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.assertEquals; 19 20 import com.android.ddmlib.testrunner.TestIdentifier; 21 import com.android.tradefed.build.IBuildInfo; 22 import com.android.tradefed.config.Option; 23 import com.android.tradefed.config.OptionSetter; 24 import com.android.tradefed.device.ITestDevice; 25 import com.android.tradefed.result.ITestInvocationListener; 26 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestMetrics; 27 28 import org.easymock.EasyMock; 29 import org.junit.Before; 30 import org.junit.Rule; 31 import org.junit.Test; 32 import org.junit.runner.RunWith; 33 import org.junit.runners.Suite.SuiteClasses; 34 35 import java.lang.annotation.Retention; 36 import java.lang.annotation.RetentionPolicy; 37 import java.util.Collections; 38 import java.util.HashMap; 39 import java.util.Map; 40 41 /** 42 * Unit Tests for {@link DeviceSuite} 43 */ 44 public class DeviceSuiteTest { 45 46 // We use HostTest as a runner for JUnit4 Suite 47 private HostTest mHostTest; 48 private ITestDevice mMockDevice; 49 private ITestInvocationListener mListener; 50 private IBuildInfo mMockBuildInfo; 51 private IAbi mMockAbi; 52 53 @Before 54 public void setUp() { 55 mHostTest = new HostTest(); 56 mMockDevice = EasyMock.createMock(ITestDevice.class); 57 mListener = EasyMock.createMock(ITestInvocationListener.class); 58 mMockBuildInfo = EasyMock.createMock(IBuildInfo.class); 59 mMockAbi = EasyMock.createMock(IAbi.class); 60 mHostTest.setDevice(mMockDevice); 61 mHostTest.setBuild(mMockBuildInfo); 62 mHostTest.setAbi(mMockAbi); 63 } 64 65 @RunWith(DeviceJUnit4ClassRunner.class) 66 public static class Junit4DeviceTestclass implements IDeviceTest, IAbiReceiver, 67 IBuildReceiver { 68 public static ITestDevice sDevice; 69 public static IBuildInfo sBuildInfo; 70 public static IAbi sAbi; 71 72 @Rule public TestMetrics metrics = new TestMetrics(); 73 74 @Option(name = "option") 75 private String mOption = null; 76 77 public Junit4DeviceTestclass() { 78 sDevice = null; 79 sBuildInfo = null; 80 sAbi = null; 81 } 82 83 @Test 84 @MyAnnotation1 85 public void testPass1() { 86 if (mOption != null) { 87 metrics.addTestMetric("option", mOption); 88 } 89 } 90 91 @Test 92 public void testPass2() {} 93 94 @Override 95 public void setDevice(ITestDevice device) { 96 sDevice = device; 97 } 98 99 @Override 100 public ITestDevice getDevice() { 101 return sDevice; 102 } 103 104 @Override 105 public void setBuild(IBuildInfo buildInfo) { 106 sBuildInfo = buildInfo; 107 } 108 109 @Override 110 public void setAbi(IAbi abi) { 111 sAbi = abi; 112 } 113 } 114 115 @RunWith(DeviceSuite.class) 116 @SuiteClasses({ 117 Junit4DeviceTestclass.class, 118 }) 119 public class Junit4DeviceSuite { 120 } 121 122 /** Simple Annotation class for testing */ 123 @Retention(RetentionPolicy.RUNTIME) 124 public @interface MyAnnotation1 {} 125 126 @Test 127 public void testRunDeviceSuite() throws Exception { 128 OptionSetter setter = new OptionSetter(mHostTest); 129 setter.setOptionValue("class", Junit4DeviceSuite.class.getName()); 130 mListener.testRunStarted( 131 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"), 132 EasyMock.eq(2)); 133 TestIdentifier test1 = new TestIdentifier(Junit4DeviceTestclass.class.getName(), 134 "testPass1"); 135 TestIdentifier test2 = new TestIdentifier(Junit4DeviceTestclass.class.getName(), 136 "testPass2"); 137 mListener.testStarted(EasyMock.eq(test1)); 138 mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(Collections.emptyMap())); 139 mListener.testStarted(EasyMock.eq(test2)); 140 mListener.testEnded(EasyMock.eq(test2), EasyMock.eq(Collections.emptyMap())); 141 mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap())); 142 EasyMock.replay(mListener, mMockDevice); 143 mHostTest.run(mListener); 144 EasyMock.verify(mListener, mMockDevice); 145 // Verify that all setters were called on Test class inside suite 146 assertEquals(mMockDevice, Junit4DeviceTestclass.sDevice); 147 assertEquals(mMockBuildInfo, Junit4DeviceTestclass.sBuildInfo); 148 assertEquals(mMockAbi, Junit4DeviceTestclass.sAbi); 149 } 150 151 /** Test the run with filtering to include only one annotation. */ 152 @Test 153 public void testRun_withFiltering() throws Exception { 154 OptionSetter setter = new OptionSetter(mHostTest); 155 setter.setOptionValue("class", Junit4DeviceSuite.class.getName()); 156 mHostTest.addIncludeAnnotation( 157 "com.android.tradefed.testtype.DeviceSuiteTest$MyAnnotation1"); 158 assertEquals(1, mHostTest.countTestCases()); 159 mListener.testRunStarted( 160 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"), 161 EasyMock.eq(1)); 162 TestIdentifier test1 = 163 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass1"); 164 mListener.testStarted(EasyMock.eq(test1)); 165 mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(Collections.emptyMap())); 166 mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap())); 167 EasyMock.replay(mListener, mMockDevice); 168 mHostTest.run(mListener); 169 EasyMock.verify(mListener, mMockDevice); 170 } 171 172 /** Tests that options are piped from Suite to the sub-runners. */ 173 @Test 174 public void testRun_withOption() throws Exception { 175 OptionSetter setter = new OptionSetter(mHostTest); 176 setter.setOptionValue("class", Junit4DeviceSuite.class.getName()); 177 setter.setOptionValue("set-option", "option:value_test"); 178 mListener.testRunStarted( 179 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"), 180 EasyMock.eq(2)); 181 TestIdentifier test1 = 182 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass1"); 183 TestIdentifier test2 = 184 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass2"); 185 mListener.testStarted(EasyMock.eq(test1)); 186 Map<String, String> expected = new HashMap<>(); 187 expected.put("option", "value_test"); 188 mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(expected)); 189 mListener.testStarted(EasyMock.eq(test2)); 190 mListener.testEnded(EasyMock.eq(test2), EasyMock.eq(Collections.emptyMap())); 191 mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap())); 192 EasyMock.replay(mListener, mMockDevice); 193 mHostTest.run(mListener); 194 EasyMock.verify(mListener, mMockDevice); 195 } 196 } 197