InstrumentationTestRunnerTest.java revision e70f61b1160e953e5e4d18d30a463fa9ba821779
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 17package android.test; 18 19import android.content.Context; 20import android.os.Bundle; 21import android.test.mock.MockContext; 22import android.test.suitebuilder.ListTestCaseNames; 23import android.test.suitebuilder.ListTestCaseNames.TestDescriptor; 24import android.test.suitebuilder.annotation.SmallTest; 25 26import junit.framework.Test; 27import junit.framework.TestCase; 28import junit.framework.TestSuite; 29 30import java.util.List; 31 32/** 33 * Tests for {@link InstrumentationTestRunner} 34 */ 35@SmallTest 36public class InstrumentationTestRunnerTest extends TestCase { 37 private StubInstrumentationTestRunner mInstrumentationTestRunner; 38 private StubAndroidTestRunner mStubAndroidTestRunner; 39 private String mTargetContextPackageName; 40 41 protected void setUp() throws Exception { 42 super.setUp(); 43 mStubAndroidTestRunner = new StubAndroidTestRunner(); 44 mTargetContextPackageName = "android.test.suitebuilder.examples"; 45 mInstrumentationTestRunner = new StubInstrumentationTestRunner( 46 new StubContext("com.google.foo.tests"), 47 new StubContext(mTargetContextPackageName), mStubAndroidTestRunner); 48 } 49 50 public void testOverrideTestToRunWithClassArgument() throws Exception { 51 String expectedTestClassName = PlaceHolderTest.class.getName(); 52 mInstrumentationTestRunner.onCreate(createBundle( 53 InstrumentationTestRunner.ARGUMENT_TEST_CLASS, expectedTestClassName)); 54 55 assertTestRunnerCalledWithExpectedParameters(expectedTestClassName, "testPlaceHolder"); 56 } 57 58 public void testOverrideTestToRunWithClassAndMethodArgument() throws Exception { 59 String expectedTestClassName = PlaceHolderTest.class.getName(); 60 String expectedTestMethodName = "testPlaceHolder"; 61 String classAndMethod = expectedTestClassName + "#" + expectedTestMethodName; 62 mInstrumentationTestRunner.onCreate(createBundle( 63 InstrumentationTestRunner.ARGUMENT_TEST_CLASS, classAndMethod)); 64 65 assertTestRunnerCalledWithExpectedParameters(expectedTestClassName, 66 expectedTestMethodName); 67 } 68 69 public void testUseSelfAsTestSuiteProviderWhenNoMetaDataOrClassArgument() throws Exception { 70 TestSuite testSuite = new TestSuite(); 71 testSuite.addTestSuite(PlaceHolderTest.class); 72 mInstrumentationTestRunner.setAllTestsSuite(testSuite); 73 mInstrumentationTestRunner.onCreate(null); 74 assertTestRunnerCalledWithExpectedParameters( 75 PlaceHolderTest.class.getName(), "testPlaceHolder"); 76 } 77 78 public void testMultipleTestClass() throws Exception { 79 String classArg = PlaceHolderTest.class.getName() + "," + 80 PlaceHolderTest2.class.getName(); 81 mInstrumentationTestRunner.onCreate(createBundle( 82 InstrumentationTestRunner.ARGUMENT_TEST_CLASS, classArg)); 83 84 Test test = mStubAndroidTestRunner.getTest(); 85 86 assertContentsInOrder(ListTestCaseNames.getTestNames((TestSuite) test), 87 new TestDescriptor(PlaceHolderTest.class.getName(), "testPlaceHolder"), 88 new TestDescriptor(PlaceHolderTest2.class.getName(), "testPlaceHolder2")); 89 90 } 91 92 public void testDelayParameter() throws Exception { 93 int delayMsec = 1000; 94 Bundle args = new Bundle(); 95 args.putInt(InstrumentationTestRunner.ARGUMENT_DELAY_MSEC, delayMsec); 96 args.putString(InstrumentationTestRunner.ARGUMENT_TEST_CLASS, 97 PlaceHolderTest.class.getName() + "," + 98 PlaceHolderTest2.class.getName()); 99 mInstrumentationTestRunner.onCreate(args); 100 Thread t = new Thread() { public void run() { mInstrumentationTestRunner.onStart(); } }; 101 102 // Should delay three times: before, between, and after the two tests. 103 long beforeTest = System.currentTimeMillis(); 104 t.start(); 105 t.join(); 106 assertTrue(System.currentTimeMillis() > beforeTest + delayMsec * 3); 107 assertTrue(mInstrumentationTestRunner.isStarted()); 108 assertTrue(mInstrumentationTestRunner.isFinished()); 109 assertTrue(mStubAndroidTestRunner.isRun()); 110 } 111 112 private void assertContentsInOrder(List<TestDescriptor> actual, TestDescriptor... source) { 113 TestDescriptor[] clonedSource = source.clone(); 114 assertEquals("Unexpected number of items.", clonedSource.length, actual.size()); 115 for (int i = 0; i < actual.size(); i++) { 116 TestDescriptor actualItem = actual.get(i); 117 TestDescriptor sourceItem = clonedSource[i]; 118 assertEquals("Unexpected item. Index: " + i, sourceItem, actualItem); 119 } 120 } 121 122 private void assertTestRunnerCalledWithExpectedParameters( 123 String expectedTestClassName, String expectedTestMethodName) { 124 Test test = mStubAndroidTestRunner.getTest(); 125 assertContentsInOrder(ListTestCaseNames.getTestNames((TestSuite) test), 126 new TestDescriptor(expectedTestClassName, expectedTestMethodName)); 127 assertTrue(mInstrumentationTestRunner.isStarted()); 128 assertFalse(mInstrumentationTestRunner.isFinished()); 129 } 130 131 private Bundle createBundle(String key, String value) { 132 Bundle bundle = new Bundle(); 133 bundle.putString(key, value); 134 return bundle; 135 } 136 137 private static class StubInstrumentationTestRunner extends InstrumentationTestRunner { 138 private Context mContext; 139 private Context mTargetContext; 140 private boolean mStarted; 141 private boolean mFinished; 142 private AndroidTestRunner mAndroidTestRunner; 143 private TestSuite mTestSuite; 144 private TestSuite mDefaultTestSuite; 145 private String mPackageNameForDefaultTests; 146 147 public StubInstrumentationTestRunner(Context context, Context targetContext, 148 AndroidTestRunner androidTestRunner) { 149 this.mContext = context; 150 this.mTargetContext = targetContext; 151 this.mAndroidTestRunner = androidTestRunner; 152 } 153 154 public Context getContext() { 155 return mContext; 156 } 157 158 public TestSuite getAllTests() { 159 return mTestSuite; 160 } 161 162 public Context getTargetContext() { 163 return mTargetContext; 164 } 165 166 protected AndroidTestRunner getAndroidTestRunner() { 167 return mAndroidTestRunner; 168 } 169 170 public void start() { 171 mStarted = true; 172 } 173 174 public void finish(int resultCode, Bundle results) { 175 mFinished = true; 176 } 177 178 public boolean isStarted() { 179 return mStarted; 180 } 181 182 public boolean isFinished() { 183 return mFinished; 184 } 185 186 public void setAllTestsSuite(TestSuite testSuite) { 187 mTestSuite = testSuite; 188 } 189 190 public void setDefaultTestsSuite(TestSuite testSuite) { 191 mDefaultTestSuite = testSuite; 192 } 193 194 public String getPackageNameForDefaultTests() { 195 return mPackageNameForDefaultTests; 196 } 197 } 198 199 private static class StubContext extends MockContext { 200 private String mPackageName; 201 202 public StubContext(String packageName) { 203 this.mPackageName = packageName; 204 } 205 206 @Override 207 public String getPackageCodePath() { 208 return mPackageName; 209 } 210 211 @Override 212 public String getPackageName() { 213 return mPackageName; 214 } 215 216 @Override 217 public ClassLoader getClassLoader() { 218 return getClass().getClassLoader(); 219 } 220 } 221 222 private static class StubAndroidTestRunner extends AndroidTestRunner { 223 private Test mTest; 224 private boolean mRun; 225 226 public boolean isRun() { 227 return mRun; 228 } 229 230 public void setTest(Test test) { 231 super.setTest(test); 232 mTest = test; 233 } 234 235 public Test getTest() { 236 return mTest; 237 } 238 239 public void runTest() { 240 super.runTest(); 241 mRun = true; 242 } 243 } 244 245 /** 246 * Empty test used for validation 247 */ 248 public static class PlaceHolderTest extends TestCase { 249 250 public PlaceHolderTest() { 251 super("testPlaceHolder"); 252 } 253 254 public void testPlaceHolder() throws Exception { 255 256 } 257 } 258 259 /** 260 * Empty test used for validation 261 */ 262 public static class PlaceHolderTest2 extends TestCase { 263 264 public PlaceHolderTest2() { 265 super("testPlaceHolder2"); 266 } 267 268 public void testPlaceHolder2() throws Exception { 269 270 } 271 } 272} 273