diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java index 9365beeb47..58d002a035 100644 --- a/tests/unit/java/com/android/server/NsdServiceTest.java +++ b/tests/unit/java/com/android/server/NsdServiceTest.java @@ -86,10 +86,15 @@ import java.util.Queue; @SmallTest @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2) public class NsdServiceTest { - static final int PROTOCOL = NsdManager.PROTOCOL_DNS_SD; private static final long CLEANUP_DELAY_MS = 500; private static final long TIMEOUT_MS = 500; + private static final String SERVICE_NAME = "a_name"; + private static final String SERVICE_TYPE = "a_type"; + private static final String SERVICE_FULL_NAME = SERVICE_NAME + "." + SERVICE_TYPE; + private static final String DOMAIN_NAME = "mytestdevice.local"; + private static final int PORT = 2201; + private static final int IFACE_IDX_ANY = 0; // Records INsdManagerCallback created when NsdService#connect is called. // Only accessed on the test thread, since NsdService#connect is called by the NsdManager @@ -103,6 +108,7 @@ public class NsdServiceTest { @Mock MDnsManager mMockMDnsM; HandlerThread mThread; TestHandler mHandler; + NsdService mService; private static class LinkToDeathRecorder extends Binder { IBinder.DeathRecipient mDr; @@ -134,6 +140,8 @@ public class NsdServiceTest { doReturn(true).when(mMockMDnsM).discover(anyInt(), anyString(), anyInt()); doReturn(true).when(mMockMDnsM).resolve( anyInt(), anyString(), anyString(), anyString(), anyInt()); + + mService = makeService(); } @After @@ -147,18 +155,14 @@ public class NsdServiceTest { @Test @DisableCompatChanges(NsdManager.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS) public void testPreSClients() throws Exception { - NsdService service = makeService(); - // Pre S client connected, the daemon should be started. - connectClient(service); - waitForIdle(); + connectClient(mService); final INsdManagerCallback cb1 = getCallback(); final IBinder.DeathRecipient deathRecipient1 = verifyLinkToDeath(cb1); verify(mMockMDnsM, times(1)).registerEventListener(any()); verify(mMockMDnsM, times(1)).startDaemon(); - connectClient(service); - waitForIdle(); + connectClient(mService); final INsdManagerCallback cb2 = getCallback(); final IBinder.DeathRecipient deathRecipient2 = verifyLinkToDeath(cb2); // Daemon has been started, it should not try to start it again. @@ -178,19 +182,15 @@ public class NsdServiceTest { @Test @EnableCompatChanges(NsdManager.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS) public void testNoDaemonStartedWhenClientsConnect() throws Exception { - final NsdService service = makeService(); - // Creating an NsdManager will not cause daemon startup. - connectClient(service); - waitForIdle(); + connectClient(mService); verify(mMockMDnsM, never()).registerEventListener(any()); verify(mMockMDnsM, never()).startDaemon(); final INsdManagerCallback cb1 = getCallback(); final IBinder.DeathRecipient deathRecipient1 = verifyLinkToDeath(cb1); // Creating another NsdManager will not cause daemon startup either. - connectClient(service); - waitForIdle(); + connectClient(mService); verify(mMockMDnsM, never()).registerEventListener(any()); verify(mMockMDnsM, never()).startDaemon(); final INsdManagerCallback cb2 = getCallback(); @@ -216,70 +216,66 @@ public class NsdServiceTest { @Test @EnableCompatChanges(NsdManager.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS) public void testClientRequestsAreGCedAtDisconnection() throws Exception { - NsdService service = makeService(); - - NsdManager client = connectClient(service); - waitForIdle(); + final NsdManager client = connectClient(mService); final INsdManagerCallback cb1 = getCallback(); final IBinder.DeathRecipient deathRecipient = verifyLinkToDeath(cb1); verify(mMockMDnsM, never()).registerEventListener(any()); verify(mMockMDnsM, never()).startDaemon(); - NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); - request.setPort(2201); + final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE); + request.setPort(PORT); // Client registration request NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); client.registerService(request, PROTOCOL, listener1); waitForIdle(); - verify(mMockMDnsM, times(1)).registerEventListener(any()); - verify(mMockMDnsM, times(1)).startDaemon(); - verify(mMockMDnsM, times(1)).registerService( - eq(2), eq("a_name"), eq("a_type"), eq(2201), any(), eq(0)); + verify(mMockMDnsM).registerEventListener(any()); + verify(mMockMDnsM).startDaemon(); + verify(mMockMDnsM).registerService( + eq(2), eq(SERVICE_NAME), eq(SERVICE_TYPE), eq(PORT), any(), eq(IFACE_IDX_ANY)); // Client discovery request NsdManager.DiscoveryListener listener2 = mock(NsdManager.DiscoveryListener.class); - client.discoverServices("a_type", PROTOCOL, listener2); + client.discoverServices(SERVICE_TYPE, PROTOCOL, listener2); waitForIdle(); - verify(mMockMDnsM, times(1)).discover(eq(3), eq("a_type"), eq(0)); + verify(mMockMDnsM).discover(3 /* id */, SERVICE_TYPE, IFACE_IDX_ANY); // Client resolve request NsdManager.ResolveListener listener3 = mock(NsdManager.ResolveListener.class); client.resolveService(request, listener3); waitForIdle(); - verify(mMockMDnsM, times(1)).resolve( - eq(4), eq("a_name"), eq("a_type"), eq("local."), eq(0)); + verify(mMockMDnsM).resolve( + 4 /* id */, SERVICE_NAME, SERVICE_TYPE, "local." /* domain */, IFACE_IDX_ANY); // Client disconnects, stop the daemon after CLEANUP_DELAY_MS. deathRecipient.binderDied(); verifyDelayMaybeStopDaemon(CLEANUP_DELAY_MS); // checks that request are cleaned - verify(mMockMDnsM, times(1)).stopOperation(eq(2)); - verify(mMockMDnsM, times(1)).stopOperation(eq(3)); - verify(mMockMDnsM, times(1)).stopOperation(eq(4)); + verify(mMockMDnsM).stopOperation(2 /* id */); + verify(mMockMDnsM).stopOperation(3 /* id */); + verify(mMockMDnsM).stopOperation(4 /* id */); } @Test @EnableCompatChanges(NsdManager.RUN_NATIVE_NSD_ONLY_IF_LEGACY_APPS) public void testCleanupDelayNoRequestActive() throws Exception { - NsdService service = makeService(); - NsdManager client = connectClient(service); + final NsdManager client = connectClient(mService); - NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); - request.setPort(2201); + final NsdServiceInfo request = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE); + request.setPort(PORT); NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); client.registerService(request, PROTOCOL, listener1); waitForIdle(); - verify(mMockMDnsM, times(1)).registerEventListener(any()); - verify(mMockMDnsM, times(1)).startDaemon(); + verify(mMockMDnsM).registerEventListener(any()); + verify(mMockMDnsM).startDaemon(); final INsdManagerCallback cb1 = getCallback(); final IBinder.DeathRecipient deathRecipient = verifyLinkToDeath(cb1); - verify(mMockMDnsM, times(1)).registerService( - eq(2), eq("a_name"), eq("a_type"), eq(2201), any(), eq(0)); + verify(mMockMDnsM).registerService( + eq(2), eq(SERVICE_NAME), eq(SERVICE_TYPE), eq(PORT), any(), eq(IFACE_IDX_ANY)); client.unregisterService(listener1); waitForIdle(); - verify(mMockMDnsM, times(1)).stopOperation(eq(2)); + verify(mMockMDnsM).stopOperation(2 /* id */); verifyDelayMaybeStopDaemon(CLEANUP_DELAY_MS); reset(mMockMDnsM); @@ -291,33 +287,28 @@ public class NsdServiceTest { @Test public void testDiscoverOnTetheringDownstream() throws Exception { - NsdService service = makeService(); - NsdManager client = connectClient(service); - - final String serviceType = "a_type"; - final String serviceName = "a_name"; - final String domainName = "mytestdevice.local"; + final NsdManager client = connectClient(mService); final int interfaceIdx = 123; final NsdManager.DiscoveryListener discListener = mock(NsdManager.DiscoveryListener.class); - client.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, discListener); + client.discoverServices(SERVICE_TYPE, PROTOCOL, discListener); waitForIdle(); final ArgumentCaptor listenerCaptor = ArgumentCaptor.forClass(IMDnsEventListener.class); verify(mMockMDnsM).registerEventListener(listenerCaptor.capture()); final ArgumentCaptor discIdCaptor = ArgumentCaptor.forClass(Integer.class); - verify(mMockMDnsM).discover(discIdCaptor.capture(), eq(serviceType), + verify(mMockMDnsM).discover(discIdCaptor.capture(), eq(SERVICE_TYPE), eq(0) /* interfaceIdx */); // NsdManager uses a separate HandlerThread to dispatch callbacks (on ServiceHandler), so // this needs to use a timeout - verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(serviceType); + verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(SERVICE_TYPE); final DiscoveryInfo discoveryInfo = new DiscoveryInfo( discIdCaptor.getValue(), IMDnsEventListener.SERVICE_FOUND, - serviceName, - serviceType, - domainName, + SERVICE_NAME, + SERVICE_TYPE, + DOMAIN_NAME, interfaceIdx, INetd.LOCAL_NET_ID); // LOCAL_NET_ID (99) used on tethering downstreams final IMDnsEventListener eventListener = listenerCaptor.getValue(); @@ -328,8 +319,8 @@ public class NsdServiceTest { ArgumentCaptor.forClass(NsdServiceInfo.class); verify(discListener, timeout(TIMEOUT_MS)).onServiceFound(discoveredInfoCaptor.capture()); final NsdServiceInfo foundInfo = discoveredInfoCaptor.getValue(); - assertEquals(serviceName, foundInfo.getServiceName()); - assertEquals(serviceType, foundInfo.getServiceType()); + assertEquals(SERVICE_NAME, foundInfo.getServiceName()); + assertEquals(SERVICE_TYPE, foundInfo.getServiceType()); assertNull(foundInfo.getHost()); assertNull(foundInfo.getNetwork()); assertEquals(interfaceIdx, foundInfo.getInterfaceIndex()); @@ -340,19 +331,18 @@ public class NsdServiceTest { waitForIdle(); final ArgumentCaptor resolvIdCaptor = ArgumentCaptor.forClass(Integer.class); - verify(mMockMDnsM).resolve(resolvIdCaptor.capture(), eq(serviceName), eq(serviceType), + verify(mMockMDnsM).resolve(resolvIdCaptor.capture(), eq(SERVICE_NAME), eq(SERVICE_TYPE), eq("local.") /* domain */, eq(interfaceIdx)); final int servicePort = 10123; - final String serviceFullName = serviceName + "." + serviceType; final ResolutionInfo resolutionInfo = new ResolutionInfo( resolvIdCaptor.getValue(), IMDnsEventListener.SERVICE_RESOLVED, null /* serviceName */, null /* serviceType */, null /* domain */, - serviceFullName, - domainName, + SERVICE_FULL_NAME, + DOMAIN_NAME, servicePort, new byte[0] /* txtRecord */, interfaceIdx); @@ -362,14 +352,14 @@ public class NsdServiceTest { waitForIdle(); final ArgumentCaptor getAddrIdCaptor = ArgumentCaptor.forClass(Integer.class); - verify(mMockMDnsM).getServiceAddress(getAddrIdCaptor.capture(), eq(domainName), + verify(mMockMDnsM).getServiceAddress(getAddrIdCaptor.capture(), eq(DOMAIN_NAME), eq(interfaceIdx)); final String serviceAddress = "192.0.2.123"; final GetAddressInfo addressInfo = new GetAddressInfo( getAddrIdCaptor.getValue(), IMDnsEventListener.SERVICE_GET_ADDR_SUCCESS, - serviceFullName, + SERVICE_FULL_NAME, serviceAddress, interfaceIdx, INetd.LOCAL_NET_ID); @@ -380,8 +370,8 @@ public class NsdServiceTest { ArgumentCaptor.forClass(NsdServiceInfo.class); verify(resolveListener, timeout(TIMEOUT_MS)).onServiceResolved(resInfoCaptor.capture()); final NsdServiceInfo resolvedService = resInfoCaptor.getValue(); - assertEquals(serviceName, resolvedService.getServiceName()); - assertEquals("." + serviceType, resolvedService.getServiceType()); + assertEquals(SERVICE_NAME, resolvedService.getServiceName()); + assertEquals("." + SERVICE_TYPE, resolvedService.getServiceType()); assertEquals(InetAddresses.parseNumericAddress(serviceAddress), resolvedService.getHost()); assertEquals(servicePort, resolvedService.getPort()); assertNull(resolvedService.getNetwork()); @@ -415,7 +405,10 @@ public class NsdServiceTest { } NsdManager connectClient(NsdService service) { - return new NsdManager(mContext, service); + final NsdManager nsdManager = new NsdManager(mContext, service); + // Wait for client registration done. + waitForIdle(); + return nsdManager; } void verifyDelayMaybeStopDaemon(long cleanupDelayMs) throws Exception {