1 /* 2 * Copyright (C) 2008 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 17 package android.test; 18 19 import android.test.mock.MockContext; 20 import android.test.suitebuilder.annotation.SmallTest; 21 22 import com.google.android.collect.Lists; 23 24 import junit.framework.TestCase; 25 import junit.framework.AssertionFailedError; 26 import junit.framework.Test; 27 import junit.framework.TestSuite; 28 import junit.framework.TestListener; 29 30 import java.util.List; 31 import java.util.Arrays; 32 33 /** 34 * Unit tests for {@link AndroidTestRunner} 35 */ 36 @SmallTest 37 public class AndroidTestRunnerTest extends TestCase { 38 private AndroidTestRunner mAndroidTestRunner; 39 private StubContext mStubContext; 40 41 @Override setUp()42 protected void setUp() throws Exception { 43 super.setUp(); 44 mStubContext = new StubContext(getClass().getClassLoader()); 45 46 mAndroidTestRunner = new AndroidTestRunner(); 47 mAndroidTestRunner.setContext(mStubContext); 48 } 49 testLoadNoTestCases()50 public void testLoadNoTestCases() throws Exception { 51 mAndroidTestRunner.setTestClassName(TestSuite.class.getName(), null); 52 53 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 54 assertNotNull(testCases); 55 assertEquals(1, testCases.size()); 56 assertEquals("warning", testCases.get(0).getName()); 57 assertEquals(TestSuite.class.getSimpleName(), mAndroidTestRunner.getTestClassName()); 58 } 59 testSetTestSuiteWithOneTestCase()60 public void testSetTestSuiteWithOneTestCase() throws Exception { 61 mAndroidTestRunner.setTestClassName(OneTestTestCase.class.getName(), null); 62 63 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 64 assertNotNull(testCases); 65 assertEquals(1, testCases.size()); 66 assertEquals("testOne", testCases.get(0).getName()); 67 assertEquals(OneTestTestCase.class.getSimpleName(), mAndroidTestRunner.getTestClassName()); 68 } 69 testRunTest()70 public void testRunTest() throws Exception { 71 mAndroidTestRunner.setTestClassName(OneTestTestCase.class.getName(), null); 72 73 TestListenerStub testListenerStub = new TestListenerStub(); 74 mAndroidTestRunner.addTestListener(testListenerStub); 75 76 mAndroidTestRunner.runTest(); 77 78 assertTrue(testListenerStub.saw("testOne")); 79 } 80 testRunTestWithAndroidTestCase()81 public void testRunTestWithAndroidTestCase() throws Exception { 82 mAndroidTestRunner.setTestClassName( 83 OneAndroidTestTestCase.class.getName(), "testOneAndroid"); 84 85 TestListenerStub testListenerStub = new TestListenerStub(); 86 mAndroidTestRunner.addTestListener(testListenerStub); 87 88 assertNull(((AndroidTestCase) mAndroidTestRunner.getTestCases().get(0)).getContext()); 89 90 mAndroidTestRunner.runTest(); 91 92 assertTrue(testListenerStub.saw("testOneAndroid")); 93 assertSame(mStubContext, 94 ((AndroidTestCase) mAndroidTestRunner.getTestCases().get(0)).getContext()); 95 } 96 testRunTestWithAndroidTestCaseInSuite()97 public void testRunTestWithAndroidTestCaseInSuite() throws Exception { 98 mAndroidTestRunner.setTestClassName(OneAndroidTestTestCase.class.getName(), null); 99 100 TestListenerStub testListenerStub = new TestListenerStub(); 101 mAndroidTestRunner.addTestListener(testListenerStub); 102 103 mAndroidTestRunner.runTest(); 104 105 assertTrue(testListenerStub.saw("testOneAndroid")); 106 107 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 108 for (TestCase testCase : testCases) { 109 assertSame(mStubContext, ((AndroidTestCase) testCase).getContext()); 110 } 111 } 112 testRunTestWithAndroidTestCaseInNestedSuite()113 public void testRunTestWithAndroidTestCaseInNestedSuite() throws Exception { 114 mAndroidTestRunner.setTestClassName(AndroidTestCaseTestSuite.class.getName(), null); 115 116 TestListenerStub testListenerStub = new TestListenerStub(); 117 mAndroidTestRunner.addTestListener(testListenerStub); 118 119 mAndroidTestRunner.runTest(); 120 121 assertTrue(testListenerStub.saw("testOneAndroid")); 122 123 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 124 for (TestCase testCase : testCases) { 125 assertSame(mStubContext, ((AndroidTestCase) testCase).getContext()); 126 } 127 } 128 testRunTestWithNullListener()129 public void testRunTestWithNullListener() throws Exception { 130 mAndroidTestRunner.setTestClassName(OneTestTestCase.class.getName(), null); 131 132 mAndroidTestRunner.addTestListener(null); 133 try { 134 mAndroidTestRunner.runTest(); 135 } catch (NullPointerException e) { 136 fail("Should not add a null TestListener"); 137 } 138 } 139 testSetTestClassWithTestSuiteProvider()140 public void testSetTestClassWithTestSuiteProvider() throws Exception { 141 mAndroidTestRunner.setTestClassName(SampleTestSuiteProvider.class.getName(), null); 142 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 143 List<String> testNames = Lists.newArrayList(); 144 for (TestCase testCase : testCases) { 145 testNames.add(testCase.getName()); 146 } 147 148 // Use the test suite provided by the interface method rather than the static suite method. 149 assertEquals(Arrays.asList("testOne"), testNames); 150 } 151 testSetTestClassWithTestSuite()152 public void testSetTestClassWithTestSuite() throws Exception { 153 mAndroidTestRunner.setTestClassName(SampleTestSuite.class.getName(), null); 154 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 155 List<String> testNames = Lists.newArrayList(); 156 for (TestCase testCase : testCases) { 157 testNames.add(testCase.getName()); 158 } 159 assertEquals(Arrays.asList("testOne", "testOne", "testTwo"), testNames); 160 } 161 testRunSingleTestMethod()162 public void testRunSingleTestMethod() throws Exception { 163 String testMethodName = "testTwo"; 164 mAndroidTestRunner.setTestClassName(TwoTestTestCase.class.getName(), testMethodName); 165 List<TestCase> testCases = mAndroidTestRunner.getTestCases(); 166 List<String> testNames = Lists.newArrayList(); 167 for (TestCase testCase : testCases) { 168 testNames.add(testCase.getName()); 169 } 170 assertEquals(Arrays.asList(testMethodName), testNames); 171 } 172 testSetTestClassInvalidClass()173 public void testSetTestClassInvalidClass() throws Exception { 174 try { 175 mAndroidTestRunner.setTestClassName("class.that.does.not.exist", null); 176 fail("expected exception not thrown"); 177 } catch (RuntimeException e) { 178 // expected 179 } 180 } 181 testRunSkipExecution()182 public void testRunSkipExecution() throws Exception { 183 String testMethodName = "testFail"; 184 mAndroidTestRunner.setTestClassName( 185 OnePassOneErrorOneFailTestCase.class.getName(), testMethodName); 186 187 TestListenerStub testListenerStub = new TestListenerStub(); 188 mAndroidTestRunner.addTestListener(testListenerStub); 189 190 // running the failing test should pass - ie as if its not run 191 mAndroidTestRunner.runTest(); 192 193 assertTrue(testListenerStub.saw("testFail")); 194 } 195 196 public static class SampleTestSuiteProvider implements TestSuiteProvider { 197 getTestSuite()198 public TestSuite getTestSuite() { 199 TestSuite testSuite = new TestSuite(); 200 testSuite.addTestSuite(OneTestTestCase.class); 201 return testSuite; 202 } 203 suite()204 public static Test suite() { 205 return SampleTestSuite.suite(); 206 } 207 } 208 209 public static class SampleTestSuite { suite()210 public static TestSuite suite() { 211 TestSuite testSuite = new TestSuite(); 212 testSuite.addTestSuite(OneTestTestCase.class); 213 testSuite.addTestSuite(TwoTestTestCase.class); 214 return testSuite; 215 } 216 } 217 218 public static class AndroidTestCaseTestSuite { suite()219 public static TestSuite suite() { 220 TestSuite testSuite = new TestSuite(); 221 testSuite.addTestSuite(OneAndroidTestTestCase.class); 222 return testSuite; 223 } 224 } 225 226 public static class OneAndroidTestTestCase extends AndroidTestCase { testOneAndroid()227 public void testOneAndroid() throws Exception { 228 } 229 } 230 231 public static class OneTestTestCase extends TestCase { testOne()232 public void testOne() throws Exception { 233 } 234 } 235 236 public static class TwoTestTestCase extends TestCase { testOne()237 public void testOne() throws Exception { 238 } 239 testTwo()240 public void testTwo() throws Exception { 241 } 242 } 243 244 public static class OnePassOneErrorOneFailTestCase extends TestCase { testPass()245 public void testPass() throws Exception { 246 } 247 testError()248 public void testError() throws Exception { 249 throw new Exception(); 250 } 251 testFail()252 public void testFail() throws Exception { 253 fail(); 254 } 255 } 256 257 private static class TestListenerStub implements TestListener { 258 List<String> testNames = Lists.newArrayList(); 259 addError(Test test, Throwable t)260 public void addError(Test test, Throwable t) { 261 } 262 addFailure(Test test, AssertionFailedError t)263 public void addFailure(Test test, AssertionFailedError t) { 264 } 265 endTest(Test test)266 public void endTest(Test test) { 267 } 268 startTest(Test test)269 public void startTest(Test test) { 270 if (test instanceof TestCase) { 271 testNames.add(((TestCase) test).getName()); 272 } else if (test instanceof TestSuite) { 273 testNames.add(((TestSuite) test).getName()); 274 } 275 } 276 saw(String testName)277 public boolean saw(String testName) { 278 return testNames.contains(testName); 279 } 280 } 281 282 private static class StubContext extends MockContext { 283 private ClassLoader mClassLoader; 284 StubContext(ClassLoader classLoader)285 public StubContext(ClassLoader classLoader) { 286 this.mClassLoader = classLoader; 287 } 288 289 @Override getClassLoader()290 public ClassLoader getClassLoader() { 291 return mClassLoader; 292 } 293 } 294 } 295