Merge "Add test for CSM#[get|set]MobileDataPreferredUids"
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index 84430a6..8b57a92 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -198,6 +198,7 @@
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;
@@ -2555,4 +2556,75 @@
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<Integer> 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<Integer> 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);
+ }
+ }
}