19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage junit.runner; 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.*; 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.runner.*; 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.*; 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An implementation of a TestCollector that loads 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all classes on the class path and tests whether 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is assignable from Test or provides a static suite method. 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see TestCollector 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} - Not needed for 1.0 SDK 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class LoadingTestCollector extends ClassPathTestCollector { 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestCaseClassLoader fLoader; 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LoadingTestCollector() { 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fLoader= new TestCaseClassLoader(); 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean isTestClass(String classFileName) { 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (classFileName.endsWith(".class")) { 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class testClass= classFromFile(classFileName); 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (testClass != null) && isTestClass(testClass); 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassNotFoundException expected) { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoClassDefFoundError notFatal) { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class classFromFile(String classFileName) throws ClassNotFoundException { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String className= classNameFromFile(classFileName); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!fLoader.isExcluded(className)) 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fLoader.loadClass(className, false); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isTestClass(Class testClass) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasSuiteMethod(testClass)) 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Test.class.isAssignableFrom(testClass) && 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Modifier.isPublic(testClass.getModifiers()) && 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasPublicConstructor(testClass)) 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSuiteMethod(Class testClass) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(Exception e) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasPublicConstructor(Class testClass) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TestSuite.getTestConstructor(testClass); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(NoSuchMethodException e) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 71