Merge "Add common parameters to reduce duplicated code"

This commit is contained in:
Paul Hu
2022-07-14 08:00:16 +00:00
committed by Gerrit Code Review

View File

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