Merge changes I53ebf1bb,I8540af27

* changes:
  Enable new NsdManager backend on U+
  Update NsdManagerTest for newer backend usage
This commit is contained in:
Remi NGUYEN VAN
2023-03-09 07:11:08 +00:00
committed by Gerrit Code Review
2 changed files with 69 additions and 14 deletions

View File

@@ -22,6 +22,8 @@ import static android.net.nsd.NsdManager.MDNS_SERVICE_EVENT;
import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
import static android.provider.DeviceConfig.NAMESPACE_TETHERING; import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
import static com.android.modules.utils.build.SdkLevel.isAtLeastU;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
@@ -1343,8 +1345,9 @@ public class NsdService extends INsdManager.Stub {
* @return true if the MdnsDiscoveryManager feature is enabled. * @return true if the MdnsDiscoveryManager feature is enabled.
*/ */
public boolean isMdnsDiscoveryManagerEnabled(Context context) { public boolean isMdnsDiscoveryManagerEnabled(Context context) {
return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, return isAtLeastU() || DeviceConfigUtils.isFeatureEnabled(context,
MDNS_DISCOVERY_MANAGER_VERSION, false /* defaultEnabled */); NAMESPACE_CONNECTIVITY, MDNS_DISCOVERY_MANAGER_VERSION,
false /* defaultEnabled */);
} }
/** /**
@@ -1354,8 +1357,8 @@ public class NsdService extends INsdManager.Stub {
* @return true if the MdnsAdvertiser feature is enabled. * @return true if the MdnsAdvertiser feature is enabled.
*/ */
public boolean isMdnsAdvertiserEnabled(Context context) { public boolean isMdnsAdvertiserEnabled(Context context) {
return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, return isAtLeastU() || DeviceConfigUtils.isFeatureEnabled(context,
MDNS_ADVERTISER_VERSION, false /* defaultEnabled */); NAMESPACE_CONNECTIVITY, MDNS_ADVERTISER_VERSION, false /* defaultEnabled */);
} }
/** /**

View File

@@ -19,6 +19,8 @@ import android.Manifest.permission.MANAGE_TEST_NETWORKS
import android.app.compat.CompatChanges import android.app.compat.CompatChanges
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback import android.net.ConnectivityManager.NetworkCallback
import android.net.InetAddresses.parseNumericAddress
import android.net.LinkAddress
import android.net.LinkProperties import android.net.LinkProperties
import android.net.LocalSocket import android.net.LocalSocket
import android.net.LocalSocketAddress import android.net.LocalSocketAddress
@@ -27,6 +29,7 @@ import android.net.NetworkAgentConfig
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED import android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED
import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkCapabilities.TRANSPORT_TEST import android.net.NetworkCapabilities.TRANSPORT_TEST
import android.net.NetworkRequest import android.net.NetworkRequest
import android.net.TestNetworkInterface import android.net.TestNetworkInterface
@@ -62,18 +65,28 @@ import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import android.os.Process.myTid import android.os.Process.myTid
import android.platform.test.annotations.AppModeFull import android.platform.test.annotations.AppModeFull
import android.system.ErrnoException
import android.system.Os
import android.system.OsConstants.AF_INET6
import android.system.OsConstants.ENETUNREACH
import android.system.OsConstants.IPPROTO_UDP
import android.system.OsConstants.SOCK_DGRAM
import android.util.Log import android.util.Log
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4 import androidx.test.runner.AndroidJUnit4
import com.android.compatibility.common.util.PollingCheck import com.android.compatibility.common.util.PollingCheck
import com.android.compatibility.common.util.PropertyUtil import com.android.compatibility.common.util.PropertyUtil
import com.android.modules.utils.build.SdkLevel.isAtLeastU
import com.android.net.module.util.ArrayTrackRecord import com.android.net.module.util.ArrayTrackRecord
import com.android.net.module.util.TrackRecord import com.android.net.module.util.TrackRecord
import com.android.networkstack.apishim.NsdShimImpl import com.android.networkstack.apishim.NsdShimImpl
import com.android.networkstack.apishim.common.NsdShim import com.android.networkstack.apishim.common.NsdShim
import com.android.testutils.ConnectivityModuleTest import com.android.testutils.ConnectivityModuleTest
import com.android.testutils.DevSdkIgnoreRule import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged
import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
import com.android.testutils.TestableNetworkAgent import com.android.testutils.TestableNetworkAgent
import com.android.testutils.TestableNetworkAgent.CallbackEntry.OnNetworkCreated
import com.android.testutils.TestableNetworkCallback import com.android.testutils.TestableNetworkCallback
import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk30 import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk30
import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk33 import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk33
@@ -82,6 +95,7 @@ import com.android.testutils.tryTest
import com.android.testutils.waitForIdle import com.android.testutils.waitForIdle
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.net.NetworkInterface
import java.net.ServerSocket import java.net.ServerSocket
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.Random import java.util.Random
@@ -353,24 +367,56 @@ class NsdManagerTest {
.build(), cb) .build(), cb)
val agent = registerTestNetworkAgent(iface.interfaceName) val agent = registerTestNetworkAgent(iface.interfaceName)
val network = agent.network ?: fail("Registered agent should have a network") val network = agent.network ?: fail("Registered agent should have a network")
cb.eventuallyExpect<LinkPropertiesChanged>(TIMEOUT_MS) {
it.lp.linkAddresses.isNotEmpty()
}
// The network has no INTERNET capability, so will be marked validated immediately // The network has no INTERNET capability, so will be marked validated immediately
cb.expectAvailableThenValidatedCallbacks(network, TIMEOUT_MS) // It does not matter if validated capabilities come before/after the link addresses change
cb.eventuallyExpect<CapabilitiesChanged>(TIMEOUT_MS, from = 0) {
it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
}
return TestTapNetwork(iface, cb, agent, network) return TestTapNetwork(iface, cb, agent, network)
} }
private fun registerTestNetworkAgent(ifaceName: String): TestableNetworkAgent { private fun registerTestNetworkAgent(ifaceName: String): TestableNetworkAgent {
val lp = LinkProperties().apply {
interfaceName = ifaceName
}
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(ifaceName)) setNetworkSpecifier(TestNetworkSpecifier(ifaceName))
}, }, lp, NetworkAgentConfig.Builder().build())
LinkProperties().apply { val network = agent.register()
interfaceName = ifaceName
},
NetworkAgentConfig.Builder().build())
agent.register()
agent.markConnected() agent.markConnected()
agent.expectCallback<OnNetworkCreated>()
// Wait until the link-local address can be used. Address flags are not available without
// elevated permissions, so check that bindSocket works.
PollingCheck.check("No usable v6 address on interface after $TIMEOUT_MS ms", TIMEOUT_MS) {
val sock = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)
tryTest {
network.bindSocket(sock)
Os.connect(sock, parseNumericAddress("ff02::fb%$ifaceName"), 12345)
true
}.catch<ErrnoException> {
if (it.errno != ENETUNREACH) {
throw it
}
false
} cleanup {
Os.close(sock)
}
}
lp.setLinkAddresses(NetworkInterface.getByName(ifaceName).interfaceAddresses.map {
LinkAddress(it.address, it.networkPrefixLength.toInt())
})
agent.sendLinkProperties(lp)
return agent return agent
} }
@@ -378,8 +424,9 @@ class NsdManagerTest {
fun tearDown() { fun tearDown() {
if (TestUtils.shouldTestTApis()) { if (TestUtils.shouldTestTApis()) {
runAsShell(MANAGE_TEST_NETWORKS) { runAsShell(MANAGE_TEST_NETWORKS) {
testNetwork1.close(cm) // Avoid throwing here if initializing failed in setUp
testNetwork2.close(cm) if (this::testNetwork1.isInitialized) testNetwork1.close(cm)
if (this::testNetwork2.isInitialized) testNetwork2.close(cm)
} }
} }
handlerThread.waitForIdle(TIMEOUT_MS) handlerThread.waitForIdle(TIMEOUT_MS)
@@ -465,7 +512,12 @@ class NsdManagerTest {
assertTrue(resolvedService.attributes.containsKey("nullBinaryDataAttr")) assertTrue(resolvedService.attributes.containsKey("nullBinaryDataAttr"))
assertNull(resolvedService.attributes["nullBinaryDataAttr"]) assertNull(resolvedService.attributes["nullBinaryDataAttr"])
assertTrue(resolvedService.attributes.containsKey("emptyBinaryDataAttr")) assertTrue(resolvedService.attributes.containsKey("emptyBinaryDataAttr"))
// TODO: change the check to target SDK U when this is what the code implements
if (isAtLeastU()) {
assertArrayEquals(byteArrayOf(), resolvedService.attributes["emptyBinaryDataAttr"])
} else {
assertNull(resolvedService.attributes["emptyBinaryDataAttr"]) assertNull(resolvedService.attributes["emptyBinaryDataAttr"])
}
assertEquals(localPort, resolvedService.port) assertEquals(localPort, resolvedService.port)
// Unregister the service // Unregister the service