11efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson/* 21efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * Copyright (C) 2015 The Android Open Source Project 31efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * 41efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * Licensed under the Apache License, Version 2.0 (the "License"); 51efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * you may not use this file except in compliance with the License. 61efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * You may obtain a copy of the License at 71efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * 81efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * http://www.apache.org/licenses/LICENSE-2.0 91efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * 101efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * Unless required by applicable law or agreed to in writing, software 111efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * distributed under the License is distributed on an "AS IS" BASIS, 121efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * See the License for the specific language governing permissions and 141efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson * limitations under the License 151efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson */ 161efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 171efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonpackage com.android.server.net; 181efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 191efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport static org.mockito.Mockito.when; 201efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 211efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.Manifest; 221efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.Manifest.permission; 231efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.app.AppOpsManager; 241efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.app.admin.DeviceAdminInfo; 251efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.app.admin.DevicePolicyManagerInternal; 261efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.content.Context; 271efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.content.pm.PackageManager; 281efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport android.telephony.TelephonyManager; 291efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 301efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport com.android.server.LocalServices; 311efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 321efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport junit.framework.TestCase; 331efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 341efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport org.mockito.Mock; 351efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonimport org.mockito.MockitoAnnotations; 361efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 371efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidsonpublic class NetworkStatsAccessTest extends TestCase { 381efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private static final String TEST_PKG = "com.example.test"; 391efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private static final int TEST_UID = 12345; 401efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 411efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Mock private Context mContext; 421efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Mock private DevicePolicyManagerInternal mDpmi; 431efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Mock private TelephonyManager mTm; 441efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Mock private AppOpsManager mAppOps; 451efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 461efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson // Hold the real service so we can restore it when tearing down the test. 471efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private DevicePolicyManagerInternal mSystemDpmi; 481efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 491efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Override 501efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void setUp() throws Exception { 511efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson super.setUp(); 521efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson MockitoAnnotations.initMocks(this); 531efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 541efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson mSystemDpmi = LocalServices.getService(DevicePolicyManagerInternal.class); 551efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class); 561efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson LocalServices.addService(DevicePolicyManagerInternal.class, mDpmi); 571efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 581efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTm); 591efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOps); 601efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 611efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 621efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson @Override 631efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void tearDown() throws Exception { 641efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class); 651efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson LocalServices.addService(DevicePolicyManagerInternal.class, mSystemDpmi); 661efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson super.tearDown(); 671efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 681efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 691efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_hasCarrierPrivileges() throws Exception { 701efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(true); 711efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 721efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(false); 731efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); 741efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 751efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.DEVICE, 761efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 771efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 781efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 791efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_isDeviceOwner() throws Exception { 801efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 811efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(true); 821efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(false); 831efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); 841efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 851efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.DEVICE, 861efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 871efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 881efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 891efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_isProfileOwner() throws Exception { 901efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 911efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 921efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(true); 931efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); 941efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 951efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.USER, 961efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 971efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 981efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 991efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_hasAppOpsBitAllowed() throws Exception { 1001efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 1011efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 1021efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(true); 1031efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_ALLOWED, false); 1041efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 1051efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.USER, 1061efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 1071efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1081efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1091efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_hasAppOpsBitDefault_grantedPermission() throws Exception { 1101efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 1111efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 1121efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(true); 1131efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, true); 1141efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 1151efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.USER, 1161efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 1171efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1181efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1191efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_hasReadHistoryPermission() throws Exception { 1201efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 1211efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 1221efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(true); 1231efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); 1241efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(true); 1251efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.USER, 1261efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 1271efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1281efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1291efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_deniedAppOpsBit() throws Exception { 1301efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 1311efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 1321efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(false); 1331efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_ERRORED, true); 1341efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 1351efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.DEFAULT, 1361efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 1371efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1381efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1391efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson public void testCheckAccessLevel_deniedAppOpsBit_deniedPermission() throws Exception { 1401efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasCarrierPrivileges(false); 1411efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsDeviceOwner(false); 1421efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setIsProfileOwner(false); 1431efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); 1441efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson setHasReadHistoryPermission(false); 1451efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson assertEquals(NetworkStatsAccess.Level.DEFAULT, 1461efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson NetworkStatsAccess.checkAccessLevel(mContext, TEST_UID, TEST_PKG)); 1471efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1481efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1491efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private void setHasCarrierPrivileges(boolean hasPrivileges) { 1501efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mTm.checkCarrierPrivilegesForPackage(TEST_PKG)).thenReturn( 1511efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson hasPrivileges ? TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS 1521efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson : TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); 1531efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1541efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1551efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private void setIsDeviceOwner(boolean isOwner) { 1561efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mDpmi.isActiveAdminWithPolicy(TEST_UID, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER)) 1571efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson .thenReturn(isOwner); 1581efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1591efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1601efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private void setIsProfileOwner(boolean isOwner) { 1611efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mDpmi.isActiveAdminWithPolicy(TEST_UID, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER)) 1621efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson .thenReturn(isOwner); 1631efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1641efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1651efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private void setHasAppOpsPermission(int appOpsMode, boolean hasPermission) { 1661efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mAppOps.checkOp(AppOpsManager.OP_GET_USAGE_STATS, TEST_UID, TEST_PKG)) 1671efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson .thenReturn(appOpsMode); 1681efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mContext.checkCallingPermission(Manifest.permission.PACKAGE_USAGE_STATS)).thenReturn( 1691efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson hasPermission ? PackageManager.PERMISSION_GRANTED 1701efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson : PackageManager.PERMISSION_DENIED); 1711efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1721efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson 1731efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson private void setHasReadHistoryPermission(boolean hasPermission) { 1741efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson when(mContext.checkCallingOrSelfPermission(permission.READ_NETWORK_USAGE_HISTORY)) 1751efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson .thenReturn(hasPermission ? PackageManager.PERMISSION_GRANTED 1761efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson : PackageManager.PERMISSION_DENIED); 1771efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson } 1781efb1335814aea8ee0696144ca0ab24159b86e54Jeff Davidson} 179