1313import io .envoyproxy .envoy .api .v2 .auth .Secret ;
1414import io .envoyproxy .envoy .api .v2 .core .Node ;
1515import java .util .Collections ;
16+ import java .util .HashMap ;
1617import java .util .LinkedList ;
1718import java .util .Map ;
1819import java .util .UUID ;
@@ -165,25 +166,35 @@ public void successfullyWatchAllResourceTypesWithSetBeforeWatchWithRequestVersio
165166
166167 cache .setSnapshot (SingleNodeGroup .GROUP , SNAPSHOT1 );
167168
168- Map <String , WatchAndTracker > watches = Resources .TYPE_URLS .stream ()
169- .collect (Collectors .toMap (
170- typeUrl -> typeUrl ,
171- typeUrl -> {
172- ResponseTracker responseTracker = new ResponseTracker ();
173-
174- Watch watch = cache .createWatch (
175- ADS ,
176- DiscoveryRequest .newBuilder ()
177- .setNode (Node .getDefaultInstance ())
178- .setTypeUrl (typeUrl )
179- .setVersionInfo (SNAPSHOT1 .version (typeUrl ))
180- .addAllResourceNames (SNAPSHOT1 .resources (typeUrl ).keySet ())
181- .build (),
182- SNAPSHOT2 .resources (typeUrl ).keySet (),
183- responseTracker );
184-
185- return new WatchAndTracker (watch , responseTracker );
186- }));
169+ ResponseOrderTracker responseOrderTracker = new ResponseOrderTracker ();
170+
171+ HashMap <String , WatchAndTracker > watches = new HashMap <>();
172+
173+ for (int i = 0 ; i < 2 ; ++i ) {
174+ watches .putAll (Resources .TYPE_URLS .stream ()
175+ .collect (Collectors .toMap (
176+ typeUrl -> typeUrl ,
177+ typeUrl -> {
178+ ResponseTracker responseTracker = new ResponseTracker ();
179+
180+ Watch watch = cache .createWatch (
181+ ADS ,
182+ DiscoveryRequest .newBuilder ()
183+ .setNode (Node .getDefaultInstance ())
184+ .setTypeUrl (typeUrl )
185+ .setVersionInfo (SNAPSHOT1 .version (typeUrl ))
186+ .addAllResourceNames (SNAPSHOT1 .resources (typeUrl ).keySet ())
187+ .build (),
188+ SNAPSHOT2 .resources (typeUrl ).keySet (),
189+ r -> {
190+ responseTracker .accept (r );
191+ responseOrderTracker .accept (r );
192+ });
193+
194+ return new WatchAndTracker (watch , responseTracker );
195+ }))
196+ );
197+ }
187198
188199 // The request version matches the current snapshot version, so the watches shouldn't receive any responses.
189200 for (String typeUrl : Resources .TYPE_URLS ) {
@@ -195,6 +206,12 @@ public void successfullyWatchAllResourceTypesWithSetBeforeWatchWithRequestVersio
195206 for (String typeUrl : Resources .TYPE_URLS ) {
196207 assertThatWatchReceivesSnapshot (watches .get (typeUrl ), SNAPSHOT2 );
197208 }
209+
210+ // Verify that CDS and LDS always get triggered before EDS and RDS respectively.
211+ assertThat (responseOrderTracker .responseTypes ).containsExactly (Resources .CLUSTER_TYPE_URL ,
212+ Resources .CLUSTER_TYPE_URL , Resources .ENDPOINT_TYPE_URL , Resources .ENDPOINT_TYPE_URL ,
213+ Resources .LISTENER_TYPE_URL , Resources .LISTENER_TYPE_URL , Resources .ROUTE_TYPE_URL ,
214+ Resources .ROUTE_TYPE_URL , Resources .SECRET_TYPE_URL , Resources .SECRET_TYPE_URL );
198215 }
199216
200217 @ Test
@@ -457,6 +474,16 @@ private static class ResponseTracker implements Consumer<Response> {
457474 public void accept (Response response ) {
458475 responses .add (response );
459476 }
477+
478+ }
479+
480+ private static class ResponseOrderTracker implements Consumer <Response > {
481+
482+ private final LinkedList <String > responseTypes = new LinkedList <>();
483+
484+ @ Override public void accept (Response response ) {
485+ responseTypes .add (response .request ().getTypeUrl ());
486+ }
460487 }
461488
462489 private static class SingleNodeGroup implements NodeGroup <String > {
0 commit comments