1/*
2 * Copyright (C) 2014 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.devicepolicy;
18
19import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
20
21import android.content.ComponentName;
22import android.os.UserHandle;
23
24/**
25 * Tests for the DeviceOwner object that saves & loads device and policy owner information.
26 * run this test with:
27 m FrameworksServicesTests &&
28 adb install \
29   -r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
30 adb shell am instrument -e class com.android.server.devicepolicy.OwnersTest \
31   -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
32
33 (mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
34 */
35public class OwnersTest extends DpmTestBase {
36    public void testUpgrade01() throws Exception {
37        getContext().addUsers(10, 11, 20, 21);
38
39        // First, migrate.
40        {
41            final OwnersTestable owners = new OwnersTestable(getContext());
42
43            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
44                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test01/input.xml"));
45
46            owners.load();
47
48            // The legacy file should be removed.
49            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
50
51            // File was empty, so no new files should be created.
52            assertFalse(owners.getDeviceOwnerFileWithTestOverride().exists());
53
54            assertFalse(owners.getProfileOwnerFileWithTestOverride(10).exists());
55            assertFalse(owners.getProfileOwnerFileWithTestOverride(11).exists());
56            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
57            assertFalse(owners.getProfileOwnerFileWithTestOverride(21).exists());
58
59            assertFalse(owners.hasDeviceOwner());
60            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
61            assertNull(owners.getSystemUpdatePolicy());
62            assertEquals(0, owners.getProfileOwnerKeys().size());
63
64            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
65            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
66            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
67            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
68            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
69        }
70
71        // Then re-read and check.
72        {
73            final OwnersTestable owners = new OwnersTestable(getContext());
74            owners.load();
75
76            assertFalse(owners.hasDeviceOwner());
77            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
78            assertNull(owners.getSystemUpdatePolicy());
79            assertEquals(0, owners.getProfileOwnerKeys().size());
80
81            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
82            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
83            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
84            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
85            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
86        }
87    }
88
89    public void testUpgrade02() throws Exception {
90        getContext().addUsers(10, 11, 20, 21);
91
92        // First, migrate.
93        {
94            final OwnersTestable owners = new OwnersTestable(getContext());
95
96            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
97                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test02/input.xml"));
98
99            owners.load();
100
101            // The legacy file should be removed.
102            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
103
104            assertTrue(owners.getDeviceOwnerFileWithTestOverride().exists()); // TODO Check content
105
106            assertFalse(owners.getProfileOwnerFileWithTestOverride(10).exists());
107            assertFalse(owners.getProfileOwnerFileWithTestOverride(11).exists());
108            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
109            assertFalse(owners.getProfileOwnerFileWithTestOverride(21).exists());
110
111            assertTrue(owners.hasDeviceOwner());
112            assertEquals(null, owners.getDeviceOwnerName());
113            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
114            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
115
116            assertNull(owners.getSystemUpdatePolicy());
117            assertEquals(0, owners.getProfileOwnerKeys().size());
118
119            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
120            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
121            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
122            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
123            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
124        }
125
126        // Then re-read and check.
127        {
128            final OwnersTestable owners = new OwnersTestable(getContext());
129            owners.load();
130
131            assertTrue(owners.hasDeviceOwner());
132            assertEquals(null, owners.getDeviceOwnerName());
133            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
134            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
135
136            assertNull(owners.getSystemUpdatePolicy());
137            assertEquals(0, owners.getProfileOwnerKeys().size());
138
139            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
140            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
141            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
142            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
143            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
144        }
145    }
146
147    public void testUpgrade03() throws Exception {
148        getContext().addUsers(10, 11, 20, 21);
149
150        // First, migrate.
151        {
152            final OwnersTestable owners = new OwnersTestable(getContext());
153
154            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
155                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test03/input.xml"));
156
157            owners.load();
158
159            // The legacy file should be removed.
160            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
161
162            assertFalse(owners.getDeviceOwnerFileWithTestOverride().exists());
163
164            assertTrue(owners.getProfileOwnerFileWithTestOverride(10).exists());
165            assertTrue(owners.getProfileOwnerFileWithTestOverride(11).exists());
166            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
167            assertFalse(owners.getProfileOwnerFileWithTestOverride(21).exists());
168
169            assertFalse(owners.hasDeviceOwner());
170            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
171            assertNull(owners.getSystemUpdatePolicy());
172
173            assertEquals(2, owners.getProfileOwnerKeys().size());
174            assertEquals(new ComponentName("com.google.android.testdpc",
175                            "com.google.android.testdpc.DeviceAdminReceiver0"),
176                    owners.getProfileOwnerComponent(10));
177            assertEquals("0", owners.getProfileOwnerName(10));
178            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
179
180            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
181                    owners.getProfileOwnerComponent(11));
182            assertEquals("1", owners.getProfileOwnerName(11));
183            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
184
185            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
186            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
187            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
188            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
189            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
190        }
191
192        // Then re-read and check.
193        {
194            final OwnersTestable owners = new OwnersTestable(getContext());
195            owners.load();
196
197            assertFalse(owners.hasDeviceOwner());
198            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
199            assertNull(owners.getSystemUpdatePolicy());
200
201            assertEquals(2, owners.getProfileOwnerKeys().size());
202            assertEquals(new ComponentName("com.google.android.testdpc",
203                            "com.google.android.testdpc.DeviceAdminReceiver0"),
204                    owners.getProfileOwnerComponent(10));
205            assertEquals("0", owners.getProfileOwnerName(10));
206            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
207
208            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
209                    owners.getProfileOwnerComponent(11));
210            assertEquals("1", owners.getProfileOwnerName(11));
211            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
212
213            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
214            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
215            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
216            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
217            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
218        }
219    }
220
221    /**
222     * Note this also tests {@link Owners#setDeviceOwnerUserRestrictionsMigrated()}
223     * and {@link  Owners#setProfileOwnerUserRestrictionsMigrated(int)}.
224     */
225    public void testUpgrade04() throws Exception {
226        getContext().addUsers(10, 11, 20, 21);
227
228        // First, migrate.
229        {
230            final OwnersTestable owners = new OwnersTestable(getContext());
231
232            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
233                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test04/input.xml"));
234
235            owners.load();
236
237            // The legacy file should be removed.
238            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
239
240            assertTrue(owners.getDeviceOwnerFileWithTestOverride().exists());
241
242            assertTrue(owners.getProfileOwnerFileWithTestOverride(10).exists());
243            assertTrue(owners.getProfileOwnerFileWithTestOverride(11).exists());
244            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
245            assertFalse(owners.getProfileOwnerFileWithTestOverride(21).exists());
246
247            assertTrue(owners.hasDeviceOwner());
248            assertEquals(null, owners.getDeviceOwnerName());
249            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
250            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
251
252            assertNotNull(owners.getSystemUpdatePolicy());
253            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
254
255            assertEquals(2, owners.getProfileOwnerKeys().size());
256            assertEquals(new ComponentName("com.google.android.testdpc",
257                            "com.google.android.testdpc.DeviceAdminReceiver0"),
258                    owners.getProfileOwnerComponent(10));
259            assertEquals("0", owners.getProfileOwnerName(10));
260            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
261
262            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
263                    owners.getProfileOwnerComponent(11));
264            assertEquals("1", owners.getProfileOwnerName(11));
265            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
266
267            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
268            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
269            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
270            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
271            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
272        }
273
274        // Then re-read and check.
275        {
276            final OwnersTestable owners = new OwnersTestable(getContext());
277            owners.load();
278
279            assertTrue(owners.hasDeviceOwner());
280            assertEquals(null, owners.getDeviceOwnerName());
281            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
282            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
283
284            assertNotNull(owners.getSystemUpdatePolicy());
285            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
286
287            assertEquals(2, owners.getProfileOwnerKeys().size());
288            assertEquals(new ComponentName("com.google.android.testdpc",
289                            "com.google.android.testdpc.DeviceAdminReceiver0"),
290                    owners.getProfileOwnerComponent(10));
291            assertEquals("0", owners.getProfileOwnerName(10));
292            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
293
294            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
295                    owners.getProfileOwnerComponent(11));
296            assertEquals("1", owners.getProfileOwnerName(11));
297            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
298
299            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
300            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
301            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
302            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
303            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
304
305            owners.setDeviceOwnerUserRestrictionsMigrated();
306        }
307
308        {
309            final OwnersTestable owners = new OwnersTestable(getContext());
310            owners.load();
311
312            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
313            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
314            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
315            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
316            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
317
318            owners.setProfileOwnerUserRestrictionsMigrated(11);
319        }
320
321        {
322            final OwnersTestable owners = new OwnersTestable(getContext());
323            owners.load();
324
325            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
326            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
327            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
328            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
329            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
330
331            owners.setProfileOwnerUserRestrictionsMigrated(11);
332        }
333    }
334
335    public void testUpgrade05() throws Exception {
336        getContext().addUsers(10, 11, 20, 21);
337
338        // First, migrate.
339        {
340            final OwnersTestable owners = new OwnersTestable(getContext());
341
342            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
343                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test05/input.xml"));
344
345            owners.load();
346
347            // The legacy file should be removed.
348            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
349
350            // Note device initializer is no longer supported.  No need to write the DO file.
351            assertFalse(owners.getDeviceOwnerFileWithTestOverride().exists());
352
353            assertFalse(owners.getProfileOwnerFileWithTestOverride(10).exists());
354            assertFalse(owners.getProfileOwnerFileWithTestOverride(11).exists());
355            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
356
357            assertFalse(owners.hasDeviceOwner());
358            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
359
360
361            assertNull(owners.getSystemUpdatePolicy());
362            assertEquals(0, owners.getProfileOwnerKeys().size());
363
364            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
365            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
366            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
367            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
368            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
369        }
370
371        // Then re-read and check.
372        {
373            final OwnersTestable owners = new OwnersTestable(getContext());
374            owners.load();
375
376            assertFalse(owners.hasDeviceOwner());
377            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
378
379
380            assertNull(owners.getSystemUpdatePolicy());
381            assertEquals(0, owners.getProfileOwnerKeys().size());
382
383            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
384            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
385            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
386            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
387            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
388        }
389    }
390
391    public void testUpgrade06() throws Exception {
392        getContext().addUsers(10, 11, 20, 21);
393
394        // First, migrate.
395        {
396            final OwnersTestable owners = new OwnersTestable(getContext());
397
398            DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
399                    DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test06/input.xml"));
400
401            owners.load();
402
403            // The legacy file should be removed.
404            assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
405
406            assertTrue(owners.getDeviceOwnerFileWithTestOverride().exists());
407
408            assertFalse(owners.getProfileOwnerFileWithTestOverride(10).exists());
409            assertFalse(owners.getProfileOwnerFileWithTestOverride(11).exists());
410            assertFalse(owners.getProfileOwnerFileWithTestOverride(20).exists());
411
412            assertFalse(owners.hasDeviceOwner());
413            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
414            assertEquals(0, owners.getProfileOwnerKeys().size());
415
416            assertNotNull(owners.getSystemUpdatePolicy());
417            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
418
419            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
420            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
421            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
422            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
423            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
424        }
425
426        // Then re-read and check.
427        {
428            final OwnersTestable owners = new OwnersTestable(getContext());
429            owners.load();
430
431            assertFalse(owners.hasDeviceOwner());
432            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
433            assertEquals(0, owners.getProfileOwnerKeys().size());
434
435            assertNotNull(owners.getSystemUpdatePolicy());
436            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
437
438            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
439            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
440            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
441            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
442            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
443        }
444    }
445
446    public void testRemoveExistingFiles() throws Exception {
447        getContext().addUsers(10, 11, 20, 21);
448
449        final OwnersTestable owners = new OwnersTestable(getContext());
450
451        // First, migrate to create new-style config files.
452        DpmTestUtils.writeToFile(owners.getLegacyConfigFileWithTestOverride(),
453                DpmTestUtils.readAsset(mRealTestContext, "OwnersTest/test04/input.xml"));
454
455        owners.load();
456
457        assertFalse(owners.getLegacyConfigFileWithTestOverride().exists());
458
459        assertTrue(owners.getDeviceOwnerFileWithTestOverride().exists());
460        assertTrue(owners.getProfileOwnerFileWithTestOverride(10).exists());
461        assertTrue(owners.getProfileOwnerFileWithTestOverride(11).exists());
462
463        // Then clear all information and save.
464        owners.clearDeviceOwner();
465        owners.clearSystemUpdatePolicy();
466        owners.removeProfileOwner(10);
467        owners.removeProfileOwner(11);
468
469        owners.writeDeviceOwner();
470        owners.writeProfileOwner(10);
471        owners.writeProfileOwner(11);
472        owners.writeProfileOwner(20);
473        owners.writeProfileOwner(21);
474
475        // Now all files should be removed.
476        assertFalse(owners.getDeviceOwnerFileWithTestOverride().exists());
477        assertFalse(owners.getProfileOwnerFileWithTestOverride(10).exists());
478        assertFalse(owners.getProfileOwnerFileWithTestOverride(11).exists());
479    }
480}
481