@@ -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 );
@@ -826,6 +828,17 @@ public void handleEdsResource_noHealthyEndpoint() {
826828
827829 @ Test
828830 public void onlyLogicalDnsCluster_endpointsResolved () {
831+ do_onlyLogicalDnsCluster_endpointsResolved ();
832+ }
833+
834+ @ Test
835+ public void oldListenerCallback_onlyLogicalDnsCluster_endpointsResolved () {
836+ nsRegistry .deregister (fakeNameResolverProvider );
837+ nsRegistry .register (new FakeNameResolverProvider (true ));
838+ do_onlyLogicalDnsCluster_endpointsResolved ();
839+ }
840+
841+ void do_onlyLogicalDnsCluster_endpointsResolved () {
829842 ClusterResolverConfig config = new ClusterResolverConfig (
830843 Collections .singletonList (logicalDnsDiscoveryMechanism ), roundRobin , false );
831844 deliverLbConfig (config );
@@ -854,7 +867,6 @@ public void onlyLogicalDnsCluster_endpointsResolved() {
854867 .get (XdsAttributes .ATTR_ADDRESS_NAME )).isEqualTo (DNS_HOST_NAME );
855868 assertThat (childBalancer .addresses .get (1 ).getAttributes ()
856869 .get (XdsAttributes .ATTR_ADDRESS_NAME )).isEqualTo (DNS_HOST_NAME );
857-
858870 }
859871
860872 @ Test
@@ -874,37 +886,48 @@ public void onlyLogicalDnsCluster_handleRefreshNameResolution() {
874886 }
875887
876888 @ Test
877- public void onlyLogicalDnsCluster_resolutionError_backoffAndRefresh () {
889+ public void resolutionError_backoffAndRefresh () {
890+ do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh ();
891+ }
892+
893+ @ Test
894+ public void oldListenerCallback_resolutionError_backoffAndRefresh () {
895+ nsRegistry .deregister (fakeNameResolverProvider );
896+ nsRegistry .register (new FakeNameResolverProvider (true ));
897+ do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh ();
898+ }
899+
900+ void do_onlyLogicalDnsCluster_resolutionError_backoffAndRefresh () {
878901 InOrder inOrder = Mockito .inOrder (helper , backoffPolicyProvider ,
879- backoffPolicy1 , backoffPolicy2 );
902+ backoffPolicy1 , backoffPolicy2 );
880903 ClusterResolverConfig config = new ClusterResolverConfig (
881- Collections .singletonList (logicalDnsDiscoveryMechanism ), roundRobin , false );
904+ Collections .singletonList (logicalDnsDiscoveryMechanism ), roundRobin , false );
882905 deliverLbConfig (config );
883906 FakeNameResolver resolver = assertResolverCreated ("/" + DNS_HOST_NAME );
884907 assertThat (childBalancers ).isEmpty ();
885908 Status error = Status .UNAVAILABLE .withDescription ("cannot reach DNS server" );
886909 resolver .deliverError (error );
887910 inOrder .verify (helper ).updateBalancingState (
888- eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
911+ eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
889912 assertPicker (pickerCaptor .getValue (), error , null );
890913 assertThat (resolver .refreshCount ).isEqualTo (0 );
891914 inOrder .verify (backoffPolicyProvider ).get ();
892915 inOrder .verify (backoffPolicy1 ).nextBackoffNanos ();
893916 assertThat (fakeClock .getPendingTasks ()).hasSize (1 );
894917 assertThat (Iterables .getOnlyElement (fakeClock .getPendingTasks ()).getDelay (TimeUnit .SECONDS ))
895- .isEqualTo (1L );
918+ .isEqualTo (1L );
896919 fakeClock .forwardTime (1L , TimeUnit .SECONDS );
897920 assertThat (resolver .refreshCount ).isEqualTo (1 );
898921
899922 error = Status .UNKNOWN .withDescription ("I am lost" );
900923 resolver .deliverError (error );
901924 inOrder .verify (helper ).updateBalancingState (
902- eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
925+ eq (ConnectivityState .TRANSIENT_FAILURE ), pickerCaptor .capture ());
903926 inOrder .verify (backoffPolicy1 ).nextBackoffNanos ();
904927 assertPicker (pickerCaptor .getValue (), error , null );
905928 assertThat (fakeClock .getPendingTasks ()).hasSize (1 );
906929 assertThat (Iterables .getOnlyElement (fakeClock .getPendingTasks ()).getDelay (TimeUnit .SECONDS ))
907- .isEqualTo (10L );
930+ .isEqualTo (10L );
908931 fakeClock .forwardTime (10L , TimeUnit .SECONDS );
909932 assertThat (resolver .refreshCount ).isEqualTo (2 );
910933
@@ -914,7 +937,7 @@ public void onlyLogicalDnsCluster_resolutionError_backoffAndRefresh() {
914937 resolver .deliverEndpointAddresses (Arrays .asList (endpoint1 , endpoint2 ));
915938 assertThat (childBalancers ).hasSize (1 );
916939 assertAddressesEqual (Arrays .asList (endpoint1 , endpoint2 ),
917- Iterables .getOnlyElement (childBalancers ).addresses );
940+ Iterables .getOnlyElement (childBalancers ).addresses );
918941
919942 assertThat (fakeClock .getPendingTasks ()).isEmpty ();
920943 inOrder .verifyNoMoreInteractions ();
@@ -1319,10 +1342,18 @@ void deliverError(Status error) {
13191342 }
13201343
13211344 private class FakeNameResolverProvider extends NameResolverProvider {
1345+ private final boolean useOldListenerCallback ;
1346+
1347+ private FakeNameResolverProvider (boolean useOldListenerCallback ) {
1348+ this .useOldListenerCallback = useOldListenerCallback ;
1349+ }
1350+
13221351 @ Override
13231352 public NameResolver newNameResolver (URI targetUri , NameResolver .Args args ) {
13241353 assertThat (targetUri .getScheme ()).isEqualTo ("dns" );
1325- FakeNameResolver resolver = new FakeNameResolver (targetUri );
1354+ FakeNameResolver resolver = useOldListenerCallback
1355+ ? new FakeNameResolverUsingOldListenerCallback (targetUri )
1356+ : new FakeNameResolver (targetUri );
13261357 resolvers .add (resolver );
13271358 return resolver ;
13281359 }
@@ -1343,9 +1374,10 @@ protected int priority() {
13431374 }
13441375 }
13451376
1377+
13461378 private class FakeNameResolver extends NameResolver {
13471379 private final URI targetUri ;
1348- private Listener2 listener ;
1380+ protected Listener2 listener ;
13491381 private int refreshCount ;
13501382
13511383 private FakeNameResolver (URI targetUri ) {
@@ -1372,12 +1404,33 @@ public void shutdown() {
13721404 resolvers .remove (this );
13731405 }
13741406
1375- private void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
1407+ protected void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
1408+ syncContext .execute (() -> {
1409+ Status ret = listener .onResult2 (ResolutionResult .newBuilder ()
1410+ .setAddressesOrError (StatusOr .fromValue (addresses )).build ());
1411+ assertThat (ret .getCode ()).isEqualTo (Status .Code .OK );
1412+ });
1413+ }
1414+
1415+ protected void deliverError (Status error ) {
1416+ syncContext .execute (() -> listener .onResult2 (ResolutionResult .newBuilder ()
1417+ .setAddressesOrError (StatusOr .fromStatus (error )).build ()));
1418+ }
1419+ }
1420+
1421+ private class FakeNameResolverUsingOldListenerCallback extends FakeNameResolver {
1422+ private FakeNameResolverUsingOldListenerCallback (URI targetUri ) {
1423+ super (targetUri );
1424+ }
1425+
1426+ @ Override
1427+ protected void deliverEndpointAddresses (List <EquivalentAddressGroup > addresses ) {
13761428 listener .onResult (ResolutionResult .newBuilder ()
1377- .setAddressesOrError (StatusOr .fromValue (addresses )).build ());
1429+ .setAddressesOrError (StatusOr .fromValue (addresses )).build ());
13781430 }
13791431
1380- private void deliverError (Status error ) {
1432+ @ Override
1433+ protected void deliverError (Status error ) {
13811434 listener .onError (error );
13821435 }
13831436 }
0 commit comments