19
"github.com/stretchr/testify/mock"
20
cmd "github.com/weaviate/weaviate/cluster/proto/api"
21
"google.golang.org/grpc/codes"
22
"google.golang.org/grpc/status"
25
func TestBootStrapper(t *testing.T) {
26
ctx := context.Background()
27
anything := mock.Anything
28
servers := map[string]int{"S1": 1, "S2": 2}
33
servers map[string]int
34
doBefore func(*MockJoiner)
38
name: "empty server list",
41
doBefore: func(m *MockJoiner) {
42
m.On("Join", anything, anything, anything).Return(&cmd.JoinPeerResponse{}, nil)
50
doBefore: func(m *MockJoiner) {
51
m.On("Join", anything, anything, anything).Return(&cmd.JoinPeerResponse{}, nil)
56
name: "servers not available",
59
doBefore: func(m *MockJoiner) {
60
m.On("Join", anything, "S1:1", anything).Return(&cmd.JoinPeerResponse{}, errAny)
61
m.On("Join", anything, "S2:2", anything).Return(&cmd.JoinPeerResponse{}, errAny)
63
m.On("Notify", anything, "S1:1", anything).Return(&cmd.NotifyPeerResponse{}, nil)
64
m.On("Notify", anything, "S2:2", anything).Return(&cmd.NotifyPeerResponse{}, errAny)
69
name: "follow the leader",
72
doBefore: func(m *MockJoiner) {
73
err := status.Error(codes.NotFound, "follow the leader")
74
m.On("Join", anything, "S1:1", anything).Return(&cmd.JoinPeerResponse{}, errAny)
75
m.On("Join", anything, "S2:2", anything).Return(&cmd.JoinPeerResponse{Leader: "S3"}, err)
76
m.On("Join", anything, "S3", anything).Return(&cmd.JoinPeerResponse{}, nil)
81
for _, test := range tests {
83
b := NewBootstrapper(m, "RID", "ADDR", &MockAddressResolver{func(id string) string { return id }})
84
b.retryPeriod = time.Millisecond
85
b.jitter = time.Millisecond
87
ctx, cancel := context.WithTimeout(ctx, time.Millisecond*100)
88
err := b.Do(ctx, test.servers, NewMockLogger(t).Logger, test.voter, make(chan struct{}))
90
if test.success && err != nil {
91
t.Errorf("%s: %v", test.name, err)
92
} else if !test.success && err == nil {
93
t.Errorf("%s: test must fail", test.name)
98
type MockJoiner struct {
102
func (m *MockJoiner) Join(ctx context.Context, leaderAddr string, req *cmd.JoinPeerRequest) (*cmd.JoinPeerResponse, error) {
103
args := m.Called(ctx, leaderAddr, req)
104
return args.Get(0).(*cmd.JoinPeerResponse), args.Error(1)
107
func (m *MockJoiner) Notify(ctx context.Context, leaderAddr string, req *cmd.NotifyPeerRequest) (*cmd.NotifyPeerResponse, error) {
108
args := m.Called(ctx, leaderAddr, req)
109
return args.Get(0).(*cmd.NotifyPeerResponse), args.Error(1)