blob: af7123b848422cda5fbd8db143f2b3530a7e6982 [file] [log] [blame]
Chalard Jean26aa91a2018-03-20 19:13:57 +09001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.connectivity;
18
19import static android.Manifest.permission.CHANGE_NETWORK_STATE;
20import static android.Manifest.permission.CHANGE_WIFI_STATE;
21import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
22import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
23import static android.Manifest.permission.NETWORK_STACK;
paulhub6733802018-08-20 11:01:21 +080024import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_OEM;
25import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_PRODUCT;
26import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_VENDOR;
Chalard Jean26aa91a2018-03-20 19:13:57 +090027import static android.content.pm.PackageManager.GET_PERMISSIONS;
paulhu3b0f5ea2018-11-01 10:38:11 +080028import static android.os.Process.SYSTEM_UID;
Chalard Jean26aa91a2018-03-20 19:13:57 +090029
30import static org.junit.Assert.assertFalse;
31import static org.junit.Assert.assertTrue;
Chalard Jean577164b2018-04-02 16:16:46 +090032import static org.mockito.Mockito.anyInt;
junyulai345155e2018-11-09 12:37:16 +080033import static org.mockito.Mockito.doReturn;
Chalard Jean577164b2018-04-02 16:16:46 +090034import static org.mockito.Mockito.eq;
junyulai345155e2018-11-09 12:37:16 +080035import static org.mockito.Mockito.spy;
Chalard Jean26aa91a2018-03-20 19:13:57 +090036import static org.mockito.Mockito.when;
37
38import android.content.Context;
39import android.content.pm.ApplicationInfo;
40import android.content.pm.PackageInfo;
41import android.content.pm.PackageManager;
paulhub6733802018-08-20 11:01:21 +080042import android.os.Build;
Chalard Jean26aa91a2018-03-20 19:13:57 +090043import android.support.test.filters.SmallTest;
44import android.support.test.runner.AndroidJUnit4;
45
46import org.junit.Before;
47import org.junit.Test;
48import org.junit.runner.RunWith;
49import org.mockito.Mock;
50import org.mockito.MockitoAnnotations;
51
52@RunWith(AndroidJUnit4.class)
53@SmallTest
54public class PermissionMonitorTest {
55 private static final int MOCK_UID = 10001;
56 private static final String[] MOCK_PACKAGE_NAMES = new String[] { "com.foo.bar" };
paulhub6733802018-08-20 11:01:21 +080057 private static final String PARTITION_SYSTEM = "system";
58 private static final String PARTITION_OEM = "oem";
59 private static final String PARTITION_PRODUCT = "product";
60 private static final String PARTITION_VENDOR = "vendor";
paulhu3b0f5ea2018-11-01 10:38:11 +080061 private static final int VERSION_P = Build.VERSION_CODES.P;
62 private static final int VERSION_Q = Build.VERSION_CODES.Q;
Chalard Jean26aa91a2018-03-20 19:13:57 +090063
64 @Mock private Context mContext;
65 @Mock private PackageManager mPackageManager;
66
67 private PermissionMonitor mPermissionMonitor;
68
69 @Before
70 public void setUp() throws Exception {
71 MockitoAnnotations.initMocks(this);
72 when(mContext.getPackageManager()).thenReturn(mPackageManager);
paulhu3b0f5ea2018-11-01 10:38:11 +080073 when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(MOCK_PACKAGE_NAMES);
junyulai345155e2018-11-09 12:37:16 +080074 mPermissionMonitor = spy(new PermissionMonitor(mContext, null));
Chalard Jean26aa91a2018-03-20 19:13:57 +090075 }
76
paulhu3b0f5ea2018-11-01 10:38:11 +080077 private boolean hasBgPermission(String partition, int targetSdkVersion, int uid,
78 String... permission) throws Exception {
79 final PackageInfo packageInfo = packageInfoWithPermissions(permission, partition);
paulhub6733802018-08-20 11:01:21 +080080 packageInfo.applicationInfo.targetSdkVersion = targetSdkVersion;
paulhu3b0f5ea2018-11-01 10:38:11 +080081 packageInfo.applicationInfo.uid = uid;
Chalard Jean577164b2018-04-02 16:16:46 +090082 when(mPackageManager.getPackageInfoAsUser(
83 eq(MOCK_PACKAGE_NAMES[0]), eq(GET_PERMISSIONS), anyInt())).thenReturn(packageInfo);
paulhu3b0f5ea2018-11-01 10:38:11 +080084 return mPermissionMonitor.hasUseBackgroundNetworksPermission(uid);
Chalard Jean26aa91a2018-03-20 19:13:57 +090085 }
86
paulhub6733802018-08-20 11:01:21 +080087 private PackageInfo packageInfoWithPermissions(String[] permissions, String partition) {
Chalard Jean26aa91a2018-03-20 19:13:57 +090088 final PackageInfo packageInfo = new PackageInfo();
89 packageInfo.requestedPermissions = permissions;
90 packageInfo.applicationInfo = new ApplicationInfo();
paulhub6733802018-08-20 11:01:21 +080091 int privateFlags = 0;
92 switch (partition) {
93 case PARTITION_OEM:
94 privateFlags = PRIVATE_FLAG_OEM;
95 break;
96 case PARTITION_PRODUCT:
97 privateFlags = PRIVATE_FLAG_PRODUCT;
98 break;
99 case PARTITION_VENDOR:
100 privateFlags = PRIVATE_FLAG_VENDOR;
101 break;
102 }
103 packageInfo.applicationInfo.privateFlags = privateFlags;
Chalard Jean26aa91a2018-03-20 19:13:57 +0900104 return packageInfo;
105 }
106
107 @Test
108 public void testHasPermission() {
paulhub6733802018-08-20 11:01:21 +0800109 PackageInfo app = packageInfoWithPermissions(new String[] {}, PARTITION_SYSTEM);
Chalard Jean26aa91a2018-03-20 19:13:57 +0900110 assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
111 assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
112 assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
113 assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
114
115 app = packageInfoWithPermissions(new String[] {
paulhub6733802018-08-20 11:01:21 +0800116 CHANGE_NETWORK_STATE, NETWORK_STACK
117 }, PARTITION_SYSTEM);
Chalard Jean26aa91a2018-03-20 19:13:57 +0900118 assertTrue(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
119 assertTrue(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
120 assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
121 assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
122
123 app = packageInfoWithPermissions(new String[] {
paulhub6733802018-08-20 11:01:21 +0800124 CONNECTIVITY_USE_RESTRICTED_NETWORKS, CONNECTIVITY_INTERNAL
125 }, PARTITION_SYSTEM);
Chalard Jean26aa91a2018-03-20 19:13:57 +0900126 assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
127 assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
128 assertTrue(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
129 assertTrue(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
130 }
131
132 @Test
paulhub6733802018-08-20 11:01:21 +0800133 public void testIsVendorApp() {
134 PackageInfo app = packageInfoWithPermissions(new String[] {}, PARTITION_SYSTEM);
135 assertFalse(mPermissionMonitor.isVendorApp(app.applicationInfo));
136 app = packageInfoWithPermissions(new String[] {}, PARTITION_OEM);
137 assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo));
138 app = packageInfoWithPermissions(new String[] {}, PARTITION_PRODUCT);
139 assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo));
140 app = packageInfoWithPermissions(new String[] {}, PARTITION_VENDOR);
141 assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo));
Chalard Jean26aa91a2018-03-20 19:13:57 +0900142 }
143
144 @Test
145 public void testHasUseBackgroundNetworksPermission() throws Exception {
paulhu3b0f5ea2018-11-01 10:38:11 +0800146 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID));
147 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CHANGE_NETWORK_STATE));
148 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, NETWORK_STACK));
149 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CONNECTIVITY_INTERNAL));
150 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID,
151 CONNECTIVITY_USE_RESTRICTED_NETWORKS));
152 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CHANGE_WIFI_STATE));
Chalard Jean26aa91a2018-03-20 19:13:57 +0900153
paulhu3b0f5ea2018-11-01 10:38:11 +0800154 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID));
155 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID, CHANGE_WIFI_STATE));
156 }
Chalard Jean26aa91a2018-03-20 19:13:57 +0900157
paulhu3b0f5ea2018-11-01 10:38:11 +0800158 @Test
159 public void testHasUseBackgroundNetworksPermissionSystemUid() throws Exception {
junyulai345155e2018-11-09 12:37:16 +0800160 doReturn(VERSION_P).when(mPermissionMonitor).getDeviceFirstSdkInt();
paulhu3b0f5ea2018-11-01 10:38:11 +0800161 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID));
162 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CHANGE_WIFI_STATE));
163 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID,
164 CONNECTIVITY_USE_RESTRICTED_NETWORKS));
Chalard Jean26aa91a2018-03-20 19:13:57 +0900165
junyulai345155e2018-11-09 12:37:16 +0800166 doReturn(VERSION_Q).when(mPermissionMonitor).getDeviceFirstSdkInt();
paulhu3b0f5ea2018-11-01 10:38:11 +0800167 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID));
168 assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CHANGE_WIFI_STATE));
169 assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID,
170 CONNECTIVITY_USE_RESTRICTED_NETWORKS));
171 }
172
173 @Test
174 public void testHasUseBackgroundNetworksPermissionVendorApp() throws Exception {
175 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID));
176 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CHANGE_NETWORK_STATE));
177 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, NETWORK_STACK));
178 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CONNECTIVITY_INTERNAL));
179 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID,
180 CONNECTIVITY_USE_RESTRICTED_NETWORKS));
181 assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CHANGE_WIFI_STATE));
182
183 assertFalse(hasBgPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID));
184 assertFalse(hasBgPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID, CHANGE_WIFI_STATE));
Chalard Jean26aa91a2018-03-20 19:13:57 +0900185 }
186}