@@ -24,6 +24,8 @@ import (
24
24
"testing"
25
25
"time"
26
26
27
+ "google.golang.org/grpc/resolver/manual"
28
+
27
29
"google.golang.org/grpc"
28
30
"google.golang.org/grpc/balancer"
29
31
"google.golang.org/grpc/connectivity"
@@ -260,3 +262,104 @@ func testDoneLoads(t *testing.T, e env) {
260
262
t .Fatalf ("b.doneInfo[0].ServerLoad = %v; want = %v" , b .doneInfo [0 ].ServerLoad , testLoad )
261
263
}
262
264
}
265
+
266
+ const testBalancerKeepAddressesName = "testbalancer-keepingaddresses"
267
+
268
+ // testBalancerKeepAddresses keeps the addresses in the builder instead of
269
+ // creating SubConns.
270
+ //
271
+ // It's used to test the addresses balancer gets are correct.
272
+ type testBalancerKeepAddresses struct {
273
+ addrs []resolver.Address
274
+ }
275
+
276
+ func (b * testBalancerKeepAddresses ) Build (cc balancer.ClientConn , opt balancer.BuildOptions ) balancer.Balancer {
277
+ return b
278
+ }
279
+
280
+ func (* testBalancerKeepAddresses ) Name () string {
281
+ return testBalancerKeepAddressesName
282
+ }
283
+
284
+ func (b * testBalancerKeepAddresses ) HandleResolvedAddrs (addrs []resolver.Address , err error ) {
285
+ b .addrs = addrs
286
+ }
287
+
288
+ func (b * testBalancerKeepAddresses ) HandleSubConnStateChange (sc balancer.SubConn , s connectivity.State ) {
289
+ panic ("not used" )
290
+ }
291
+
292
+ func (b * testBalancerKeepAddresses ) Close () {
293
+ }
294
+
295
+ // Make sure that non-grpclb balancers don't get grpclb addresses even if name
296
+ // resolver sends them
297
+ func (s ) TestNonGRPCLBBalancerGetsNoGRPCLBAddress (t * testing.T ) {
298
+ r , rcleanup := manual .GenerateAndRegisterManualResolver ()
299
+ defer rcleanup ()
300
+
301
+ b := & testBalancerKeepAddresses {}
302
+ balancer .Register (b )
303
+
304
+ cc , err := grpc .Dial (r .Scheme ()+ ":///test.server" , grpc .WithInsecure (),
305
+ grpc .WithBalancerName (b .Name ()))
306
+ if err != nil {
307
+ t .Fatalf ("failed to dial: %v" , err )
308
+ }
309
+ defer cc .Close ()
310
+
311
+ if len (b .addrs ) != 0 {
312
+ t .Fatalf ("Before name resolving, balancer got addresses %v, want empty" , b .addrs )
313
+ }
314
+
315
+ grpclbAddresses := []resolver.Address {{
316
+ Addr : "grpc.lb.com" ,
317
+ Type : resolver .GRPCLB ,
318
+ ServerName : "grpc.lb.com" ,
319
+ }}
320
+
321
+ nonGRPCLBAddresses := []resolver.Address {{
322
+ Addr : "localhost" ,
323
+ Type : resolver .Backend ,
324
+ }}
325
+
326
+ r .UpdateState (resolver.State {
327
+ Addresses : nonGRPCLBAddresses ,
328
+ })
329
+ var i int
330
+ for i = 0 ; i < 1000 ; i ++ {
331
+ if reflect .DeepEqual (b .addrs , nonGRPCLBAddresses ) {
332
+ break
333
+ }
334
+ time .Sleep (time .Millisecond )
335
+ }
336
+ if i >= 1000 {
337
+ t .Fatalf ("With only backend addresses, balancer got addresses %v, want %v" , b .addrs , nonGRPCLBAddresses )
338
+ }
339
+
340
+ r .UpdateState (resolver.State {
341
+ Addresses : grpclbAddresses ,
342
+ })
343
+ for i = 0 ; i < 1000 ; i ++ {
344
+ if len (b .addrs ) == 0 {
345
+ break
346
+ }
347
+ time .Sleep (time .Millisecond )
348
+ }
349
+ if i >= 1000 {
350
+ t .Fatalf ("With only grpclb addresses, balancer got addresses %v, want empty" , b .addrs )
351
+ }
352
+
353
+ r .UpdateState (resolver.State {
354
+ Addresses : append (grpclbAddresses , nonGRPCLBAddresses ... ),
355
+ })
356
+ for i = 0 ; i < 1000 ; i ++ {
357
+ if reflect .DeepEqual (b .addrs , nonGRPCLBAddresses ) {
358
+ break
359
+ }
360
+ time .Sleep (time .Millisecond )
361
+ }
362
+ if i >= 1000 {
363
+ t .Fatalf ("With both backend and grpclb addresses, balancer got addresses %v, want %v" , b .addrs , nonGRPCLBAddresses )
364
+ }
365
+ }
0 commit comments