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 package com.android.tradefed.targetprep; 17 18 import com.android.tradefed.build.IDeviceBuildInfo; 19 import com.android.tradefed.device.DeviceNotAvailableException; 20 import com.android.tradefed.device.ITestDevice; 21 import com.android.tradefed.util.FileUtil; 22 23 import org.easymock.EasyMock; 24 import org.junit.After; 25 import org.junit.Before; 26 import org.junit.Test; 27 import org.junit.runner.RunWith; 28 import org.junit.runners.JUnit4; 29 30 import java.io.File; 31 import java.util.ArrayList; 32 import java.util.Collection; 33 34 import static org.junit.Assert.*; 35 36 /** 37 * Unit tests for {@link InstallApkSetup} 38 */ 39 @RunWith(JUnit4.class) 40 public class InstallApkSetupTest { 41 42 private static final String SERIAL = "SERIAL"; 43 private InstallApkSetup mInstallApkSetup; 44 private IDeviceBuildInfo mMockBuildInfo; 45 private ITestDevice mMockTestDevice; 46 47 private File testDir = null; 48 private File testFile = null; 49 private Collection<File> testCollectionFiles = new ArrayList<File>(); 50 51 @Before 52 public void setUp() throws Exception { 53 mInstallApkSetup = new InstallApkSetup(); 54 mMockBuildInfo = EasyMock.createMock(IDeviceBuildInfo.class); 55 mMockTestDevice = EasyMock.createMock(ITestDevice.class); 56 EasyMock.expect(mMockTestDevice.getSerialNumber()).andStubReturn(SERIAL); 57 EasyMock.expect(mMockTestDevice.getDeviceDescriptor()).andStubReturn(null); 58 59 testDir = FileUtil.createTempDir("TestApkDir"); 60 testFile = FileUtil.createTempFile("File", ".apk", testDir); 61 } 62 63 @After 64 public void tearDown() throws Exception { 65 testCollectionFiles.clear(); 66 FileUtil.recursiveDelete(testDir); 67 } 68 69 /** 70 * Test {@link InstallApkSetupTest#setUp()} by successfully installing 2 Apk files 71 */ 72 @Test 73 public void testSetup() throws DeviceNotAvailableException, BuildError, TargetSetupError { 74 testCollectionFiles.add(testFile); 75 testCollectionFiles.add(testFile); 76 mInstallApkSetup.setApkPaths(testCollectionFiles); 77 EasyMock.expect(mMockTestDevice.installPackage((File) EasyMock.anyObject(), 78 EasyMock.eq(true))).andReturn(null).times(2); 79 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 80 mInstallApkSetup.setUp(mMockTestDevice, mMockBuildInfo); 81 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 82 } 83 84 /** 85 * Test {@link InstallApkSetupTest#setUp()} by installing a non-existing Apk 86 */ 87 @Test 88 public void testNonExistingApk() throws DeviceNotAvailableException, BuildError { 89 testCollectionFiles.add(testFile); 90 FileUtil.recursiveDelete(testFile); 91 mInstallApkSetup.setApkPaths(testCollectionFiles); 92 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 93 try { 94 mInstallApkSetup.setUp(mMockTestDevice, mMockBuildInfo); 95 fail("should have failed due to missing APK file"); 96 } catch (TargetSetupError expected) { 97 String refMessage = String.format("%s does not exist null", testFile.getAbsolutePath()); 98 assertEquals(refMessage, expected.getMessage()); 99 } 100 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 101 } 102 103 /** 104 * Test {@link InstallApkSetupTest#setUp()} by having an installation failure 105 * but not throwing any exception 106 */ 107 @Test 108 public void testInstallFailureNoThrow() throws DeviceNotAvailableException, BuildError, 109 TargetSetupError { 110 testCollectionFiles.add(testFile); 111 mInstallApkSetup.setApkPaths(testCollectionFiles); 112 113 EasyMock.expect(mMockTestDevice.installPackage((File) EasyMock.anyObject(), 114 EasyMock.eq(true))).andReturn(String.format("%s (Permission denied)", 115 testFile.getAbsolutePath())).times(1); 116 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 117 mInstallApkSetup.setUp(mMockTestDevice, mMockBuildInfo); 118 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 119 } 120 121 /** 122 * Test {@link InstallApkSetupTest#setUp()} by having an installation failure 123 * and throwing an exception 124 */ 125 @Test 126 public void testInstallFailureThrow() throws DeviceNotAvailableException, BuildError { 127 testCollectionFiles.add(testFile); 128 mInstallApkSetup.setApkPaths(testCollectionFiles); 129 mInstallApkSetup.setThrowIfInstallFail(true); 130 131 EasyMock.expect(mMockTestDevice.installPackage((File) EasyMock.anyObject(), 132 EasyMock.eq(true))).andReturn(String.format("%s (Permission denied)", 133 testFile.getAbsolutePath())).times(1); 134 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 135 try { 136 mInstallApkSetup.setUp(mMockTestDevice, mMockBuildInfo); 137 fail("should have failed due to installation failure"); 138 } catch (TargetSetupError expected) { 139 String refMessage = String.format("Stopping test: failed to install %s on device %s. " + 140 "Reason: %s (Permission denied) null", testFile.getAbsolutePath(), 141 SERIAL, testFile.getAbsolutePath()); 142 assertEquals(refMessage, expected.getMessage()); 143 } 144 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 145 } 146 } 147