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.testtype; 17 18 import static org.junit.Assert.assertTrue; 19 20 import com.android.ddmlib.IDevice; 21 import com.android.tradefed.build.IBuildInfo; 22 import com.android.tradefed.build.IFolderBuildInfo; 23 import com.android.tradefed.command.CommandOptions; 24 import com.android.tradefed.config.GlobalConfiguration; 25 import com.android.tradefed.config.IConfiguration; 26 import com.android.tradefed.config.OptionSetter; 27 import com.android.tradefed.device.ITestDevice; 28 import com.android.tradefed.device.NullDevice; 29 import com.android.tradefed.device.StubDevice; 30 import com.android.tradefed.metrics.proto.MetricMeasurement.Metric; 31 import com.android.tradefed.result.FileInputStreamSource; 32 import com.android.tradefed.result.ITestInvocationListener; 33 import com.android.tradefed.result.LogDataType; 34 import com.android.tradefed.result.TestDescription; 35 import com.android.tradefed.util.CommandResult; 36 import com.android.tradefed.util.CommandStatus; 37 import com.android.tradefed.util.IRunUtil; 38 import com.android.tradefed.util.IRunUtil.EnvPriority; 39 40 import org.easymock.EasyMock; 41 import org.junit.Before; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.junit.runners.JUnit4; 45 46 import java.io.File; 47 import java.io.FileOutputStream; 48 import java.util.HashMap; 49 import java.util.Map; 50 51 /** Unit tests for {@link VersionedTfLauncher}. */ 52 @RunWith(JUnit4.class) 53 public class VersionedTfLauncherTest { 54 55 private static final String FAKE_SERIAL = "FAKE_SERIAL"; 56 private static final String CONFIG_NAME = "FAKE_CONFIG"; 57 private static final String TF_COMMAND_LINE_TEMPLATE = "--template:map"; 58 private static final String TF_COMMAND_LINE_TEST = "test=tf/fake"; 59 // Test option value with empty spaces should be parsed correctly. 60 private static final String TF_COMMAND_LINE_OPTION = "--option"; 61 private static final String TF_COMMAND_LINE_OPTION_VALUE = "value1 value2"; 62 private static final String TF_COMMAND_LINE_OPTION_VALUE_QUOTED = 63 ("\\\"" + TF_COMMAND_LINE_OPTION_VALUE + "\\\""); 64 private static final String TF_COMMAND_LINE = 65 (TF_COMMAND_LINE_TEMPLATE + " " + TF_COMMAND_LINE_TEST + " " + TF_COMMAND_LINE_OPTION + 66 " " + TF_COMMAND_LINE_OPTION_VALUE_QUOTED); 67 private static final String ADDITIONAL_TEST_ZIP = "/tmp/tests.zip"; 68 69 private VersionedTfLauncher mVersionedTfLauncher; 70 private ITestInvocationListener mMockListener; 71 private IRunUtil mMockRunUtil; 72 private ITestDevice mMockTestDevice; 73 private IDevice mMockIDevice; 74 private IFolderBuildInfo mMockBuildInfo; 75 private IConfiguration mMockConfig; 76 77 @Before 78 public void setUp() throws Exception { 79 mMockListener = EasyMock.createMock(ITestInvocationListener.class); 80 mMockRunUtil = EasyMock.createMock(IRunUtil.class); 81 mMockBuildInfo = EasyMock.createMock(IFolderBuildInfo.class); 82 mMockTestDevice = EasyMock.createMock(ITestDevice.class); 83 mMockConfig = EasyMock.createMock(IConfiguration.class); 84 85 mVersionedTfLauncher = new VersionedTfLauncher(); 86 mVersionedTfLauncher.setRunUtil(mMockRunUtil); 87 mVersionedTfLauncher.setBuild(mMockBuildInfo); 88 mVersionedTfLauncher.setEventStreaming(false); 89 mVersionedTfLauncher.setConfiguration(mMockConfig); 90 91 OptionSetter setter = new OptionSetter(mVersionedTfLauncher); 92 setter.setOptionValue("config-name", CONFIG_NAME); 93 setter.setOptionValue("tf-command-line", TF_COMMAND_LINE); 94 setter.setOptionValue("inject-invocation-data", "true"); 95 96 try { 97 GlobalConfiguration.createGlobalConfiguration(new String[] {}); 98 } catch (IllegalStateException e) { 99 // ignore re-init. 100 } 101 } 102 103 /** 104 * Test {@link VersionedTfLauncher#run(ITestInvocationListener)} for test with a single device 105 */ 106 @Test 107 public void testRun_singleDevice() { 108 mMockIDevice = EasyMock.createMock(IDevice.class); 109 110 CommandResult cr = new CommandResult(CommandStatus.SUCCESS); 111 mMockRunUtil.unsetEnvVariable(SubprocessTfLauncher.TF_GLOBAL_CONFIG); 112 mMockRunUtil.setEnvVariablePriority(EnvPriority.SET); 113 mMockRunUtil.setEnvVariable( 114 EasyMock.eq(SubprocessTfLauncher.TF_GLOBAL_CONFIG), (String) EasyMock.anyObject()); 115 116 EasyMock.expect( 117 mMockRunUtil.runTimedCmd( 118 EasyMock.anyLong(), 119 (FileOutputStream) EasyMock.anyObject(), 120 (FileOutputStream) EasyMock.anyObject(), 121 EasyMock.eq("java"), 122 (String) EasyMock.anyObject(), 123 EasyMock.eq("--add-opens=java.base/java.nio=ALL-UNNAMED"), 124 EasyMock.eq("-cp"), 125 (String) EasyMock.anyObject(), 126 EasyMock.eq("com.android.tradefed.command.CommandRunner"), 127 EasyMock.eq(CONFIG_NAME), 128 EasyMock.eq(TF_COMMAND_LINE_TEMPLATE), 129 EasyMock.eq(TF_COMMAND_LINE_TEST), 130 EasyMock.eq(TF_COMMAND_LINE_OPTION), 131 EasyMock.eq(TF_COMMAND_LINE_OPTION_VALUE), 132 EasyMock.eq("--serial"), 133 EasyMock.eq(FAKE_SERIAL), 134 EasyMock.eq("--additional-tests-zip"), 135 EasyMock.eq(ADDITIONAL_TEST_ZIP), 136 EasyMock.eq("--subprocess-report-file"), 137 (String) EasyMock.anyObject())) 138 .andReturn(cr); 139 Map<ITestDevice, IBuildInfo> deviceInfos = new HashMap<ITestDevice, IBuildInfo>(); 140 deviceInfos.put(mMockTestDevice, null); 141 mVersionedTfLauncher.setDeviceInfos(deviceInfos); 142 EasyMock.expect(mMockBuildInfo.getRootDir()).andReturn(new File("")); 143 EasyMock.expect(mMockBuildInfo.getBuildId()).andReturn("FAKEID").times(2); 144 EasyMock.expect(mMockBuildInfo.getFile("general-tests.zip")) 145 .andReturn(new File(ADDITIONAL_TEST_ZIP)); 146 EasyMock.expect(mMockTestDevice.getIDevice()).andReturn(mMockIDevice).times(2); 147 EasyMock.expect(mMockTestDevice.getSerialNumber()).andReturn(FAKE_SERIAL).times(1); 148 mMockListener.testLog((String)EasyMock.anyObject(), (LogDataType)EasyMock.anyObject(), 149 (FileInputStreamSource)EasyMock.anyObject()); 150 EasyMock.expectLastCall().times(3); 151 mMockListener.testRunStarted("StdErr", 1); 152 mMockListener.testStarted((TestDescription) EasyMock.anyObject()); 153 mMockListener.testEnded( 154 (TestDescription) EasyMock.anyObject(), EasyMock.eq(new HashMap<String, Metric>())); 155 mMockListener.testRunEnded(0, new HashMap<String, Metric>()); 156 157 EasyMock.expect(mMockConfig.getCommandOptions()).andReturn(new CommandOptions()); 158 EasyMock.replay(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 159 mVersionedTfLauncher.run(mMockListener); 160 EasyMock.verify(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 161 } 162 163 /** 164 * Test {@link VersionedTfLauncher#run(ITestInvocationListener)} for test with a null device 165 */ 166 @Test 167 public void testRun_nullDevice() { 168 mMockIDevice = new NullDevice("null-device-1"); 169 170 CommandResult cr = new CommandResult(CommandStatus.SUCCESS); 171 mMockRunUtil.unsetEnvVariable(SubprocessTfLauncher.TF_GLOBAL_CONFIG); 172 mMockRunUtil.setEnvVariablePriority(EnvPriority.SET); 173 mMockRunUtil.setEnvVariable( 174 EasyMock.eq(SubprocessTfLauncher.TF_GLOBAL_CONFIG), (String) EasyMock.anyObject()); 175 176 EasyMock.expect( 177 mMockRunUtil.runTimedCmd( 178 EasyMock.anyLong(), 179 (FileOutputStream) EasyMock.anyObject(), 180 (FileOutputStream) EasyMock.anyObject(), 181 EasyMock.eq("java"), 182 (String) EasyMock.anyObject(), 183 EasyMock.eq("--add-opens=java.base/java.nio=ALL-UNNAMED"), 184 EasyMock.eq("-cp"), 185 (String) EasyMock.anyObject(), 186 EasyMock.eq("com.android.tradefed.command.CommandRunner"), 187 EasyMock.eq(CONFIG_NAME), 188 EasyMock.eq(TF_COMMAND_LINE_TEMPLATE), 189 EasyMock.eq(TF_COMMAND_LINE_TEST), 190 EasyMock.eq(TF_COMMAND_LINE_OPTION), 191 EasyMock.eq(TF_COMMAND_LINE_OPTION_VALUE), 192 EasyMock.eq("--null-device"), 193 EasyMock.eq("--subprocess-report-file"), 194 (String) EasyMock.anyObject())) 195 .andReturn(cr); 196 Map<ITestDevice, IBuildInfo> deviceInfos = new HashMap<ITestDevice, IBuildInfo>(); 197 deviceInfos.put(mMockTestDevice, null); 198 mVersionedTfLauncher.setDeviceInfos(deviceInfos); 199 EasyMock.expect(mMockBuildInfo.getRootDir()).andReturn(new File("")); 200 EasyMock.expect(mMockBuildInfo.getBuildId()).andReturn("FAKEID").times(2); 201 EasyMock.expect(mMockBuildInfo.getFile("general-tests.zip")).andReturn(null); 202 EasyMock.expect(mMockTestDevice.getIDevice()).andReturn(mMockIDevice).times(1); 203 mMockListener.testLog((String)EasyMock.anyObject(), (LogDataType)EasyMock.anyObject(), 204 (FileInputStreamSource)EasyMock.anyObject()); 205 EasyMock.expectLastCall().times(3); 206 mMockListener.testRunStarted("StdErr", 1); 207 mMockListener.testStarted((TestDescription) EasyMock.anyObject()); 208 mMockListener.testEnded( 209 (TestDescription) EasyMock.anyObject(), EasyMock.eq(new HashMap<String, Metric>())); 210 mMockListener.testRunEnded(0, new HashMap<String, Metric>()); 211 212 EasyMock.expect(mMockConfig.getCommandOptions()).andReturn(new CommandOptions()); 213 EasyMock.replay(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 214 mVersionedTfLauncher.run(mMockListener); 215 EasyMock.verify(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 216 } 217 218 /** Test {@link VersionedTfLauncher#run(ITestInvocationListener)} for test with a StubDevice. */ 219 @Test 220 public void testRun_DeviceNoPreSetup() { 221 CommandResult cr = new CommandResult(CommandStatus.SUCCESS); 222 mMockRunUtil.unsetEnvVariable(SubprocessTfLauncher.TF_GLOBAL_CONFIG); 223 mMockRunUtil.setEnvVariablePriority(EnvPriority.SET); 224 mMockRunUtil.setEnvVariable( 225 EasyMock.eq(SubprocessTfLauncher.TF_GLOBAL_CONFIG), (String) EasyMock.anyObject()); 226 227 EasyMock.expect( 228 mMockRunUtil.runTimedCmd( 229 EasyMock.anyLong(), 230 (FileOutputStream) EasyMock.anyObject(), 231 (FileOutputStream) EasyMock.anyObject(), 232 EasyMock.eq("java"), 233 (String) EasyMock.anyObject(), 234 EasyMock.eq("--add-opens=java.base/java.nio=ALL-UNNAMED"), 235 EasyMock.eq("-cp"), 236 (String) EasyMock.anyObject(), 237 EasyMock.eq("com.android.tradefed.command.CommandRunner"), 238 EasyMock.eq(CONFIG_NAME), 239 EasyMock.eq(TF_COMMAND_LINE_TEMPLATE), 240 EasyMock.eq(TF_COMMAND_LINE_TEST), 241 EasyMock.eq(TF_COMMAND_LINE_OPTION), 242 EasyMock.eq(TF_COMMAND_LINE_OPTION_VALUE), 243 EasyMock.eq("--additional-tests-zip"), 244 EasyMock.eq(ADDITIONAL_TEST_ZIP), 245 EasyMock.eq("--subprocess-report-file"), 246 (String) EasyMock.anyObject())) 247 .andReturn(cr); 248 Map<ITestDevice, IBuildInfo> deviceInfos = new HashMap<ITestDevice, IBuildInfo>(); 249 deviceInfos.put(mMockTestDevice, null); 250 mVersionedTfLauncher.setDeviceInfos(deviceInfos); 251 EasyMock.expect(mMockBuildInfo.getRootDir()).andReturn(new File("")); 252 EasyMock.expect(mMockBuildInfo.getBuildId()).andReturn("FAKEID").times(2); 253 EasyMock.expect(mMockBuildInfo.getFile("general-tests.zip")) 254 .andReturn(new File(ADDITIONAL_TEST_ZIP)); 255 EasyMock.expect(mMockTestDevice.getIDevice()).andReturn(new StubDevice("serial1")).times(2); 256 mMockListener.testLog( 257 (String) EasyMock.anyObject(), 258 (LogDataType) EasyMock.anyObject(), 259 (FileInputStreamSource) EasyMock.anyObject()); 260 EasyMock.expectLastCall().times(3); 261 mMockListener.testRunStarted("StdErr", 1); 262 mMockListener.testStarted((TestDescription) EasyMock.anyObject()); 263 mMockListener.testEnded( 264 (TestDescription) EasyMock.anyObject(), EasyMock.eq(new HashMap<String, Metric>())); 265 mMockListener.testRunEnded(0, new HashMap<String, Metric>()); 266 267 EasyMock.expect(mMockConfig.getCommandOptions()).andReturn(new CommandOptions()); 268 EasyMock.replay(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 269 mVersionedTfLauncher.run(mMockListener); 270 EasyMock.verify(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 271 } 272 273 /** 274 * Test that when a test is sharded, the instance of the implementation is used and options are 275 * passed to the shard test. 276 */ 277 @Test 278 public void testGetTestShard() { 279 IRemoteTest test = mVersionedTfLauncher.getTestShard(2, 1); 280 assertTrue(test instanceof VersionedTfLauncher); 281 282 VersionedTfLauncher shardedTest = (VersionedTfLauncher) test; 283 284 shardedTest.setRunUtil(mMockRunUtil); 285 shardedTest.setBuild(mMockBuildInfo); 286 shardedTest.setEventStreaming(false); 287 shardedTest.setConfiguration(mMockConfig); 288 289 mMockIDevice = EasyMock.createMock(IDevice.class); 290 291 CommandResult cr = new CommandResult(CommandStatus.SUCCESS); 292 mMockRunUtil.unsetEnvVariable(SubprocessTfLauncher.TF_GLOBAL_CONFIG); 293 mMockRunUtil.setEnvVariablePriority(EnvPriority.SET); 294 mMockRunUtil.setEnvVariable( 295 EasyMock.eq(SubprocessTfLauncher.TF_GLOBAL_CONFIG), (String) EasyMock.anyObject()); 296 297 EasyMock.expect( 298 mMockRunUtil.runTimedCmd( 299 EasyMock.anyLong(), 300 (FileOutputStream) EasyMock.anyObject(), 301 (FileOutputStream) EasyMock.anyObject(), 302 EasyMock.eq("java"), 303 (String) EasyMock.anyObject(), 304 EasyMock.eq("--add-opens=java.base/java.nio=ALL-UNNAMED"), 305 EasyMock.eq("-cp"), 306 (String) EasyMock.anyObject(), 307 EasyMock.eq("com.android.tradefed.command.CommandRunner"), 308 EasyMock.eq(CONFIG_NAME), 309 EasyMock.eq(TF_COMMAND_LINE_TEMPLATE), 310 EasyMock.eq(TF_COMMAND_LINE_TEST), 311 EasyMock.eq(TF_COMMAND_LINE_OPTION), 312 EasyMock.eq(TF_COMMAND_LINE_OPTION_VALUE), 313 EasyMock.eq("--serial"), 314 EasyMock.eq(FAKE_SERIAL), 315 EasyMock.eq("--shard-count"), 316 EasyMock.eq("2"), 317 EasyMock.eq("--shard-index"), 318 EasyMock.eq("1"), 319 EasyMock.eq("--subprocess-report-file"), 320 (String) EasyMock.anyObject())) 321 .andReturn(cr); 322 Map<ITestDevice, IBuildInfo> deviceInfos = new HashMap<ITestDevice, IBuildInfo>(); 323 deviceInfos.put(mMockTestDevice, null); 324 shardedTest.setDeviceInfos(deviceInfos); 325 EasyMock.expect(mMockBuildInfo.getRootDir()).andReturn(new File("")); 326 EasyMock.expect(mMockBuildInfo.getBuildId()).andReturn("FAKEID").times(2); 327 EasyMock.expect(mMockBuildInfo.getFile("general-tests.zip")).andReturn(null); 328 EasyMock.expect(mMockTestDevice.getIDevice()).andReturn(mMockIDevice).times(2); 329 EasyMock.expect(mMockTestDevice.getSerialNumber()).andReturn(FAKE_SERIAL).times(1); 330 mMockListener.testLog( 331 (String) EasyMock.anyObject(), 332 (LogDataType) EasyMock.anyObject(), 333 (FileInputStreamSource) EasyMock.anyObject()); 334 EasyMock.expectLastCall().times(3); 335 mMockListener.testRunStarted("StdErr", 1); 336 mMockListener.testStarted((TestDescription) EasyMock.anyObject()); 337 mMockListener.testEnded( 338 (TestDescription) EasyMock.anyObject(), EasyMock.eq(new HashMap<String, Metric>())); 339 mMockListener.testRunEnded(0, new HashMap<String, Metric>()); 340 EasyMock.expect(mMockConfig.getCommandOptions()).andReturn(new CommandOptions()); 341 EasyMock.replay(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 342 shardedTest.run(mMockListener); 343 EasyMock.verify(mMockTestDevice, mMockBuildInfo, mMockRunUtil, mMockListener, mMockConfig); 344 } 345 } 346