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.suitebuilder;
18 
19 import android.test.suitebuilder.examples.instrumentation.InstrumentationTest;
20 
21 import junit.framework.Assert;
22 import junit.framework.AssertionFailedError;
23 import junit.framework.Test;
24 import junit.framework.TestCase;
25 import junit.framework.TestListener;
26 import junit.framework.TestResult;
27 import junit.framework.TestSuite;
28 
29 import java.util.HashSet;
30 import java.util.Set;
31 
32 public class UnitTestSuiteBuilderTest extends TestCase {
33 
34     private UnitTestSuiteBuilder unitTestSuiteBuilder;
35 
setUp()36     protected void setUp() throws Exception {
37         super.setUp();
38         unitTestSuiteBuilder = new UnitTestSuiteBuilder(getClass());
39     }
40 
testShouldExcludeIntrumentationTests()41     public void testShouldExcludeIntrumentationTests() throws Exception {
42         unitTestSuiteBuilder.includePackages(packageFor(InstrumentationTest.class));
43 
44         TestSuite testSuite = unitTestSuiteBuilder.build();
45         Assert.assertEquals(0, ListTestCaseNames.getTestCaseNames(testSuite).size());
46 
47         SuiteExecutionRecorder recorder = runSuite(unitTestSuiteBuilder);
48 
49         assertFalse(recorder.saw("InstrumentationTest.testInstrumentation"));
50         assertTrue(recorder.testsSeen.isEmpty());
51     }
52 
packageFor(Class clazz)53     private static String packageFor(Class clazz) {
54         String className = clazz.getName();
55         return className.substring(0, className.lastIndexOf('.'));
56     }
57 
runSuite(TestSuiteBuilder builder)58     private SuiteExecutionRecorder runSuite(TestSuiteBuilder builder) {
59         TestSuite suite = builder.build();
60         SuiteExecutionRecorder recorder = new SuiteExecutionRecorder();
61         TestResult result = new TestResult();
62         result.addListener(recorder);
63         suite.run(result);
64         return recorder;
65     }
66 
67     private class SuiteExecutionRecorder implements TestListener {
68 
69         private Set<String> failures = new HashSet<String>();
70         private Set<String> errors = new HashSet<String>();
71         private Set<String> testsSeen = new HashSet<String>();
72 
addError(Test test, Throwable t)73         public void addError(Test test, Throwable t) {
74             errors.add(testName(test));
75         }
76 
addFailure(Test test, AssertionFailedError t)77         public void addFailure(Test test, AssertionFailedError t) {
78             failures.add(testName(test));
79         }
80 
endTest(Test test)81         public void endTest(Test test) {
82         }
83 
startTest(Test test)84         public void startTest(Test test) {
85             testsSeen.add(testName(test));
86         }
87 
saw(String testName)88         public boolean saw(String testName) {
89             return testsSeen.contains(testName);
90         }
91 
failed(String testName)92         public boolean failed(String testName) {
93             return failures.contains(testName);
94         }
95 
errored(String testName)96         public boolean errored(String testName) {
97             return errors.contains(testName);
98         }
99 
passed(String testName)100         public boolean passed(String testName) {
101             return saw(testName) && !failed(testName) && !errored(testName);
102         }
103 
testName(Test test)104         private String testName(Test test) {
105             TestCase testCase = (TestCase) test;
106             return testCase.getClass().getSimpleName() + "." + testCase.getName();
107         }
108     }
109 }
110