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