Home | History | Annotate | Download | only in suite
      1 /*
      2  * Copyright (C) 2018 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.suite;
     17 
     18 import static org.junit.Assert.assertEquals;
     19 import static org.junit.Assert.assertNull;
     20 import static org.junit.Assert.assertThat;
     21 import static org.junit.Assert.assertTrue;
     22 import static org.hamcrest.CoreMatchers.*;
     23 import static org.junit.Assert.fail;
     24 
     25 import com.android.tradefed.build.DeviceBuildInfo;
     26 import com.android.tradefed.build.IDeviceBuildInfo;
     27 import com.android.tradefed.config.IConfiguration;
     28 import com.android.tradefed.config.OptionSetter;
     29 import com.android.tradefed.device.DeviceNotAvailableException;
     30 import com.android.tradefed.device.ITestDevice;
     31 import com.android.tradefed.testtype.Abi;
     32 import com.android.tradefed.testtype.IAbi;
     33 import com.android.tradefed.testtype.IRemoteTest;
     34 import com.android.tradefed.util.AbiUtils;
     35 import com.android.tradefed.util.FileUtil;
     36 
     37 
     38 import org.easymock.EasyMock;
     39 import org.junit.Before;
     40 import org.junit.Test;
     41 import org.junit.runner.RunWith;
     42 import org.junit.runners.JUnit4;
     43 
     44 import java.io.File;
     45 import java.util.Collection;
     46 import java.util.HashSet;
     47 import java.util.LinkedHashMap;
     48 import java.util.Set;
     49 
     50 /** Unit tests for {@link BaseTestSuite}. */
     51 @RunWith(JUnit4.class)
     52 public class BaseTestSuiteTest {
     53     private BaseTestSuite mRunner;
     54     private IDeviceBuildInfo mBuildInfo;
     55     private ITestDevice mMockDevice;
     56 
     57     private static final String TEST_MODULE = "test-module";
     58 
     59     @Before
     60     public void setUp() throws Exception {
     61         mMockDevice = EasyMock.createMock(ITestDevice.class);
     62         mBuildInfo = new DeviceBuildInfo();
     63         mRunner = new AbiBaseTestSuite();
     64         mRunner.setBuild(mBuildInfo);
     65         mRunner.setDevice(mMockDevice);
     66 
     67         EasyMock.expect(mMockDevice.getProperty(EasyMock.anyObject())).andReturn("arm64-v8a");
     68         EasyMock.expect(mMockDevice.getProperty(EasyMock.anyObject())).andReturn("armeabi-v7a");
     69         EasyMock.replay(mMockDevice);
     70     }
     71     /**
     72      * Test BaseTestSuite that hardcodes the abis to avoid failures related to running the tests
     73      * against a particular abi build of tradefed.
     74      */
     75     public static class AbiBaseTestSuite extends BaseTestSuite {
     76         @Override
     77         public Set<IAbi> getAbis(ITestDevice device) throws DeviceNotAvailableException {
     78             Set<IAbi> abis = new HashSet<>();
     79             abis.add(new Abi("arm64-v8a", AbiUtils.getBitness("arm64-v8a")));
     80             abis.add(new Abi("armeabi-v7a", AbiUtils.getBitness("armeabi-v7a")));
     81             return abis;
     82         }
     83     }
     84 
     85     /** Test for {@#link BaseTestSuite#setupFilters()} implementation, no modules match. */
     86     @Test
     87     public void testSetupFilters_noMatch() throws Exception {
     88         File tmpDir = FileUtil.createTempDir(TEST_MODULE);
     89         File moduleConfig = new File(tmpDir, "module_name.config");
     90         moduleConfig.createNewFile();
     91         try {
     92             OptionSetter setter = new OptionSetter(mRunner);
     93             setter.setOptionValue("module", "my_module");
     94             mRunner.setupFilters(tmpDir);
     95             fail("Should have thrown exception");
     96         } catch (IllegalArgumentException expected) {
     97             assertEquals("No modules found matching my_module", expected.getMessage());
     98         } finally {
     99             FileUtil.recursiveDelete(tmpDir);
    100         }
    101     }
    102 
    103     /** Test for {@#link BaseTestSuite#setupFilters()} implementation, only one module matches. */
    104     @Test
    105     public void testSetupFilters_oneMatch() throws Exception {
    106         File tmpDir = FileUtil.createTempDir(TEST_MODULE);
    107         File moduleConfig = new File(tmpDir, "module_name.config");
    108         File moduleConfig2 = new File(tmpDir, "module_name2.config");
    109         moduleConfig.createNewFile();
    110         moduleConfig2.createNewFile();
    111         try {
    112             OptionSetter setter = new OptionSetter(mRunner);
    113             setter.setOptionValue("module", "module_name2");
    114             mRunner.setupFilters(tmpDir);
    115             assertEquals(1, mRunner.getIncludeFilter().size());
    116             assertThat(
    117                     mRunner.getIncludeFilter(),
    118                     hasItem(
    119                             new SuiteTestFilter(mRunner.getRequestedAbi(), "module_name2", null)
    120                                     .toString()));
    121         } finally {
    122             FileUtil.recursiveDelete(tmpDir);
    123         }
    124     }
    125 
    126     /**
    127      * Test for {@#link BaseTestSuite#setupFilters()} implementation, multi modules match prefix but
    128      * don't exact match.
    129      */
    130     @Test
    131     public void testSetupFilters_multiMatchNoExactMatch() throws Exception {
    132         File tmpDir = FileUtil.createTempDir(TEST_MODULE);
    133         File moduleConfig = new File(tmpDir, "module_name1.config");
    134         File moduleConfig2 = new File(tmpDir, "module_name2.config");
    135         moduleConfig.createNewFile();
    136         moduleConfig2.createNewFile();
    137         try {
    138             OptionSetter setter = new OptionSetter(mRunner);
    139             setter.setOptionValue("module", "module_name");
    140             mRunner.setupFilters(tmpDir);
    141             fail("Should have thrown exception");
    142         } catch (IllegalArgumentException expected) {
    143             assertThat(
    144                     expected.getMessage(),
    145                     containsString("Multiple modules found matching module_name:"));
    146         } finally {
    147             FileUtil.recursiveDelete(tmpDir);
    148         }
    149     }
    150 
    151     /**
    152      * Test for {@#link BaseTestSuite#setupFilters()} implementation, multi modules match prefix and
    153      * one matches exactly.
    154      */
    155     @Test
    156     public void testSetupFilters_multiMatchOneExactMatch() throws Exception {
    157         File tmpDir = FileUtil.createTempDir(TEST_MODULE);
    158         File moduleConfig = new File(tmpDir, "module_name.config");
    159         File moduleConfig2 = new File(tmpDir, "module_name2.config");
    160         moduleConfig.createNewFile();
    161         moduleConfig2.createNewFile();
    162         try {
    163             OptionSetter setter = new OptionSetter(mRunner);
    164             setter.setOptionValue("module", "module_name");
    165             mRunner.setupFilters(tmpDir);
    166             assertEquals(1, mRunner.getIncludeFilter().size());
    167             assertThat(
    168                     mRunner.getIncludeFilter(),
    169                     hasItem(
    170                             new SuiteTestFilter(mRunner.getRequestedAbi(), "module_name", null)
    171                                     .toString()));
    172         } finally {
    173             FileUtil.recursiveDelete(tmpDir);
    174         }
    175     }
    176 
    177     /**
    178      * Test for {@link BaseTestSuite#loadTests()} implementation, for basic example configurations.
    179      */
    180     @Test
    181     public void testLoadTests() throws Exception {
    182         OptionSetter setter = new OptionSetter(mRunner);
    183         setter.setOptionValue("suite-config-prefix", "suite");
    184         setter.setOptionValue("run-suite-tag", "example-suite");
    185         LinkedHashMap<String, IConfiguration> configMap = mRunner.loadTests();
    186         assertEquals(4, configMap.size());
    187         assertTrue(configMap.containsKey("arm64-v8a suite/stub1"));
    188         assertTrue(configMap.containsKey("arm64-v8a suite/stub2"));
    189         assertTrue(configMap.containsKey("armeabi-v7a suite/stub1"));
    190         assertTrue(configMap.containsKey("armeabi-v7a suite/stub2"));
    191     }
    192 
    193     /**
    194      * Test for {@link BaseTestSuite#loadTests()} implementation, only stub1.xml is part of this
    195      * suite.
    196      */
    197     @Test
    198     public void testLoadTests_suite2() throws Exception {
    199         OptionSetter setter = new OptionSetter(mRunner);
    200         setter.setOptionValue("suite-config-prefix", "suite");
    201         setter.setOptionValue("run-suite-tag", "example-suite2");
    202         LinkedHashMap<String, IConfiguration> configMap = mRunner.loadTests();
    203         assertEquals(2, configMap.size());
    204         assertTrue(configMap.containsKey("arm64-v8a suite/stub1"));
    205         assertTrue(configMap.containsKey("armeabi-v7a suite/stub1"));
    206     }
    207 
    208     /** Test that when splitting, the instance of the implementation is used. */
    209     @Test
    210     public void testSplit() throws Exception {
    211         OptionSetter setter = new OptionSetter(mRunner);
    212         setter.setOptionValue("suite-config-prefix", "suite");
    213         setter.setOptionValue("run-suite-tag", "example-suite");
    214         Collection<IRemoteTest> tests = mRunner.split(2);
    215         assertEquals(4, tests.size());
    216         for (IRemoteTest test : tests) {
    217             assertTrue(test instanceof BaseTestSuite);
    218         }
    219     }
    220 
    221     /**
    222      * Test that when {@link BaseTestSuite} run-suite-tag is not set we cannot shard since there is
    223      * no configuration.
    224      */
    225     @Test
    226     public void testSplit_nothingToLoad() throws Exception {
    227         OptionSetter setter = new OptionSetter(mRunner);
    228         setter.setOptionValue("suite-config-prefix", "doesnotexists");
    229         setter.setOptionValue("run-suite-tag", "doesnotexists");
    230         assertNull(mRunner.split(2));
    231     }
    232 
    233     /**
    234      * Test for {@link BaseTestSuite#loadTests()} that when a test config supports IAbiReceiver,
    235      * multiple instances of the config are queued up.
    236      */
    237     @Test
    238     public void testLoadTestsForMultiAbi() throws Exception {
    239         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
    240         mRunner.setDevice(mockDevice);
    241         OptionSetter setter = new OptionSetter(mRunner);
    242         setter.setOptionValue("suite-config-prefix", "suite");
    243         setter.setOptionValue("run-suite-tag", "example-suite-abi");
    244         EasyMock.replay(mockDevice);
    245         LinkedHashMap<String, IConfiguration> configMap = mRunner.loadTests();
    246         assertEquals(2, configMap.size());
    247         assertTrue(configMap.containsKey("arm64-v8a suite/stubAbi"));
    248         assertTrue(configMap.containsKey("armeabi-v7a suite/stubAbi"));
    249         EasyMock.verify(mockDevice);
    250     }
    251 }
    252