@@ -67,20 +67,54 @@ func Test(t *testing.T) {
67
67
grpctest .RunSubTests (t , s {})
68
68
}
69
69
70
+ // testServer is a server than can be stopped and resumed without closing
71
+ // the listener. This guarantees the same port number (and address) is used
72
+ // after restart. When a server is stopped, it accepts and closes all tcp
73
+ // connections from clients.
74
+ type testServer struct {
75
+ stubserver.StubServer
76
+ lis * testutils.RestartableListener
77
+ }
78
+
79
+ func (s * testServer ) stop () {
80
+ s .lis .Stop ()
81
+ }
82
+
83
+ func (s * testServer ) resume () {
84
+ s .lis .Restart ()
85
+ }
86
+
87
+ func newTestServer (t * testing.T ) * testServer {
88
+ l , err := testutils .LocalTCPListener ()
89
+ if err != nil {
90
+ t .Fatalf ("Failed to create listener: %v" , err )
91
+ }
92
+ rl := testutils .NewRestartableListener (l )
93
+ ss := stubserver.StubServer {
94
+ EmptyCallF : func (context.Context , * testpb.Empty ) (* testpb.Empty , error ) { return & testpb.Empty {}, nil },
95
+ Listener : rl ,
96
+ }
97
+ return & testServer {
98
+ StubServer : ss ,
99
+ lis : rl ,
100
+ }
101
+ }
102
+
70
103
// setupPickFirstLeaf performs steps required for pick_first tests. It starts a
71
104
// bunch of backends exporting the TestService, and creates a ClientConn to them.
72
105
func setupPickFirstLeaf (t * testing.T , backendCount int , opts ... grpc.DialOption ) (* grpc.ClientConn , * manual.Resolver , * backendManager ) {
73
106
t .Helper ()
74
107
r := manual .NewBuilderWithScheme ("whatever" )
75
- backends := make ([]* stubserver. StubServer , backendCount )
108
+ backends := make ([]* testServer , backendCount )
76
109
addrs := make ([]resolver.Address , backendCount )
77
110
78
111
for i := 0 ; i < backendCount ; i ++ {
79
- backend := stubserver .StartTestService (t , nil )
112
+ server := newTestServer (t )
113
+ backend := stubserver .StartTestService (t , & server .StubServer )
80
114
t .Cleanup (func () {
81
115
backend .Stop ()
82
116
})
83
- backends [i ] = backend
117
+ backends [i ] = server
84
118
addrs [i ] = resolver.Address {Addr : backend .Address }
85
119
}
86
120
@@ -264,8 +298,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_DisjointLists(t *testing.T) {
264
298
stateSubscriber := & ccStateSubscriber {}
265
299
internal .SubscribeToConnectivityStateChanges .(func (cc * grpc.ClientConn , s grpcsync.Subscriber ) func ())(cc , stateSubscriber )
266
300
267
- bm .backends [0 ].S .Stop ()
268
- bm .backends [0 ].S = nil
301
+ bm .backends [0 ].stop ()
269
302
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [1 ]}})
270
303
var bal * stateStoringBalancer
271
304
select {
@@ -287,8 +320,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_DisjointLists(t *testing.T) {
287
320
t .Errorf ("SubConn states mismatch (-want +got):\n %s" , diff )
288
321
}
289
322
290
- bm .backends [2 ].S .Stop ()
291
- bm .backends [2 ].S = nil
323
+ bm .backends [2 ].stop ()
292
324
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [2 ], addrs [3 ]}})
293
325
294
326
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [3 ]); err != nil {
@@ -327,8 +359,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_ActiveBackendInUpdatedList(t *testing
327
359
stateSubscriber := & ccStateSubscriber {}
328
360
internal .SubscribeToConnectivityStateChanges .(func (cc * grpc.ClientConn , s grpcsync.Subscriber ) func ())(cc , stateSubscriber )
329
361
330
- bm .backends [0 ].S .Stop ()
331
- bm .backends [0 ].S = nil
362
+ bm .backends [0 ].stop ()
332
363
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [1 ]}})
333
364
var bal * stateStoringBalancer
334
365
select {
@@ -350,8 +381,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_ActiveBackendInUpdatedList(t *testing
350
381
t .Errorf ("SubConn states mismatch (-want +got):\n %s" , diff )
351
382
}
352
383
353
- bm .backends [2 ].S .Stop ()
354
- bm .backends [2 ].S = nil
384
+ bm .backends [2 ].stop ()
355
385
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [2 ], addrs [1 ]}})
356
386
357
387
// Verify that the ClientConn stays in READY.
@@ -391,8 +421,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_InActiveBackendInUpdatedList(t *testi
391
421
stateSubscriber := & ccStateSubscriber {}
392
422
internal .SubscribeToConnectivityStateChanges .(func (cc * grpc.ClientConn , s grpcsync.Subscriber ) func ())(cc , stateSubscriber )
393
423
394
- bm .backends [0 ].S .Stop ()
395
- bm .backends [0 ].S = nil
424
+ bm .backends [0 ].stop ()
396
425
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [1 ]}})
397
426
var bal * stateStoringBalancer
398
427
select {
@@ -414,11 +443,9 @@ func (s) TestPickFirstLeaf_ResolverUpdates_InActiveBackendInUpdatedList(t *testi
414
443
t .Errorf ("SubConn states mismatch (-want +got):\n %s" , diff )
415
444
}
416
445
417
- bm .backends [2 ].S .Stop ()
418
- bm .backends [2 ].S = nil
419
- if err := bm .backends [0 ].StartServer (); err != nil {
420
- t .Fatalf ("Failed to re-start test backend: %v" , err )
421
- }
446
+ bm .backends [2 ].stop ()
447
+ bm .backends [0 ].resume ()
448
+
422
449
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [2 ]}})
423
450
424
451
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
@@ -456,8 +483,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_IdenticalLists(t *testing.T) {
456
483
stateSubscriber := & ccStateSubscriber {}
457
484
internal .SubscribeToConnectivityStateChanges .(func (cc * grpc.ClientConn , s grpcsync.Subscriber ) func ())(cc , stateSubscriber )
458
485
459
- bm .backends [0 ].S .Stop ()
460
- bm .backends [0 ].S = nil
486
+ bm .backends [0 ].stop ()
461
487
r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [1 ]}})
462
488
var bal * stateStoringBalancer
463
489
select {
@@ -554,14 +580,11 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerRestart(t *testing.T)
554
580
}
555
581
556
582
// Shut down the connected server.
557
- bm .backends [0 ].S .Stop ()
558
- bm .backends [0 ].S = nil
583
+ bm .backends [0 ].stop ()
559
584
testutils .AwaitState (ctx , t , cc , connectivity .Idle )
560
585
561
586
// Start the new target server.
562
- if err := bm .backends [0 ].StartServer (); err != nil {
563
- t .Fatalf ("Failed to start server: %v" , err )
564
- }
587
+ bm .backends [0 ].resume ()
565
588
566
589
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
567
590
t .Fatal (err )
@@ -620,14 +643,11 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerRestart(t *testing.T)
620
643
}
621
644
622
645
// Shut down the connected server.
623
- bm .backends [1 ].S .Stop ()
624
- bm .backends [1 ].S = nil
646
+ bm .backends [1 ].stop ()
625
647
testutils .AwaitState (ctx , t , cc , connectivity .Idle )
626
648
627
649
// Start the new target server.
628
- if err := bm .backends [1 ].StartServer (); err != nil {
629
- t .Fatalf ("Failed to start server: %v" , err )
630
- }
650
+ bm .backends [1 ].resume ()
631
651
632
652
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [1 ]); err != nil {
633
653
t .Fatal (err )
@@ -692,14 +712,11 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerToFirst(t *testing.T)
692
712
}
693
713
694
714
// Shut down the connected server.
695
- bm .backends [1 ].S .Stop ()
696
- bm .backends [1 ].S = nil
715
+ bm .backends [1 ].stop ()
697
716
testutils .AwaitState (ctx , t , cc , connectivity .Idle )
698
717
699
718
// Start the new target server.
700
- if err := bm .backends [0 ].StartServer (); err != nil {
701
- t .Fatalf ("Failed to start server: %v" , err )
702
- }
719
+ bm .backends [0 ].resume ()
703
720
704
721
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
705
722
t .Fatal (err )
@@ -763,14 +780,11 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerToSecond(t *testing.T)
763
780
}
764
781
765
782
// Shut down the connected server.
766
- bm .backends [0 ].S .Stop ()
767
- bm .backends [0 ].S = nil
783
+ bm .backends [0 ].stop ()
768
784
testutils .AwaitState (ctx , t , cc , connectivity .Idle )
769
785
770
786
// Start the new target server.
771
- if err := bm .backends [1 ].StartServer (); err != nil {
772
- t .Fatalf ("Failed to start server: %v" , err )
773
- }
787
+ bm .backends [1 ].resume ()
774
788
775
789
if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [1 ]); err != nil {
776
790
t .Fatal (err )
@@ -1308,14 +1322,13 @@ type scState struct {
1308
1322
}
1309
1323
1310
1324
type backendManager struct {
1311
- backends []* stubserver. StubServer
1325
+ backends []* testServer
1312
1326
}
1313
1327
1314
1328
func (b * backendManager ) stopAllExcept (index int ) {
1315
1329
for idx , b := range b .backends {
1316
1330
if idx != index {
1317
- b .S .Stop ()
1318
- b .S = nil
1331
+ b .stop ()
1319
1332
}
1320
1333
}
1321
1334
}
0 commit comments