@@ -1666,6 +1666,36 @@ public void rdsResourceUpdated() {
16661666 TIME_INCREMENT * 2 );
16671667 }
16681668
1669+ @ Test
1670+ public void rdsResourceInvalid () {
1671+ xdsClient .watchXdsResource (XdsRouteConfigureResource .getInstance (), "A" , rdsResourceWatcher );
1672+ xdsClient .watchXdsResource (XdsRouteConfigureResource .getInstance (), "B" , rdsResourceWatcher );
1673+ DiscoveryRpcCall call = resourceDiscoveryCalls .poll ();
1674+ assertThat (call ).isNotNull ();
1675+ verifyResourceMetadataRequested (RDS , "A" );
1676+ verifyResourceMetadataRequested (RDS , "B" );
1677+ verifySubscribedResourcesMetadataSizes (0 , 0 , 2 , 0 );
1678+
1679+ // RDS -> {A, B}, version 1
1680+ // Failed to parse endpoint B
1681+ List <Message > vhostsV1 = mf .buildOpaqueVirtualHosts (1 );
1682+ ImmutableMap <String , Any > resourcesV1 = ImmutableMap .of (
1683+ "A" , Any .pack (mf .buildRouteConfiguration ("A" , vhostsV1 )),
1684+ "B" , Any .pack (mf .buildRouteConfigurationInvalid ("B" )));
1685+ call .sendResponse (RDS , resourcesV1 .values ().asList (), VERSION_1 , "0000" );
1686+
1687+ // {A} -> ACK, version 1
1688+ // {B} -> NACK, version 1, rejected version 1, rejected reason: Failed to parse B
1689+ List <String > errorsV1 =
1690+ ImmutableList .of ("RDS response RouteConfiguration 'B' validation error: " );
1691+ verifyResourceMetadataAcked (RDS , "A" , resourcesV1 .get ("A" ), VERSION_1 , TIME_INCREMENT );
1692+ verifyResourceMetadataNacked (RDS , "B" , null , "" , 0 ,
1693+ VERSION_1 , TIME_INCREMENT , errorsV1 , false );
1694+ // Check metric data.
1695+ verifyResourceValidInvalidCount (1 , 1 , 1 , xdsServerInfo .target (), RDS .typeUrl ());
1696+ verifySubscribedResourcesMetadataSizes (0 , 0 , 2 , 0 );
1697+ }
1698+
16691699 @ Test
16701700 public void rdsResourceDeletedByLdsApiListener () {
16711701 xdsClient .watchXdsResource (XdsListenerResource .getInstance (), LDS_RESOURCE ,
0 commit comments