1 /* 2 * Copyright (C) 2017 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.tradefed.targetprep; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNull; 21 import static org.junit.Assert.fail; 22 23 import com.android.tradefed.build.IBuildInfo; 24 import com.android.tradefed.build.IDeviceBuildInfo; 25 import com.android.tradefed.device.DeviceNotAvailableException; 26 import com.android.tradefed.device.ITestDevice; 27 import com.android.tradefed.util.FileUtil; 28 29 import org.easymock.EasyMock; 30 import org.junit.After; 31 import org.junit.Before; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 import org.junit.runners.JUnit4; 35 36 import java.io.File; 37 import java.io.IOException; 38 39 /** Unit tests for {@link InstallAllTestZipAppsSetupTest} */ 40 @RunWith(JUnit4.class) 41 public class InstallAllTestZipAppsSetupTest { 42 43 private static final String SERIAL = "SERIAL"; 44 private InstallAllTestZipAppsSetup mPrep; 45 private IBuildInfo mMockBuildInfo; 46 private ITestDevice mMockTestDevice; 47 private File mMockUnzipDir; 48 private boolean mFailUnzip; 49 private boolean mFailAapt; 50 51 @Before 52 public void setUp() throws Exception { 53 mPrep = 54 new InstallAllTestZipAppsSetup() { 55 @Override 56 File extractZip(File testsZip) throws IOException { 57 if (mFailUnzip) { 58 throw new IOException(); 59 } 60 return mMockUnzipDir; 61 } 62 63 @Override 64 String getAppPackageName(File appFile) { 65 if (mFailAapt) { 66 return null; 67 } 68 return ""; 69 } 70 }; 71 mFailAapt = false; 72 mFailUnzip = false; 73 mMockUnzipDir = null; 74 mMockBuildInfo = EasyMock.createMock(IDeviceBuildInfo.class); 75 mMockTestDevice = EasyMock.createMock(ITestDevice.class); 76 EasyMock.expect(mMockTestDevice.getSerialNumber()).andStubReturn(SERIAL); 77 EasyMock.expect(mMockTestDevice.getDeviceDescriptor()).andStubReturn(null); 78 } 79 80 @After 81 public void tearDown() throws Exception { 82 if (mMockUnzipDir != null) { 83 FileUtil.recursiveDelete(mMockUnzipDir); 84 } 85 } 86 87 private void setMockUnzipDir() throws IOException { 88 File testDir = FileUtil.createTempDir("TestAppSetupTest"); 89 // fake hierarchy of directory and files 90 FileUtil.createTempFile("fakeApk", ".apk", testDir); 91 FileUtil.createTempFile("fakeApk2", ".apk", testDir); 92 FileUtil.createTempFile("notAnApk", ".txt", testDir); 93 File subTestDir = FileUtil.createTempDir("SubTestAppSetupTest", testDir); 94 FileUtil.createTempFile("subfakeApk", ".apk", subTestDir); 95 mMockUnzipDir = testDir; 96 } 97 98 @Test 99 public void testGetZipFile() throws TargetSetupError { 100 String zip = "zip"; 101 mPrep.setTestZipName(zip); 102 File file = new File(zip); 103 EasyMock.expect(mMockBuildInfo.getFile(zip)).andReturn(file); 104 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 105 File ret = mPrep.getZipFile(mMockTestDevice, mMockBuildInfo); 106 assertEquals(file, ret); 107 EasyMock.verify(mMockBuildInfo); 108 } 109 110 @Test 111 public void testGetZipFileDoesntExist() throws TargetSetupError { 112 String zip = "zip"; 113 mPrep.setTestZipName(zip); 114 EasyMock.expect(mMockBuildInfo.getFile(zip)).andReturn(null); 115 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 116 File ret = mPrep.getZipFile(mMockTestDevice, mMockBuildInfo); 117 assertNull(ret); 118 EasyMock.verify(mMockBuildInfo); 119 } 120 121 @Test 122 public void testNullTestZipName() throws DeviceNotAvailableException { 123 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 124 try { 125 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 126 fail("Should have thrown a TargetSetupError"); 127 } catch (TargetSetupError e) { 128 // expected 129 } 130 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 131 } 132 133 @Test 134 public void testSuccess() throws Exception { 135 mPrep.setTestZipName("zip"); 136 137 mMockBuildInfo.getFile((String) EasyMock.anyObject()); 138 EasyMock.expectLastCall().andReturn(new File("zip")); 139 140 setMockUnzipDir(); 141 142 mMockTestDevice.installPackage((File) EasyMock.anyObject(), EasyMock.anyBoolean()); 143 EasyMock.expectLastCall().andReturn(null).times(3); 144 mMockTestDevice.uninstallPackage((String) EasyMock.anyObject()); 145 EasyMock.expectLastCall().andReturn(null).times(3); 146 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 147 148 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 149 mPrep.tearDown(mMockTestDevice, mMockBuildInfo, null); 150 151 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 152 } 153 154 @Test 155 public void testSuccessNoTearDown() throws Exception { 156 mPrep.setTestZipName("zip"); 157 mPrep.setCleanup(false); 158 159 mMockBuildInfo.getFile((String) EasyMock.anyObject()); 160 EasyMock.expectLastCall().andReturn(new File("zip")); 161 162 setMockUnzipDir(); 163 164 mMockTestDevice.installPackage((File) EasyMock.anyObject(), EasyMock.anyBoolean()); 165 EasyMock.expectLastCall().andReturn(null).times(3); 166 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 167 168 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 169 mPrep.tearDown(mMockTestDevice, mMockBuildInfo, null); 170 171 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 172 } 173 174 @Test 175 public void testInstallFailure() throws DeviceNotAvailableException { 176 final String failure = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED"; 177 final String file = "TEST"; 178 EasyMock.expect( 179 mMockTestDevice.installPackage( 180 (File) EasyMock.anyObject(), EasyMock.eq(true))) 181 .andReturn(failure); 182 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 183 try { 184 mPrep.installApk(new File(file), mMockTestDevice); 185 fail("Should have thrown an exception"); 186 } catch (TargetSetupError e) { 187 String expected = 188 String.format( 189 "Failed to install %s on %s. Reason: '%s' " + "null", 190 file, SERIAL, failure); 191 assertEquals(expected, e.getMessage()); 192 } 193 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 194 } 195 196 @Test 197 public void testInstallFailureNoStop() throws DeviceNotAvailableException, TargetSetupError { 198 final String failure = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED"; 199 final String file = "TEST"; 200 mPrep.setStopInstallOnFailure(false); 201 EasyMock.expect( 202 mMockTestDevice.installPackage( 203 (File) EasyMock.anyObject(), EasyMock.eq(true))) 204 .andReturn(failure); 205 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 206 // should not throw exception 207 mPrep.installApk(new File(file), mMockTestDevice); 208 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 209 } 210 211 @Test 212 public void testDisable() throws Exception { 213 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 214 mPrep.setDisable(true); 215 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 216 mPrep.tearDown(mMockTestDevice, mMockBuildInfo, null); 217 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 218 } 219 220 @Test 221 public void testUnzipFail() throws Exception { 222 mFailUnzip = true; 223 mPrep.setTestZipName("zip"); 224 225 mMockBuildInfo.getFile((String) EasyMock.anyObject()); 226 EasyMock.expectLastCall().andReturn(new File("zip")); 227 228 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 229 230 try { 231 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 232 fail("Should have thrown an exception"); 233 } catch (TargetSetupError e) { 234 TargetSetupError error = 235 new TargetSetupError( 236 "Failed to extract test zip.", 237 e, 238 mMockTestDevice.getDeviceDescriptor()); 239 assertEquals(error.getMessage(), e.getMessage()); 240 } 241 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 242 } 243 244 @Test 245 public void testAaptFail() throws Exception { 246 mFailAapt = true; 247 mPrep.setTestZipName("zip"); 248 setMockUnzipDir(); 249 250 mMockBuildInfo.getFile((String) EasyMock.anyObject()); 251 EasyMock.expectLastCall().andReturn(new File("zip")); 252 mMockTestDevice.installPackage((File) EasyMock.anyObject(), EasyMock.anyBoolean()); 253 EasyMock.expectLastCall().andReturn(null); 254 255 EasyMock.replay(mMockBuildInfo, mMockTestDevice); 256 257 try { 258 mPrep.setUp(mMockTestDevice, mMockBuildInfo); 259 fail("Should have thrown an exception"); 260 } catch (TargetSetupError e) { 261 TargetSetupError error = 262 new TargetSetupError( 263 "apk installed but AaptParser failed", 264 e, 265 mMockTestDevice.getDeviceDescriptor()); 266 assertEquals(error.getMessage(), e.getMessage()); 267 } 268 EasyMock.verify(mMockBuildInfo, mMockTestDevice); 269 } 270 } 271