• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016, 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.managedprovisioning.model;
17 
18 import static com.android.managedprovisioning.TestUtils.createTestAdminExtras;
19 
20 import static org.mockito.ArgumentMatchers.eq;
21 import static org.mockito.ArgumentMatchers.nullable;
22 import static org.mockito.Mockito.when;
23 
24 import android.accounts.Account;
25 import android.app.admin.DevicePolicyManager;
26 import android.content.ComponentName;
27 import android.os.Parcel;
28 import android.os.UserHandle;
29 import android.test.AndroidTestCase;
30 import android.test.MoreAsserts;
31 import android.test.suitebuilder.annotation.SmallTest;
32 
33 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException;
34 import com.android.managedprovisioning.common.Utils;
35 
36 import org.mockito.Mock;
37 import org.mockito.MockitoAnnotations;
38 
39 import java.io.File;
40 import java.util.Locale;
41 
42 /** Tests for {@link ProvisioningParams} */
43 public class ProvisioningParamsTest extends AndroidTestCase {
44     private static final String TEST_PROVISIONING_ACTION =
45             DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
46 
47     private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc";
48     private static final ComponentName TEST_COMPONENT_NAME =
49             ComponentName.unflattenFromString(
50                     "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver");
51     private static final long TEST_LOCAL_TIME = 1456939524713L;
52     private static final Locale TEST_LOCALE = Locale.UK;
53     private static final String TEST_TIME_ZONE = "GMT";
54     private static final Integer TEST_MAIN_COLOR = 65280;
55     private static final boolean TEST_STARTED_BY_TRUSTED_SOURCE = true;
56     private static final boolean TEST_IS_NFC = true;
57     private static final boolean TEST_LEAVE_ALL_SYSTEM_APP_ENABLED = true;
58     private static final boolean TEST_SKIP_ENCRYPTION = true;
59     private static final boolean TEST_SKIP_USER_SETUP = true;
60     private static final boolean TEST_SKIP_USER_CONSENT = true;
61     private static final Account TEST_ACCOUNT_TO_MIGRATE =
62             new Account("user@gmail.com", "com.google");
63 
64     // Wifi info
65     private static final String TEST_SSID = "TestWifi";
66     private static final boolean TEST_HIDDEN = true;
67     private static final String TEST_SECURITY_TYPE = "WPA2";
68     private static final String TEST_PASSWORD = "GoogleRock";
69     private static final String TEST_PROXY_HOST = "testhost.com";
70     private static final int TEST_PROXY_PORT = 7689;
71     private static final String TEST_PROXY_BYPASS_HOSTS = "http://host1.com;https://host2.com";
72     private static final String TEST_PAC_URL = "pac.test.com";
73     private static final WifiInfo TEST_WIFI_INFO = WifiInfo.Builder.builder()
74             .setSsid(TEST_SSID)
75             .setHidden(TEST_HIDDEN)
76             .setSecurityType(TEST_SECURITY_TYPE)
77             .setPassword(TEST_PASSWORD)
78             .setProxyHost(TEST_PROXY_HOST)
79             .setProxyPort(TEST_PROXY_PORT)
80             .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS)
81             .setPacUrl(TEST_PAC_URL)
82             .build();
83 
84     // Device admin package download info
85     private static final String TEST_DOWNLOAD_LOCATION =
86             "http://example/dpc.apk";
87     private static final String TEST_COOKIE_HEADER =
88             "Set-Cookie: sessionToken=foobar; Expires=Thu, 18 Feb 2016 23:59:59 GMT";
89     private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[] { '1', '2', '3', '4', '5' };
90     private static final byte[] TEST_SIGNATURE_CHECKSUM = new byte[] { '5', '4', '3', '2', '1' };
91     private static final int TEST_MIN_SUPPORT_VERSION = 17689;
92     private static final PackageDownloadInfo TEST_DOWNLOAD_INFO =
93             PackageDownloadInfo.Builder.builder()
94                     .setLocation(TEST_DOWNLOAD_LOCATION)
95                     .setCookieHeader(TEST_COOKIE_HEADER)
96                     .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
97                     .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM)
98                     .setMinVersion(TEST_MIN_SUPPORT_VERSION)
99                     .build();
100 
101     @Mock
102     private Utils mUtils;
103 
104     @Override
setUp()105     protected void setUp() throws Exception {
106         super.setUp();
107         MockitoAnnotations.initMocks(this);
108     }
109 
110     @SmallTest
testFailToConstructProvisioningParamsWithoutPackageNameOrComponentName()111     public void testFailToConstructProvisioningParamsWithoutPackageNameOrComponentName() {
112         // WHEN the ProvisioningParams is constructed by with neither a package name nor a component
113         // name
114         try {
115             ProvisioningParams provisioningParams = ProvisioningParams.Builder.builder()
116                     .setProvisioningAction(TEST_PROVISIONING_ACTION)
117                     .build();
118             fail("Package name or component name is mandatory.");
119         } catch (IllegalArgumentException e) {
120             // THEN the ProvisioningParams fails to construct.
121         }
122     }
123 
124     @SmallTest
testFailToConstructProvisioningParamsWithoutProvisioningAction()125     public void testFailToConstructProvisioningParamsWithoutProvisioningAction() {
126         // WHEN the ProvisioningParams is constructed by without a provisioning action.
127         try {
128             ProvisioningParams provisioningParams = ProvisioningParams.Builder.builder()
129                     .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
130                     .build();
131             fail("Provisioning action is mandatory");
132         } catch (NullPointerException e) {
133             // THEN the ProvisioningParams fails to construct.
134         }
135     }
136 
137     @SmallTest
testEquals()138     public void testEquals() {
139         // GIVEN 2 ProvisioningParams objects created by the same set of parameters
140         ProvisioningParams provisioningParams1 = getCompleteProvisioningParams();
141         ProvisioningParams provisioningParams2 = getCompleteProvisioningParams();
142 
143         // WHEN these two objects compare.
144         // THEN they are the same.
145         assertEquals(provisioningParams1, provisioningParams2);
146     }
147 
148     @SmallTest
testNotEquals()149     public void testNotEquals() {
150         // GIVEN 2 ProvisioningParams objects created by different sets of parameters
151         ProvisioningParams provisioningParams1 = ProvisioningParams.Builder.builder()
152                 .setProvisioningAction(TEST_PROVISIONING_ACTION)
153                 .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
154                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
155                 .setDeviceAdminDownloadInfo(TEST_DOWNLOAD_INFO)
156                 .setLocalTime(TEST_LOCAL_TIME)
157                 .setLocale(TEST_LOCALE)
158                 .setTimeZone(TEST_TIME_ZONE)
159                 .setMainColor(TEST_MAIN_COLOR)
160                 .setStartedByTrustedSource(TEST_STARTED_BY_TRUSTED_SOURCE)
161                 .setLeaveAllSystemAppsEnabled(TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
162                 .setSkipEncryption(TEST_SKIP_ENCRYPTION)
163                 .setSkipUserSetup(TEST_SKIP_USER_SETUP)
164                 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
165                 .setWifiInfo(TEST_WIFI_INFO)
166                 .setAdminExtrasBundle(createTestAdminExtras())
167                 .build();
168         ProvisioningParams provisioningParams2 = ProvisioningParams.Builder.builder()
169                 .setProvisioningAction("different.action")
170                 .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
171                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
172                 .setDeviceAdminDownloadInfo(TEST_DOWNLOAD_INFO)
173                 .setLocalTime(TEST_LOCAL_TIME)
174                 .setLocale(TEST_LOCALE)
175                 .setTimeZone(TEST_TIME_ZONE)
176                 .setMainColor(TEST_MAIN_COLOR)
177                 .setStartedByTrustedSource(TEST_STARTED_BY_TRUSTED_SOURCE)
178                 .setLeaveAllSystemAppsEnabled(TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
179                 .setSkipEncryption(TEST_SKIP_ENCRYPTION)
180                 .setSkipUserSetup(TEST_SKIP_USER_SETUP)
181                 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
182                 .setWifiInfo(TEST_WIFI_INFO)
183                 .setAdminExtrasBundle(createTestAdminExtras())
184                 .build();
185 
186         // WHEN these two objects compare.
187         // THEN they are not the same.
188         MoreAsserts.assertNotEqual(provisioningParams1, provisioningParams2);
189     }
190 
191     @SmallTest
testSaveAndRestoreComplete()192     public void testSaveAndRestoreComplete() throws Exception {
193         testSaveAndRestore(getCompleteProvisioningParams());
194     }
195 
196     // Testing with a minimum set of parameters to cover all null use cases.
197     @SmallTest
testSaveAndRestoreMinimalist()198     public void testSaveAndRestoreMinimalist() throws Exception {
199         testSaveAndRestore(ProvisioningParams.Builder.builder()
200                 .setProvisioningAction(TEST_PROVISIONING_ACTION)
201                 .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
202                 .build());
203     }
204 
testSaveAndRestore(ProvisioningParams original)205     private void testSaveAndRestore(ProvisioningParams original) {
206         // GIVEN a ProvisioningParams object
207         // WHEN the ProvisioningParams is written to xml and then read back
208         File file = new File(mContext.getFilesDir(), "test_store.xml");
209         original.save(file);
210         ProvisioningParams copy = ProvisioningParams.load(file);
211         // THEN the same ProvisioningParams is obtained
212         assertEquals(original, copy);
213     }
214 
215     @SmallTest
testParceable()216     public void testParceable() {
217         // GIVEN a ProvisioningParams object.
218         ProvisioningParams expectedProvisioningParams = getCompleteProvisioningParams();
219 
220         // WHEN the ProvisioningParams is written to parcel and then read back.
221         Parcel parcel = Parcel.obtain();
222         expectedProvisioningParams.writeToParcel(parcel, 0);
223         parcel.setDataPosition(0);
224         ProvisioningParams actualProvisioningParams =
225                 ProvisioningParams.CREATOR.createFromParcel(parcel);
226 
227         // THEN the same ProvisioningParams is obtained.
228         assertEquals(expectedProvisioningParams, actualProvisioningParams);
229     }
230 
231     @SmallTest
testInferDeviceAdminComponentName_componentNameIsGiven()232     public void testInferDeviceAdminComponentName_componentNameIsGiven()
233             throws IllegalProvisioningArgumentException {
234         ProvisioningParams provisioningParams = new
235                 ProvisioningParams.Builder()
236                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
237                 .setProvisioningAction(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)
238                 .build();
239 
240         assertEquals(TEST_COMPONENT_NAME, provisioningParams.inferDeviceAdminComponentName(
241                 mUtils, mContext, UserHandle.myUserId()));
242     }
243 
244     @SmallTest
testInferDeviceAdminComponentName_componentNameIsNotGiven()245     public void testInferDeviceAdminComponentName_componentNameIsNotGiven()
246             throws IllegalProvisioningArgumentException {
247         ProvisioningParams provisioningParams = new
248                 ProvisioningParams.Builder()
249                 .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
250                 .setProvisioningAction(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)
251                 .build();
252 
253         when(mUtils.findDeviceAdmin(eq(TEST_PACKAGE_NAME), nullable(ComponentName.class),
254                 eq(mContext), eq(UserHandle.myUserId()))).thenReturn(TEST_COMPONENT_NAME);
255 
256         assertEquals(TEST_COMPONENT_NAME, provisioningParams.inferDeviceAdminComponentName(
257                 mUtils, mContext, UserHandle.myUserId()));
258     }
259 
getCompleteProvisioningParams()260     private ProvisioningParams getCompleteProvisioningParams() {
261         return ProvisioningParams.Builder.builder()
262                 .setProvisioningAction(TEST_PROVISIONING_ACTION)
263                 .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
264                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
265                 .setDeviceAdminDownloadInfo(TEST_DOWNLOAD_INFO)
266                 .setLocalTime(TEST_LOCAL_TIME)
267                 .setLocale(TEST_LOCALE)
268                 .setTimeZone(TEST_TIME_ZONE)
269                 .setMainColor(TEST_MAIN_COLOR)
270                 .setStartedByTrustedSource(TEST_STARTED_BY_TRUSTED_SOURCE)
271                 .setIsNfc(TEST_IS_NFC)
272                 .setLeaveAllSystemAppsEnabled(TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
273                 .setSkipEncryption(TEST_SKIP_ENCRYPTION)
274                 .setSkipUserSetup(TEST_SKIP_USER_SETUP)
275                 .setSkipUserConsent(TEST_SKIP_USER_CONSENT)
276                 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
277                 .setWifiInfo(TEST_WIFI_INFO)
278                 .setAdminExtrasBundle(createTestAdminExtras())
279                 .build();
280     }
281 }
282