Home | History | Annotate | Download | only in test
      1 /*
      2  * Copyright (C) 2015 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 package com.android.support.car.test;
     17 
     18 import android.car.Car;
     19 import android.car.CarNotConnectedException;
     20 import android.car.content.pm.AppBlockingPackageInfo;
     21 import android.car.content.pm.CarAppBlockingPolicy;
     22 import android.car.content.pm.CarPackageManager;
     23 import android.content.pm.PackageManager;
     24 import android.test.suitebuilder.annotation.SmallTest;
     25 import android.util.Log;
     26 
     27 import com.android.car.test.MockedCarTestBase;
     28 import com.android.car.test.TestAppBlockingPolicyService;
     29 
     30 @SmallTest
     31 public class CarPackageManagerTest extends MockedCarTestBase {
     32     private static final String TAG = CarPackageManagerTest.class.getSimpleName();
     33 
     34     private static final int POLLING_MAX_RETRY = 10;
     35     private static final long POLLING_SLEEP = 100;
     36 
     37     private CarPackageManager mCarPm;
     38     private PackageManager mPm;
     39 
     40 
     41     @Override
     42     protected void setUp() throws Exception {
     43         super.setUp();
     44         mPm = getContext().getPackageManager();
     45 
     46     }
     47 
     48     private void init(boolean policyFromService) throws Exception {
     49         TestAppBlockingPolicyService.controlPolicySettingFromService(policyFromService);
     50         getVehicleHalEmulator().start();
     51         mCarPm = (CarPackageManager) getCar().getCarManager(Car.PACKAGE_SERVICE);
     52         assertNotNull(mCarPm);
     53     }
     54 
     55     public void testServiceLaunched() throws Exception {
     56         init(true);
     57         assertTrue(pollingCheck(new PollingChecker() {
     58             @Override
     59             public boolean check() {
     60                 return TestAppBlockingPolicyService.getInstance() != null;
     61             }
     62         }, POLLING_MAX_RETRY, POLLING_SLEEP));
     63         final String thisPackage = getContext().getPackageName();
     64         final String serviceClassName = "DOES_NOT_MATTER";
     65         assertTrue(pollingCheck(new PollingChecker() {
     66             @Override
     67             public boolean check() {
     68                 try {
     69                     return mCarPm.isServiceAllowedWhileDriving(thisPackage, serviceClassName);
     70                 } catch (CarNotConnectedException e) {
     71                     return false;
     72                 }
     73             }
     74         }, POLLING_MAX_RETRY, POLLING_SLEEP));
     75         assertTrue(mCarPm.isServiceAllowedWhileDriving(thisPackage, null));
     76         assertFalse(mCarPm.isServiceAllowedWhileDriving(serviceClassName, serviceClassName));
     77         assertFalse(mCarPm.isServiceAllowedWhileDriving(serviceClassName, null));
     78     }
     79 
     80     public void testSettingWhitelist() throws Exception {
     81         init(false);
     82         final String carServicePackageName = "com.android.car";
     83         final String activityAllowed = "NO_SUCH_ACTIVITY_BUT_ALLOWED";
     84         final String activityNotAllowed = "NO_SUCH_ACTIVITY_AND_NOT_ALLOWED";
     85         final String acticityAllowed2 = "NO_SUCH_ACTIVITY_BUT_ALLOWED2";
     86         final String thisPackage = getContext().getPackageName();
     87 
     88         AppBlockingPackageInfo info = new AppBlockingPackageInfo(carServicePackageName, 0, 0,
     89                 AppBlockingPackageInfo.FLAG_SYSTEM_APP, null, new String[] { activityAllowed });
     90         CarAppBlockingPolicy policy = new CarAppBlockingPolicy(new AppBlockingPackageInfo[] { info }
     91                 , null);
     92         Log.i(TAG, "setting policy");
     93         mCarPm.setAppBlockingPolicy(thisPackage, policy,
     94                 CarPackageManager.FLAG_SET_POLICY_WAIT_FOR_CHANGE);
     95         Log.i(TAG, "setting policy done");
     96         assertTrue(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, activityAllowed));
     97         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName,
     98                 activityNotAllowed));
     99 
    100         // replace policy
    101         info = new AppBlockingPackageInfo(carServicePackageName, 0, 0,
    102                 AppBlockingPackageInfo.FLAG_SYSTEM_APP, null, new String[] { acticityAllowed2 });
    103         policy = new CarAppBlockingPolicy(new AppBlockingPackageInfo[] { info }
    104                 , null);
    105         mCarPm.setAppBlockingPolicy(thisPackage, policy,
    106                 CarPackageManager.FLAG_SET_POLICY_WAIT_FOR_CHANGE);
    107         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, activityAllowed));
    108         assertTrue(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, acticityAllowed2));
    109         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName,
    110                 activityNotAllowed));
    111 
    112         //add, it replace the whole package policy. So activities are not added.
    113         info = new AppBlockingPackageInfo(carServicePackageName, 0, 0,
    114                 AppBlockingPackageInfo.FLAG_SYSTEM_APP, null, new String[] { activityAllowed });
    115         policy = new CarAppBlockingPolicy(new AppBlockingPackageInfo[] { info }
    116                 , null);
    117         mCarPm.setAppBlockingPolicy(thisPackage, policy,
    118                 CarPackageManager.FLAG_SET_POLICY_WAIT_FOR_CHANGE |
    119                 CarPackageManager.FLAG_SET_POLICY_ADD);
    120         assertTrue(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, activityAllowed));
    121         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, acticityAllowed2));
    122         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName,
    123                 activityNotAllowed));
    124 
    125         //remove
    126         info = new AppBlockingPackageInfo(carServicePackageName, 0, 0,
    127                 AppBlockingPackageInfo.FLAG_SYSTEM_APP, null, new String[] { activityAllowed });
    128         policy = new CarAppBlockingPolicy(new AppBlockingPackageInfo[] { info }
    129                 , null);
    130         mCarPm.setAppBlockingPolicy(thisPackage, policy,
    131                 CarPackageManager.FLAG_SET_POLICY_WAIT_FOR_CHANGE |
    132                 CarPackageManager.FLAG_SET_POLICY_REMOVE);
    133         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, activityAllowed));
    134         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName, acticityAllowed2));
    135         assertFalse(mCarPm.isActivityAllowedWhileDriving(carServicePackageName,
    136                 activityNotAllowed));
    137     }
    138 
    139     public interface PollingChecker {
    140         boolean check();
    141     }
    142 
    143     public static boolean pollingCheck(PollingChecker checker, int maxRetry, long sleepMs)
    144             throws Exception {
    145         int retry = 0;
    146         boolean checked = checker.check();
    147         while (!checked && (retry < maxRetry)) {
    148             Thread.sleep(sleepMs);
    149             retry++;
    150             checked = checker.check();
    151         }
    152         return checked;
    153     }
    154 }
    155