-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathloadbalancer_test.go
122 lines (88 loc) · 2.38 KB
/
loadbalancer_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package loadbalancer
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
// -----------------------------------------------------------------------------
const (
serverOneCount = 5
serverOneName = "server 1"
serverTwoCount = 2
serverTwoName = "server 2"
backupServerName = "backup server"
serverTotalCount = serverOneCount + serverTwoCount
)
// -----------------------------------------------------------------------------
func TestNoFail(t *testing.T) {
lb := createTestLoadBalancer(false)
for idx := 0; idx < serverTotalCount*2; idx++ {
srv := lb.Next()
srvName, _ := srv.UserData().(string)
if (idx % serverTotalCount) < serverOneCount {
require.Equal(t, serverOneName, srvName)
} else {
require.Equal(t, serverTwoName, srvName)
}
srv.SetOnline()
}
}
func TestFailAll(t *testing.T) {
lb := createTestLoadBalancer(false)
for idx := 0; idx < 6; idx++ {
srv := lb.Next()
srv.SetOffline()
}
// At this point next server should be none
srv := lb.Next()
require.Equal(t, (*Server)(nil), srv)
}
func TestBackup(t *testing.T) {
lb := createTestLoadBalancer(true)
for idx := 0; idx < 6; idx++ {
srv := lb.Next()
srv.SetOffline()
}
// At this point next server should be the backup one
srv := lb.Next()
srvName, _ := srv.UserData().(string)
require.Equal(t, backupServerName, srvName)
srv.SetOffline() // NOTE: This call will act as a NO-OP
}
func TestWait(t *testing.T) {
lb := createTestLoadBalancer(false)
for idx := 0; idx < 6; idx++ {
srv := lb.Next()
srv.SetOffline()
}
// At this point next server should be none
srv := lb.Next()
require.Equal(t, (*Server)(nil), srv)
// Wait until a server becomes available (after ~1sec)
ch := lb.WaitNext()
srv = <-ch
// At this point server 2 should be online again
srvName, _ := srv.UserData().(string)
require.Equal(t, srvName, serverTwoName)
}
// -----------------------------------------------------------------------------
// Private functions
func createTestLoadBalancer(addBackup bool) *LoadBalancer {
lb := Create()
_ = lb.Add(ServerOptions{
Weight: serverOneCount,
MaxFails: 3,
FailTimeout: 5 * time.Second,
}, serverOneName)
_ = lb.Add(ServerOptions{
Weight: serverTwoCount,
MaxFails: 3,
FailTimeout: 1 * time.Second,
}, serverTwoName)
if addBackup {
_ = lb.Add(ServerOptions{
IsBackup: true,
}, backupServerName)
}
return lb
}