Merge "Reduce duplicated code"
This commit is contained in:
@@ -60,7 +60,6 @@ import static org.mockito.Mockito.doCallRealMethod;
|
|||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.reset;
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.spy;
|
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
@@ -83,9 +82,12 @@ import android.provider.Settings;
|
|||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
|
import com.android.net.module.util.CollectionUtils;
|
||||||
import com.android.testutils.DevSdkIgnoreRule;
|
import com.android.testutils.DevSdkIgnoreRule;
|
||||||
import com.android.testutils.DevSdkIgnoreRunner;
|
import com.android.testutils.DevSdkIgnoreRunner;
|
||||||
|
|
||||||
@@ -98,6 +100,7 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -161,20 +164,17 @@ public class PermissionMonitorTest {
|
|||||||
doReturn(UserHandle.ALL).when(asUserCtx).getUser();
|
doReturn(UserHandle.ALL).when(asUserCtx).getUser();
|
||||||
when(mContext.createContextAsUser(eq(UserHandle.ALL), anyInt())).thenReturn(asUserCtx);
|
when(mContext.createContextAsUser(eq(UserHandle.ALL), anyInt())).thenReturn(asUserCtx);
|
||||||
when(mDeps.getUidsAllowedOnRestrictedNetworks(any())).thenReturn(new ArraySet<>());
|
when(mDeps.getUidsAllowedOnRestrictedNetworks(any())).thenReturn(new ArraySet<>());
|
||||||
|
// Set DEVICE_INITIAL_SDK_INT to Q that SYSTEM_UID won't have restricted network permission
|
||||||
|
// by default.
|
||||||
|
doReturn(VERSION_Q).when(mDeps).getDeviceFirstSdkInt();
|
||||||
|
|
||||||
mPermissionMonitor = spy(new PermissionMonitor(mContext, mNetdService, mDeps));
|
mPermissionMonitor = new PermissionMonitor(mContext, mNetdService, mDeps);
|
||||||
mNetdMonitor = new NetdMonitor(mNetdService);
|
mNetdMonitor = new NetdMonitor(mNetdService);
|
||||||
|
|
||||||
when(mPackageManager.getInstalledPackages(anyInt())).thenReturn(/* empty app list */ null);
|
when(mPackageManager.getInstalledPackages(anyInt())).thenReturn(/* empty app list */ null);
|
||||||
mPermissionMonitor.startMonitoring();
|
mPermissionMonitor.startMonitoring();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasRestrictedNetworkPermission(String partition, int targetSdkVersion, int uid,
|
|
||||||
String... permissions) {
|
|
||||||
return hasRestrictedNetworkPermission(
|
|
||||||
partition, targetSdkVersion, "" /* packageName */, uid, permissions);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasRestrictedNetworkPermission(String partition, int targetSdkVersion,
|
private boolean hasRestrictedNetworkPermission(String partition, int targetSdkVersion,
|
||||||
String packageName, int uid, String... permissions) {
|
String packageName, int uid, String... permissions) {
|
||||||
final PackageInfo packageInfo =
|
final PackageInfo packageInfo =
|
||||||
@@ -223,13 +223,44 @@ public class PermissionMonitorTest {
|
|||||||
|
|
||||||
private static PackageInfo buildPackageInfo(String packageName, int uid,
|
private static PackageInfo buildPackageInfo(String packageName, int uid,
|
||||||
String... permissions) {
|
String... permissions) {
|
||||||
final PackageInfo pkgInfo;
|
final PackageInfo pkgInfo = systemPackageInfoWithPermissions(permissions);
|
||||||
pkgInfo = systemPackageInfoWithPermissions(permissions);
|
|
||||||
pkgInfo.packageName = packageName;
|
pkgInfo.packageName = packageName;
|
||||||
pkgInfo.applicationInfo.uid = uid;
|
pkgInfo.applicationInfo.uid = uid;
|
||||||
return pkgInfo;
|
return pkgInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Move this method to static lib.
|
||||||
|
private static @NonNull <T> T[] appendElement(Class<T> kind, @Nullable T[] array, T element) {
|
||||||
|
final T[] result;
|
||||||
|
if (array != null) {
|
||||||
|
result = Arrays.copyOf(array, array.length + 1);
|
||||||
|
} else {
|
||||||
|
result = (T[]) Array.newInstance(kind, 1);
|
||||||
|
}
|
||||||
|
result[result.length - 1] = element;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildAndMockPackageInfoWithPermissions(String packageName, int uid,
|
||||||
|
String... permissions) throws Exception {
|
||||||
|
final PackageInfo packageInfo = buildPackageInfo(packageName, uid, permissions);
|
||||||
|
// This will return the wrong UID for the package when queried with other users.
|
||||||
|
doReturn(packageInfo).when(mPackageManager)
|
||||||
|
.getPackageInfo(eq(packageName), anyInt() /* flag */);
|
||||||
|
final String[] oldPackages = mPackageManager.getPackagesForUid(uid);
|
||||||
|
// If it's duplicated package, no need to set it again.
|
||||||
|
if (CollectionUtils.contains(oldPackages, packageName)) return;
|
||||||
|
|
||||||
|
// Combine the package if this uid is shared with other packages.
|
||||||
|
final String[] newPackages = appendElement(String.class, oldPackages, packageName);
|
||||||
|
doReturn(newPackages).when(mPackageManager).getPackagesForUid(eq(uid));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addPackage(String packageName, int uid, String... permissions) throws Exception {
|
||||||
|
buildAndMockPackageInfoWithPermissions(packageName, uid, permissions);
|
||||||
|
mPermissionMonitor.onPackageAdded(packageName, uid);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHasPermission() {
|
public void testHasPermission() {
|
||||||
PackageInfo app = systemPackageInfoWithPermissions();
|
PackageInfo app = systemPackageInfoWithPermissions();
|
||||||
@@ -298,67 +329,77 @@ public class PermissionMonitorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHasRestrictedNetworkPermission() {
|
public void testHasRestrictedNetworkPermission() {
|
||||||
assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID1));
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CHANGE_NETWORK_STATE));
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, NETWORK_STACK));
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, NETWORK_STACK));
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CHANGE_WIFI_STATE));
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, PERMISSION_MAINLINE_NETWORK_STACK));
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1,
|
||||||
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
||||||
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CHANGE_WIFI_STATE));
|
||||||
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_SYSTEM, VERSION_P, MOCK_PACKAGE1, MOCK_UID1,
|
||||||
|
PERMISSION_MAINLINE_NETWORK_STACK));
|
||||||
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID1));
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_Q, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
PARTITION_SYSTEM, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1));
|
||||||
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_SYSTEM, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHasRestrictedNetworkPermissionSystemUid() {
|
public void testHasRestrictedNetworkPermissionSystemUid() {
|
||||||
doReturn(VERSION_P).when(mDeps).getDeviceFirstSdkInt();
|
doReturn(VERSION_P).when(mDeps).getDeviceFirstSdkInt();
|
||||||
assertTrue(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID));
|
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CONNECTIVITY_INTERNAL));
|
PARTITION_SYSTEM, VERSION_P, SYSTEM_PACKAGE1, SYSTEM_UID));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
PARTITION_SYSTEM, VERSION_P, SYSTEM_PACKAGE1, SYSTEM_UID, CONNECTIVITY_INTERNAL));
|
||||||
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_SYSTEM, VERSION_P, SYSTEM_PACKAGE1, SYSTEM_UID,
|
||||||
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
||||||
|
|
||||||
doReturn(VERSION_Q).when(mDeps).getDeviceFirstSdkInt();
|
doReturn(VERSION_Q).when(mDeps).getDeviceFirstSdkInt();
|
||||||
assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID));
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CONNECTIVITY_INTERNAL));
|
PARTITION_SYSTEM, VERSION_Q, SYSTEM_PACKAGE1, SYSTEM_UID));
|
||||||
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_SYSTEM, VERSION_Q, SYSTEM_PACKAGE1, SYSTEM_UID, CONNECTIVITY_INTERNAL));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
PARTITION_SYSTEM, VERSION_Q, SYSTEM_PACKAGE1, SYSTEM_UID,
|
||||||
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHasRestrictedNetworkPermissionVendorApp() {
|
public void testHasRestrictedNetworkPermissionVendorApp() {
|
||||||
assertTrue(hasRestrictedNetworkPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID1));
|
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_P, MOCK_UID1, CHANGE_NETWORK_STATE));
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_P, MOCK_UID1, NETWORK_STACK));
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_P, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, NETWORK_STACK));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_P, MOCK_UID1, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_P, MOCK_UID1, CHANGE_WIFI_STATE));
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1,
|
||||||
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS));
|
||||||
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_VENDOR, VERSION_P, MOCK_PACKAGE1, MOCK_UID1, CHANGE_WIFI_STATE));
|
||||||
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID1));
|
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
PARTITION_VENDOR, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1));
|
||||||
assertFalse(hasRestrictedNetworkPermission(
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CHANGE_NETWORK_STATE));
|
PARTITION_VENDOR, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1, CONNECTIVITY_INTERNAL));
|
||||||
|
assertFalse(hasRestrictedNetworkPermission(
|
||||||
|
PARTITION_VENDOR, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHasRestrictedNetworkPermissionUidAllowedOnRestrictedNetworks() {
|
public void testHasRestrictedNetworkPermissionUidAllowedOnRestrictedNetworks() {
|
||||||
mPermissionMonitor.updateUidsAllowedOnRestrictedNetworks(
|
mPermissionMonitor.updateUidsAllowedOnRestrictedNetworks(Set.of(MOCK_UID1));
|
||||||
new ArraySet<>(new Integer[] { MOCK_UID1 }));
|
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
PARTITION_VENDOR, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1));
|
PARTITION_VENDOR, VERSION_Q, MOCK_PACKAGE1, MOCK_UID1));
|
||||||
assertTrue(hasRestrictedNetworkPermission(
|
assertTrue(hasRestrictedNetworkPermission(
|
||||||
@@ -441,10 +482,7 @@ public class PermissionMonitorTest {
|
|||||||
|
|
||||||
private void assertBackgroundPermission(boolean hasPermission, String name, int uid,
|
private void assertBackgroundPermission(boolean hasPermission, String name, int uid,
|
||||||
String... permissions) throws Exception {
|
String... permissions) throws Exception {
|
||||||
when(mPackageManager.getPackageInfo(eq(name), anyInt()))
|
addPackage(name, uid, permissions);
|
||||||
.thenReturn(packageInfoWithPermissions(
|
|
||||||
REQUESTED_PERMISSION_GRANTED, permissions, PARTITION_SYSTEM));
|
|
||||||
mPermissionMonitor.onPackageAdded(name, uid);
|
|
||||||
assertEquals(hasPermission, mPermissionMonitor.hasUseBackgroundNetworksPermission(uid));
|
assertEquals(hasPermission, mPermissionMonitor.hasUseBackgroundNetworksPermission(uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -556,13 +594,10 @@ public class PermissionMonitorTest {
|
|||||||
// MOCK_UID1: MOCK_PACKAGE1 only has network permission.
|
// MOCK_UID1: MOCK_PACKAGE1 only has network permission.
|
||||||
// SYSTEM_UID: SYSTEM_PACKAGE1 has system permission.
|
// SYSTEM_UID: SYSTEM_PACKAGE1 has system permission.
|
||||||
// SYSTEM_UID: SYSTEM_PACKAGE2 only has network permission.
|
// SYSTEM_UID: SYSTEM_PACKAGE2 only has network permission.
|
||||||
doReturn(SYSTEM).when(mPermissionMonitor).highestPermissionForUid(any(),
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE);
|
||||||
eq(SYSTEM_PACKAGE1));
|
buildAndMockPackageInfoWithPermissions(SYSTEM_PACKAGE1, SYSTEM_UID,
|
||||||
doReturn(NETWORK).when(mPermissionMonitor).highestPermissionForUid(any(),
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS);
|
||||||
eq(SYSTEM_PACKAGE2));
|
buildAndMockPackageInfoWithPermissions(SYSTEM_PACKAGE2, SYSTEM_UID, CHANGE_NETWORK_STATE);
|
||||||
doReturn(NETWORK).when(mPermissionMonitor).highestPermissionForUid(any(),
|
|
||||||
eq(MOCK_PACKAGE1));
|
|
||||||
doReturn(SYSTEM).when(mPermissionMonitor).highestPermissionForUid(eq(SYSTEM), anyString());
|
|
||||||
|
|
||||||
// Add SYSTEM_PACKAGE2, expect only have network permission.
|
// Add SYSTEM_PACKAGE2, expect only have network permission.
|
||||||
mPermissionMonitor.onUserAdded(MOCK_USER1);
|
mPermissionMonitor.onUserAdded(MOCK_USER1);
|
||||||
@@ -603,7 +638,6 @@ public class PermissionMonitorTest {
|
|||||||
.thenReturn(new String[]{});
|
.thenReturn(new String[]{});
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_USER2.getUid(MOCK_UID1)))
|
when(mPackageManager.getPackagesForUid(MOCK_USER2.getUid(MOCK_UID1)))
|
||||||
.thenReturn(new String[]{});
|
.thenReturn(new String[]{});
|
||||||
mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1);
|
|
||||||
removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1);
|
removePackageForUsers(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_PACKAGE1, MOCK_UID1);
|
||||||
mNetdMonitor.expectNoNetworkPerm(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_UID1);
|
mNetdMonitor.expectNoNetworkPerm(new UserHandle[]{MOCK_USER1, MOCK_USER2}, MOCK_UID1);
|
||||||
|
|
||||||
@@ -751,50 +785,29 @@ public class PermissionMonitorTest {
|
|||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_NONE, SYSTEM_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_NONE, SYSTEM_UID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PackageInfo setPackagePermissions(String packageName, int uid, String[] permissions)
|
|
||||||
throws Exception {
|
|
||||||
PackageInfo packageInfo = packageInfoWithPermissions(
|
|
||||||
REQUESTED_PERMISSION_GRANTED, permissions, PARTITION_SYSTEM);
|
|
||||||
when(mPackageManager.getPackageInfo(eq(packageName), anyInt())).thenReturn(packageInfo);
|
|
||||||
when(mPackageManager.getPackagesForUid(eq(uid))).thenReturn(new String[]{packageName});
|
|
||||||
return packageInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PackageInfo addPackage(String packageName, int uid, String[] permissions)
|
|
||||||
throws Exception {
|
|
||||||
PackageInfo packageInfo = setPackagePermissions(packageName, uid, permissions);
|
|
||||||
mPermissionMonitor.onPackageAdded(packageName, uid);
|
|
||||||
return packageInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageInstall() throws Exception {
|
public void testPackageInstall() throws Exception {
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET, UPDATE_DEVICE_STATS});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET, UPDATE_DEVICE_STATS);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
addPackage(MOCK_PACKAGE2, MOCK_UID2, new String[] {INTERNET});
|
addPackage(MOCK_PACKAGE2, MOCK_UID2, INTERNET);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID2);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageInstallSharedUid() throws Exception {
|
public void testPackageInstallSharedUid() throws Exception {
|
||||||
PackageInfo packageInfo1 = addPackage(MOCK_PACKAGE1, MOCK_UID1,
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET, UPDATE_DEVICE_STATS);
|
||||||
new String[] {INTERNET, UPDATE_DEVICE_STATS});
|
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
// Install another package with the same uid and no permissions should not cause the UID to
|
// Install another package with the same uid and no permissions should not cause the UID to
|
||||||
// lose permissions.
|
// lose permissions.
|
||||||
PackageInfo packageInfo2 = systemPackageInfoWithPermissions();
|
addPackage(MOCK_PACKAGE2, MOCK_UID1);
|
||||||
when(mPackageManager.getPackageInfo(eq(MOCK_PACKAGE2), anyInt())).thenReturn(packageInfo2);
|
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1))
|
|
||||||
.thenReturn(new String[]{MOCK_PACKAGE1, MOCK_PACKAGE2});
|
|
||||||
mPermissionMonitor.onPackageAdded(MOCK_PACKAGE2, MOCK_UID1);
|
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageUninstallBasic() throws Exception {
|
public void testPackageUninstallBasic() throws Exception {
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET, UPDATE_DEVICE_STATS});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET, UPDATE_DEVICE_STATS);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1)).thenReturn(new String[]{});
|
when(mPackageManager.getPackagesForUid(MOCK_UID1)).thenReturn(new String[]{});
|
||||||
@@ -804,37 +817,38 @@ public class PermissionMonitorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageRemoveThenAdd() throws Exception {
|
public void testPackageRemoveThenAdd() throws Exception {
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET, UPDATE_DEVICE_STATS});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET, UPDATE_DEVICE_STATS);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1)).thenReturn(new String[]{});
|
when(mPackageManager.getPackagesForUid(MOCK_UID1)).thenReturn(new String[]{});
|
||||||
mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1);
|
mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_UNINSTALLED, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_UNINSTALLED, MOCK_UID1);
|
||||||
|
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageUpdate() throws Exception {
|
public void testPackageUpdate() throws Exception {
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_NONE, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_NONE, MOCK_UID1);
|
||||||
|
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPackageUninstallWithMultiplePackages() throws Exception {
|
public void testPackageUninstallWithMultiplePackages() throws Exception {
|
||||||
addPackage(MOCK_PACKAGE1, MOCK_UID1, new String[] {INTERNET, UPDATE_DEVICE_STATS});
|
addPackage(MOCK_PACKAGE1, MOCK_UID1, INTERNET, UPDATE_DEVICE_STATS);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
// Mock another package with the same uid but different permissions.
|
// Install another package with the same uid but different permissions.
|
||||||
PackageInfo packageInfo2 = systemPackageInfoWithPermissions(INTERNET);
|
addPackage(MOCK_PACKAGE2, MOCK_UID1, INTERNET);
|
||||||
when(mPackageManager.getPackageInfo(eq(MOCK_PACKAGE2), anyInt())).thenReturn(packageInfo2);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1)).thenReturn(new String[]{
|
|
||||||
MOCK_PACKAGE2});
|
|
||||||
|
|
||||||
|
// Uninstall MOCK_PACKAGE1 and expect only INTERNET permission left.
|
||||||
|
when(mPackageManager.getPackagesForUid(eq(MOCK_UID1)))
|
||||||
|
.thenReturn(new String[]{MOCK_PACKAGE2});
|
||||||
mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1);
|
mPermissionMonitor.onPackageRemoved(MOCK_PACKAGE1, MOCK_UID1);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_INTERNET, MOCK_UID1);
|
||||||
}
|
}
|
||||||
@@ -888,8 +902,8 @@ public class PermissionMonitorTest {
|
|||||||
final Intent addedIntent = new Intent(Intent.ACTION_PACKAGE_ADDED,
|
final Intent addedIntent = new Intent(Intent.ACTION_PACKAGE_ADDED,
|
||||||
Uri.fromParts("package", MOCK_PACKAGE1, null /* fragment */));
|
Uri.fromParts("package", MOCK_PACKAGE1, null /* fragment */));
|
||||||
addedIntent.putExtra(Intent.EXTRA_UID, MOCK_UID1);
|
addedIntent.putExtra(Intent.EXTRA_UID, MOCK_UID1);
|
||||||
setPackagePermissions(MOCK_PACKAGE1, MOCK_UID1,
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, INTERNET,
|
||||||
new String[] { INTERNET, UPDATE_DEVICE_STATS });
|
UPDATE_DEVICE_STATS);
|
||||||
receiver.onReceive(mContext, addedIntent);
|
receiver.onReceive(mContext, addedIntent);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|
||||||
@@ -910,13 +924,6 @@ public class PermissionMonitorTest {
|
|||||||
return captor.getValue();
|
return captor.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildAndMockPackageInfoWithPermissions(String packageName, int uid,
|
|
||||||
String... permissions) throws Exception {
|
|
||||||
final PackageInfo packageInfo = setPackagePermissions(packageName, uid, permissions);
|
|
||||||
packageInfo.packageName = packageName;
|
|
||||||
packageInfo.applicationInfo.uid = uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUidsAllowedOnRestrictedNetworksChanged() throws Exception {
|
public void testUidsAllowedOnRestrictedNetworksChanged() throws Exception {
|
||||||
final ContentObserver contentObserver = expectRegisterContentObserver(
|
final ContentObserver contentObserver = expectRegisterContentObserver(
|
||||||
@@ -957,8 +964,6 @@ public class PermissionMonitorTest {
|
|||||||
mPermissionMonitor.onUserAdded(MOCK_USER1);
|
mPermissionMonitor.onUserAdded(MOCK_USER1);
|
||||||
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE);
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE);
|
||||||
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1);
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1);
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1))
|
|
||||||
.thenReturn(new String[]{MOCK_PACKAGE1, MOCK_PACKAGE2});
|
|
||||||
|
|
||||||
// MOCK_PACKAGE1 have CHANGE_NETWORK_STATE, MOCK_UID1 should have NETWORK permission.
|
// MOCK_PACKAGE1 have CHANGE_NETWORK_STATE, MOCK_UID1 should have NETWORK permission.
|
||||||
addPackageForUsers(new UserHandle[]{MOCK_USER1}, MOCK_PACKAGE1, MOCK_UID1);
|
addPackageForUsers(new UserHandle[]{MOCK_USER1}, MOCK_PACKAGE1, MOCK_UID1);
|
||||||
@@ -1105,8 +1110,6 @@ public class PermissionMonitorTest {
|
|||||||
externalIntent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, new String[] {MOCK_PACKAGE1});
|
externalIntent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, new String[] {MOCK_PACKAGE1});
|
||||||
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE);
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE1, MOCK_UID1, CHANGE_NETWORK_STATE);
|
||||||
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1, UPDATE_DEVICE_STATS);
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1, UPDATE_DEVICE_STATS);
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1))
|
|
||||||
.thenReturn(new String[]{MOCK_PACKAGE1, MOCK_PACKAGE2});
|
|
||||||
receiver.onReceive(mContext, externalIntent);
|
receiver.onReceive(mContext, externalIntent);
|
||||||
mNetdMonitor.expectNetworkPerm(NETWORK, new UserHandle[]{MOCK_USER1}, MOCK_UID1);
|
mNetdMonitor.expectNetworkPerm(NETWORK, new UserHandle[]{MOCK_USER1}, MOCK_UID1);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_UPDATE_DEVICE_STATS, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_UPDATE_DEVICE_STATS, MOCK_UID1);
|
||||||
@@ -1137,8 +1140,6 @@ public class PermissionMonitorTest {
|
|||||||
CONNECTIVITY_USE_RESTRICTED_NETWORKS, UPDATE_DEVICE_STATS);
|
CONNECTIVITY_USE_RESTRICTED_NETWORKS, UPDATE_DEVICE_STATS);
|
||||||
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1, CHANGE_NETWORK_STATE,
|
buildAndMockPackageInfoWithPermissions(MOCK_PACKAGE2, MOCK_UID1, CHANGE_NETWORK_STATE,
|
||||||
INTERNET);
|
INTERNET);
|
||||||
when(mPackageManager.getPackagesForUid(MOCK_UID1))
|
|
||||||
.thenReturn(new String[]{MOCK_PACKAGE1, MOCK_PACKAGE2});
|
|
||||||
receiver.onReceive(mContext, externalIntent);
|
receiver.onReceive(mContext, externalIntent);
|
||||||
mNetdMonitor.expectNetworkPerm(SYSTEM, new UserHandle[]{MOCK_USER1}, MOCK_UID1);
|
mNetdMonitor.expectNetworkPerm(SYSTEM, new UserHandle[]{MOCK_USER1}, MOCK_UID1);
|
||||||
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
mNetdMonitor.expectTrafficPerm(PERMISSION_TRAFFIC_ALL, MOCK_UID1);
|
||||||
|
|||||||
Reference in New Issue
Block a user