• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.managedprovisioning.task;
18 
19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertTrue;
22 import static org.junit.Assert.fail;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.verifyNoMoreInteractions;
25 import static org.mockito.Mockito.when;
26 
27 import android.content.Context;
28 import android.content.pm.IPackageDeleteObserver;
29 import android.content.pm.PackageInfo;
30 import android.content.pm.PackageManager;
31 import android.os.RemoteException;
32 import android.support.test.InstrumentationRegistry;
33 import android.support.test.filters.SmallTest;
34 import android.test.mock.MockPackageManager;
35 
36 import com.android.managedprovisioning.model.ProvisioningParams;
37 import com.android.managedprovisioning.task.nonrequiredapps.NonRequiredAppsLogic;
38 
39 import java.util.Arrays;
40 import java.util.Collections;
41 import java.util.HashSet;
42 import java.util.Set;
43 
44 import org.junit.Before;
45 import org.junit.Test;
46 import org.mockito.Mock;
47 import org.mockito.MockitoAnnotations;
48 
49 @SmallTest
50 public class DeleteNonRequiredAppsTaskTest {
51     private static final String TEST_DPC_PACKAGE_NAME = "dpc.package.name";
52     private static final int TEST_USER_ID = 123;
53     private static final ProvisioningParams TEST_PARAMS = new ProvisioningParams.Builder()
54             .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
55             .setDeviceAdminPackageName(TEST_DPC_PACKAGE_NAME)
56             .build();
57 
58     private @Mock AbstractProvisioningTask.Callback mCallback;
59     private @Mock Context mTestContext;
60     private @Mock NonRequiredAppsLogic mLogic;
61 
62     private FakePackageManager mPackageManager;
63     private Set<String> mDeletedApps;
64     private DeleteNonRequiredAppsTask mTask;
65 
66     @Before
setUp()67     public void setUp() throws Exception {
68         MockitoAnnotations.initMocks(this);
69 
70         mPackageManager = new FakePackageManager();
71 
72         when(mTestContext.getPackageManager()).thenReturn(mPackageManager);
73         when(mTestContext.getFilesDir()).thenReturn(InstrumentationRegistry.getTargetContext()
74                 .getFilesDir());
75 
76         mDeletedApps = new HashSet<>();
77 
78         mTask = new DeleteNonRequiredAppsTask(mTestContext, TEST_PARAMS, mCallback, mLogic);
79     }
80 
81     @Test
testNoAppsToDelete()82     public void testNoAppsToDelete() {
83         // GIVEN that no apps should be deleted
84         when(mLogic.getSystemAppsToRemove(TEST_USER_ID)).thenReturn(Collections.emptySet());
85         mPackageManager.setInstalledApps(setFromArray("app.a"));
86 
87         // WHEN running the task
88         mTask.run(TEST_USER_ID);
89 
90         // THEN maybe take snapshot should have been called
91         verify(mLogic).maybeTakeSystemAppsSnapshot(TEST_USER_ID);
92 
93         // THEN success should be called
94         verify(mCallback).onSuccess(mTask);
95         verifyNoMoreInteractions(mCallback);
96 
97         // THEN no apps should have been deleted
98         assertDeletedApps();
99     }
100 
101     @Test
testAppsToDelete()102     public void testAppsToDelete() {
103         // GIVEN that some apps should be deleted
104         when(mLogic.getSystemAppsToRemove(TEST_USER_ID))
105                 .thenReturn(setFromArray("app.a", "app.b"));
106         // GIVEN that only app a is currently installed
107         mPackageManager.setInstalledApps(setFromArray("app.a", "app.c"));
108 
109         // WHEN running the task
110         mTask.run(TEST_USER_ID);
111 
112         // THEN maybe take snapshot should have been called
113         verify(mLogic).maybeTakeSystemAppsSnapshot(TEST_USER_ID);
114 
115         // THEN success should be called
116         verify(mCallback).onSuccess(mTask);
117         verifyNoMoreInteractions(mCallback);
118 
119         // THEN those apps should have been deleted
120         assertDeletedApps("app.a");
121     }
122 
123     @Test
testAllAppsAlreadyDeleted()124     public void testAllAppsAlreadyDeleted() {
125         // GIVEN that some apps should be deleted
126         when(mLogic.getSystemAppsToRemove(TEST_USER_ID))
127             .thenReturn(setFromArray("app.a", "app.b"));
128 
129         // WHEN running the task
130         mTask.run(TEST_USER_ID);
131 
132         // THEN maybe take snapshot should have been called
133         verify(mLogic).maybeTakeSystemAppsSnapshot(TEST_USER_ID);
134 
135         // THEN success should be called
136         verify(mCallback).onSuccess(mTask);
137         verifyNoMoreInteractions(mCallback);
138 
139         // THEN those apps should have been deleted
140         assertDeletedApps();
141     }
142 
143     @Test
testDeletionFailed()144     public void testDeletionFailed() {
145         // GIVEN that one app should be deleted
146         when(mLogic.getSystemAppsToRemove(TEST_USER_ID))
147             .thenReturn(setFromArray("app.a"));
148         mPackageManager.setInstalledApps(setFromArray("app.a"));
149 
150         // GIVEN that deletion fails
151         mPackageManager.setDeletionSucceeds(false);
152 
153         // WHEN running the task
154         mTask.run(TEST_USER_ID);
155 
156         // THEN maybe take snapshot should have been called
157         verify(mLogic).maybeTakeSystemAppsSnapshot(TEST_USER_ID);
158 
159         // THEN error should be returned
160         verify(mCallback).onError(mTask, 0);
161         verifyNoMoreInteractions(mCallback);
162     }
163 
setFromArray(T... array)164     private <T> Set<T> setFromArray(T... array) {
165         if (array == null) {
166             return null;
167         }
168         return new HashSet<>(Arrays.asList(array));
169     }
170 
assertDeletedApps(String... appArray)171     private void assertDeletedApps(String... appArray) {
172         assertEquals(setFromArray(appArray), mDeletedApps);
173     }
174 
175 
176     class FakePackageManager extends MockPackageManager {
177         private boolean mDeletionSucceeds = true;
178         private Set<String> mInstalledApps = new HashSet<>();
179 
setDeletionSucceeds(boolean deletionSucceeds)180         void setDeletionSucceeds(boolean deletionSucceeds) {
181             mDeletionSucceeds = deletionSucceeds;
182         }
183 
setInstalledApps(Set<String> set)184         void setInstalledApps(Set<String> set) {
185             mInstalledApps = set;
186         }
187 
188         @Override
deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags, int userId)189         public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer,
190                 int flags, int userId) {
191             if (mDeletionSucceeds) {
192                 mDeletedApps.add(packageName);
193             }
194             assertTrue((flags & PackageManager.DELETE_SYSTEM_APP) != 0);
195             assertEquals(TEST_USER_ID, userId);
196 
197             int resultCode;
198             if (mDeletionSucceeds) {
199                 resultCode = PackageManager.DELETE_SUCCEEDED;
200             } else {
201                 resultCode = PackageManager.DELETE_FAILED_INTERNAL_ERROR;
202             }
203             assertTrue(mInstalledApps.remove(packageName));
204 
205             try {
206                 observer.packageDeleted(packageName, resultCode);
207             } catch (RemoteException e) {
208                 fail(e.toString());
209             }
210         }
211 
212         @Override
getPackageInfoAsUser(String pkg, int flag, int userId)213         public PackageInfo getPackageInfoAsUser(String pkg, int flag, int userId)
214                 throws NameNotFoundException {
215             if (mInstalledApps.contains(pkg) && userId == TEST_USER_ID) {
216                 return new PackageInfo();
217             }
218             throw new NameNotFoundException();
219         }
220     }
221 }
222