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