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