func TestRunIsLeader(t *testing.T) { r := &run{ cals: []string{"a", "b", "c"}, // len(cals) == 3 seqn: 3, // 3 % 3 == 0 } assert.T(t, r.isLeader("a")) // index == 0 assert.T(t, !r.isLeader("b")) // index == 1 assert.T(t, !r.isLeader("c")) // index == 2 assert.T(t, !r.isLeader("x")) // index DNE }
func TestMemberSimple(t *testing.T) { st := store.New() defer close(st.Ops) fp := &test.FakeProposer{Store: st} c := make(chan string) go Clean(c, fp.Store, fp) fp.Propose([]byte(store.MustEncodeSet("/ctl/node/a/x", "a", store.Missing))) fp.Propose([]byte(store.MustEncodeSet("/ctl/node/a/y", "b", store.Missing))) fp.Propose([]byte(store.MustEncodeSet("/ctl/node/a/addr", "1.2.3.4", store.Missing))) fp.Propose([]byte(store.MustEncodeSet("/ctl/cal/0", "a", store.Missing))) calCh, err := fp.Wait(store.MustCompileGlob("/ctl/cal/0"), 1+<-fp.Seqns) if err != nil { panic(err) } nodeCh, err := fp.Wait(store.MustCompileGlob("/ctl/node/a/?"), 1+<-fp.Seqns) if err != nil { panic(err) } // indicate that this peer is inactive go func() { c <- "1.2.3.4" }() ev := <-calCh assert.T(t, ev.IsSet()) assert.Equal(t, "", ev.Body) cs := []int{} ev = <-nodeCh assert.T(t, ev.IsDel()) cs = append(cs, int(ev.Path[len(ev.Path)-1])) nodeCh, err = fp.Wait(store.MustCompileGlob("/ctl/node/a/?"), ev.Seqn+1) if err != nil { panic(err) } ev = <-nodeCh assert.T(t, ev.IsDel()) cs = append(cs, int(ev.Path[len(ev.Path)-1])) sort.Ints(cs) assert.Equal(t, []int{'x', 'y'}, cs) }
func TestSchedTrigger(t *testing.T) { var q triggers d := int64(15e8) t0 := time.Now().UnixNano() ts := t0 + d schedTrigger(&q, 1, t0, d) assert.Equal(t, 1, q.Len()) f := q[0] assert.Equal(t, int64(1), f.n) assert.T(t, f.t == ts) }
func TestRunReturnFalseIfNotLearned(t *testing.T) { r := run{} r.out = make(chan Packet, 100) r.ops = make(chan store.Op, 100) p := packet{msg: msg{ Seqn: proto.Int64(1), Cmd: invite, Value: []byte("foo"), }} r.update(&p, 0, new(triggers)) assert.T(t, !r.l.done) }