Merge changes I53ebf1bb,I8540af27
* changes: Enable new NsdManager backend on U+ Update NsdManagerTest for newer backend usage
This commit is contained in:
@@ -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 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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"))
|
||||||
assertNull(resolvedService.attributes["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"])
|
||||||
|
}
|
||||||
assertEquals(localPort, resolvedService.port)
|
assertEquals(localPort, resolvedService.port)
|
||||||
|
|
||||||
// Unregister the service
|
// Unregister the service
|
||||||
|
|||||||
Reference in New Issue
Block a user