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.parser;
17 
18 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE;
20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
21 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE;
22 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER;
23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
24 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
25 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
26 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE;
27 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
28 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
29 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
30 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL;
31 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
32 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM;
33 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
34 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE;
35 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME;
36 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR;
37 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION;
38 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ORGANIZATION_NAME;
39 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION;
40 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_CONSENT;
41 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SUPPORT_URL;
42 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE;
43 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN;
44 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL;
45 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD;
46 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS;
47 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST;
48 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT;
49 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE;
50 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID;
51 import static android.nfc.NfcAdapter.ACTION_NDEF_DISCOVERED;
52 import static com.android.managedprovisioning.TestUtils.createTestAdminExtras;
53 import static org.mockito.Mockito.doReturn;
54 import static org.mockito.Mockito.spy;
55 import static org.mockito.Mockito.when;
56 
57 import android.accounts.Account;
58 import android.app.admin.DevicePolicyManager;
59 import android.content.ComponentName;
60 import android.content.Context;
61 import android.content.Intent;
62 import android.os.Bundle;
63 import android.test.AndroidTestCase;
64 import android.test.suitebuilder.annotation.SmallTest;
65 import android.util.Base64;
66 import com.android.managedprovisioning.common.Globals;
67 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException;
68 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
69 import com.android.managedprovisioning.common.StoreUtils;
70 import com.android.managedprovisioning.common.Utils;
71 import com.android.managedprovisioning.model.PackageDownloadInfo;
72 import com.android.managedprovisioning.model.ProvisioningParams;
73 import com.android.managedprovisioning.model.WifiInfo;
74 import java.util.Locale;
75 import org.mockito.Mock;
76 import org.mockito.MockitoAnnotations;
77 
78 /** Tests for {@link ExtrasProvisioningDataParser}. */
79 @SmallTest
80 public class ExtrasProvisioningDataParserTest extends AndroidTestCase {
81     private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc";
82     private static final ComponentName TEST_COMPONENT_NAME =
83             ComponentName.unflattenFromString(
84                     "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver");
85     private static final ComponentName TEST_COMPONENT_NAME_2 =
86             ComponentName.unflattenFromString(
87                     "com.afwsamples.testdpc2/com.afwsamples.testdpc.DeviceAdminReceiver");
88     private static final long TEST_LOCAL_TIME = 1456939524713L;
89     private static final Locale TEST_LOCALE = Locale.UK;
90     private static final String TEST_TIME_ZONE = "GMT";
91     private static final Integer TEST_MAIN_COLOR = 65280;
92     private static final boolean TEST_STARTED_BY_TRUSTED_SOURCE = true;
93     private static final boolean TEST_LEAVE_ALL_SYSTEM_APP_ENABLED = true;
94     private static final boolean TEST_SKIP_ENCRYPTION = true;
95     private static final boolean TEST_SKIP_USER_CONSENT = true;
96     private static final boolean TEST_KEEP_ACCOUNT_MIGRATED = true;
97     private static final boolean TEST_SKIP_USER_SETUP = true;
98     private static final long TEST_PROVISIONING_ID = 1000L;
99     private static final Account TEST_ACCOUNT_TO_MIGRATE =
100             new Account("user@gmail.com", "com.google");
101     private static final String TEST_SHARED_PREFERENCE = "ExtrasProvisioningDataParserTest";
102     private static final String TEST_DEVICE_ADMIN_PACKAGE_LABEL = "TestPackage";
103     private static final String TEST_ORGANIZATION_NAME = "TestOrganizationName";
104     private static final String TEST_SUPPORT_URL = "https://www.support.url/";
105 
106     // Wifi info
107     private static final String TEST_SSID = "TestWifi";
108     private static final boolean TEST_HIDDEN = true;
109     private static final String TEST_SECURITY_TYPE = "WPA2";
110     private static final String TEST_PASSWORD = "GoogleRock";
111     private static final String TEST_PROXY_HOST = "testhost.com";
112     private static final int TEST_PROXY_PORT = 7689;
113     private static final String TEST_PROXY_BYPASS_HOSTS = "http://host1.com;https://host2.com";
114     private static final String TEST_PAC_URL = "pac.test.com";
115     private static final WifiInfo TEST_WIFI_INFO = WifiInfo.Builder.builder()
116             .setSsid(TEST_SSID)
117             .setHidden(TEST_HIDDEN)
118             .setSecurityType(TEST_SECURITY_TYPE)
119             .setPassword(TEST_PASSWORD)
120             .setProxyHost(TEST_PROXY_HOST)
121             .setProxyPort(TEST_PROXY_PORT)
122             .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS)
123             .setPacUrl(TEST_PAC_URL)
124             .build();
125 
126     // Device admin package download info
127     private static final String TEST_DOWNLOAD_LOCATION =
128             "http://example/dpc.apk";
129     private static final String TEST_COOKIE_HEADER =
130             "Set-Cookie: sessionToken=foobar; Expires=Thu, 18 Feb 2016 23:59:59 GMT";
131     private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[] { '1', '2', '3', '4', '5' };
132     private static final byte[] TEST_SIGNATURE_CHECKSUM = new byte[] { '5', '4', '3', '2', '1' };
133     private static final int TEST_MIN_SUPPORT_VERSION = 17689;
134     private static final PackageDownloadInfo TEST_DOWNLOAD_INFO =
135             PackageDownloadInfo.Builder.builder()
136                     .setLocation(TEST_DOWNLOAD_LOCATION)
137                     .setCookieHeader(TEST_COOKIE_HEADER)
138                     .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
139                     .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM)
140                     .setMinVersion(TEST_MIN_SUPPORT_VERSION)
141                     .build();
142     @Mock
143     private Context mContext;
144 
145     @Mock
146     private DevicePolicyManager mDpm;
147 
148     @Mock
149     private ManagedProvisioningSharedPreferences mSharedPreferences;
150 
151     private ExtrasProvisioningDataParser mExtrasProvisioningDataParser;
152 
153     private Utils mUtils;
154 
155     @Override
setUp()156     public void setUp() {
157         // this is necessary for mockito to work
158         System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
159 
160         MockitoAnnotations.initMocks(this);
161         when(mContext.getSystemServiceName(DevicePolicyManager.class))
162                 .thenReturn(Context.DEVICE_POLICY_SERVICE);
163         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDpm);
164         when(mSharedPreferences.incrementAndGetProvisioningId()).thenReturn(TEST_PROVISIONING_ID);
165         mUtils = spy(new Utils());
166         mExtrasProvisioningDataParser = new ExtrasProvisioningDataParser(mContext, mUtils,
167                 mSharedPreferences);
168     }
169 
testParse_trustedSourceProvisioningIntent()170     public void testParse_trustedSourceProvisioningIntent() throws Exception {
171         // GIVEN a ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE intent and other extras.
172         Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE)
173                 // GIVEN a device admin package name and component name
174                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
175                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
176                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
177                 .putExtras(getTestWifiInfoExtras())
178                 .putExtras(getTestDeviceAdminDownloadExtras())
179                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
180                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
181                 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT)
182                 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED)
183                 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
184                         TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
185                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
186                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE)
187                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL,
188                         TEST_DEVICE_ADMIN_PACKAGE_LABEL)
189                 .putExtra(EXTRA_PROVISIONING_ORGANIZATION_NAME, TEST_ORGANIZATION_NAME)
190                 .putExtra(EXTRA_PROVISIONING_SUPPORT_URL, TEST_SUPPORT_URL);
191 
192         // WHEN the intent is parsed by the parser.
193         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
194 
195         // THEN ProvisionParams is constructed as expected.
196         assertEquals(
197                 ProvisioningParams.Builder.builder()
198                         // THEN ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE is translated to
199                         // ACTION_PROVISION_MANAGED_DEVICE
200                         .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
201                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
202                         .setDeviceAdminDownloadInfo(TEST_DOWNLOAD_INFO)
203                         .setProvisioningId(TEST_PROVISIONING_ID)
204                         .setLocalTime(TEST_LOCAL_TIME)
205                         .setLocale(TEST_LOCALE)
206                         .setTimeZone(TEST_TIME_ZONE)
207                         // THEN customizable color is not supported.
208                         .setMainColor(ProvisioningParams.DEFAULT_MAIN_COLOR)
209                         // THEN the trusted source is set to true.
210                         .setStartedByTrustedSource(true)
211                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
212                         // THEN skipping user consent flag is ignored
213                         .setSkipUserConsent(false)
214                         // THEN keep account migrated flag is ignored
215                         .setKeepAccountMigrated(false)
216                         .setLeaveAllSystemAppsEnabled(true)
217                         .setWifiInfo(TEST_WIFI_INFO)
218                         .setAdminExtrasBundle(createTestAdminExtras())
219                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
220                         .setDeviceAdminLabel(TEST_DEVICE_ADMIN_PACKAGE_LABEL)
221                         .setOrganizationName(TEST_ORGANIZATION_NAME)
222                         .setSupportUrl(TEST_SUPPORT_URL)
223                         .build(),
224                 params);
225     }
226 
testParse_resumeProvisioningIntent()227     public void testParse_resumeProvisioningIntent() throws Exception {
228         // GIVEN a ProvisioningParams stored in an intent
229         ProvisioningParams expected = ProvisioningParams.Builder.builder()
230                 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
231                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
232                 .build();
233         Intent intent = new Intent(Globals.ACTION_RESUME_PROVISIONING)
234                 .putExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS, expected);
235         // WHEN the intent is parsed by the parser
236         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
237         // THEN we get back the original ProvisioningParams.
238         assertEquals(expected, params);
239     }
240 
testParse_managedProfileIntent()241     public void testParse_managedProfileIntent() throws Exception {
242         // GIVEN a managed profile provisioning intent and other extras.
243         Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE)
244                 // GIVEN a device admin package name and component name
245                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
246                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
247                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
248                 .putExtras(getTestWifiInfoExtras())
249                 .putExtras(getTestDeviceAdminDownloadExtras())
250                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
251                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
252                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
253                 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT)
254                 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED)
255                 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
256                         TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
257                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
258 
259         // GIVEN the device admin is installed.
260         doReturn(TEST_COMPONENT_NAME)
261                 .when(mUtils)
262                 .findDeviceAdmin(TEST_PACKAGE_NAME, TEST_COMPONENT_NAME, mContext);
263 
264         // WHEN the intent is parsed by the parser.
265         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
266 
267         // THEN ProvisionParams is constructed as expected.
268         assertEquals(
269                 ProvisioningParams.Builder.builder()
270                         // THEN provisioning action is ACTION_PROVISION_MANAGED_PROFILE
271                         .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE)
272                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
273                         .setProvisioningId(TEST_PROVISIONING_ID)
274                         // THEN device admin package name is not supported.
275                         .setDeviceAdminPackageName(null)
276                         // THEN device admin download info is not supported.
277                         .setDeviceAdminDownloadInfo(null)
278                         // THEN wifi info is not supported.
279                         .setWifiInfo(null)
280                         .setMainColor(TEST_MAIN_COLOR)
281                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
282                         // THEN leave all system apps flag is ignored
283                         .setLeaveAllSystemAppsEnabled(false)
284                         // THEN skipping user consent flag is ignored
285                         .setSkipUserConsent(false)
286                         .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED)
287                         .setAdminExtrasBundle(createTestAdminExtras())
288                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
289                         .build(),
290                 params);
291     }
292 
testParse_managedProfileIntent_CompProvisioning()293     public void testParse_managedProfileIntent_CompProvisioning() throws Exception {
294         // GIVEN a managed profile provisioning intent and other extras.
295         Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE)
296                 // GIVEN a device admin package name and component name
297                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
298                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
299                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
300                 .putExtras(getTestWifiInfoExtras())
301                 .putExtras(getTestDeviceAdminDownloadExtras())
302                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
303                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
304                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
305                 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT)
306                 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED)
307                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
308 
309         // GIVEN the device admin is installed.
310         doReturn(TEST_COMPONENT_NAME)
311                 .when(mUtils)
312                 .findDeviceAdmin(TEST_PACKAGE_NAME, TEST_COMPONENT_NAME, mContext);
313 
314         // GIVEN the device admin is also device owner in primary user.
315         when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(TEST_COMPONENT_NAME);
316 
317         // WHEN the intent is parsed by the parser.
318         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
319 
320         // THEN ProvisionParams is constructed as expected.
321         assertEquals(
322                 ProvisioningParams.Builder.builder()
323                         // THEN provisioning action is ACTION_PROVISION_MANAGED_PROFILE
324                         .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE)
325                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
326                         .setProvisioningId(TEST_PROVISIONING_ID)
327                         // THEN device admin package name is not supported.
328                         .setDeviceAdminPackageName(null)
329                         // THEN device admin download info is not supported.
330                         .setDeviceAdminDownloadInfo(null)
331                         // THEN wifi info is not supported.
332                         .setWifiInfo(null)
333                         .setMainColor(TEST_MAIN_COLOR)
334                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
335                         .setSkipUserConsent(TEST_SKIP_USER_CONSENT)
336                         .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED)
337                         .setAdminExtrasBundle(createTestAdminExtras())
338                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
339                         .build(),
340                 params);
341     }
342 
testParse_managedProfileIntent_DeviceOwnerWithByodProvisioning()343     public void testParse_managedProfileIntent_DeviceOwnerWithByodProvisioning() throws Exception {
344         // GIVEN a managed profile provisioning intent and other extras.
345         Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE)
346                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
347                 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT)
348                 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED);
349 
350         // GIVEN the device admin is installed.
351         doReturn(TEST_COMPONENT_NAME)
352                 .when(mUtils)
353                 .findDeviceAdmin(null, TEST_COMPONENT_NAME, mContext);
354 
355         // GIVEN a different device admin is a device owner in primary user.
356         when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(TEST_COMPONENT_NAME_2);
357 
358         // WHEN the intent is parsed by the parser.
359         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
360 
361         // THEN ProvisionParams is constructed as expected.
362         assertEquals(
363                 ProvisioningParams.Builder.builder()
364                         .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE)
365                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
366                         .setProvisioningId(TEST_PROVISIONING_ID)
367                         // THEN skipping user consent flag is ignored
368                         .setSkipUserConsent(false)
369                         .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED)
370                         .build(),
371                 params);
372     }
373 
testParse_managedUserIntent()374     public void testParse_managedUserIntent() throws Exception {
375         // GIVEN a managed user provisioning intent and other extras.
376         Intent intent = new Intent(ACTION_PROVISION_MANAGED_USER)
377                 // GIVEN a device admin package name and component name
378                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
379                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
380                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
381                 .putExtras(getTestWifiInfoExtras())
382                 .putExtras(getTestDeviceAdminDownloadExtras())
383                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
384                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
385                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
386                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
387 
388         // WHEN the intent is parsed by the parser.
389         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
390 
391         // THEN ProvisionParams is constructed as expected.
392         assertEquals(
393                 ProvisioningParams.Builder.builder()
394                         // THEN provisioning action is ACTION_PROVISION_MANAGED_USER
395                         .setProvisioningAction(ACTION_PROVISION_MANAGED_USER)
396                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
397                         .setProvisioningId(TEST_PROVISIONING_ID)
398                         // THEN device admin package name is not supported in Managed User
399                         // provisioning.
400                         .setDeviceAdminPackageName(null)
401                         // THEN device admin download info is not supported.
402                         .setDeviceAdminDownloadInfo(null)
403                         // THEN wifi info is not supported.
404                         .setWifiInfo(null)
405                         .setMainColor(TEST_MAIN_COLOR)
406                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
407                         .setAdminExtrasBundle(createTestAdminExtras())
408                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
409                         .build(),
410                 params);
411     }
412 
testParse_managedDeviceIntent()413     public void testParse_managedDeviceIntent() throws Exception {
414         // GIVEN a managed device provisioning intent and other extras.
415         Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE)
416                 // GIVEN a device admin package name and component name
417                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
418                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
419                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
420                 .putExtras(getTestWifiInfoExtras())
421                 .putExtras(getTestDeviceAdminDownloadExtras())
422                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
423                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
424                 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
425                         TEST_LEAVE_ALL_SYSTEM_APP_ENABLED)
426                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
427                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
428 
429         // WHEN the intent is parsed by the parser.
430         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
431 
432         // THEN ProvisionParams is constructed as expected.
433         assertEquals(
434                 ProvisioningParams.Builder.builder()
435                         // THEN provisioning action is ACTION_PROVISION_MANAGED_DEVICE
436                         .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
437                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
438                         .setProvisioningId(TEST_PROVISIONING_ID)
439                         // THEN device admin package name is not supported in Device Owner
440                         // provisioning.
441                         .setDeviceAdminPackageName(null)
442                         // THEN Device Admin download info is not supported.
443                         .setDeviceAdminDownloadInfo(null)
444                         // THEN time, time zone and locale are not supported.
445                         .setMainColor(TEST_MAIN_COLOR)
446                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
447                         .setLeaveAllSystemAppsEnabled(true)
448                         // THEN wifi configuration is not supported.
449                         .setWifiInfo(null)
450                         .setAdminExtrasBundle(createTestAdminExtras())
451                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
452                         .build(),
453                 params);
454     }
455 
testParse_managedSharableDeviceIntent()456     public void testParse_managedSharableDeviceIntent() throws Exception {
457         // GIVEN a managed device provisioning intent and other extras.
458         Intent intent = new Intent(ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE)
459                 // GIVEN a device admin package name and component name
460                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
461                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
462                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
463                 .putExtras(getTestWifiInfoExtras())
464                 .putExtras(getTestDeviceAdminDownloadExtras())
465                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
466                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
467                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
468                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
469 
470         // WHEN the intent is parsed by the parser.
471         ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
472 
473         // THEN ProvisionParams is constructed as expected.
474         assertEquals(
475                 ProvisioningParams.Builder.builder()
476                         // THEN provisioning action is ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE
477                         .setProvisioningAction(ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE)
478                         .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
479                         .setProvisioningId(TEST_PROVISIONING_ID)
480                         // THEN device admin package name is not supported in Device Owner
481                         // provisioning.
482                         .setDeviceAdminPackageName(null)
483                         // THEN Device Admin download info is not supported.
484                         .setDeviceAdminDownloadInfo(null)
485                         // THEN time, time zone and locale are not supported.
486                         .setMainColor(TEST_MAIN_COLOR)
487                         .setSkipEncryption(TEST_SKIP_ENCRYPTION)
488                         // THEN wifi configuration is not supported.
489                         .setWifiInfo(null)
490                         .setAdminExtrasBundle(createTestAdminExtras())
491                         .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE)
492                         .build(),
493                 params);
494     }
495 
testParse_nfcProvisioningIntentThrowsException()496     public void testParse_nfcProvisioningIntentThrowsException() {
497         // GIVEN a NFC provisioning intent and other extras.
498         Intent intent = new Intent(ACTION_NDEF_DISCOVERED)
499                 // GIVEN a device admin package name and component name
500                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
501                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
502                 .putExtras(getTestTimeTimeZoneAndLocaleExtras())
503                 .putExtras(getTestWifiInfoExtras())
504                 .putExtras(getTestDeviceAdminDownloadExtras())
505                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras())
506                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
507                 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
508                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
509 
510         try {
511             // WHEN the intent is parsed by the parser.
512             ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent);
513             fail("ExtrasProvisioningDataParser doesn't support NFC intent. "
514                     + "IllegalProvisioningArgumentException should be thrown");
515         } catch (IllegalProvisioningArgumentException e) {
516             // THEN IllegalProvisioningArgumentException is thrown.
517         }
518     }
519 
getTestWifiInfoExtras()520     private static Bundle getTestWifiInfoExtras() {
521         Bundle wifiInfoExtras = new Bundle();
522         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID);
523         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE);
524         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD);
525         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST);
526         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS);
527         wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL);
528         wifiInfoExtras.putInt(EXTRA_PROVISIONING_WIFI_PROXY_PORT, TEST_PROXY_PORT);
529         wifiInfoExtras.putBoolean(EXTRA_PROVISIONING_WIFI_HIDDEN, TEST_HIDDEN);
530         return wifiInfoExtras;
531     }
532 
getTestTimeTimeZoneAndLocaleExtras()533     private static Bundle getTestTimeTimeZoneAndLocaleExtras() {
534         Bundle timeTimezoneAndLocaleExtras = new Bundle();
535         timeTimezoneAndLocaleExtras.putLong(EXTRA_PROVISIONING_LOCAL_TIME, TEST_LOCAL_TIME);
536         timeTimezoneAndLocaleExtras.putString(EXTRA_PROVISIONING_TIME_ZONE, TEST_TIME_ZONE);
537         timeTimezoneAndLocaleExtras.putString(
538                 EXTRA_PROVISIONING_LOCALE, StoreUtils.localeToString(TEST_LOCALE));
539         return timeTimezoneAndLocaleExtras;
540     }
541 
getTestDeviceAdminDownloadExtras()542     private static Bundle getTestDeviceAdminDownloadExtras() {
543         Bundle downloadInfoExtras = new Bundle();
544         downloadInfoExtras.putInt(
545                 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, TEST_MIN_SUPPORT_VERSION);
546         downloadInfoExtras.putString(
547                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, TEST_DOWNLOAD_LOCATION);
548         downloadInfoExtras.putString(
549                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER, TEST_COOKIE_HEADER);
550         downloadInfoExtras.putString(
551                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
552                 Base64.encodeToString(TEST_PACKAGE_CHECKSUM,
553                         Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP));
554         downloadInfoExtras.putString(
555                 EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM,
556                 Base64.encodeToString(TEST_SIGNATURE_CHECKSUM,
557                         Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP));
558         return downloadInfoExtras;
559     }
560 }
561