• 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  */
13 public class LoadingTestCollector extends ClassPathTestCollector {
14 
15 	TestCaseClassLoader fLoader;
16 
LoadingTestCollector()17 	public LoadingTestCollector() {
18 		fLoader= new TestCaseClassLoader();
19 	}
20 
isTestClass(String classFileName)21 	protected boolean isTestClass(String classFileName) {
22 		try {
23 			if (classFileName.endsWith(".class")) {
24 				Class testClass= classFromFile(classFileName);
25 				return (testClass != null) && isTestClass(testClass);
26 			}
27 		}
28 		catch (ClassNotFoundException expected) {
29 		}
30 		catch (NoClassDefFoundError notFatal) {
31 		}
32 		return false;
33 	}
34 
classFromFile(String classFileName)35 	Class classFromFile(String classFileName) throws ClassNotFoundException {
36 		String className= classNameFromFile(classFileName);
37 		if (!fLoader.isExcluded(className))
38 			return fLoader.loadClass(className, false);
39 		return null;
40 	}
41 
isTestClass(Class testClass)42 	boolean isTestClass(Class testClass) {
43 		if (hasSuiteMethod(testClass))
44 			return true;
45 		if (Test.class.isAssignableFrom(testClass) &&
46 			Modifier.isPublic(testClass.getModifiers()) &&
47 			hasPublicConstructor(testClass))
48 			return true;
49 		return false;
50 	}
51 
hasSuiteMethod(Class testClass)52 	boolean hasSuiteMethod(Class testClass) {
53 		try {
54 			testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]);
55 	 	} catch(Exception e) {
56 	 		return false;
57 		}
58 		return true;
59 	}
60 
hasPublicConstructor(Class testClass)61 	boolean hasPublicConstructor(Class testClass) {
62 		try {
63 			TestSuite.getTestConstructor(testClass);
64 		} catch(NoSuchMethodException e) {
65 			return false;
66 		}
67 		return true;
68 	}
69 }
70