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