weaviate

Форк
0
/
bootstrap_test.go 
110 строк · 3.2 Кб
1
//                           _       _
2
// __      _____  __ ___   ___  __ _| |_ ___
3
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
4
//  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
5
//   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
6
//
7
//  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
8
//
9
//  CONTACT: hello@weaviate.io
10
//
11

12
package store
13

14
import (
15
	"context"
16
	"testing"
17
	"time"
18

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"
23
)
24

25
func TestBootStrapper(t *testing.T) {
26
	ctx := context.Background()
27
	anything := mock.Anything
28
	servers := map[string]int{"S1": 1, "S2": 2}
29

30
	tests := []struct {
31
		name     string
32
		voter    bool
33
		servers  map[string]int
34
		doBefore func(*MockJoiner)
35
		success  bool
36
	}{
37
		{
38
			name:    "empty server list",
39
			voter:   true,
40
			servers: nil,
41
			doBefore: func(m *MockJoiner) {
42
				m.On("Join", anything, anything, anything).Return(&cmd.JoinPeerResponse{}, nil)
43
			},
44
			success: false,
45
		},
46
		{
47
			name:    "leader exist",
48
			voter:   true,
49
			servers: servers,
50
			doBefore: func(m *MockJoiner) {
51
				m.On("Join", anything, anything, anything).Return(&cmd.JoinPeerResponse{}, nil)
52
			},
53
			success: true,
54
		},
55
		{
56
			name:    "servers not available",
57
			voter:   true,
58
			servers: servers,
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)
62

63
				m.On("Notify", anything, "S1:1", anything).Return(&cmd.NotifyPeerResponse{}, nil)
64
				m.On("Notify", anything, "S2:2", anything).Return(&cmd.NotifyPeerResponse{}, errAny)
65
			},
66
			success: false,
67
		},
68
		{
69
			name:    "follow the leader",
70
			voter:   true,
71
			servers: servers,
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)
77
			},
78
			success: true,
79
		},
80
	}
81
	for _, test := range tests {
82
		m := &MockJoiner{}
83
		b := NewBootstrapper(m, "RID", "ADDR", &MockAddressResolver{func(id string) string { return id }})
84
		b.retryPeriod = time.Millisecond
85
		b.jitter = time.Millisecond
86
		test.doBefore(m)
87
		ctx, cancel := context.WithTimeout(ctx, time.Millisecond*100)
88
		err := b.Do(ctx, test.servers, NewMockLogger(t).Logger, test.voter, make(chan struct{}))
89
		cancel()
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)
94
		}
95
	}
96
}
97

98
type MockJoiner struct {
99
	mock.Mock
100
}
101

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)
105
}
106

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)
110
}
111

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.