github.phpd.cn/hashicorp/consul@v1.4.5/agent/consul/autopilot/autopilot_test.go (about) 1 package autopilot 2 3 import ( 4 "errors" 5 "net" 6 "testing" 7 8 "github.com/hashicorp/serf/serf" 9 ) 10 11 func TestMinRaftProtocol(t *testing.T) { 12 t.Parallel() 13 makeMember := func(version string) serf.Member { 14 return serf.Member{ 15 Name: "foo", 16 Addr: net.IP([]byte{127, 0, 0, 1}), 17 Tags: map[string]string{ 18 "role": "consul", 19 "dc": "dc1", 20 "port": "10000", 21 "vsn": "1", 22 "raft_vsn": version, 23 }, 24 Status: serf.StatusAlive, 25 } 26 } 27 28 cases := []struct { 29 members []serf.Member 30 expected int 31 err error 32 }{ 33 // No servers, error 34 { 35 members: []serf.Member{}, 36 expected: -1, 37 err: errors.New("No servers found"), 38 }, 39 // One server 40 { 41 members: []serf.Member{ 42 makeMember("1"), 43 }, 44 expected: 1, 45 }, 46 // One server, bad version formatting 47 { 48 members: []serf.Member{ 49 makeMember("asdf"), 50 }, 51 expected: -1, 52 err: errors.New(`strconv.Atoi: parsing "asdf": invalid syntax`), 53 }, 54 // Multiple servers, different versions 55 { 56 members: []serf.Member{ 57 makeMember("1"), 58 makeMember("2"), 59 }, 60 expected: 1, 61 }, 62 // Multiple servers, same version 63 { 64 members: []serf.Member{ 65 makeMember("2"), 66 makeMember("2"), 67 }, 68 expected: 2, 69 }, 70 } 71 72 serverFunc := func(m serf.Member) (*ServerInfo, error) { 73 return &ServerInfo{}, nil 74 } 75 for _, tc := range cases { 76 result, err := minRaftProtocol(tc.members, serverFunc) 77 if result != tc.expected { 78 t.Fatalf("bad: %v, %v, %v", result, tc.expected, tc) 79 } 80 if tc.err != nil { 81 if err == nil || tc.err.Error() != err.Error() { 82 t.Fatalf("bad: %v, %v, %v", err, tc.err, tc) 83 } 84 } 85 } 86 }