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
17 public LoadingTestCollector() {
18 fLoader= new TestCaseClassLoader();
19 }
20
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
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
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
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
61 boolean hasPublicConstructor(Class testClass) {
62 try {
63 TestSuite.getTestConstructor(testClass);
64 } catch(NoSuchMethodException e) {
65 return false;
66 }
67 return true;
68 }
69 }