From 8c96badb5dbf1d545aa658586d7da3e827d654da Mon Sep 17 00:00:00 2001 From: paulhu Date: Thu, 17 Jun 2021 07:18:07 +0000 Subject: [PATCH] Add test for CSM#[get|set]MobileDataPreferredUids Bug: 171872461 Test: atest ConnectivityManagerTest Change-Id: I43dfb049c271602526fa3e89ebb91219c7785a21 --- .../net/cts/ConnectivityManagerTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java index b249abfae8..32ca02a07c 100644 --- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java +++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java @@ -197,6 +197,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -2519,4 +2520,75 @@ public class ConnectivityManagerTest { NetworkValidationTestUtil.setUrlExpirationDeviceConfig( System.currentTimeMillis() + WIFI_CONNECT_TIMEOUT_MS); } + + @AppModeFull(reason = "Cannot get WifiManager in instant app mode") + @Test + public void testMobileDataPreferredUids() throws Exception { + assumeTrue(TestUtils.shouldTestSApis()); + final boolean canRunTest = mPackageManager.hasSystemFeature(FEATURE_WIFI) + && mPackageManager.hasSystemFeature(FEATURE_TELEPHONY); + assumeTrue("testMobileDataPreferredUidsWithCallback cannot execute" + + " unless device supports both WiFi and telephony", canRunTest); + + final int uid = mPackageManager.getPackageUid(mContext.getPackageName(), 0 /* flag */); + final Set mobileDataPreferredUids = + ConnectivitySettingsManager.getMobileDataPreferredUids(mContext); + // CtsNetTestCases uid should not list in MOBILE_DATA_PREFERRED_UIDS setting because it just + // installs to device. In case the uid is existed in setting mistakenly, try to remove the + // uid and set correct uids to setting. + mobileDataPreferredUids.remove(uid); + ConnectivitySettingsManager.setMobileDataPreferredUids(mContext, mobileDataPreferredUids); + + // For testing mobile data preferred uids feature, it needs both wifi and cell network. + final Network wifiNetwork = mCtsNetUtils.ensureWifiConnected(); + final Network cellNetwork = mCtsNetUtils.connectToCell(); + final TestableNetworkCallback defaultTrackingCb = new TestableNetworkCallback(); + final TestableNetworkCallback systemDefaultCb = new TestableNetworkCallback(); + final Handler h = new Handler(Looper.getMainLooper()); + runWithShellPermissionIdentity(() -> mCm.registerSystemDefaultNetworkCallback( + systemDefaultCb, h), NETWORK_SETTINGS); + mCm.registerDefaultNetworkCallback(defaultTrackingCb); + + try { + // CtsNetTestCases uid is not listed in MOBILE_DATA_PREFERRED_UIDS setting, so the + // per-app default network should be same as system default network. + waitForAvailable(systemDefaultCb, wifiNetwork); + defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, + entry -> wifiNetwork.equals(entry.getNetwork())); + // Active network for CtsNetTestCases uid should be wifi now. + assertEquals(wifiNetwork, mCm.getActiveNetwork()); + + // Add CtsNetTestCases uid to MOBILE_DATA_PREFERRED_UIDS setting, then available per-app + // default network callback should be received with cell network. + final Set newMobileDataPreferredUids = new ArraySet<>(mobileDataPreferredUids); + newMobileDataPreferredUids.add(uid); + ConnectivitySettingsManager.setMobileDataPreferredUids( + mContext, newMobileDataPreferredUids); + defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, + entry -> cellNetwork.equals(entry.getNetwork())); + // System default network doesn't change. + systemDefaultCb.assertNoCallback(); + // Active network for CtsNetTestCases uid should change to cell, too. + assertEquals(cellNetwork, mCm.getActiveNetwork()); + + // Remove CtsNetTestCases uid from MOBILE_DATA_PREFERRED_UIDS setting, then available + // per-app default network callback should be received again with system default network + newMobileDataPreferredUids.remove(uid); + ConnectivitySettingsManager.setMobileDataPreferredUids( + mContext, newMobileDataPreferredUids); + defaultTrackingCb.eventuallyExpect(CallbackEntry.AVAILABLE, NETWORK_CALLBACK_TIMEOUT_MS, + entry -> wifiNetwork.equals(entry.getNetwork())); + // System default network still doesn't change. + systemDefaultCb.assertNoCallback(); + // Active network for CtsNetTestCases uid should change back to wifi. + assertEquals(wifiNetwork, mCm.getActiveNetwork()); + } finally { + mCm.unregisterNetworkCallback(systemDefaultCb); + mCm.unregisterNetworkCallback(defaultTrackingCb); + + // Restore setting. + ConnectivitySettingsManager.setMobileDataPreferredUids( + mContext, mobileDataPreferredUids); + } + } }