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 198c5a24d16926fb14f407ba51026f9a5b973b2e01Paul Duffinimport java.util.ArrayList; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Test; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestSuite; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.runner.BaseTestRunner; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Method; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - This is part of a framework that is under development and should not be used for 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * active development. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner@Deprecated 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TestCaseUtil { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private TestCaseUtil() { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static List<? extends Test> getTests(Test test, boolean flatten) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getTests(test, flatten, new HashSet<Class<?>>()); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static List<? extends Test> getTests(Test test, boolean flatten, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Class<?>> seen) { 498c5a24d16926fb14f407ba51026f9a5b973b2e01Paul Duffin List<Test> testCases = new ArrayList<>(); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test != null) { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Test workingTest = null; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If we want to run a single TestCase method only, we must not 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoke the suite() method, because we will run all test methods 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the class then. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test instanceof TestCase && 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TestCase)test).getName() == null) { 60b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner workingTest = invokeSuiteMethodIfPossible(test.getClass(), 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seen); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (workingTest == null) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project workingTest = test; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (workingTest instanceof TestSuite) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite testSuite = (TestSuite) workingTest; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration enumeration = testSuite.tests(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (enumeration.hasMoreElements()) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Test childTest = (Test) enumeration.nextElement(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flatten) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.addAll(getTests(childTest, flatten, seen)); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.add(childTest); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testCases.add(workingTest); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testCases; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85bd96f408085701fe04fb46acdd3a101cfdebe064Paul Duffin static Test invokeSuiteMethodIfPossible(Class testClass, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Class<?>> seen) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Method suiteMethod = testClass.getMethod( 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BaseTestRunner.SUITE_METHODNAME, new Class[0]); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additional check necessary: If a TestCase contains a suite() 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method that returns a TestSuite including the TestCase itself, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we need to stop the recursion. We use a set of classes to 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remember which classes' suite() methods were already invoked. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Modifier.isStatic(suiteMethod.getModifiers()) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !seen.contains(testClass)) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seen.add(testClass); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Test) suiteMethod.invoke(null, (Object[]) null); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InvocationTargetException e) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalAccessException e) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NoSuchMethodException e) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113bd96f408085701fe04fb46acdd3a101cfdebe064Paul Duffin static String getTestName(Test test) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (test instanceof TestCase) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestCase testCase = (TestCase) test; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return testCase.getName(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (test instanceof TestSuite) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite testSuite = (TestSuite) test; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = testSuite.getName(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = name.lastIndexOf("."); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > -1) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.substring(index + 1); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 132