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