• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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 com.google.android.collect.Lists;
20 
21 import junit.framework.Test;
22 import junit.framework.TestCase;
23 import junit.framework.TestSuite;
24 import junit.runner.BaseTestRunner;
25 
26 import java.lang.reflect.InvocationTargetException;
27 import java.lang.reflect.Method;
28 import java.lang.reflect.Modifier;
29 import java.util.Enumeration;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.Set;
33 
34 /**
35  * @hide - This is part of a framework that is under development and should not be used for
36  * active development.
37  */
38 @Deprecated
39 public class TestCaseUtil {
40 
TestCaseUtil()41     private TestCaseUtil() {
42     }
43 
44     @SuppressWarnings("unchecked")
getTestCaseNames(Test test, boolean flatten)45     public static List<String> getTestCaseNames(Test test, boolean flatten) {
46         List<Test> tests = (List<Test>) getTests(test, flatten);
47         List<String> testCaseNames = Lists.newArrayList();
48         for (Test aTest : tests) {
49             testCaseNames.add(getTestName(aTest));
50         }
51         return testCaseNames;
52     }
53 
getTests(Test test, boolean flatten)54     public static List<? extends Test> getTests(Test test, boolean flatten) {
55         return getTests(test, flatten, new HashSet<Class<?>>());
56     }
57 
getTests(Test test, boolean flatten, Set<Class<?>> seen)58     private static List<? extends Test> getTests(Test test, boolean flatten,
59             Set<Class<?>> seen) {
60         List<Test> testCases = Lists.newArrayList();
61         if (test != null) {
62 
63             Test workingTest = null;
64             /*
65              * If we want to run a single TestCase method only, we must not
66              * invoke the suite() method, because we will run all test methods
67              * of the class then.
68              */
69             if (test instanceof TestCase &&
70                     ((TestCase)test).getName() == null) {
71                 workingTest = invokeSuiteMethodIfPossible(test.getClass(),
72                         seen);
73             }
74             if (workingTest == null) {
75                 workingTest = test;
76             }
77 
78             if (workingTest instanceof TestSuite) {
79                 TestSuite testSuite = (TestSuite) workingTest;
80                 Enumeration enumeration = testSuite.tests();
81                 while (enumeration.hasMoreElements()) {
82                     Test childTest = (Test) enumeration.nextElement();
83                     if (flatten) {
84                         testCases.addAll(getTests(childTest, flatten, seen));
85                     } else {
86                         testCases.add(childTest);
87                     }
88                 }
89             } else {
90                 testCases.add(workingTest);
91             }
92         }
93         return testCases;
94     }
95 
invokeSuiteMethodIfPossible(Class testClass, Set<Class<?>> seen)96     private static Test invokeSuiteMethodIfPossible(Class testClass,
97             Set<Class<?>> seen) {
98         try {
99             Method suiteMethod = testClass.getMethod(
100                     BaseTestRunner.SUITE_METHODNAME, new Class[0]);
101             /*
102              * Additional check necessary: If a TestCase contains a suite()
103              * method that returns a TestSuite including the TestCase itself,
104              * we need to stop the recursion. We use a set of classes to
105              * remember which classes' suite() methods were already invoked.
106              */
107             if (Modifier.isStatic(suiteMethod.getModifiers())
108                     && !seen.contains(testClass)) {
109                 seen.add(testClass);
110                 try {
111                     return (Test) suiteMethod.invoke(null, (Object[]) null);
112                 } catch (InvocationTargetException e) {
113                     // do nothing
114                 } catch (IllegalAccessException e) {
115                     // do nothing
116                 }
117             }
118         } catch (NoSuchMethodException e) {
119             // do nothing
120         }
121         return null;
122     }
123 
getTestName(Test test)124     public static String getTestName(Test test) {
125         if (test instanceof TestCase) {
126             TestCase testCase = (TestCase) test;
127             return testCase.getName();
128         } else if (test instanceof TestSuite) {
129             TestSuite testSuite = (TestSuite) test;
130             String name = testSuite.getName();
131             if (name != null) {
132                 int index = name.lastIndexOf(".");
133                 if (index > -1) {
134                     return name.substring(index + 1);
135                 } else {
136                     return name;
137                 }
138             }
139         }
140         return "";
141     }
142 
getTestAtIndex(TestSuite testSuite, int position)143     public static Test getTestAtIndex(TestSuite testSuite, int position) {
144         int index = 0;
145         Enumeration enumeration = testSuite.tests();
146         while (enumeration.hasMoreElements()) {
147             Test test = (Test) enumeration.nextElement();
148             if (index == position) {
149                 return test;
150             }
151             index++;
152         }
153         return null;
154     }
155 
createTestSuite(Class<? extends Test> testClass)156     public static TestSuite createTestSuite(Class<? extends Test> testClass)
157             throws InstantiationException, IllegalAccessException {
158 
159         Test test = invokeSuiteMethodIfPossible(testClass,
160                 new HashSet<Class<?>>());
161         if (test == null) {
162             return new TestSuite(testClass);
163 
164         } else if (TestCase.class.isAssignableFrom(test.getClass())) {
165             TestSuite testSuite = new TestSuite(test.getClass().getName());
166             testSuite.addTest(test);
167             return testSuite;
168         }
169 
170         return (TestSuite) test;
171     }
172 }
173