Add test for CSM#[get|set]MobileDataPreferredUids

Bug: 171872461
Test: atest ConnectivityManagerTest
Change-Id: I43dfb049c271602526fa3e89ebb91219c7785a21
This commit is contained in:
paulhu
2021-06-17 07:18:07 +00:00
parent 27586f8210
commit 8c96badb5d

View File

@@ -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<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);
}
}
}