1 /*
2  * Copyright (C) 2019 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 
17 package com.android.managedprovisioning.task;
18 
19 import static android.provider.Settings.Secure.MANAGED_PROVISIONING_DPC_DOWNLOADED;
20 
21 import static com.google.common.truth.Truth.assertThat;
22 
23 import static org.mockito.Mockito.mock;
24 import static org.robolectric.Shadows.shadowOf;
25 
26 import android.content.ComponentName;
27 import android.content.Context;
28 import android.content.pm.PackageInfo;
29 import android.content.pm.PackageManager;
30 import android.net.ConnectivityManager;
31 import android.provider.Settings;
32 
33 import com.android.managedprovisioning.model.PackageDownloadInfo;
34 import com.android.managedprovisioning.model.ProvisioningParams;
35 
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.robolectric.RobolectricTestRunner;
39 import org.robolectric.RuntimeEnvironment;
40 
41 /** Test class for {@link DownloadPackaageTask}. */
42 @RunWith(RobolectricTestRunner.class)
43 public class DownloadPackageTaskRoboTest {
44 
45     private static final int USER_ID = 0;
46     private static final ComponentName TEST_COMPONENT_NAME =
47             new ComponentName("test", "test");
48     private static final String TEST_PACKAGE_LOCATION = "http://test.location/test.apk";
49     private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[]{1};
50 
51     private final Context mContext = RuntimeEnvironment.application;
52     private final PackageManager mPackageManager = mContext.getPackageManager();
53     private final ConnectivityManager mConnectivityManager =
54             mContext.getSystemService(ConnectivityManager.class);
55     private final AbstractProvisioningTask.Callback mCallback =
56             mock(AbstractProvisioningTask.Callback.class);
57 
58     @Test
run_doesSetManagedProvisioningDpcDownloaded()59     public void run_doesSetManagedProvisioningDpcDownloaded() {
60         final ProvisioningParams params = createDefaultProvisioningParamsBuilder().build();
61         final DownloadPackageTask mDownloadPackageTask =
62                 new DownloadPackageTask(mContext, params, mCallback);
63 
64         mDownloadPackageTask.run(USER_ID);
65 
66         assertManagedProvisioningDpcDownloadedSetTo(1);
67     }
68 
69     @Test
run_alreadyInstalled_doesNotSetManagedProvisioningDpcDownloaded()70     public void run_alreadyInstalled_doesNotSetManagedProvisioningDpcDownloaded() {
71         final ProvisioningParams params = createDefaultProvisioningParamsBuilder()
72                 .setDeviceAdminDownloadInfo(
73                         new PackageDownloadInfo.Builder()
74                                 .setLocation(TEST_PACKAGE_LOCATION)
75                                 .setMinVersion(1) // installed package is version 2
76                                 .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
77                                 .build())
78                 .build();
79         installTestPackage();
80         final DownloadPackageTask mDownloadPackageTask =
81                 new DownloadPackageTask(mContext, params, mCallback);
82 
83         mDownloadPackageTask.run(USER_ID);
84 
85         assertManagedProvisioningDpcDownloadedSetTo(0);
86     }
87 
88     @Test
run_installsUpdate_doesSetManagedProvisioningDpcDownloaded()89     public void run_installsUpdate_doesSetManagedProvisioningDpcDownloaded() {
90         final ProvisioningParams params = createDefaultProvisioningParamsBuilder()
91                 .setDeviceAdminDownloadInfo(
92                         new PackageDownloadInfo.Builder()
93                                 .setLocation(TEST_PACKAGE_LOCATION)
94                                 .setMinVersion(3) // installed package is version 2
95                                 .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
96                                 .build())
97                 .build();
98         installTestPackage();
99         final DownloadPackageTask mDownloadPackageTask =
100                 new DownloadPackageTask(mContext, params, mCallback);
101 
102         mDownloadPackageTask.run(USER_ID);
103 
104         assertManagedProvisioningDpcDownloadedSetTo(1);
105     }
106 
107     @Test
run_notConnected_doesNotSetManagedProvisioningDpcDownloaded()108     public void run_notConnected_doesNotSetManagedProvisioningDpcDownloaded() {
109         setNotConnected();
110         final ProvisioningParams params = createDefaultProvisioningParamsBuilder().build();
111         final DownloadPackageTask mDownloadPackageTask =
112                 new DownloadPackageTask(mContext, params, mCallback);
113 
114         mDownloadPackageTask.run(USER_ID);
115 
116         assertManagedProvisioningDpcDownloadedSetTo(0);
117     }
118 
assertManagedProvisioningDpcDownloadedSetTo(int value)119     private void assertManagedProvisioningDpcDownloadedSetTo(int value) {
120         int dpcInstalledSetting =
121                 Settings.Secure.getInt(
122                         mContext.getContentResolver(), MANAGED_PROVISIONING_DPC_DOWNLOADED, 0);
123         assertThat(dpcInstalledSetting).isEqualTo(value);
124     }
125 
installTestPackage()126     private void installTestPackage() {
127         final PackageInfo packageInfo = new PackageInfo();
128         packageInfo.packageName = TEST_COMPONENT_NAME.getPackageName();
129         packageInfo.versionCode = 2;
130         shadowOf(mPackageManager).installPackage(packageInfo);
131     }
132 
setNotConnected()133     private void setNotConnected() {
134         shadowOf(mConnectivityManager).setActiveNetworkInfo(null);
135     }
136 
createDefaultProvisioningParamsBuilder()137     private static ProvisioningParams.Builder createDefaultProvisioningParamsBuilder() {
138         return new ProvisioningParams.Builder()
139                 .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
140                 .setProvisioningAction("")
141                 .setDeviceAdminDownloadInfo(
142                         new PackageDownloadInfo.Builder()
143                                 .setLocation(TEST_PACKAGE_LOCATION)
144                                 .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
145                                 .build());
146     }
147 }
148