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  }