project2a 关于测试代码的问题

对于下面这个测试代码,当传入参数state为stateCandidate时,Raft会依次执行becomeCandidate和tick超时。
测试代码检查了第二次requestVote的情况。
我的问题是,按raft逻辑,becomeCandidate只有在follower超时的时候才可能发生,也就是说执行becomeCandidate的时候,就会发送requestVote。
但测试代码似乎没考虑第一次的投票情况。
所以,是在becomeCandidate的时候不该立即requestVote,还是应该在测试代码tick超时之前额外清空一下消息列表?

func testNonleaderStartElection(t *testing.T, state StateType) {
	// election timeout
	et := 10
	r := newTestRaft(1, []uint64{1, 2, 3}, et, 1, NewMemoryStorage())
	switch state {
	case StateFollower:
		r.becomeFollower(1, 2)
	case StateCandidate:
		r.becomeCandidate()
	}
	for i := 1; i < 2*et; i++ {
		r.tick()
	}
	if r.Term != 2 {
		t.Errorf("term = %d, want 2", r.Term)
	}
	if r.State != StateCandidate {
		t.Errorf("state = %s, want %s", r.State, StateCandidate)
	}
	if !r.votes[r.id] {
		t.Errorf("vote for self = false, want true")
	}
	msgs := r.readMessages()
	sort.Sort(messageSlice(msgs))
	wmsgs := []pb.Message{
		{From: 1, To: 2, Term: 2, MsgType: pb.MessageType_MsgRequestVote},
		{From: 1, To: 3, Term: 2, MsgType: pb.MessageType_MsgRequestVote},
	}
	if !reflect.DeepEqual(msgs, wmsgs) {
		t.Errorf("msgs = %v, want %v", msgs, wmsgs)
	}
}
1赞

单纯的 becomeCandidate 不会发送 requestVote ,这个测试点就是处理节点是 Follower 或者 Candidate 的时候发起选举。
becomeXXX 之后,紧接着就是 tick ,这里才会发送 MsgRequestVote

2赞

谢谢佬。
就是将becomeCandidate和requestVote这两个动作分割开来对吧?
虽然我感觉这两个动作是强相关的,分隔开来怪怪的:joy::joy:

1赞

becomeXXX是为了方便写测试的

一些API的说明文档确实太简单了,不是能很好的描述API的行为,还得靠测试一步一步熟悉和修改。