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
17package com.android.server.pm;
18
19import android.os.Bundle;
20import android.os.UserHandle;
21import android.os.UserManager;
22import android.test.AndroidTestCase;
23import android.test.suitebuilder.annotation.SmallTest;
24
25import com.android.server.devicepolicy.DpmTestUtils;
26
27/**
28 * Tests for {@link com.android.server.pm.UserRestrictionsUtils}.
29 *
30 * <p>Run with:<pre>
31   m FrameworksServicesTests &&
32   adb install \
33     -r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
34   adb shell am instrument -e class com.android.server.pm.UserRestrictionsUtilsTest \
35     -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
36 * </pre>
37 */
38@SmallTest
39public class UserRestrictionsUtilsTest extends AndroidTestCase {
40    public void testNonNull() {
41        Bundle out = UserRestrictionsUtils.nonNull(null);
42        assertNotNull(out);
43        out.putBoolean("a", true); // Should not be Bundle.EMPTY.
44
45        Bundle in = new Bundle();
46        assertSame(in, UserRestrictionsUtils.nonNull(in));
47    }
48
49    public void testIsEmpty() {
50        assertTrue(UserRestrictionsUtils.isEmpty(null));
51        assertTrue(UserRestrictionsUtils.isEmpty(new Bundle()));
52        assertFalse(UserRestrictionsUtils.isEmpty(DpmTestUtils.newRestrictions("a")));
53    }
54
55    public void testClone() {
56        Bundle in = new Bundle();
57        Bundle out = UserRestrictionsUtils.clone(in);
58        assertNotSame(in, out);
59        DpmTestUtils.assertRestrictions(out, new Bundle());
60
61        out = UserRestrictionsUtils.clone(null);
62        assertNotNull(out);
63        out.putBoolean("a", true); // Should not be Bundle.EMPTY.
64    }
65
66    public void testMerge() {
67        Bundle a = DpmTestUtils.newRestrictions("a", "d");
68        Bundle b = DpmTestUtils.newRestrictions("b", "d", "e");
69
70        UserRestrictionsUtils.merge(a, b);
71
72        DpmTestUtils.assertRestrictions(DpmTestUtils.newRestrictions("a", "b", "d", "e"), a);
73
74        UserRestrictionsUtils.merge(a, null);
75
76        DpmTestUtils.assertRestrictions(DpmTestUtils.newRestrictions("a", "b", "d", "e"), a);
77
78        try {
79            UserRestrictionsUtils.merge(a, a);
80            fail();
81        } catch (IllegalArgumentException expected) {
82        }
83    }
84
85    public void testCanDeviceOwnerChange() {
86        assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_RECORD_AUDIO));
87        assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_WALLPAPER));
88        assertTrue(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_ADD_USER));
89    }
90
91    public void testCanProfileOwnerChange() {
92        int user = UserHandle.USER_SYSTEM;
93        assertFalse(UserRestrictionsUtils.canProfileOwnerChange(
94                UserManager.DISALLOW_RECORD_AUDIO, user));
95        assertFalse(UserRestrictionsUtils.canProfileOwnerChange(
96                UserManager.DISALLOW_WALLPAPER, user));
97        assertTrue(UserRestrictionsUtils.canProfileOwnerChange(
98                UserManager.DISALLOW_ADD_USER, user));
99        assertTrue(UserRestrictionsUtils.canProfileOwnerChange(
100                UserManager.DISALLOW_ADJUST_VOLUME, user));
101
102        user = 10;
103        assertFalse(UserRestrictionsUtils.canProfileOwnerChange(
104                UserManager.DISALLOW_RECORD_AUDIO, user));
105        assertFalse(UserRestrictionsUtils.canProfileOwnerChange(
106                UserManager.DISALLOW_WALLPAPER, user));
107        assertFalse(UserRestrictionsUtils.canProfileOwnerChange(
108                UserManager.DISALLOW_ADD_USER, user));
109        assertTrue(UserRestrictionsUtils.canProfileOwnerChange(
110                UserManager.DISALLOW_ADJUST_VOLUME, user));
111    }
112
113    public void testSortToGlobalAndLocal() {
114        final Bundle local = new Bundle();
115        final Bundle global = new Bundle();
116
117        UserRestrictionsUtils.sortToGlobalAndLocal(null, global, local);
118        assertEquals(0, global.size());
119        assertEquals(0, local.size());
120
121        UserRestrictionsUtils.sortToGlobalAndLocal(Bundle.EMPTY, global, local);
122        assertEquals(0, global.size());
123        assertEquals(0, local.size());
124
125        UserRestrictionsUtils.sortToGlobalAndLocal(DpmTestUtils.newRestrictions(
126                UserManager.DISALLOW_ADJUST_VOLUME,
127                UserManager.DISALLOW_UNMUTE_MICROPHONE,
128                UserManager.DISALLOW_USB_FILE_TRANSFER,
129                UserManager.DISALLOW_CONFIG_TETHERING,
130                UserManager.DISALLOW_OUTGOING_BEAM,
131                UserManager.DISALLOW_APPS_CONTROL
132        ), global, local);
133
134
135        DpmTestUtils.assertRestrictions(DpmTestUtils.newRestrictions(
136                // These can be set by PO too, but when DO sets them, they're global.
137                UserManager.DISALLOW_ADJUST_VOLUME,
138                UserManager.DISALLOW_UNMUTE_MICROPHONE,
139
140                // These can only be set by DO.
141                UserManager.DISALLOW_USB_FILE_TRANSFER,
142                UserManager.DISALLOW_CONFIG_TETHERING
143        ), global);
144
145        DpmTestUtils.assertRestrictions(DpmTestUtils.newRestrictions(
146                // They can be set by both DO/PO.
147                UserManager.DISALLOW_OUTGOING_BEAM,
148                UserManager.DISALLOW_APPS_CONTROL
149        ), local);
150    }
151
152    public void testAreEqual() {
153        assertTrue(UserRestrictionsUtils.areEqual(
154                null,
155                null));
156
157        assertTrue(UserRestrictionsUtils.areEqual(
158                null,
159                Bundle.EMPTY));
160
161        assertTrue(UserRestrictionsUtils.areEqual(
162                Bundle.EMPTY,
163                null));
164
165        assertTrue(UserRestrictionsUtils.areEqual(
166                Bundle.EMPTY,
167                Bundle.EMPTY));
168
169        assertTrue(UserRestrictionsUtils.areEqual(
170                new Bundle(),
171                Bundle.EMPTY));
172
173        assertFalse(UserRestrictionsUtils.areEqual(
174                null,
175                DpmTestUtils.newRestrictions("a")));
176
177        assertFalse(UserRestrictionsUtils.areEqual(
178                DpmTestUtils.newRestrictions("a"),
179                null));
180
181        assertTrue(UserRestrictionsUtils.areEqual(
182                DpmTestUtils.newRestrictions("a"),
183                DpmTestUtils.newRestrictions("a")));
184
185        assertFalse(UserRestrictionsUtils.areEqual(
186                DpmTestUtils.newRestrictions("a"),
187                DpmTestUtils.newRestrictions("a", "b")));
188
189        assertFalse(UserRestrictionsUtils.areEqual(
190                DpmTestUtils.newRestrictions("a", "b"),
191                DpmTestUtils.newRestrictions("a")));
192
193        assertFalse(UserRestrictionsUtils.areEqual(
194                DpmTestUtils.newRestrictions("b", "a"),
195                DpmTestUtils.newRestrictions("a", "a")));
196
197        // Make sure false restrictions are handled correctly.
198        final Bundle a = DpmTestUtils.newRestrictions("a");
199        a.putBoolean("b", true);
200
201        final Bundle b = DpmTestUtils.newRestrictions("a");
202        b.putBoolean("b", false);
203
204        assertFalse(UserRestrictionsUtils.areEqual(a, b));
205        assertFalse(UserRestrictionsUtils.areEqual(b, a));
206    }
207}
208