node_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package raft
  2. import (
  3. "testing"
  4. )
  5. const (
  6. defaultHeartbeat = 1
  7. defaultElection = 5
  8. )
  9. func TestTickMsgHub(t *testing.T) {
  10. n := New(3, 0, defaultHeartbeat, defaultElection)
  11. for i := 0; i < defaultElection+1; i++ {
  12. n.Tick()
  13. }
  14. called := false
  15. for _, m := range n.Msgs() {
  16. if m.Type == msgVote {
  17. called = true
  18. }
  19. }
  20. if !called {
  21. t.Errorf("called = %v, want true", called)
  22. }
  23. }
  24. func TestTickMsgBeat(t *testing.T) {
  25. k := 3
  26. n := New(k, 0, defaultHeartbeat, defaultElection)
  27. n.Step(Message{Type: msgHup}) // become leader please
  28. for _, m := range n.Msgs() {
  29. if m.Type == msgVote {
  30. n.Step(Message{From: 1, Type: msgVoteResp, Index: 1, Term: 1})
  31. }
  32. }
  33. for i := 0; i < defaultHeartbeat+1; i++ {
  34. n.Tick()
  35. }
  36. called := 0
  37. for _, m := range n.Msgs() {
  38. if m.Type == msgApp {
  39. called++
  40. }
  41. }
  42. // becomeLeader -> k-1 append
  43. // msgBeat -> k-1 append
  44. w := (k - 1) * 2
  45. if called != w {
  46. t.Errorf("called = %v, want %v", called, w)
  47. }
  48. }
  49. func TestResetElapse(t *testing.T) {
  50. tests := []struct {
  51. msg Message
  52. welapsed tick
  53. }{
  54. {Message{From: 0, To: 1, Type: msgApp, Term: 2, Entries: []Entry{{Term: 1}}}, 0},
  55. {Message{From: 0, To: 1, Type: msgApp, Term: 1, Entries: []Entry{{Term: 1}}}, 1},
  56. {Message{From: 0, To: 1, Type: msgVote, Term: 2}, 0},
  57. {Message{From: 0, To: 1, Type: msgVote, Term: 1}, 1},
  58. }
  59. for i, tt := range tests {
  60. n := New(3, 1, defaultHeartbeat, defaultElection)
  61. n.sm.term = 2
  62. n.Tick()
  63. if n.elapsed != 1 {
  64. t.Errorf("%d: elpased = %d, want %d", i, n.elapsed, 1)
  65. }
  66. n.Step(tt.msg)
  67. if n.elapsed != tt.welapsed {
  68. t.Errorf("%d: elpased = %d, want %d", i, n.elapsed, tt.welapsed)
  69. }
  70. }
  71. }