PreloadAppsInstallerTest.java revision a34f53f61be31b7171d6cbcb12490ee143acffff
1/* 2 * Copyright (C) 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 17package com.android.server.retaildemo; 18 19import static org.junit.Assert.assertEquals; 20import static org.mockito.Matchers.anyInt; 21import static org.mockito.Matchers.anyString; 22import static org.mockito.Matchers.eq; 23import static org.mockito.Mockito.verify; 24import static org.mockito.Mockito.when; 25 26import android.content.Context; 27import android.content.pm.IPackageInstallObserver2; 28import android.content.pm.IPackageManager; 29import android.content.pm.PackageManager; 30import android.os.FileUtils; 31import android.os.UserHandle; 32import android.provider.Settings; 33import android.support.test.InstrumentationRegistry; 34import android.support.test.filters.SmallTest; 35import android.test.mock.MockContentResolver; 36 37import com.android.internal.util.test.FakeSettingsProvider; 38 39import org.junit.After; 40import org.junit.Before; 41import org.junit.Test; 42import org.junit.runner.RunWith; 43import org.junit.runners.JUnit4; 44import org.mockito.ArgumentCaptor; 45import org.mockito.Mock; 46import org.mockito.MockitoAnnotations; 47 48import java.io.File; 49import java.util.ArrayList; 50 51@RunWith(JUnit4.class) 52@SmallTest 53public class PreloadAppsInstallerTest { 54 private static final int TEST_DEMO_USER = 111; 55 56 private @Mock Context mContext; 57 private @Mock IPackageManager mIpm; 58 private MockContentResolver mContentResolver; 59 private File mPreloadsAppsDirectory; 60 private String[] mPreloadedApps = 61 new String[] {"test1.apk.preload", "test2.apk.preload", "test3.apk.preload"}; 62 private ArrayList<String> mPreloadedAppPaths = new ArrayList<>(); 63 64 private PreloadAppsInstaller mInstaller; 65 66 @Before 67 public void setUp() throws Exception { 68 MockitoAnnotations.initMocks(this); 69 mContentResolver = new MockContentResolver(mContext); 70 mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); 71 when(mContext.getContentResolver()).thenReturn(mContentResolver); 72 initializePreloadedApps(); 73 Settings.Secure.putStringForUser(mContentResolver, 74 Settings.Secure.DEMO_USER_SETUP_COMPLETE, "0", TEST_DEMO_USER); 75 76 mInstaller = new PreloadAppsInstaller(mContext, mIpm, mPreloadsAppsDirectory); 77 } 78 79 private void initializePreloadedApps() throws Exception { 80 mPreloadsAppsDirectory = new File(InstrumentationRegistry.getContext().getFilesDir(), 81 "test_preload_apps_dir"); 82 mPreloadsAppsDirectory.mkdir(); 83 for (String name : mPreloadedApps) { 84 final File f = new File(mPreloadsAppsDirectory, name); 85 f.createNewFile(); 86 mPreloadedAppPaths.add(f.getPath()); 87 } 88 } 89 90 @After 91 public void tearDown() { 92 FileUtils.deleteContentsAndDir(mPreloadsAppsDirectory); 93 } 94 95 @Test 96 public void testInstallApps() throws Exception { 97 mInstaller.installApps(TEST_DEMO_USER); 98 for (String path : mPreloadedAppPaths) { 99 ArgumentCaptor<IPackageInstallObserver2> observer = 100 ArgumentCaptor.forClass(IPackageInstallObserver2.class); 101 verify(mIpm).installPackageAsUser(eq(path), observer.capture(), anyInt(), 102 anyString(), eq(TEST_DEMO_USER)); 103 observer.getValue().onPackageInstalled(path, PackageManager.INSTALL_SUCCEEDED, 104 null, null); 105 // Verify that we try to install the package in system user. 106 verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM, 107 PackageManager.INSTALL_REASON_UNKNOWN); 108 } 109 assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed", 110 "1", 111 Settings.Secure.getStringForUser(mContentResolver, 112 Settings.Secure.DEMO_USER_SETUP_COMPLETE, TEST_DEMO_USER)); 113 } 114 115 @Test 116 public void testInstallApps_noPreloads() throws Exception { 117 // Delete all files in preloaded apps directory - no preloaded apps 118 FileUtils.deleteContents(mPreloadsAppsDirectory); 119 mInstaller.installApps(TEST_DEMO_USER); 120 assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed", 121 "1", 122 Settings.Secure.getStringForUser(mContentResolver, 123 Settings.Secure.DEMO_USER_SETUP_COMPLETE, TEST_DEMO_USER)); 124 } 125 126 @Test 127 public void testInstallApps_installationFails() throws Exception { 128 mInstaller.installApps(TEST_DEMO_USER); 129 for (int i = 0; i < mPreloadedAppPaths.size(); ++i) { 130 ArgumentCaptor<IPackageInstallObserver2> observer = 131 ArgumentCaptor.forClass(IPackageInstallObserver2.class); 132 final String path = mPreloadedAppPaths.get(i); 133 verify(mIpm).installPackageAsUser(eq(path), observer.capture(), anyInt(), 134 anyString(), eq(TEST_DEMO_USER)); 135 if (i == 0) { 136 observer.getValue().onPackageInstalled(path, PackageManager.INSTALL_FAILED_DEXOPT, 137 null, null); 138 continue; 139 } 140 observer.getValue().onPackageInstalled(path, PackageManager.INSTALL_SUCCEEDED, 141 null, null); 142 // Verify that we try to install the package in system user. 143 verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM, 144 PackageManager.INSTALL_REASON_UNKNOWN); 145 } 146 assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed", 147 "1", 148 Settings.Secure.getStringForUser(mContentResolver, 149 Settings.Secure.DEMO_USER_SETUP_COMPLETE, TEST_DEMO_USER)); 150 } 151} 152