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