• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package junit.runner;
2 
3 import java.lang.reflect.*;
4 import junit.runner.*;
5 import junit.framework.*;
6 
7 /**
8  * An implementation of a TestCollector that loads
9  * all classes on the class path and tests whether
10  * it is assignable from Test or provides a static suite method.
11  * @see TestCollector
12  * {@hide} - Not needed for 1.0 SDK
13  */
14 public class LoadingTestCollector extends ClassPathTestCollector {
15 
16 	TestCaseClassLoader fLoader;
17 
LoadingTestCollector()18 	public LoadingTestCollector() {
19 		fLoader= new TestCaseClassLoader();
20 	}
21 
isTestClass(String classFileName)22 	protected boolean isTestClass(String classFileName) {
23 		try {
24 			if (classFileName.endsWith(".class")) {
25 				Class testClass= classFromFile(classFileName);
26 				return (testClass != null) && isTestClass(testClass);
27 			}
28 		}
29 		catch (ClassNotFoundException expected) {
30 		}
31 		catch (NoClassDefFoundError notFatal) {
32 		}
33 		return false;
34 	}
35 
classFromFile(String classFileName)36 	Class classFromFile(String classFileName) throws ClassNotFoundException {
37 		String className= classNameFromFile(classFileName);
38 		if (!fLoader.isExcluded(className))
39 			return fLoader.loadClass(className, false);
40 		return null;
41 	}
42 
isTestClass(Class testClass)43 	boolean isTestClass(Class testClass) {
44 		if (hasSuiteMethod(testClass))
45 			return true;
46 		if (Test.class.isAssignableFrom(testClass) &&
47 			Modifier.isPublic(testClass.getModifiers()) &&
48 			hasPublicConstructor(testClass))
49 			return true;
50 		return false;
51 	}
52 
hasSuiteMethod(Class testClass)53 	boolean hasSuiteMethod(Class testClass) {
54 		try {
55 			testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]);
56 	 	} catch(Exception e) {
57 	 		return false;
58 		}
59 		return true;
60 	}
61 
hasPublicConstructor(Class testClass)62 	boolean hasPublicConstructor(Class testClass) {
63 		try {
64 			TestSuite.getTestConstructor(testClass);
65 		} catch(NoSuchMethodException e) {
66 			return false;
67 		}
68 		return true;
69 	}
70 }
71