Merge "Add APIs for discovery with a network request"
This commit is contained in:
@@ -4,6 +4,7 @@ package android.net.nsd {
|
|||||||
public final class NsdManager {
|
public final class NsdManager {
|
||||||
method public void discoverServices(String, int, android.net.nsd.NsdManager.DiscoveryListener);
|
method public void discoverServices(String, int, android.net.nsd.NsdManager.DiscoveryListener);
|
||||||
method public void discoverServices(@NonNull String, int, @Nullable android.net.Network, @NonNull android.net.nsd.NsdManager.DiscoveryListener);
|
method public void discoverServices(@NonNull String, int, @Nullable android.net.Network, @NonNull android.net.nsd.NsdManager.DiscoveryListener);
|
||||||
|
method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void discoverServices(@NonNull String, int, @NonNull android.net.NetworkRequest, @NonNull android.net.nsd.NsdManager.DiscoveryListener);
|
||||||
method public void registerService(android.net.nsd.NsdServiceInfo, int, android.net.nsd.NsdManager.RegistrationListener);
|
method public void registerService(android.net.nsd.NsdServiceInfo, int, android.net.nsd.NsdManager.RegistrationListener);
|
||||||
method public void resolveService(android.net.nsd.NsdServiceInfo, android.net.nsd.NsdManager.ResolveListener);
|
method public void resolveService(android.net.nsd.NsdServiceInfo, android.net.nsd.NsdManager.ResolveListener);
|
||||||
method public void stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener);
|
method public void stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener);
|
||||||
|
|||||||
@@ -264,21 +264,27 @@ class NsdManagerTest {
|
|||||||
.addTransportType(TRANSPORT_TEST)
|
.addTransportType(TRANSPORT_TEST)
|
||||||
.setNetworkSpecifier(testNetworkSpecifier)
|
.setNetworkSpecifier(testNetworkSpecifier)
|
||||||
.build(), cb)
|
.build(), cb)
|
||||||
|
val agent = registerTestNetworkAgent(iface.interfaceName)
|
||||||
|
val network = agent.network ?: fail("Registered agent should have a network")
|
||||||
|
// The network has no INTERNET capability, so will be marked validated immediately
|
||||||
|
cb.expectAvailableThenValidatedCallbacks(network)
|
||||||
|
return TestTapNetwork(iface, cb, agent, network)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerTestNetworkAgent(ifaceName: String): TestableNetworkAgent {
|
||||||
val agent = TestableNetworkAgent(context, handlerThread.looper,
|
val agent = TestableNetworkAgent(context, handlerThread.looper,
|
||||||
NetworkCapabilities().apply {
|
NetworkCapabilities().apply {
|
||||||
removeCapability(NET_CAPABILITY_TRUSTED)
|
removeCapability(NET_CAPABILITY_TRUSTED)
|
||||||
addTransportType(TRANSPORT_TEST)
|
addTransportType(TRANSPORT_TEST)
|
||||||
setNetworkSpecifier(testNetworkSpecifier)
|
setNetworkSpecifier(TestNetworkSpecifier(ifaceName))
|
||||||
},
|
},
|
||||||
LinkProperties().apply {
|
LinkProperties().apply {
|
||||||
interfaceName = iface.interfaceName
|
interfaceName = ifaceName
|
||||||
},
|
},
|
||||||
NetworkAgentConfig.Builder().build())
|
NetworkAgentConfig.Builder().build())
|
||||||
val network = agent.register()
|
agent.register()
|
||||||
agent.markConnected()
|
agent.markConnected()
|
||||||
// The network has no INTERNET capability, so will be marked validated immediately
|
return agent
|
||||||
cb.expectAvailableThenValidatedCallbacks(network)
|
|
||||||
return TestTapNetwork(iface, cb, agent, network)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -434,6 +440,71 @@ class NsdManagerTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testNsdManager_DiscoverWithNetworkRequest() {
|
||||||
|
// This tests requires shims supporting T+ APIs (discovering on network request)
|
||||||
|
assumeTrue(ConstantsShim.VERSION > SC_V2)
|
||||||
|
|
||||||
|
val si = NsdServiceInfo()
|
||||||
|
si.serviceType = SERVICE_TYPE
|
||||||
|
si.serviceName = this.serviceName
|
||||||
|
si.port = 12345 // Test won't try to connect so port does not matter
|
||||||
|
|
||||||
|
val registrationRecord = NsdRegistrationRecord()
|
||||||
|
val registeredInfo1 = registerService(registrationRecord, si)
|
||||||
|
val discoveryRecord = NsdDiscoveryRecord()
|
||||||
|
|
||||||
|
tryTest {
|
||||||
|
val specifier = TestNetworkSpecifier(testNetwork1.iface.interfaceName)
|
||||||
|
nsdShim.discoverServices(nsdManager, SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
|
||||||
|
NetworkRequest.Builder()
|
||||||
|
.removeCapability(NET_CAPABILITY_TRUSTED)
|
||||||
|
.addTransportType(TRANSPORT_TEST)
|
||||||
|
.setNetworkSpecifier(specifier)
|
||||||
|
.build(),
|
||||||
|
discoveryRecord)
|
||||||
|
|
||||||
|
val discoveryStarted = discoveryRecord.expectCallback<DiscoveryStarted>()
|
||||||
|
assertEquals(SERVICE_TYPE, discoveryStarted.serviceType)
|
||||||
|
|
||||||
|
val serviceDiscovered = discoveryRecord.expectCallback<ServiceFound>()
|
||||||
|
assertEquals(registeredInfo1.serviceName, serviceDiscovered.serviceInfo.serviceName)
|
||||||
|
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceDiscovered.serviceInfo))
|
||||||
|
|
||||||
|
// Unregister, then register the service back: it should be lost and found again
|
||||||
|
nsdManager.unregisterService(registrationRecord)
|
||||||
|
val serviceLost1 = discoveryRecord.expectCallback<ServiceLost>()
|
||||||
|
assertEquals(registeredInfo1.serviceName, serviceLost1.serviceInfo.serviceName)
|
||||||
|
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceLost1.serviceInfo))
|
||||||
|
|
||||||
|
registrationRecord.expectCallback<ServiceUnregistered>()
|
||||||
|
val registeredInfo2 = registerService(registrationRecord, si)
|
||||||
|
val serviceDiscovered2 = discoveryRecord.expectCallback<ServiceFound>()
|
||||||
|
assertEquals(registeredInfo2.serviceName, serviceDiscovered2.serviceInfo.serviceName)
|
||||||
|
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceDiscovered2.serviceInfo))
|
||||||
|
|
||||||
|
// Teardown, then bring back up a network on the test interface: the service should
|
||||||
|
// go away, then come back
|
||||||
|
testNetwork1.agent.unregister()
|
||||||
|
val serviceLost = discoveryRecord.expectCallback<ServiceLost>()
|
||||||
|
assertEquals(registeredInfo2.serviceName, serviceLost.serviceInfo.serviceName)
|
||||||
|
assertEquals(testNetwork1.network, nsdShim.getNetwork(serviceLost.serviceInfo))
|
||||||
|
|
||||||
|
val newAgent = runAsShell(MANAGE_TEST_NETWORKS) {
|
||||||
|
registerTestNetworkAgent(testNetwork1.iface.interfaceName)
|
||||||
|
}
|
||||||
|
val newNetwork = newAgent.network ?: fail("Registered agent should have a network")
|
||||||
|
val serviceDiscovered3 = discoveryRecord.expectCallback<ServiceFound>()
|
||||||
|
assertEquals(registeredInfo2.serviceName, serviceDiscovered3.serviceInfo.serviceName)
|
||||||
|
assertEquals(newNetwork, nsdShim.getNetwork(serviceDiscovered3.serviceInfo))
|
||||||
|
} cleanupStep {
|
||||||
|
nsdManager.stopServiceDiscovery(discoveryRecord)
|
||||||
|
discoveryRecord.expectCallback<DiscoveryStopped>()
|
||||||
|
} cleanup {
|
||||||
|
nsdManager.unregisterService(registrationRecord)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNsdManager_ResolveOnNetwork() {
|
fun testNsdManager_ResolveOnNetwork() {
|
||||||
// This tests requires shims supporting T+ APIs (NsdServiceInfo.network)
|
// This tests requires shims supporting T+ APIs (NsdServiceInfo.network)
|
||||||
|
|||||||
Reference in New Issue
Block a user