@@ -191,7 +191,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_FirstServerReady(t *testing.T) {
191
191
connectivity .Connecting ,
192
192
connectivity .Ready ,
193
193
}
194
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
194
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
195
195
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
196
196
}
197
197
}
@@ -233,7 +233,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_FirstServerUnReady(t *testing.T)
233
233
connectivity .Connecting ,
234
234
connectivity .Ready ,
235
235
}
236
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
236
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
237
237
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
238
238
}
239
239
}
@@ -278,7 +278,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_DuplicateAddrs(t *testing.T) {
278
278
connectivity .Connecting ,
279
279
connectivity .Ready ,
280
280
}
281
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
281
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
282
282
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
283
283
}
284
284
}
@@ -350,7 +350,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_DisjointLists(t *testing.T) {
350
350
connectivity .Connecting ,
351
351
connectivity .Ready ,
352
352
}
353
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
353
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
354
354
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
355
355
}
356
356
}
@@ -412,7 +412,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_ActiveBackendInUpdatedList(t *testing
412
412
connectivity .Connecting ,
413
413
connectivity .Ready ,
414
414
}
415
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
415
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
416
416
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
417
417
}
418
418
}
@@ -474,7 +474,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_InActiveBackendInUpdatedList(t *testi
474
474
connectivity .Connecting ,
475
475
connectivity .Ready ,
476
476
}
477
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
477
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
478
478
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
479
479
}
480
480
}
@@ -535,7 +535,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_IdenticalLists(t *testing.T) {
535
535
connectivity .Connecting ,
536
536
connectivity .Ready ,
537
537
}
538
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
538
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
539
539
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
540
540
}
541
541
}
@@ -608,7 +608,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerRestart(t *testing.T)
608
608
connectivity .Connecting ,
609
609
connectivity .Ready ,
610
610
}
611
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
611
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
612
612
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
613
613
}
614
614
}
@@ -677,7 +677,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerRestart(t *testing.T)
677
677
connectivity .Connecting ,
678
678
connectivity .Ready ,
679
679
}
680
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
680
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
681
681
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
682
682
}
683
683
}
@@ -746,7 +746,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerToFirst(t *testing.T)
746
746
connectivity .Connecting ,
747
747
connectivity .Ready ,
748
748
}
749
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
749
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
750
750
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
751
751
}
752
752
}
@@ -813,7 +813,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerToSecond(t *testing.T)
813
813
connectivity .Connecting ,
814
814
connectivity .Ready ,
815
815
}
816
- if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions ); diff != "" {
816
+ if diff := cmp .Diff (wantConnStateTransitions , stateSubscriber .transitions () ); diff != "" {
817
817
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
818
818
}
819
819
}
@@ -866,7 +866,7 @@ func (s) TestPickFirstLeaf_EmptyAddressList(t *testing.T) {
866
866
connectivity .Ready ,
867
867
}
868
868
869
- if diff := cmp .Diff (wantTransitions , stateSubscriber .transitions ); diff != "" {
869
+ if diff := cmp .Diff (wantTransitions , stateSubscriber .transitions () ); diff != "" {
870
870
t .Errorf ("ClientConn states mismatch (-want +got):\n %s" , diff )
871
871
}
872
872
}
@@ -1606,11 +1606,23 @@ func (b *backendManager) holds(dialer *testutils.BlockingDialer) []*testutils.Ho
1606
1606
}
1607
1607
1608
1608
type ccStateSubscriber struct {
1609
- transitions []connectivity.State
1609
+ mu sync.Mutex
1610
+ states []connectivity.State
1611
+ }
1612
+
1613
+ // transitions returns all the states that ccStateSubscriber recorded.
1614
+ // Without this a race condition occurs when the test compares the states
1615
+ // and the subscriber at the same time receives a connectivity.Shutdown.
1616
+ func (c * ccStateSubscriber ) transitions () []connectivity.State {
1617
+ c .mu .Lock ()
1618
+ defer c .mu .Unlock ()
1619
+ return c .states
1610
1620
}
1611
1621
1612
1622
func (c * ccStateSubscriber ) OnMessage (msg any ) {
1613
- c .transitions = append (c .transitions , msg .(connectivity.State ))
1623
+ c .mu .Lock ()
1624
+ defer c .mu .Unlock ()
1625
+ c .states = append (c .states , msg .(connectivity.State ))
1614
1626
}
1615
1627
1616
1628
// mockTimer returns a fake timeAfterFunc that will not trigger automatically.
0 commit comments