• 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