Home | History | Annotate | Download | only in testtype
      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