// TestNodeStep ensures that node.Step sends msgProp to propc chan // and other kinds of messages to recvc chan. func TestNodeStep(t *testing.T) { for i, msgn := range raftpb.MessageType_name { n := &node{ propc: make(chan raftpb.Message, 1), recvc: make(chan raftpb.Message, 1), } msgt := raftpb.MessageType(i) n.Step(context.TODO(), raftpb.Message{Type: msgt}) // Proposal goes to proc chan. Others go to recvc chan. if msgt == raftpb.MsgProp { select { case <-n.propc: default: t.Errorf("%d: cannot receive %s on propc chan", msgt, msgn) } } else { if IsLocalMsg(msgt) { select { case <-n.recvc: t.Errorf("%d: step should ignore %s", msgt, msgn) default: } } else { select { case <-n.recvc: default: t.Errorf("%d: cannot receive %s on recvc chan", msgt, msgn) } } } } }
// TestMultiNodeStep ensures that multiNode.Step sends MsgProp to propc // chan and other kinds of messages to recvc chan. func TestMultiNodeStep(t *testing.T) { for i, msgn := range raftpb.MessageType_name { mn := &multiNode{ propc: make(chan multiMessage, 1), recvc: make(chan multiMessage, 1), } msgt := raftpb.MessageType(i) mn.Step(context.TODO(), 1, raftpb.Message{Type: msgt}) // Proposal goes to proc chan. Others go to recvc chan. if msgt == raftpb.MsgProp { select { case <-mn.propc: default: t.Errorf("%d: cannot receive %s on propc chan", msgt, msgn) } } else { if msgt == raftpb.MsgBeat || msgt == raftpb.MsgHup || msgt == raftpb.MsgUnreachable || msgt == raftpb.MsgSnapStatus { select { case <-mn.recvc: t.Errorf("%d: step should ignore %s", msgt, msgn) default: } } else { select { case <-mn.recvc: default: t.Errorf("%d: cannot receive %s on recvc chan", msgt, msgn) } } } } }
// TestRawNodeStep ensures that RawNode.Step ignore local message. func TestRawNodeStep(t *testing.T) { for i, msgn := range raftpb.MessageType_name { s := NewMemoryStorage() rawNode, err := NewRawNode(newTestConfig(1, nil, 10, 1, s), []Peer{{ID: 1}}) if err != nil { t.Fatal(err) } msgt := raftpb.MessageType(i) err = rawNode.Step(raftpb.Message{Type: msgt}) // LocalMsg should be ignored. if msgt == raftpb.MsgBeat || msgt == raftpb.MsgHup || msgt == raftpb.MsgUnreachable || msgt == raftpb.MsgSnapStatus { if err != ErrStepLocalMsg { t.Errorf("%d: step should ignore %s", msgt, msgn) } } } }