@@ -200,6 +200,7 @@ public XdsClient returnObject(Object object) {
200200 private ArgumentCaptor <SubchannelPicker > pickerCaptor ;
201201 private int xdsClientRefs ;
202202 private ClusterResolverLoadBalancer loadBalancer ;
203+ private NameResolverProvider fakeNameResolverProvider ;
203204
204205 @ Before
205206 public void setUp () throws URISyntaxException {
@@ -216,7 +217,8 @@ public void setUp() throws URISyntaxException {
216217 .setServiceConfigParser (mock (ServiceConfigParser .class ))
217218 .setChannelLogger (mock (ChannelLogger .class ))
218219 .build ();
219- nsRegistry .register (new FakeNameResolverProvider ());
220+ fakeNameResolverProvider = new FakeNameResolverProvider (false );
221+ nsRegistry .register (fakeNameResolverProvider );
220222 when (helper .getNameResolverRegistry ()).thenReturn (nsRegistry );
221223 when (helper .getNameResolverArgs ()).thenReturn (args );
222224 when (helper .getSynchronizationContext ()).thenReturn (syncContext );
@@ -857,6 +859,41 @@ public void onlyLogicalDnsCluster_endpointsResolved() {
857859
858860 }
859861
862+ @ Test
863+ public void oldListenerCallback_onlyLogicalDnsCluster_endpointsResolved () {
864+ nsRegistry .deregister (fakeNameResolverProvider );
865+ nsRegistry .register (new FakeNameResolverProvider (true ));
866+ ClusterResolverConfig config = new ClusterResolverConfig (
867+ Collections .singletonList (logicalDnsDiscoveryMechanism ), roundRobin , false );
868+ deliverLbConfig (config );
869+ FakeNameResolver resolver = assertResolverCreated ("/" + DNS_HOST_NAME );
870+ assertThat (childBalancers ).isEmpty ();
871+ EquivalentAddressGroup endpoint1 = makeAddress ("endpoint-addr-1" );
872+ EquivalentAddressGroup endpoint2 = makeAddress ("endpoint-addr-2" );
873+ resolver .deliverEndpointAddresses (Arrays .asList (endpoint1 , endpoint2 ));
874+
875+ assertThat (childBalancers ).hasSize (1 );
876+ FakeLoadBalancer childBalancer = Iterables .getOnlyElement (childBalancers );
877+ assertThat (childBalancer .name ).isEqualTo (PRIORITY_POLICY_NAME );
878+ PriorityLbConfig priorityLbConfig = (PriorityLbConfig ) childBalancer .config ;
879+ String priority = Iterables .getOnlyElement (priorityLbConfig .priorities );
880+ PriorityChildConfig priorityChildConfig = priorityLbConfig .childConfigs .get (priority );
881+ assertThat (priorityChildConfig .ignoreReresolution ).isFalse ();
882+ assertThat (GracefulSwitchLoadBalancerAccessor .getChildProvider (priorityChildConfig .childConfig )
883+ .getPolicyName ())
884+ .isEqualTo (CLUSTER_IMPL_POLICY_NAME );
885+ ClusterImplConfig clusterImplConfig = (ClusterImplConfig )
886+ GracefulSwitchLoadBalancerAccessor .getChildConfig (priorityChildConfig .childConfig );
887+ assertClusterImplConfig (clusterImplConfig , CLUSTER_DNS , null , LRS_SERVER_INFO , 300L , null ,
888+ Collections .<DropOverload >emptyList (), "pick_first" );
889+ assertAddressesEqual (Arrays .asList (endpoint1 , endpoint2 ), childBalancer .addresses );
890+ assertThat (childBalancer .addresses .get (0 ).getAttributes ()
891+ .get (XdsAttributes .ATTR_ADDRESS_NAME )).isEqualTo (DNS_HOST_NAME );
892+ assertThat (childBalancer .addresses .get (1 ).getAttributes ()
893+ .get (XdsAttributes .ATTR_ADDRESS_NAME )).isEqualTo (DNS_HOST_NAME );
894+
895+ }
896+
860897 @ Test
861898 public void onlyLogicalDnsCluster_handleRefreshNameResolution () {
862899 ClusterResolverConfig config = new ClusterResolverConfig (
@@ -920,6 +957,55 @@ public void onlyLogicalDnsCluster_resolutionError_backoffAndRefresh() {
920957 inOrder .verifyNoMoreInteractions ();
921958 }
922959
960+ @ Test
961+ public void oldListenerCallback_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh () {
962+ nsRegistry .deregister (fakeNameResolverProvider );
963+ nsRegistry .register (new FakeNameResolverProvider (true ));
964+ InOrder inOrder = Mockito .inOrder (helper , backoffPolicyProvider ,
965+ backoffPolicy1 , backoffPolicy2 );
966+ ClusterResolverConfig config = new ClusterResolverConfig (
967+ Collections .singletonList (logicalDnsDiscoveryMechanism ), roundRobin , false );
968+ deliverLbConfig (config );
969+ FakeNameResolver resolver = assertResolverCreated ("/" + DNS_HOST_NAME );
970+ assertThat (childBalancers ).isEmpty ();
971+ Status error = Status .UNAVAILABLE .withDescription ("cannot reach DNS server" );
972+ resolver .deliverError (error );
973+ inOrder .verify (helper ).updateBalancingState (
974+ eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
975+ assertPicker (pickerCaptor .getValue (), error , null );
976+ assertThat (resolver .refreshCount ).isEqualTo (0 );
977+ inOrder .verify (backoffPolicyProvider ).get ();
978+ inOrder .verify (backoffPolicy1 ).nextBackoffNanos ();
979+ assertThat (fakeClock .getPendingTasks ()).hasSize (1 );
980+ assertThat (Iterables .getOnlyElement (fakeClock .getPendingTasks ()).getDelay (TimeUnit .SECONDS ))
981+ .isEqualTo (1L );
982+ fakeClock .forwardTime (1L , TimeUnit .SECONDS );
983+ assertThat (resolver .refreshCount ).isEqualTo (1 );
984+
985+ error = Status .UNKNOWN .withDescription ("I am lost" );
986+ resolver .deliverError (error );
987+ inOrder .verify (helper ).updateBalancingState (
988+ eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
989+ inOrder .verify (backoffPolicy1 ).nextBackoffNanos ();
990+ assertPicker (pickerCaptor .getValue (), error , null );
991+ assertThat (fakeClock .getPendingTasks ()).hasSize (1 );
992+ assertThat (Iterables .getOnlyElement (fakeClock .getPendingTasks ()).getDelay (TimeUnit .SECONDS ))
993+ .isEqualTo (10L );
994+ fakeClock .forwardTime (10L , TimeUnit .SECONDS );
995+ assertThat (resolver .refreshCount ).isEqualTo (2 );
996+
997+ // Succeed.
998+ EquivalentAddressGroup endpoint1 = makeAddress ("endpoint-addr-1" );
999+ EquivalentAddressGroup endpoint2 = makeAddress ("endpoint-addr-2" );
1000+ resolver .deliverEndpointAddresses (Arrays .asList (endpoint1 , endpoint2 ));
1001+ assertThat (childBalancers ).hasSize (1 );
1002+ assertAddressesEqual (Arrays .asList (endpoint1 , endpoint2 ),
1003+ Iterables .getOnlyElement (childBalancers ).addresses );
1004+
1005+ assertThat (fakeClock .getPendingTasks ()).isEmpty ();
1006+ inOrder .verifyNoMoreInteractions ();
1007+ }
1008+
9231009 @ Test
9241010 public void onlyLogicalDnsCluster_refreshNameResolutionRaceWithResolutionError () {
9251011 InOrder inOrder = Mockito .inOrder (backoffPolicyProvider , backoffPolicy1 , backoffPolicy2 );
@@ -1319,10 +1405,18 @@ void deliverError(Status error) {
13191405 }
13201406
13211407 private class FakeNameResolverProvider extends NameResolverProvider {
1408+ private final boolean useOldListenerCallback ;
1409+
1410+ private FakeNameResolverProvider (boolean useOldListenerCallback ) {
1411+ this .useOldListenerCallback = useOldListenerCallback ;
1412+ }
1413+
13221414 @ Override
13231415 public NameResolver newNameResolver (URI targetUri , NameResolver .Args args ) {
13241416 assertThat (targetUri .getScheme ()).isEqualTo ("dns" );
1325- FakeNameResolver resolver = new FakeNameResolver (targetUri );
1417+ FakeNameResolver resolver = useOldListenerCallback
1418+ ? new FakeNameResolverUsingOldListenerCallback (targetUri )
1419+ : new FakeNameResolver (targetUri );
13261420 resolvers .add (resolver );
13271421 return resolver ;
13281422 }
@@ -1343,9 +1437,10 @@ protected int priority() {
13431437 }
13441438 }
13451439
1440+
13461441 private class FakeNameResolver extends NameResolver {
13471442 private final URI targetUri ;
1348- private Listener2 listener ;
1443+ protected Listener2 listener ;
13491444 private int refreshCount ;
13501445
13511446 private FakeNameResolver (URI targetUri ) {
@@ -1372,19 +1467,37 @@ public void shutdown() {
13721467 resolvers .remove (this );
13731468 }
13741469
1375- private void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
1470+ protected void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
1471+ syncContext .execute (() -> listener .onResult2 (ResolutionResult .newBuilder ()
1472+ .setAddressesOrError (StatusOr .fromValue (addresses )).build ()) );
1473+ }
1474+
1475+ protected void deliverError (Status error ) {
1476+ syncContext .execute (() -> listener .onResult2 (ResolutionResult .newBuilder ()
1477+ .setAddressesOrError (StatusOr .fromStatus (error )).build ()));
1478+ }
1479+ }
1480+
1481+ private class FakeNameResolverUsingOldListenerCallback extends FakeNameResolver {
1482+ private FakeNameResolverUsingOldListenerCallback (URI targetUri ) {
1483+ super (targetUri );
1484+ }
1485+
1486+ @ Override
1487+ protected void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
13761488 listener .onResult (ResolutionResult .newBuilder ()
1377- .setAddressesOrError (StatusOr .fromValue (addresses )).build ());
1489+ .setAddressesOrError (StatusOr .fromValue (addresses )).build ());
13781490 }
13791491
1380- private void deliverError (Status error ) {
1492+ @ Override
1493+ protected void deliverError (Status error ) {
13811494 listener .onError (error );
13821495 }
13831496 }
13841497
13851498 private final class FakeLoadBalancerProvider extends LoadBalancerProvider {
13861499 private final String policyName ;
1387-
1500+
13881501 FakeLoadBalancerProvider (String policyName ) {
13891502 this .policyName = policyName ;
13901503 }
0 commit comments