19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.test;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1931e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabotimport android.app.Instrumentation;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.mock.MockContext;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.ListTestCaseNames;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.ListTestCaseNames.TestDescriptor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Test;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestSuite;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tests for {@link InstrumentationTestRunner}
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@SmallTest
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class InstrumentationTestRunnerTest extends TestCase {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private StubInstrumentationTestRunner mInstrumentationTestRunner;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private StubAndroidTestRunner mStubAndroidTestRunner;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mTargetContextPackageName;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStubAndroidTestRunner = new StubAndroidTestRunner();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTargetContextPackageName = "android.test.suitebuilder.examples";
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner = new StubInstrumentationTestRunner(
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new StubContext("com.google.foo.tests"),
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new StubContext(mTargetContextPackageName), mStubAndroidTestRunner);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testOverrideTestToRunWithClassArgument() throws Exception {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String expectedTestClassName = PlaceHolderTest.class.getName();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.onCreate(createBundle(
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationTestRunner.ARGUMENT_TEST_CLASS, expectedTestClassName));
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTestRunnerCalledWithExpectedParameters(expectedTestClassName, "testPlaceHolder");
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testOverrideTestToRunWithClassAndMethodArgument() throws Exception {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String expectedTestClassName = PlaceHolderTest.class.getName();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String expectedTestMethodName = "testPlaceHolder";
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String classAndMethod = expectedTestClassName + "#" + expectedTestMethodName;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.onCreate(createBundle(
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationTestRunner.ARGUMENT_TEST_CLASS, classAndMethod));
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTestRunnerCalledWithExpectedParameters(expectedTestClassName,
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                expectedTestMethodName);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testUseSelfAsTestSuiteProviderWhenNoMetaDataOrClassArgument() throws Exception {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TestSuite testSuite = new TestSuite();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testSuite.addTestSuite(PlaceHolderTest.class);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.setAllTestsSuite(testSuite);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.onCreate(null);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTestRunnerCalledWithExpectedParameters(
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PlaceHolderTest.class.getName(), "testPlaceHolder");
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testMultipleTestClass() throws Exception {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String classArg = PlaceHolderTest.class.getName() + "," +
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PlaceHolderTest2.class.getName();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.onCreate(createBundle(
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationTestRunner.ARGUMENT_TEST_CLASS, classArg));
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Test test = mStubAndroidTestRunner.getTest();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertContentsInOrder(ListTestCaseNames.getTestNames((TestSuite) test),
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new TestDescriptor(PlaceHolderTest.class.getName(), "testPlaceHolder"),
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new TestDescriptor(PlaceHolderTest2.class.getName(), "testPlaceHolder2"));
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9331e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    /**
9431e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot     * Test that runtime exceptions during runTest are handled gracefully
9531e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot     */
9631e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    public void testUnhandledException() throws Exception {
9731e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        StubAndroidTestRunner stubAndroidTestRunner = new StubAndroidTestRunner() {
9831e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot            @Override
9931e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot            public void runTest() {
10031e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                throw new RuntimeException();
10131e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot            }
10231e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        };
10331e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        StubInstrumentationTestRunner instrumentationTestRunner = new StubInstrumentationTestRunner(
10431e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                new StubContext("com.google.foo.tests"),
10531e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                new StubContext(mTargetContextPackageName), stubAndroidTestRunner);
10631e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        instrumentationTestRunner.onCreate(new Bundle());
10731e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        instrumentationTestRunner.onStart();
10831e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        assertTrue("Instrumentation did not finish", instrumentationTestRunner.isFinished());
10931e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        // ensure a meaningful error message placed in results
11031e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        String resultsData = instrumentationTestRunner.mResults.getString(
11131e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                Instrumentation.REPORT_KEY_STREAMRESULT);
11231e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        assertTrue("Instrumentation results is missing RuntimeException",
11331e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                resultsData.contains("RuntimeException"));
11431e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    }
11531e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot
11631e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    /**
11731e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot     * Test that specifying a method which does not exist is handled gracefully
11831e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot     */
11931e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    public void testBadMethodArgument() throws Exception {
12031e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        String testClassName = PlaceHolderTest.class.getName();
12131e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        String invalidMethodName = "testNoExist";
12231e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        String classAndMethod = testClassName + "#" + invalidMethodName;
12331e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        mInstrumentationTestRunner.onCreate(createBundle(
12431e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                InstrumentationTestRunner.ARGUMENT_TEST_CLASS, classAndMethod));
12531e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        assertTestRunnerCalledWithExpectedParameters(testClassName,
12631e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot                invalidMethodName);
12731e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot    }
12831e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testDelayParameter() throws Exception {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int delayMsec = 1000;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle args = new Bundle();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.putInt(InstrumentationTestRunner.ARGUMENT_DELAY_MSEC, delayMsec);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.putString(InstrumentationTestRunner.ARGUMENT_TEST_CLASS,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PlaceHolderTest.class.getName() + "," +
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PlaceHolderTest2.class.getName());
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrumentationTestRunner.onCreate(args);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Thread t = new Thread() { public void run() { mInstrumentationTestRunner.onStart(); } };
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should delay three times: before, between, and after the two tests.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long beforeTest = System.currentTimeMillis();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.start();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.join();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(System.currentTimeMillis() > beforeTest + delayMsec * 3);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(mInstrumentationTestRunner.isStarted());
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(mInstrumentationTestRunner.isFinished());
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(mStubAndroidTestRunner.isRun());
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14988e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    /**
15088e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     * Test that the -e {@link InstrumentationTestRunner.ARGUMENT_ANNOTATION} parameter properly
15188e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     * selects tests.
15288e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     */
15388e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    public void testAnnotationParameter() throws Exception {
15488e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        String expectedTestClassName = AnnotationTest.class.getName();
15588e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        Bundle args = new Bundle();
15688e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        args.putString(InstrumentationTestRunner.ARGUMENT_TEST_CLASS, expectedTestClassName);
15788e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        args.putString(InstrumentationTestRunner.ARGUMENT_ANNOTATION, FlakyTest.class.getName());
15888e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        mInstrumentationTestRunner.onCreate(args);
15988e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        assertTestRunnerCalledWithExpectedParameters(expectedTestClassName, "testAnnotated");
16088e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    }
16188e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot
16288e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    /**
16388e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     * Test that the -e {@link InstrumentationTestRunner.ARGUMENT_NOT_ANNOTATION} parameter
16488e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     * properly excludes tests.
16588e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     */
16688e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    public void testNotAnnotationParameter() throws Exception {
16788e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        String expectedTestClassName = AnnotationTest.class.getName();
16888e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        Bundle args = new Bundle();
16988e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        args.putString(InstrumentationTestRunner.ARGUMENT_TEST_CLASS, expectedTestClassName);
17088e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        args.putString(InstrumentationTestRunner.ARGUMENT_NOT_ANNOTATION,
17188e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot                FlakyTest.class.getName());
17288e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        mInstrumentationTestRunner.onCreate(args);
17388e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        assertTestRunnerCalledWithExpectedParameters(expectedTestClassName, "testNotAnnotated");
17488e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    }
17588e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void assertContentsInOrder(List<TestDescriptor> actual, TestDescriptor... source) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TestDescriptor[] clonedSource = source.clone();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Unexpected number of items.", clonedSource.length, actual.size());
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < actual.size(); i++) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TestDescriptor actualItem = actual.get(i);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TestDescriptor sourceItem = clonedSource[i];
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals("Unexpected item. Index: " + i, sourceItem, actualItem);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void assertTestRunnerCalledWithExpectedParameters(
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String expectedTestClassName, String expectedTestMethodName) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Test test = mStubAndroidTestRunner.getTest();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertContentsInOrder(ListTestCaseNames.getTestNames((TestSuite) test),
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new TestDescriptor(expectedTestClassName, expectedTestMethodName));
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(mInstrumentationTestRunner.isStarted());
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse(mInstrumentationTestRunner.isFinished());
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle createBundle(String key, String value) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle bundle = new Bundle();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString(key, value);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bundle;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class StubInstrumentationTestRunner extends InstrumentationTestRunner {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Context mContext;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Context mTargetContext;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mStarted;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mFinished;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AndroidTestRunner mAndroidTestRunner;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private TestSuite mTestSuite;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private TestSuite mDefaultTestSuite;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private String mPackageNameForDefaultTests;
21031e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        private Bundle mResults;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public StubInstrumentationTestRunner(Context context, Context targetContext,
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AndroidTestRunner androidTestRunner) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.mContext = context;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.mTargetContext = targetContext;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.mAndroidTestRunner = androidTestRunner;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Context getContext() {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mContext;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public TestSuite getAllTests() {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTestSuite;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Context getTargetContext() {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTargetContext;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected AndroidTestRunner getAndroidTestRunner() {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mAndroidTestRunner;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void start() {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStarted = true;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void finish(int resultCode, Bundle results) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFinished = true;
24131e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot            mResults = results;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isStarted() {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mStarted;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isFinished() {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFinished;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setAllTestsSuite(TestSuite testSuite) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTestSuite = testSuite;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setDefaultTestsSuite(TestSuite testSuite) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDefaultTestSuite = testSuite;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getPackageNameForDefaultTests() {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageNameForDefaultTests;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26331e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot
26431e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        @Override
26531e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        void prepareLooper() {
26631e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot            // ignore
26731e7ce762ccbbb747fabb4581e42a0a2fe56e780Brett Chabot        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class StubContext extends MockContext {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private String mPackageName;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public StubContext(String packageName) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.mPackageName = packageName;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getPackageCodePath() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageName;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String getPackageName() {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageName;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ClassLoader getClassLoader() {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getClass().getClassLoader();
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class StubAndroidTestRunner extends AndroidTestRunner {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Test mTest;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mRun;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isRun() {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mRun;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setTest(Test test) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.setTest(test);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTest = test;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Test getTest() {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTest;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void runTest() {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.runTest();
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRun = true;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Empty test used for validation
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PlaceHolderTest extends TestCase {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PlaceHolderTest() {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("testPlaceHolder");
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void testPlaceHolder() throws Exception {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Empty test used for validation
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PlaceHolderTest2 extends TestCase {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PlaceHolderTest2() {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("testPlaceHolder2");
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void testPlaceHolder2() throws Exception {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34388e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot
34488e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    /**
34588e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     * Annotated test used for validation.
34688e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot     */
34788e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    public static class AnnotationTest extends TestCase {
34888e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot
34988e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        public void testNotAnnotated() throws Exception {
35088e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        }
35188e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot
35288e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        @FlakyTest
35388e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        public void testAnnotated() throws Exception {
35488e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot        }
35588e03a97366d08fc69d852cf2219f9d0b1916af4Brett Chabot    }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
357