Loading services/core/java/com/android/server/ConnectivityService.java +19 −2 Original line number Diff line number Diff line Loading @@ -5049,10 +5049,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private void onUserAdded(UserHandle user) { mPermissionMonitor.onUserAdded(user); if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) { handleSetOemNetworkPreference(mOemNetworkPreferences, null); } } private void onUserRemoved(UserHandle user) { mPermissionMonitor.onUserRemoved(user); if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) { handleSetOemNetworkPreference(mOemNetworkPreferences, null); } } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { Loading Loading @@ -9076,7 +9082,7 @@ public class ConnectivityService extends IConnectivityManager.Stub try { listener.onComplete(); } catch (RemoteException e) { loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e); loge("Can't send onComplete in handleSetOemNetworkPreference", e); } } } Loading Loading @@ -9203,6 +9209,14 @@ public class ConnectivityService extends IConnectivityManager.Stub @NonNull final OemNetworkPreferences preference) { final SparseArray<Set<Integer>> uids = new SparseArray<>(); final PackageManager pm = mContext.getPackageManager(); final List<UserHandle> users = mContext.getSystemService(UserManager.class).getUserHandles(true); if (null == users || users.size() == 0) { if (VDBG || DDBG) { log("No users currently available for setting the OEM network preference."); } return uids; } for (final Map.Entry<String, Integer> entry : preference.getNetworkPreferences().entrySet()) { @OemNetworkPreferences.OemNetworkPreference final int pref = entry.getValue(); Loading @@ -9211,7 +9225,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!uids.contains(pref)) { uids.put(pref, new ArraySet<>()); } uids.get(pref).add(uid); for (final UserHandle ui : users) { // Add the rules for all users as this policy is device wide. uids.get(pref).add(UserHandle.getUid(ui, uid)); } } catch (PackageManager.NameNotFoundException e) { // Although this may seem like an error scenario, it is ok that uninstalled // packages are sent on a network preference as the system will watch for Loading tests/net/java/com/android/server/ConnectivityServiceTest.java +189 −27 Original line number Diff line number Diff line Loading @@ -1085,9 +1085,11 @@ public class ConnectivityServiceTest { } } private Set<UidRange> uidRangesForUid(int uid) { private Set<UidRange> uidRangesForUids(int... uids) { final ArraySet<UidRange> ranges = new ArraySet<>(); for (final int uid : uids) { ranges.add(new UidRange(uid, uid)); } return ranges; } Loading Loading @@ -1217,13 +1219,13 @@ public class ConnectivityServiceTest { public void establishForMyUid(LinkProperties lp) throws Exception { final int uid = Process.myUid(); establish(lp, uid, uidRangesForUid(uid), true, true, false); establish(lp, uid, uidRangesForUids(uid), true, true, false); } public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode) throws Exception { final int uid = Process.myUid(); establish(makeLinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet, establish(makeLinkProperties(), uid, uidRangesForUids(uid), validated, hasInternet, isStrictMode); } Loading Loading @@ -1332,7 +1334,7 @@ public class ConnectivityServiceTest { } private void processBroadcastForVpn(Intent intent) { private void processBroadcast(Intent intent) { mServiceContext.sendBroadcast(intent); HandlerUtils.waitForIdle(mVMSHandlerThread, TIMEOUT_MS); waitForIdle(); Loading Loading @@ -1423,6 +1425,7 @@ public class ConnectivityServiceTest { private static final int VPN_UID = UserHandle.getUid(PRIMARY_USER, 10043); private static final UserInfo PRIMARY_USER_INFO = new UserInfo(PRIMARY_USER, "", UserInfo.FLAG_PRIMARY); private static final UserHandle PRIMARY_USER_HANDLE = new UserHandle(PRIMARY_USER); private static final int RESTRICTED_USER = 1; private static final UserInfo RESTRICTED_USER_INFO = new UserInfo(RESTRICTED_USER, "", Loading @@ -1440,6 +1443,8 @@ public class ConnectivityServiceTest { MockitoAnnotations.initMocks(this); when(mUserManager.getAliveUsers()).thenReturn(Arrays.asList(PRIMARY_USER_INFO)); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); when(mUserManager.getUserInfo(PRIMARY_USER)).thenReturn(PRIMARY_USER_INFO); // canHaveRestrictedProfile does not take a userId. It applies to the userId of the context // it was started from, i.e., PRIMARY_USER. Loading Loading @@ -6390,7 +6395,7 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); final Set<UidRange> ranges = uidRangesForUid(uid); final Set<UidRange> ranges = uidRangesForUids(uid); mMockVpn.registerAgent(ranges); mMockVpn.setUnderlyingNetworks(new Network[0]); Loading Loading @@ -6862,7 +6867,7 @@ public class ConnectivityServiceTest { final int uid = Process.myUid(); NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertNotNull("nc=" + nc, nc.getUids()); assertEquals(nc.getUids(), uidRangesForUid(uid)); assertEquals(nc.getUids(), uidRangesForUids(uid)); assertVpnTransportInfo(nc, VpnManager.TYPE_VPN_SERVICE); // Set an underlying network and expect to see the VPN transports change. Loading @@ -6883,7 +6888,7 @@ public class ConnectivityServiceTest { addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); // Send a USER_ADDED broadcast for it. processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); // Expect that the VPN UID ranges contain both |uid| and the UID range for the newly-added // restricted user. Loading @@ -6908,7 +6913,7 @@ public class ConnectivityServiceTest { final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); removedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(removedIntent); processBroadcast(removedIntent); // Expect that the VPN gains the UID range for the restricted user, and that the capability // change made just before that (i.e., loss of TRANSPORT_WIFI) is preserved. Loading Loading @@ -6966,7 +6971,7 @@ public class ConnectivityServiceTest { final Intent addedIntent = new Intent(ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); assertNull(mCm.getActiveNetworkForUid(uid)); assertNull(mCm.getActiveNetworkForUid(restrictedUid)); Loading @@ -6977,7 +6982,7 @@ public class ConnectivityServiceTest { final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); removedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(removedIntent); processBroadcast(removedIntent); assertNull(mCm.getActiveNetworkForUid(uid)); assertNotNull(mCm.getActiveNetworkForUid(restrictedUid)); Loading Loading @@ -7132,7 +7137,7 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUid(Process.myUid()), mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUids(Process.myUid()), new LinkProperties()); mMockVpn.connect(true); waitForIdle(); Loading Loading @@ -7571,7 +7576,7 @@ public class ConnectivityServiceTest { final Intent addedIntent = new Intent(ACTION_USER_UNLOCKED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(userId)); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); // Lockdown VPN disables teardown and enables lockdown. assertFalse(mMockVpn.getEnableTeardown()); Loading Loading @@ -9290,7 +9295,7 @@ public class ConnectivityServiceTest { private void assertUidRangesUpdatedForMyUid(boolean add) throws Exception { final int uid = Process.myUid(); assertVpnUidRangesUpdated(add, uidRangesForUid(uid), uid); assertVpnUidRangesUpdated(add, uidRangesForUids(uid), uid); } private void assertVpnUidRangesUpdated(boolean add, Set<UidRange> vpnRanges, int exemptUid) Loading Loading @@ -9679,7 +9684,7 @@ public class ConnectivityServiceTest { } @Test public void testOemNetworkRequestFactoryCorrectlySetsUids() public void testOemNetworkRequestFactoryMultiplePrefsCorrectlySetsUids() throws Exception { // Arrange PackageManager mocks final String testPackageName2 = "com.google.apps.dialer"; Loading Loading @@ -9709,6 +9714,46 @@ public class ConnectivityServiceTest { assertEquals(testPackageNameUid2, getNriFirstUidRange(nris.get(1)).stop); } @Test public void testOemNetworkRequestFactoryMultipleUsersCorrectlySetsUids() throws Exception { // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); // Arrange PackageManager mocks mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID); // Build OemNetworkPreferences object final int testOemPref = OEM_NETWORK_PREFERENCE_OEM_PAID; final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() .addNetworkPreference(TEST_PACKAGE_NAME, testOemPref) .build(); // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final List<ConnectivityService.NetworkRequestInfo> nris = new ArrayList<>( mService.new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences( pref)); // UIDs for all users and all managed packages should be present. // Two users each with two packages. final int expectedUidSize = 2; final List<UidRange> uids = new ArrayList<>(nris.get(0).mRequests.get(0).networkCapabilities.getUids()); assertEquals(expectedUidSize, uids.size()); // Sort by uid to access nris by index uids.sort(Comparator.comparingInt(uid -> uid.start)); final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); assertEquals(TEST_PACKAGE_UID, uids.get(0).start); assertEquals(TEST_PACKAGE_UID, uids.get(0).stop); assertEquals(secondUserTestPackageUid, uids.get(1).start); assertEquals(secondUserTestPackageUid, uids.get(1).stop); } @Test public void testOemNetworkRequestFactoryAddsPackagesToCorrectPreference() throws Exception { Loading Loading @@ -9914,7 +9959,7 @@ public class ConnectivityServiceTest { assertEquals(1, mService.mDefaultNetworkRequests.size()); final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageUid)); toUidRangeStableParcels(uidRangesForUids(testPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest( networkPrefToSetup, uidRanges, testPackageName); } Loading Loading @@ -10144,6 +10189,10 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(defaultNetworkCallback); } /** * This method assumes that the same uidRanges input will be used to verify that dependencies * are called as expected. */ private void verifySetOemNetworkPreferenceForPreference( @NonNull final UidRangeParcel[] uidRanges, final int addUidRangesNetId, Loading @@ -10151,16 +10200,30 @@ public class ConnectivityServiceTest { final int removeUidRangesNetId, final int removeUidRangesTimes, final boolean shouldDestroyNetwork) throws RemoteException { verifySetOemNetworkPreferenceForPreference(uidRanges, uidRanges, addUidRangesNetId, addUidRangesTimes, removeUidRangesNetId, removeUidRangesTimes, shouldDestroyNetwork); } private void verifySetOemNetworkPreferenceForPreference( @NonNull final UidRangeParcel[] addedUidRanges, @NonNull final UidRangeParcel[] removedUidRanges, final int addUidRangesNetId, final int addUidRangesTimes, final int removeUidRangesNetId, final int removeUidRangesTimes, final boolean shouldDestroyNetwork) throws RemoteException { final boolean useAnyIdForAdd = OEM_PREF_ANY_NET_ID == addUidRangesNetId; final boolean useAnyIdForRemove = OEM_PREF_ANY_NET_ID == removeUidRangesNetId; // Validate netd. verify(mMockNetd, times(addUidRangesTimes)) .networkAddUidRanges( (useAnyIdForAdd ? anyInt() : eq(addUidRangesNetId)), eq(uidRanges)); (useAnyIdForAdd ? anyInt() : eq(addUidRangesNetId)), eq(addedUidRanges)); verify(mMockNetd, times(removeUidRangesTimes)) .networkRemoveUidRanges( (useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)), eq(uidRanges)); (useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)), eq(removedUidRanges)); if (shouldDestroyNetwork) { verify(mMockNetd, times(1)) .networkDestroy((useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId))); Loading @@ -10178,7 +10241,7 @@ public class ConnectivityServiceTest { final int testPackageUid = 123; final String testPackageName = "com.google.apps.contacts"; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageUid)); toUidRangeStableParcels(uidRangesForUids(testPackageUid)); // Validate the starting requests only includes the fallback request. assertEquals(1, mService.mDefaultNetworkRequests.size()); Loading Loading @@ -10207,9 +10270,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. Loading Loading @@ -10274,9 +10336,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10337,9 +10398,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10390,9 +10450,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10431,6 +10490,109 @@ public class ConnectivityServiceTest { true /* shouldDestroyNetwork */); } @Test public void testMultilayerForMultipleUsersEvaluatesCorrectly() throws Exception { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); // Arrange PackageManager mocks final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); final UidRangeParcel[] uidRanges = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID, secondUserTestPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. verifySetOemNetworkPreferenceForPreference(uidRanges, OEM_PREF_ANY_NET_ID, 0 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly add the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); verifySetOemNetworkPreferenceForPreference(uidRanges, mCellNetworkAgent.getNetwork().netId, 1 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly remove the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); verifySetOemNetworkPreferenceForPreference(uidRanges, OEM_PREF_ANY_NET_ID, 0 /* times */, mCellNetworkAgent.getNetwork().netId, 0 /* times */, true /* shouldDestroyNetwork */); } @Test public void testMultilayerForBroadcastedUsersEvaluatesCorrectly() throws Exception { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); // Arrange PackageManager mocks final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); final UidRangeParcel[] uidRangesSingleUser = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID)); final UidRangeParcel[] uidRangesBothUsers = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID, secondUserTestPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest( networkPref, uidRangesSingleUser, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, OEM_PREF_ANY_NET_ID, 0 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly add the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, mCellNetworkAgent.getNetwork().netId, 1 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Send a broadcast indicating a user was added. when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); final Intent addedIntent = new Intent(ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser)); processBroadcast(addedIntent); // Test that we correctly add values for all users and remove for the single user. verifySetOemNetworkPreferenceForPreference(uidRangesBothUsers, uidRangesSingleUser, mCellNetworkAgent.getNetwork().netId, 1 /* times */, mCellNetworkAgent.getNetwork().netId, 1 /* times */, false /* shouldDestroyNetwork */); // Send a broadcast indicating a user was removed. when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser)); processBroadcast(removedIntent); // Test that we correctly add values for the single user and remove for the all users. verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, uidRangesBothUsers, mCellNetworkAgent.getNetwork().netId, 1 /* times */, mCellNetworkAgent.getNetwork().netId, 1 /* times */, false /* shouldDestroyNetwork */); } /** * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID in the following order: * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback Loading Loading
services/core/java/com/android/server/ConnectivityService.java +19 −2 Original line number Diff line number Diff line Loading @@ -5049,10 +5049,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private void onUserAdded(UserHandle user) { mPermissionMonitor.onUserAdded(user); if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) { handleSetOemNetworkPreference(mOemNetworkPreferences, null); } } private void onUserRemoved(UserHandle user) { mPermissionMonitor.onUserRemoved(user); if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) { handleSetOemNetworkPreference(mOemNetworkPreferences, null); } } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { Loading Loading @@ -9076,7 +9082,7 @@ public class ConnectivityService extends IConnectivityManager.Stub try { listener.onComplete(); } catch (RemoteException e) { loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e); loge("Can't send onComplete in handleSetOemNetworkPreference", e); } } } Loading Loading @@ -9203,6 +9209,14 @@ public class ConnectivityService extends IConnectivityManager.Stub @NonNull final OemNetworkPreferences preference) { final SparseArray<Set<Integer>> uids = new SparseArray<>(); final PackageManager pm = mContext.getPackageManager(); final List<UserHandle> users = mContext.getSystemService(UserManager.class).getUserHandles(true); if (null == users || users.size() == 0) { if (VDBG || DDBG) { log("No users currently available for setting the OEM network preference."); } return uids; } for (final Map.Entry<String, Integer> entry : preference.getNetworkPreferences().entrySet()) { @OemNetworkPreferences.OemNetworkPreference final int pref = entry.getValue(); Loading @@ -9211,7 +9225,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!uids.contains(pref)) { uids.put(pref, new ArraySet<>()); } uids.get(pref).add(uid); for (final UserHandle ui : users) { // Add the rules for all users as this policy is device wide. uids.get(pref).add(UserHandle.getUid(ui, uid)); } } catch (PackageManager.NameNotFoundException e) { // Although this may seem like an error scenario, it is ok that uninstalled // packages are sent on a network preference as the system will watch for Loading
tests/net/java/com/android/server/ConnectivityServiceTest.java +189 −27 Original line number Diff line number Diff line Loading @@ -1085,9 +1085,11 @@ public class ConnectivityServiceTest { } } private Set<UidRange> uidRangesForUid(int uid) { private Set<UidRange> uidRangesForUids(int... uids) { final ArraySet<UidRange> ranges = new ArraySet<>(); for (final int uid : uids) { ranges.add(new UidRange(uid, uid)); } return ranges; } Loading Loading @@ -1217,13 +1219,13 @@ public class ConnectivityServiceTest { public void establishForMyUid(LinkProperties lp) throws Exception { final int uid = Process.myUid(); establish(lp, uid, uidRangesForUid(uid), true, true, false); establish(lp, uid, uidRangesForUids(uid), true, true, false); } public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode) throws Exception { final int uid = Process.myUid(); establish(makeLinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet, establish(makeLinkProperties(), uid, uidRangesForUids(uid), validated, hasInternet, isStrictMode); } Loading Loading @@ -1332,7 +1334,7 @@ public class ConnectivityServiceTest { } private void processBroadcastForVpn(Intent intent) { private void processBroadcast(Intent intent) { mServiceContext.sendBroadcast(intent); HandlerUtils.waitForIdle(mVMSHandlerThread, TIMEOUT_MS); waitForIdle(); Loading Loading @@ -1423,6 +1425,7 @@ public class ConnectivityServiceTest { private static final int VPN_UID = UserHandle.getUid(PRIMARY_USER, 10043); private static final UserInfo PRIMARY_USER_INFO = new UserInfo(PRIMARY_USER, "", UserInfo.FLAG_PRIMARY); private static final UserHandle PRIMARY_USER_HANDLE = new UserHandle(PRIMARY_USER); private static final int RESTRICTED_USER = 1; private static final UserInfo RESTRICTED_USER_INFO = new UserInfo(RESTRICTED_USER, "", Loading @@ -1440,6 +1443,8 @@ public class ConnectivityServiceTest { MockitoAnnotations.initMocks(this); when(mUserManager.getAliveUsers()).thenReturn(Arrays.asList(PRIMARY_USER_INFO)); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); when(mUserManager.getUserInfo(PRIMARY_USER)).thenReturn(PRIMARY_USER_INFO); // canHaveRestrictedProfile does not take a userId. It applies to the userId of the context // it was started from, i.e., PRIMARY_USER. Loading Loading @@ -6390,7 +6395,7 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); final Set<UidRange> ranges = uidRangesForUid(uid); final Set<UidRange> ranges = uidRangesForUids(uid); mMockVpn.registerAgent(ranges); mMockVpn.setUnderlyingNetworks(new Network[0]); Loading Loading @@ -6862,7 +6867,7 @@ public class ConnectivityServiceTest { final int uid = Process.myUid(); NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertNotNull("nc=" + nc, nc.getUids()); assertEquals(nc.getUids(), uidRangesForUid(uid)); assertEquals(nc.getUids(), uidRangesForUids(uid)); assertVpnTransportInfo(nc, VpnManager.TYPE_VPN_SERVICE); // Set an underlying network and expect to see the VPN transports change. Loading @@ -6883,7 +6888,7 @@ public class ConnectivityServiceTest { addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); // Send a USER_ADDED broadcast for it. processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); // Expect that the VPN UID ranges contain both |uid| and the UID range for the newly-added // restricted user. Loading @@ -6908,7 +6913,7 @@ public class ConnectivityServiceTest { final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); removedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(removedIntent); processBroadcast(removedIntent); // Expect that the VPN gains the UID range for the restricted user, and that the capability // change made just before that (i.e., loss of TRANSPORT_WIFI) is preserved. Loading Loading @@ -6966,7 +6971,7 @@ public class ConnectivityServiceTest { final Intent addedIntent = new Intent(ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); assertNull(mCm.getActiveNetworkForUid(uid)); assertNull(mCm.getActiveNetworkForUid(restrictedUid)); Loading @@ -6977,7 +6982,7 @@ public class ConnectivityServiceTest { final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(RESTRICTED_USER)); removedIntent.putExtra(Intent.EXTRA_USER_HANDLE, RESTRICTED_USER); processBroadcastForVpn(removedIntent); processBroadcast(removedIntent); assertNull(mCm.getActiveNetworkForUid(uid)); assertNotNull(mCm.getActiveNetworkForUid(restrictedUid)); Loading Loading @@ -7132,7 +7137,7 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUid(Process.myUid()), mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUids(Process.myUid()), new LinkProperties()); mMockVpn.connect(true); waitForIdle(); Loading Loading @@ -7571,7 +7576,7 @@ public class ConnectivityServiceTest { final Intent addedIntent = new Intent(ACTION_USER_UNLOCKED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(userId)); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); processBroadcastForVpn(addedIntent); processBroadcast(addedIntent); // Lockdown VPN disables teardown and enables lockdown. assertFalse(mMockVpn.getEnableTeardown()); Loading Loading @@ -9290,7 +9295,7 @@ public class ConnectivityServiceTest { private void assertUidRangesUpdatedForMyUid(boolean add) throws Exception { final int uid = Process.myUid(); assertVpnUidRangesUpdated(add, uidRangesForUid(uid), uid); assertVpnUidRangesUpdated(add, uidRangesForUids(uid), uid); } private void assertVpnUidRangesUpdated(boolean add, Set<UidRange> vpnRanges, int exemptUid) Loading Loading @@ -9679,7 +9684,7 @@ public class ConnectivityServiceTest { } @Test public void testOemNetworkRequestFactoryCorrectlySetsUids() public void testOemNetworkRequestFactoryMultiplePrefsCorrectlySetsUids() throws Exception { // Arrange PackageManager mocks final String testPackageName2 = "com.google.apps.dialer"; Loading Loading @@ -9709,6 +9714,46 @@ public class ConnectivityServiceTest { assertEquals(testPackageNameUid2, getNriFirstUidRange(nris.get(1)).stop); } @Test public void testOemNetworkRequestFactoryMultipleUsersCorrectlySetsUids() throws Exception { // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); // Arrange PackageManager mocks mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID); // Build OemNetworkPreferences object final int testOemPref = OEM_NETWORK_PREFERENCE_OEM_PAID; final OemNetworkPreferences pref = new OemNetworkPreferences.Builder() .addNetworkPreference(TEST_PACKAGE_NAME, testOemPref) .build(); // Act on OemNetworkRequestFactory.createNrisFromOemNetworkPreferences() final List<ConnectivityService.NetworkRequestInfo> nris = new ArrayList<>( mService.new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences( pref)); // UIDs for all users and all managed packages should be present. // Two users each with two packages. final int expectedUidSize = 2; final List<UidRange> uids = new ArrayList<>(nris.get(0).mRequests.get(0).networkCapabilities.getUids()); assertEquals(expectedUidSize, uids.size()); // Sort by uid to access nris by index uids.sort(Comparator.comparingInt(uid -> uid.start)); final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); assertEquals(TEST_PACKAGE_UID, uids.get(0).start); assertEquals(TEST_PACKAGE_UID, uids.get(0).stop); assertEquals(secondUserTestPackageUid, uids.get(1).start); assertEquals(secondUserTestPackageUid, uids.get(1).stop); } @Test public void testOemNetworkRequestFactoryAddsPackagesToCorrectPreference() throws Exception { Loading Loading @@ -9914,7 +9959,7 @@ public class ConnectivityServiceTest { assertEquals(1, mService.mDefaultNetworkRequests.size()); final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageUid)); toUidRangeStableParcels(uidRangesForUids(testPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest( networkPrefToSetup, uidRanges, testPackageName); } Loading Loading @@ -10144,6 +10189,10 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(defaultNetworkCallback); } /** * This method assumes that the same uidRanges input will be used to verify that dependencies * are called as expected. */ private void verifySetOemNetworkPreferenceForPreference( @NonNull final UidRangeParcel[] uidRanges, final int addUidRangesNetId, Loading @@ -10151,16 +10200,30 @@ public class ConnectivityServiceTest { final int removeUidRangesNetId, final int removeUidRangesTimes, final boolean shouldDestroyNetwork) throws RemoteException { verifySetOemNetworkPreferenceForPreference(uidRanges, uidRanges, addUidRangesNetId, addUidRangesTimes, removeUidRangesNetId, removeUidRangesTimes, shouldDestroyNetwork); } private void verifySetOemNetworkPreferenceForPreference( @NonNull final UidRangeParcel[] addedUidRanges, @NonNull final UidRangeParcel[] removedUidRanges, final int addUidRangesNetId, final int addUidRangesTimes, final int removeUidRangesNetId, final int removeUidRangesTimes, final boolean shouldDestroyNetwork) throws RemoteException { final boolean useAnyIdForAdd = OEM_PREF_ANY_NET_ID == addUidRangesNetId; final boolean useAnyIdForRemove = OEM_PREF_ANY_NET_ID == removeUidRangesNetId; // Validate netd. verify(mMockNetd, times(addUidRangesTimes)) .networkAddUidRanges( (useAnyIdForAdd ? anyInt() : eq(addUidRangesNetId)), eq(uidRanges)); (useAnyIdForAdd ? anyInt() : eq(addUidRangesNetId)), eq(addedUidRanges)); verify(mMockNetd, times(removeUidRangesTimes)) .networkRemoveUidRanges( (useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)), eq(uidRanges)); (useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId)), eq(removedUidRanges)); if (shouldDestroyNetwork) { verify(mMockNetd, times(1)) .networkDestroy((useAnyIdForRemove ? anyInt() : eq(removeUidRangesNetId))); Loading @@ -10178,7 +10241,7 @@ public class ConnectivityServiceTest { final int testPackageUid = 123; final String testPackageName = "com.google.apps.contacts"; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageUid)); toUidRangeStableParcels(uidRangesForUids(testPackageUid)); // Validate the starting requests only includes the fallback request. assertEquals(1, mService.mDefaultNetworkRequests.size()); Loading Loading @@ -10207,9 +10270,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. Loading Loading @@ -10274,9 +10336,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10337,9 +10398,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10390,9 +10450,8 @@ public class ConnectivityServiceTest { OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; // Arrange PackageManager mocks final int testPackageNameUid = 123; final UidRangeParcel[] uidRanges = toUidRangeStableParcels(uidRangesForUid(testPackageNameUid)); toUidRangeStableParcels(uidRangesForUids(TEST_PACKAGE_UID)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. This preference doesn't support using the fallback network Loading Loading @@ -10431,6 +10490,109 @@ public class ConnectivityServiceTest { true /* shouldDestroyNetwork */); } @Test public void testMultilayerForMultipleUsersEvaluatesCorrectly() throws Exception { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); // Arrange PackageManager mocks final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); final UidRangeParcel[] uidRanges = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID, secondUserTestPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest(networkPref, uidRanges, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. verifySetOemNetworkPreferenceForPreference(uidRanges, OEM_PREF_ANY_NET_ID, 0 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly add the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); verifySetOemNetworkPreferenceForPreference(uidRanges, mCellNetworkAgent.getNetwork().netId, 1 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly remove the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); verifySetOemNetworkPreferenceForPreference(uidRanges, OEM_PREF_ANY_NET_ID, 0 /* times */, mCellNetworkAgent.getNetwork().netId, 0 /* times */, true /* shouldDestroyNetwork */); } @Test public void testMultilayerForBroadcastedUsersEvaluatesCorrectly() throws Exception { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID; // Arrange users final int secondUser = 10; final UserHandle secondUserHandle = new UserHandle(secondUser); when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); // Arrange PackageManager mocks final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); final UidRangeParcel[] uidRangesSingleUser = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID)); final UidRangeParcel[] uidRangesBothUsers = toUidRangeStableParcels( uidRangesForUids(TEST_PACKAGE_UID, secondUserTestPackageUid)); setupSetOemNetworkPreferenceForPreferenceTest( networkPref, uidRangesSingleUser, TEST_PACKAGE_NAME); // Verify the starting state. No networks should be connected. verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, OEM_PREF_ANY_NET_ID, 0 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Test that we correctly add the expected values for multiple users. setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, mCellNetworkAgent.getNetwork().netId, 1 /* times */, OEM_PREF_ANY_NET_ID, 0 /* times */, false /* shouldDestroyNetwork */); // Send a broadcast indicating a user was added. when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE, secondUserHandle)); final Intent addedIntent = new Intent(ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser)); processBroadcast(addedIntent); // Test that we correctly add values for all users and remove for the single user. verifySetOemNetworkPreferenceForPreference(uidRangesBothUsers, uidRangesSingleUser, mCellNetworkAgent.getNetwork().netId, 1 /* times */, mCellNetworkAgent.getNetwork().netId, 1 /* times */, false /* shouldDestroyNetwork */); // Send a broadcast indicating a user was removed. when(mUserManager.getUserHandles(anyBoolean())).thenReturn( Arrays.asList(PRIMARY_USER_HANDLE)); final Intent removedIntent = new Intent(ACTION_USER_REMOVED); removedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(secondUser)); processBroadcast(removedIntent); // Test that we correctly add values for the single user and remove for the all users. verifySetOemNetworkPreferenceForPreference(uidRangesSingleUser, uidRangesBothUsers, mCellNetworkAgent.getNetwork().netId, 1 /* times */, mCellNetworkAgent.getNetwork().netId, 1 /* times */, false /* shouldDestroyNetwork */); } /** * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID in the following order: * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback Loading