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