• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.content.Context;
20 import android.os.Bundle;
21 import android.test.mock.MockContext;
22 import android.test.suitebuilder.ListTestCaseNames;
23 import android.test.suitebuilder.ListTestCaseNames.TestDescriptor;
24 import android.test.suitebuilder.annotation.SmallTest;
25 
26 import junit.framework.Test;
27 import junit.framework.TestCase;
28 import junit.framework.TestSuite;
29 
30 import java.util.List;
31 
32 /**
33  * Tests for {@link InstrumentationTestRunner}
34  */
35 @SmallTest
36 public class InstrumentationTestRunnerTest extends TestCase {
37     private StubInstrumentationTestRunner mInstrumentationTestRunner;
38     private StubAndroidTestRunner mStubAndroidTestRunner;
39     private String mTargetContextPackageName;
40 
setUp()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 
testOverrideTestToRunWithClassArgument()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 
testOverrideTestToRunWithClassAndMethodArgument()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 
testUseSelfAsTestSuiteProviderWhenNoMetaDataOrClassArgument()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 
testMultipleTestClass()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 
testDelayParameter()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 
assertContentsInOrder(List<TestDescriptor> actual, TestDescriptor... source)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 
assertTestRunnerCalledWithExpectedParameters( String expectedTestClassName, String expectedTestMethodName)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 
createBundle(String key, String value)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 
StubInstrumentationTestRunner(Context context, Context targetContext, AndroidTestRunner androidTestRunner)147         public StubInstrumentationTestRunner(Context context, Context targetContext,
148                 AndroidTestRunner androidTestRunner) {
149             this.mContext = context;
150             this.mTargetContext = targetContext;
151             this.mAndroidTestRunner = androidTestRunner;
152         }
153 
getContext()154         public Context getContext() {
155             return mContext;
156         }
157 
getAllTests()158         public TestSuite getAllTests() {
159             return mTestSuite;
160         }
161 
getTargetContext()162         public Context getTargetContext() {
163             return mTargetContext;
164         }
165 
getAndroidTestRunner()166         protected AndroidTestRunner getAndroidTestRunner() {
167             return mAndroidTestRunner;
168         }
169 
start()170         public void start() {
171             mStarted = true;
172         }
173 
finish(int resultCode, Bundle results)174         public void finish(int resultCode, Bundle results) {
175             mFinished = true;
176         }
177 
isStarted()178         public boolean isStarted() {
179             return mStarted;
180         }
181 
isFinished()182         public boolean isFinished() {
183             return mFinished;
184         }
185 
setAllTestsSuite(TestSuite testSuite)186         public void setAllTestsSuite(TestSuite testSuite) {
187             mTestSuite = testSuite;
188         }
189 
setDefaultTestsSuite(TestSuite testSuite)190         public void setDefaultTestsSuite(TestSuite testSuite) {
191             mDefaultTestSuite = testSuite;
192         }
193 
getPackageNameForDefaultTests()194         public String getPackageNameForDefaultTests() {
195             return mPackageNameForDefaultTests;
196         }
197     }
198 
199     private static class StubContext extends MockContext {
200         private String mPackageName;
201 
StubContext(String packageName)202         public StubContext(String packageName) {
203             this.mPackageName = packageName;
204         }
205 
206         @Override
getPackageCodePath()207         public String getPackageCodePath() {
208             return mPackageName;
209         }
210 
211         @Override
getPackageName()212         public String getPackageName() {
213             return mPackageName;
214         }
215 
216         @Override
getClassLoader()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 
isRun()226         public boolean isRun() {
227             return mRun;
228         }
229 
setTest(Test test)230         public void setTest(Test test) {
231             super.setTest(test);
232             mTest = test;
233         }
234 
getTest()235         public Test getTest() {
236             return mTest;
237         }
238 
runTest()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 
PlaceHolderTest()250         public PlaceHolderTest() {
251             super("testPlaceHolder");
252         }
253 
testPlaceHolder()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 
PlaceHolderTest2()264         public PlaceHolderTest2() {
265             super("testPlaceHolder2");
266         }
267 
testPlaceHolder2()268         public void testPlaceHolder2() throws Exception {
269 
270         }
271     }
272 }
273