@@ -77,16 +77,39 @@ func (cw *listenerWatcher) OnUpdate(update *xdsresource.ListenerResourceData, on
7777}
7878
7979func (cw * listenerWatcher ) OnError (err error , onDone xdsresource.OnDoneFunc ) {
80+ cw .updateCh .Replace (listenerUpdateErrTuple {err : err })
81+ onDone ()
82+ }
83+
84+ func (cw * listenerWatcher ) OnResourceDoesNotExist (onDone xdsresource.OnDoneFunc ) {
85+ cw .updateCh .Replace (listenerUpdateErrTuple {err : xdsresource .NewErrorf (xdsresource .ErrorTypeResourceNotFound , "Listener not found in received response" )})
86+ onDone ()
87+ }
88+
89+ type listenerWatcherMultiple struct {
90+ updateCh * testutils.Channel
91+ }
92+
93+ func newListenerWatcherMultiple () * listenerWatcherMultiple {
94+ return & listenerWatcherMultiple {updateCh : testutils .NewChannelWithSize (2 )}
95+ }
96+
97+ func (cw * listenerWatcherMultiple ) OnUpdate (update * xdsresource.ListenerResourceData , onDone xdsresource.OnDoneFunc ) {
98+ cw .updateCh .Send (listenerUpdateErrTuple {update : update .Resource })
99+ onDone ()
100+ }
101+
102+ func (cw * listenerWatcherMultiple ) OnError (err error , onDone xdsresource.OnDoneFunc ) {
80103 // When used with a go-control-plane management server that continuously
81104 // resends resources which are NACKed by the xDS client, using a `Replace()`
82105 // here and in OnResourceDoesNotExist() simplifies tests which will have
83106 // access to the most recently received error.
84- cw .updateCh .Replace (listenerUpdateErrTuple {err : err })
107+ cw .updateCh .Send (listenerUpdateErrTuple {err : err })
85108 onDone ()
86109}
87110
88- func (cw * listenerWatcher ) OnResourceDoesNotExist (onDone xdsresource.OnDoneFunc ) {
89- cw .updateCh .Replace (listenerUpdateErrTuple {err : xdsresource .NewErrorf (xdsresource .ErrorTypeResourceNotFound , "Listener not found in received response" )})
111+ func (cw * listenerWatcherMultiple ) OnResourceDoesNotExist (onDone xdsresource.OnDoneFunc ) {
112+ cw .updateCh .Send (listenerUpdateErrTuple {err : xdsresource .NewErrorf (xdsresource .ErrorTypeResourceNotFound , "Listener not found in received response" )})
90113 onDone ()
91114}
92115
@@ -547,7 +570,7 @@ func (s) TestLDSWatch_ThreeWatchesForDifferentResourceNames(t *testing.T) {
547570// a resource which is already present in the cache. The test verifies that the
548571// watch callback is invoked with the contents from the cache, instead of a
549572// request being sent to the management server.
550- func ( s ) TestLDSWatch_ResourceCaching (t * testing.T ) {
573+ func TestLDSWatch_ResourceCaching (t * testing.T ) {
551574 firstRequestReceived := false
552575 firstAckReceived := grpcsync .NewEvent ()
553576 secondRequestReceived := grpcsync .NewEvent ()
@@ -923,10 +946,10 @@ func (s) TestLDSWatch_NACKError(t *testing.T) {
923946
924947// TestLDSWatch_ResourceCaching_WithNACKError covers the case where a watch is
925948// registered for a resource which is already present in the cache with an old
926- // good update and latest NACK error. The test verifies that new watcher
927- // receives both good update and error without request being sent to the
928- // management server.
929- func ( s ) TestLDSWatch_ResourceCaching_NACKError (t * testing.T ) {
949+ // good update as well latest NACK error. The test verifies that new watcher
950+ // receives both good update and error without a new resource request being
951+ // sent to the management server.
952+ func TestLDSWatch_ResourceCaching_NACKError (t * testing.T ) {
930953 firstRequestReceived := false
931954 firstAckReceived := grpcsync .NewEvent ()
932955 secondRequestReceived := grpcsync .NewEvent ()
@@ -943,6 +966,13 @@ func (s) TestLDSWatch_ResourceCaching_NACKError(t *testing.T) {
943966 firstAckReceived .Fire ()
944967 return nil
945968 }
969+ // If the request version remains "1" while the nonce keeps
970+ // increasing, it indicates the client is repeatedly NACKing
971+ // updates from the server but not sending any new resource
972+ // request.
973+ if req .GetVersionInfo () == "1" {
974+ return nil
975+ }
946976 // Any requests after the first request and ack, are not expected.
947977 secondRequestReceived .Fire ()
948978 return nil
@@ -1018,21 +1048,12 @@ func (s) TestLDSWatch_ResourceCaching_NACKError(t *testing.T) {
10181048
10191049 // Register another watch for the same resource. This should get the update
10201050 // and error from the cache.
1021- lw2 := newListenerWatcher ()
1051+ lw2 := newListenerWatcherMultiple ()
10221052 ldsCancel2 := xdsresource .WatchListener (client , ldsName , lw2 )
10231053 defer ldsCancel2 ()
10241054 if err := verifyListenerUpdate (ctx , lw2 .updateCh , wantUpdate ); err != nil {
10251055 t .Fatal (err )
10261056 }
1027- u , err = lw2 .updateCh .Receive (ctx )
1028- if err != nil {
1029- t .Fatalf ("timeout when waiting for a listener resource from the management server: %v" , err )
1030- }
1031- gotErr = u .(listenerUpdateErrTuple ).err
1032- if gotErr == nil || ! strings .Contains (gotErr .Error (), wantListenerNACKErr ) {
1033- t .Fatalf ("update received with error: %v, want %q" , gotErr , wantListenerNACKErr )
1034- }
1035-
10361057 // No request should get sent out as part of this watch.
10371058 sCtx , sCancel := context .WithTimeout (ctx , defaultTestShortTimeout )
10381059 defer sCancel ()
@@ -1041,6 +1062,14 @@ func (s) TestLDSWatch_ResourceCaching_NACKError(t *testing.T) {
10411062 case <- secondRequestReceived .Done ():
10421063 t .Fatal ("xdsClient sent out request instead of using update from cache" )
10431064 }
1065+ u , err = lw2 .updateCh .Receive (ctx )
1066+ if err != nil {
1067+ t .Fatalf ("timeout when waiting for a listener resource from the management server: %v" , err )
1068+ }
1069+ gotErr = u .(listenerUpdateErrTuple ).err
1070+ if gotErr == nil || ! strings .Contains (gotErr .Error (), wantListenerNACKErr ) {
1071+ t .Fatalf ("update received with error: %v, want %q" , gotErr , wantListenerNACKErr )
1072+ }
10441073}
10451074
10461075// TestLDSWatch_PartialValid covers the case where a response from the
0 commit comments