Add CTS for registerBestMatchingNetworkCallback

Bug: 188657173
Test: atest CtsNetTestCases:android.net.cts.NetworkAgentTest \
      CtsNetTestCases:android.net.cts.ConnectivityManagerTest
Test: atest CtsNetTestCasesLatestSdk:android.net.cts.NetworkAgentTest \
      CtsNetTestCasesLatestSdk:android.net.cts.ConnectivityManagerTest
      on R device
Merged-In: I81abc1742a3aa965b444d0196f4eaa2393dcad1c
Change-Id: I81abc1742a3aa965b444d0196f4eaa2393dcad1c
  (cherry-picked from aosp/1727824)
This commit is contained in:
Junyu Lai
2021-05-21 02:56:31 +00:00
parent e5bdc06735
commit 512efafd32
2 changed files with 85 additions and 0 deletions

View File

@@ -650,6 +650,18 @@ public class ConnectivityManagerTest {
mCm.getBackgroundDataSetting(); mCm.getBackgroundDataSetting();
} }
private NetworkRequest makeDefaultRequest() {
// Make a request that is similar to the way framework tracks the system
// default network.
return new NetworkRequest.Builder()
.clearCapabilities()
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
}
private NetworkRequest makeWifiNetworkRequest() { private NetworkRequest makeWifiNetworkRequest() {
return new NetworkRequest.Builder() return new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
@@ -688,12 +700,14 @@ public class ConnectivityManagerTest {
final TestNetworkCallback systemDefaultCallback = new TestNetworkCallback(); final TestNetworkCallback systemDefaultCallback = new TestNetworkCallback();
final TestNetworkCallback perUidCallback = new TestNetworkCallback(); final TestNetworkCallback perUidCallback = new TestNetworkCallback();
final TestNetworkCallback bestMatchingCallback = new TestNetworkCallback();
final Handler h = new Handler(Looper.getMainLooper()); final Handler h = new Handler(Looper.getMainLooper());
if (TestUtils.shouldTestSApis()) { if (TestUtils.shouldTestSApis()) {
runWithShellPermissionIdentity(() -> { runWithShellPermissionIdentity(() -> {
mCmShim.registerSystemDefaultNetworkCallback(systemDefaultCallback, h); mCmShim.registerSystemDefaultNetworkCallback(systemDefaultCallback, h);
mCmShim.registerDefaultNetworkCallbackForUid(Process.myUid(), perUidCallback, h); mCmShim.registerDefaultNetworkCallbackForUid(Process.myUid(), perUidCallback, h);
}, NETWORK_SETTINGS); }, NETWORK_SETTINGS);
mCm.registerBestMatchingNetworkCallback(makeDefaultRequest(), bestMatchingCallback, h);
} }
Network wifiNetwork = null; Network wifiNetwork = null;
@@ -719,6 +733,10 @@ public class ConnectivityManagerTest {
assertNotNull("Did not receive onAvailable on per-UID default network callback", assertNotNull("Did not receive onAvailable on per-UID default network callback",
perUidNetwork); perUidNetwork);
assertEquals(defaultNetwork, perUidNetwork); assertEquals(defaultNetwork, perUidNetwork);
final Network bestMatchingNetwork = bestMatchingCallback.waitForAvailable();
assertNotNull("Did not receive onAvailable on best matching network callback",
bestMatchingNetwork);
assertEquals(defaultNetwork, bestMatchingNetwork);
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
@@ -729,6 +747,7 @@ public class ConnectivityManagerTest {
if (TestUtils.shouldTestSApis()) { if (TestUtils.shouldTestSApis()) {
mCm.unregisterNetworkCallback(systemDefaultCallback); mCm.unregisterNetworkCallback(systemDefaultCallback);
mCm.unregisterNetworkCallback(perUidCallback); mCm.unregisterNetworkCallback(perUidCallback);
mCm.unregisterNetworkCallback(bestMatchingCallback);
} }
} }
} }

View File

@@ -66,6 +66,7 @@ import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnSta
import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnStopSocketKeepalive import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnStopSocketKeepalive
import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnValidationStatus import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnValidationStatus
import android.os.Build import android.os.Build
import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
@@ -331,6 +332,15 @@ class NetworkAgentTest {
callbacksToCleanUp.add(callback) callbacksToCleanUp.add(callback)
} }
private fun registerBestMatchingNetworkCallback(
request: NetworkRequest,
callback: TestableNetworkCallback,
handler: Handler
) {
mCM!!.registerBestMatchingNetworkCallback(request, callback, handler)
callbacksToCleanUp.add(callback)
}
private fun makeTestNetworkRequest(specifier: String? = null): NetworkRequest { private fun makeTestNetworkRequest(specifier: String? = null): NetworkRequest {
return NetworkRequest.Builder() return NetworkRequest.Builder()
.clearCapabilities() .clearCapabilities()
@@ -868,4 +878,60 @@ class NetworkAgentTest {
val testNetworkSnapshot = snapshots.findLast { it.network == agent.network } val testNetworkSnapshot = snapshots.findLast { it.network == agent.network }
assertEquals(imsi, testNetworkSnapshot!!.subscriberId) assertEquals(imsi, testNetworkSnapshot!!.subscriberId)
} }
@Test
@IgnoreUpTo(Build.VERSION_CODES.R)
// TODO: Refactor helper functions to util class and move this test case to
// {@link android.net.cts.ConnectivityManagerTest}.
fun testRegisterBestMatchingNetworkCallback() {
// Register best matching network callback with additional condition that will be
// exercised later. This assumes the test network agent has NOT_VCN_MANAGED in it and
// does not have NET_CAPABILITY_TEMPORARILY_NOT_METERED.
val bestMatchingCb = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
registerBestMatchingNetworkCallback(NetworkRequest.Builder()
.clearCapabilities()
.addTransportType(TRANSPORT_TEST)
.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
.build(), bestMatchingCb, mHandlerThread.threadHandler)
val (agent1, _) = createConnectedNetworkAgent(specifier = "AGENT-1")
bestMatchingCb.expectAvailableThenValidatedCallbacks(agent1.network!!)
// Make agent1 worse so when agent2 shows up, the callback will see that.
agent1.sendNetworkScore(NetworkScore.Builder().setExiting(true).build())
bestMatchingCb.assertNoCallback(NO_CALLBACK_TIMEOUT)
val (agent2, _) = createConnectedNetworkAgent(specifier = "AGENT-2")
bestMatchingCb.expectAvailableDoubleValidatedCallbacks(agent2.network!!)
// Change something on agent1 to trigger capabilities changed, since the callback
// only cares about the best network, verify it received nothing from agent1.
val ncAgent1 = agent1.nc
ncAgent1.addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)
agent1.sendNetworkCapabilities(ncAgent1)
bestMatchingCb.assertNoCallback(NO_CALLBACK_TIMEOUT)
// Make agent1 the best network again, verify the callback now tracks agent1.
agent1.sendNetworkScore(NetworkScore.Builder()
.setExiting(false).setTransportPrimary(true).build())
bestMatchingCb.expectAvailableCallbacks(agent1.network!!)
// Make agent1 temporary vcn managed, which will not satisfying the request.
// Verify the callback switch from/to the other network accordingly.
ncAgent1.removeCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
agent1.sendNetworkCapabilities(ncAgent1)
bestMatchingCb.expectAvailableCallbacks(agent2.network!!)
ncAgent1.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
agent1.sendNetworkCapabilities(ncAgent1)
bestMatchingCb.expectAvailableDoubleValidatedCallbacks(agent1.network!!)
// Verify the callback doesn't care about agent2 disconnect.
agent2.unregister()
agentsToCleanUp.remove(agent2)
bestMatchingCb.assertNoCallback()
agent1.unregister()
agentsToCleanUp.remove(agent1)
bestMatchingCb.expectCallback<Lost>(agent1.network!!)
// tearDown() will unregister the requests and agents
}
} }