@@ -12,20 +12,24 @@ import (
12
12
"testing"
13
13
"time"
14
14
15
+ "github.com/siderolabs/gen/slices"
15
16
"github.com/siderolabs/go-retry/retry"
16
17
"github.com/stretchr/testify/assert"
17
18
"github.com/stretchr/testify/require"
18
19
"go.uber.org/goleak"
19
20
"go.uber.org/zap/zaptest"
20
21
21
22
"github.com/siderolabs/go-loadbalancer/controlplane"
23
+ "github.com/siderolabs/go-loadbalancer/upstream"
22
24
)
23
25
26
+ //nolint:govet
24
27
type mockUpstream struct {
28
+ T testing.TB
29
+ Identity string
30
+
25
31
addr string
26
32
l net.Listener
27
-
28
- identity string
29
33
}
30
34
31
35
func (u * mockUpstream ) Start () error {
@@ -50,13 +54,14 @@ func (u *mockUpstream) serve() {
50
54
return
51
55
}
52
56
53
- c .Write ([]byte (u .identity )) //nolint: errcheck
54
- c .Close () //nolint: errcheck
57
+ _ , err = c .Write ([]byte (u .Identity ))
58
+ require .NoError (u .T , err )
59
+ require .NoError (u .T , c .Close ())
55
60
}
56
61
}
57
62
58
63
func (u * mockUpstream ) Close () {
59
- u . l .Close () //nolint: errcheck
64
+ require . NoError ( u . T , u . l .Close ())
60
65
}
61
66
62
67
func TestLoadBalancer (t * testing.T ) {
@@ -69,16 +74,24 @@ func TestLoadBalancer(t *testing.T) {
69
74
70
75
upstreams := make ([]mockUpstream , upstreamCount )
71
76
for i := range upstreams {
72
- upstreams [i ].identity = strconv .Itoa (i )
77
+ upstreams [i ].T = t
78
+ upstreams [i ].Identity = strconv .Itoa (i )
73
79
require .NoError (t , upstreams [i ].Start ())
74
80
}
75
81
76
- upstreamAddrs := make ([]string , len (upstreams ))
77
- for i := range upstreamAddrs {
78
- upstreamAddrs [i ] = upstreams [i ].addr
79
- }
80
-
81
- lb , err := controlplane .NewLoadBalancer ("localhost" , 0 , zaptest .NewLogger (t ))
82
+ upstreamAddrs := slices .Map (upstreams , func (u mockUpstream ) string { return u .addr })
83
+
84
+ lb , err := controlplane .NewLoadBalancer (
85
+ "localhost" ,
86
+ 0 ,
87
+ zaptest .NewLogger (t ),
88
+ controlplane .WithHealthCheckOptions (
89
+ // start with negative initlal score so that every healthcheck will be performed
90
+ // at least once. It will also make upstream tiers.
91
+ upstream .WithInitialScore (- 1 ),
92
+ upstream .WithHealthcheckInterval (10 * time .Millisecond ),
93
+ ),
94
+ )
82
95
require .NoError (t , err )
83
96
84
97
upstreamCh := make (chan []string )
@@ -93,17 +106,19 @@ func TestLoadBalancer(t *testing.T) {
93
106
return 0 , retry .ExpectedError (err )
94
107
}
95
108
96
- defer c .Close () //nolint:errcheck
109
+ defer ensure ( t , c .Close )
97
110
98
111
id , err := io .ReadAll (c )
99
112
if err != nil {
100
113
return 0 , retry .ExpectedError (err )
114
+ } else if len (id ) == 0 {
115
+ return 0 , retry .ExpectedErrorf ("zero length response" )
101
116
}
102
117
103
118
return strconv .Atoi (string (id ))
104
119
}
105
120
106
- assert .NoError (t , retry .Constant (10 * time .Second , retry .WithUnits (time .Second )).Retry (func () error {
121
+ assert .NoError (t , retry .Constant (10 * time .Second , retry .WithUnits (30 * time .Millisecond )).Retry (func () error {
107
122
identity , err := readIdentity ()
108
123
if err != nil {
109
124
return err
@@ -170,3 +185,7 @@ func TestLoadBalancer(t *testing.T) {
170
185
171
186
assert .NoError (t , lb .Shutdown ())
172
187
}
188
+
189
+ func ensure (t * testing.T , closer func () error ) {
190
+ require .NoError (t , closer ())
191
+ }
0 commit comments