TestCaseUtil.java revision b51617f4668ef8cf0e6d8d0fc3284eae51dbd8ca
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Lists; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Test; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestSuite; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.runner.BaseTestRunner; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Method; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - This is part of a framework that is under development and should not be used for 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * active development. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner@Deprecated 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TestCaseUtil { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private TestCaseUtil() { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unchecked") 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static List<String> getTestCaseNames(Test test, boolean flatten) { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<Test> tests = (List<Test>) getTests(test, flatten); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<String> testCaseNames = Lists.newArrayList(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Test aTest : tests) { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCaseNames.add(getTestName(aTest)); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testCaseNames; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static List<? extends Test> getTests(Test test, boolean flatten) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTests(test, flatten, new HashSet<Class<?>>()); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static List<? extends Test> getTests(Test test, boolean flatten, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Class<?>> seen) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<Test> testCases = Lists.newArrayList(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test != null) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Test workingTest = null; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If we want to run a single TestCase method only, we must not 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoke the suite() method, because we will run all test methods 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the class then. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test instanceof TestCase && 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TestCase)test).getName() == null) { 71b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner workingTest = invokeSuiteMethodIfPossible(test.getClass(), 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seen); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (workingTest == null) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project workingTest = test; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (workingTest instanceof TestSuite) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite testSuite = (TestSuite) workingTest; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration enumeration = testSuite.tests(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (enumeration.hasMoreElements()) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Test childTest = (Test) enumeration.nextElement(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flatten) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.addAll(getTests(childTest, flatten, seen)); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.add(childTest); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.add(workingTest); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testCases; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Test invokeSuiteMethodIfPossible(Class testClass, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Class<?>> seen) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Method suiteMethod = testClass.getMethod( 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BaseTestRunner.SUITE_METHODNAME, new Class[0]); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additional check necessary: If a TestCase contains a suite() 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method that returns a TestSuite including the TestCase itself, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we need to stop the recursion. We use a set of classes to 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remember which classes' suite() methods were already invoked. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Modifier.isStatic(suiteMethod.getModifiers()) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !seen.contains(testClass)) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seen.add(testClass); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Test) suiteMethod.invoke(null, (Object[]) null); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InvocationTargetException e) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalAccessException e) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NoSuchMethodException e) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String getTestName(Test test) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test instanceof TestCase) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestCase testCase = (TestCase) test; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testCase.getName(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (test instanceof TestSuite) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite testSuite = (TestSuite) test; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = testSuite.getName(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = name.lastIndexOf("."); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > -1) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.substring(index + 1); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Test getTestAtIndex(TestSuite testSuite, int position) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 0; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration enumeration = testSuite.tests(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (enumeration.hasMoreElements()) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Test test = (Test) enumeration.nextElement(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == position) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return test; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static TestSuite createTestSuite(Class<? extends Test> testClass) 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws InstantiationException, IllegalAccessException { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner Test test = invokeSuiteMethodIfPossible(testClass, 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashSet<Class<?>>()); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test == null) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new TestSuite(testClass); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (TestCase.class.isAssignableFrom(test.getClass())) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite testSuite = new TestSuite(test.getClass().getName()); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testSuite.addTest(test); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testSuite; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (TestSuite) test; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 173