Add tests for onUserAdded and onUserRemoved
Test coverage of adding and removing a restricted user with and without lockdown mode, using either setLockdown() and setAlwaysOnPackage(). This change also refactors makeVpnUidRange() to return a list and adds makeVpnUidRangeSet(). Bug: 230548427 Test: atest FrameworksNetTests Change-Id: I47a25e9f0337f5c1d5754c279534640cd2753b5c
This commit is contained in:
@@ -787,6 +787,101 @@ public class VpnTest extends VpnTestBase {
|
|||||||
order.verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(entireUser));
|
order.verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(entireUser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnUserAddedAndRemoved_restrictedUser() throws Exception {
|
||||||
|
final InOrder order = inOrder(mMockNetworkAgent);
|
||||||
|
final Vpn vpn = createVpn(PRIMARY_USER.id);
|
||||||
|
final Set<Range<Integer>> initialRange = rangeSet(PRIMARY_USER_RANGE);
|
||||||
|
// Note since mVpnProfile is a Ikev2VpnProfile, this starts an IkeV2VpnRunner.
|
||||||
|
startLegacyVpn(vpn, mVpnProfile);
|
||||||
|
// Set an initial Uid range and mock the network agent
|
||||||
|
vpn.mNetworkCapabilities.setUids(initialRange);
|
||||||
|
vpn.mNetworkAgent = mMockNetworkAgent;
|
||||||
|
|
||||||
|
// Add the restricted user
|
||||||
|
setMockedUsers(PRIMARY_USER, RESTRICTED_PROFILE_A);
|
||||||
|
vpn.onUserAdded(RESTRICTED_PROFILE_A.id);
|
||||||
|
// Expect restricted user range to be added to the NetworkCapabilities.
|
||||||
|
final Set<Range<Integer>> expectRestrictedRange =
|
||||||
|
rangeSet(PRIMARY_USER_RANGE, uidRangeForUser(RESTRICTED_PROFILE_A.id));
|
||||||
|
assertEquals(expectRestrictedRange, vpn.mNetworkCapabilities.getUids());
|
||||||
|
order.verify(mMockNetworkAgent).doSendNetworkCapabilities(
|
||||||
|
argThat(nc -> expectRestrictedRange.equals(nc.getUids())));
|
||||||
|
|
||||||
|
// Remove the restricted user
|
||||||
|
vpn.onUserRemoved(RESTRICTED_PROFILE_A.id);
|
||||||
|
// Expect restricted user range to be removed from the NetworkCapabilities.
|
||||||
|
assertEquals(initialRange, vpn.mNetworkCapabilities.getUids());
|
||||||
|
order.verify(mMockNetworkAgent).doSendNetworkCapabilities(
|
||||||
|
argThat(nc -> initialRange.equals(nc.getUids())));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnUserAddedAndRemoved_restrictedUserLockdown() throws Exception {
|
||||||
|
final UidRangeParcel[] primaryUserRangeParcel = new UidRangeParcel[] {
|
||||||
|
new UidRangeParcel(PRIMARY_USER_RANGE.getLower(), PRIMARY_USER_RANGE.getUpper())};
|
||||||
|
final Range<Integer> restrictedUserRange = uidRangeForUser(RESTRICTED_PROFILE_A.id);
|
||||||
|
final UidRangeParcel[] restrictedUserRangeParcel = new UidRangeParcel[] {
|
||||||
|
new UidRangeParcel(restrictedUserRange.getLower(), restrictedUserRange.getUpper())};
|
||||||
|
final Vpn vpn = createVpn(PRIMARY_USER.id);
|
||||||
|
|
||||||
|
// Set lockdown calls setRequireVpnForUids
|
||||||
|
vpn.setLockdown(true);
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(primaryUserRangeParcel));
|
||||||
|
|
||||||
|
// Add the restricted user
|
||||||
|
doReturn(true).when(mUserManager).canHaveRestrictedProfile();
|
||||||
|
setMockedUsers(PRIMARY_USER, RESTRICTED_PROFILE_A);
|
||||||
|
vpn.onUserAdded(RESTRICTED_PROFILE_A.id);
|
||||||
|
|
||||||
|
// Expect restricted user range to be added.
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(true,
|
||||||
|
toRanges(restrictedUserRangeParcel));
|
||||||
|
|
||||||
|
// Mark as partial indicates that the user is removed, mUserManager.getAliveUsers() does not
|
||||||
|
// return the restricted user but it is still returned in mUserManager.getUserInfo().
|
||||||
|
RESTRICTED_PROFILE_A.partial = true;
|
||||||
|
// Remove the restricted user
|
||||||
|
vpn.onUserRemoved(RESTRICTED_PROFILE_A.id);
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(false,
|
||||||
|
toRanges(restrictedUserRangeParcel));
|
||||||
|
// reset to avoid affecting other tests since RESTRICTED_PROFILE_A is static.
|
||||||
|
RESTRICTED_PROFILE_A.partial = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnUserAddedAndRemoved_restrictedUserAlwaysOn() throws Exception {
|
||||||
|
final Vpn vpn = createVpn(PRIMARY_USER.id);
|
||||||
|
|
||||||
|
// setAlwaysOnPackage() calls setRequireVpnForUids()
|
||||||
|
assertTrue(vpn.setAlwaysOnPackage(
|
||||||
|
PKGS[0], true /* lockdown */, null /* lockdownAllowlist */));
|
||||||
|
final List<Integer> excludedUids = List.of(PKG_UIDS[0]);
|
||||||
|
final List<Range<Integer>> primaryRanges =
|
||||||
|
makeVpnUidRange(PRIMARY_USER.id, excludedUids);
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(true, primaryRanges);
|
||||||
|
|
||||||
|
// Add the restricted user
|
||||||
|
doReturn(true).when(mUserManager).canHaveRestrictedProfile();
|
||||||
|
setMockedUsers(PRIMARY_USER, RESTRICTED_PROFILE_A);
|
||||||
|
vpn.onUserAdded(RESTRICTED_PROFILE_A.id);
|
||||||
|
|
||||||
|
final List<Range<Integer>> restrictedRanges =
|
||||||
|
makeVpnUidRange(RESTRICTED_PROFILE_A.id, excludedUids);
|
||||||
|
// Expect restricted user range to be added.
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(true, restrictedRanges);
|
||||||
|
|
||||||
|
// Mark as partial indicates that the user is removed, mUserManager.getAliveUsers() does not
|
||||||
|
// return the restricted user but it is still returned in mUserManager.getUserInfo().
|
||||||
|
RESTRICTED_PROFILE_A.partial = true;
|
||||||
|
// Remove the restricted user
|
||||||
|
vpn.onUserRemoved(RESTRICTED_PROFILE_A.id);
|
||||||
|
verify(mConnectivityManager).setRequireVpnForUids(false, restrictedRanges);
|
||||||
|
|
||||||
|
// reset to avoid affecting other tests since RESTRICTED_PROFILE_A is static.
|
||||||
|
RESTRICTED_PROFILE_A.partial = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPrepare_throwSecurityExceptionWhenGivenPackageDoesNotBelongToTheCaller()
|
public void testPrepare_throwSecurityExceptionWhenGivenPackageDoesNotBelongToTheCaller()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
@@ -1002,12 +1097,12 @@ public class VpnTest extends VpnTestBase {
|
|||||||
|
|
||||||
// List in keystore is not changed, but UID for the removed packages is no longer exempted.
|
// List in keystore is not changed, but UID for the removed packages is no longer exempted.
|
||||||
assertEquals(Arrays.asList(PKGS), vpn.getAppExclusionList(TEST_VPN_PKG));
|
assertEquals(Arrays.asList(PKGS), vpn.getAppExclusionList(TEST_VPN_PKG));
|
||||||
assertEquals(makeVpnUidRange(PRIMARY_USER.id, newExcludedUids),
|
assertEquals(makeVpnUidRangeSet(PRIMARY_USER.id, newExcludedUids),
|
||||||
vpn.mNetworkCapabilities.getUids());
|
vpn.mNetworkCapabilities.getUids());
|
||||||
ArgumentCaptor<NetworkCapabilities> ncCaptor =
|
ArgumentCaptor<NetworkCapabilities> ncCaptor =
|
||||||
ArgumentCaptor.forClass(NetworkCapabilities.class);
|
ArgumentCaptor.forClass(NetworkCapabilities.class);
|
||||||
verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
|
verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
|
||||||
assertEquals(makeVpnUidRange(PRIMARY_USER.id, newExcludedUids),
|
assertEquals(makeVpnUidRangeSet(PRIMARY_USER.id, newExcludedUids),
|
||||||
ncCaptor.getValue().getUids());
|
ncCaptor.getValue().getUids());
|
||||||
|
|
||||||
reset(mMockNetworkAgent);
|
reset(mMockNetworkAgent);
|
||||||
@@ -1019,14 +1114,14 @@ public class VpnTest extends VpnTestBase {
|
|||||||
|
|
||||||
// List in keystore is not changed and the uid list should be updated in the net cap.
|
// List in keystore is not changed and the uid list should be updated in the net cap.
|
||||||
assertEquals(Arrays.asList(PKGS), vpn.getAppExclusionList(TEST_VPN_PKG));
|
assertEquals(Arrays.asList(PKGS), vpn.getAppExclusionList(TEST_VPN_PKG));
|
||||||
assertEquals(makeVpnUidRange(PRIMARY_USER.id, newExcludedUids),
|
assertEquals(makeVpnUidRangeSet(PRIMARY_USER.id, newExcludedUids),
|
||||||
vpn.mNetworkCapabilities.getUids());
|
vpn.mNetworkCapabilities.getUids());
|
||||||
verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
|
verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
|
||||||
assertEquals(makeVpnUidRange(PRIMARY_USER.id, newExcludedUids),
|
assertEquals(makeVpnUidRangeSet(PRIMARY_USER.id, newExcludedUids),
|
||||||
ncCaptor.getValue().getUids());
|
ncCaptor.getValue().getUids());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Range<Integer>> makeVpnUidRange(int userId, List<Integer> excludedList) {
|
private List<Range<Integer>> makeVpnUidRange(int userId, List<Integer> excludedList) {
|
||||||
final SortedSet<Integer> list = new TreeSet<>();
|
final SortedSet<Integer> list = new TreeSet<>();
|
||||||
|
|
||||||
final int userBase = userId * UserHandle.PER_USER_RANGE;
|
final int userBase = userId * UserHandle.PER_USER_RANGE;
|
||||||
@@ -1038,7 +1133,7 @@ public class VpnTest extends VpnTestBase {
|
|||||||
|
|
||||||
final int minUid = userBase;
|
final int minUid = userBase;
|
||||||
final int maxUid = userBase + UserHandle.PER_USER_RANGE - 1;
|
final int maxUid = userBase + UserHandle.PER_USER_RANGE - 1;
|
||||||
final Set<Range<Integer>> ranges = new ArraySet<>();
|
final List<Range<Integer>> ranges = new ArrayList<>();
|
||||||
|
|
||||||
// Iterate the list to create the ranges between each uid.
|
// Iterate the list to create the ranges between each uid.
|
||||||
int start = minUid;
|
int start = minUid;
|
||||||
@@ -1059,6 +1154,10 @@ public class VpnTest extends VpnTestBase {
|
|||||||
return ranges;
|
return ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<Range<Integer>> makeVpnUidRangeSet(int userId, List<Integer> excludedList) {
|
||||||
|
return new ArraySet<>(makeVpnUidRange(userId, excludedList));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetAndGetAppExclusionListRestrictedUser() throws Exception {
|
public void testSetAndGetAppExclusionListRestrictedUser() throws Exception {
|
||||||
final Vpn vpn = prepareVpnForVerifyAppExclusionList();
|
final Vpn vpn = prepareVpnForVerifyAppExclusionList();
|
||||||
|
|||||||
Reference in New Issue
Block a user