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