From eae8529fc6542691ba2f0c1262f3ab8732e4434b Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Fri, 12 May 2023 11:19:29 +0900 Subject: [PATCH] Add test for subtype discovery/advertising Check that advertised subtypes can be found by matching discoveries and discoveries for the base type, and that discoveries for different subtypes do not find the service. Bug: 266167702 Test: atest Change-Id: I0a8249cca22c1d30baad12bb4e8351a65ce87cb1 --- .../net/src/android/net/cts/NsdManagerTest.kt | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/NsdManagerTest.kt b/tests/cts/net/src/android/net/cts/NsdManagerTest.kt index 88b9baff1e..98081378ea 100644 --- a/tests/cts/net/src/android/net/cts/NsdManagerTest.kt +++ b/tests/cts/net/src/android/net/cts/NsdManagerTest.kt @@ -73,8 +73,8 @@ import android.system.OsConstants.ENETUNREACH import android.system.OsConstants.IPPROTO_UDP import android.system.OsConstants.SOCK_DGRAM import android.util.Log +import androidx.test.filters.SmallTest import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.runner.AndroidJUnit4 import com.android.compatibility.common.util.PollingCheck import com.android.compatibility.common.util.PropertyUtil import com.android.modules.utils.build.SdkLevel.isAtLeastU @@ -84,6 +84,8 @@ import com.android.networkstack.apishim.NsdShimImpl import com.android.networkstack.apishim.common.NsdShim import com.android.testutils.ConnectivityModuleTest import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.DevSdkIgnoreRunner import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged import com.android.testutils.TestableNetworkAgent @@ -129,12 +131,15 @@ private const val NO_CALLBACK_TIMEOUT_MS = 200L // tried sequentially private const val REGISTRATION_TIMEOUT_MS = 10_000L private const val DBG = false +private const val TEST_PORT = 12345 private val nsdShim = NsdShimImpl.newInstance() @AppModeFull(reason = "Socket cannot bind in instant app mode") -@RunWith(AndroidJUnit4::class) +@RunWith(DevSdkIgnoreRunner::class) +@SmallTest @ConnectivityModuleTest +@IgnoreUpTo(Build.VERSION_CODES.S_V2) class NsdManagerTest { // Rule used to filter CtsNetTestCasesMaxTargetSdkXX @get:Rule @@ -436,6 +441,13 @@ class NsdManagerTest { return agent } + private fun makeTestServiceInfo(network: Network? = null) = NsdServiceInfo().also { + it.serviceType = serviceType + it.serviceName = serviceName + it.network = network + it.port = TEST_PORT + } + @After fun tearDown() { if (TestUtils.shouldTestTApis()) { @@ -1048,6 +1060,52 @@ class NsdManagerTest { assertEquals(NsdManager.FAILURE_OPERATION_NOT_RUNNING, failedCb.errorCode) } + @Test + fun testSubtypeAdvertisingAndDiscovery() { + val si = makeTestServiceInfo(network = testNetwork1.network) + // Test "_type._tcp.local,_subtype" syntax with the registration + si.serviceType = si.serviceType + ",_subtype" + + val registrationRecord = NsdRegistrationRecord() + + val baseTypeDiscoveryRecord = NsdDiscoveryRecord() + val subtypeDiscoveryRecord = NsdDiscoveryRecord() + val otherSubtypeDiscoveryRecord = NsdDiscoveryRecord() + tryTest { + registerService(registrationRecord, si) + + // Test "_subtype._type._tcp.local" syntax with discovery. Note this is not + // "_subtype._sub._type._tcp.local". + nsdManager.discoverServices(serviceType, + NsdManager.PROTOCOL_DNS_SD, + testNetwork1.network, Executor { it.run() }, baseTypeDiscoveryRecord) + nsdManager.discoverServices("_othersubtype.$serviceType", + NsdManager.PROTOCOL_DNS_SD, + testNetwork1.network, Executor { it.run() }, otherSubtypeDiscoveryRecord) + nsdManager.discoverServices("_subtype.$serviceType", + NsdManager.PROTOCOL_DNS_SD, + testNetwork1.network, Executor { it.run() }, subtypeDiscoveryRecord) + + subtypeDiscoveryRecord.waitForServiceDiscovered( + serviceName, serviceType, testNetwork1.network) + baseTypeDiscoveryRecord.waitForServiceDiscovered( + serviceName, serviceType, testNetwork1.network) + otherSubtypeDiscoveryRecord.expectCallback() + // The subtype callback was registered later but called, no need for an extra delay + otherSubtypeDiscoveryRecord.assertNoCallback(timeoutMs = 0) + } cleanupStep { + nsdManager.stopServiceDiscovery(baseTypeDiscoveryRecord) + nsdManager.stopServiceDiscovery(subtypeDiscoveryRecord) + nsdManager.stopServiceDiscovery(otherSubtypeDiscoveryRecord) + + baseTypeDiscoveryRecord.expectCallback() + subtypeDiscoveryRecord.expectCallback() + otherSubtypeDiscoveryRecord.expectCallback() + } cleanup { + nsdManager.unregisterService(registrationRecord) + } + } + /** * Register a service and return its registration record. */