blob: f48ddee6855fda7ba5382b2f509c886052006ffa [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001package junit.runner;
2
3import java.util.*;
4import java.io.*;
5
6/**
7 * An implementation of a TestCollector that consults the
8 * class path. It considers all classes on the class path
9 * excluding classes in JARs. It leaves it up to subclasses
10 * to decide whether a class is a runnable Test.
11 *
12 * @see TestCollector
13 * {@hide} - Not needed for 1.0 SDK
14 */
15public abstract class ClassPathTestCollector implements TestCollector {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080016
Brett Chabotf1253cd2012-01-30 11:29:54 -080017 static final int SUFFIX_LENGTH= ".class".length();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Brett Chabotf1253cd2012-01-30 11:29:54 -080019 public ClassPathTestCollector() {
20 }
21
22 public Enumeration collectTests() {
23 String classPath= System.getProperty("java.class.path");
24 Hashtable result = collectFilesInPath(classPath);
25 return result.elements();
26 }
27
28 public Hashtable collectFilesInPath(String classPath) {
29 Hashtable result= collectFilesInRoots(splitClassPath(classPath));
30 return result;
31 }
32
33 Hashtable collectFilesInRoots(Vector roots) {
34 Hashtable result= new Hashtable(100);
35 Enumeration e= roots.elements();
36 while (e.hasMoreElements())
37 gatherFiles(new File((String)e.nextElement()), "", result);
38 return result;
39 }
40
41 void gatherFiles(File classRoot, String classFileName, Hashtable result) {
42 File thisRoot= new File(classRoot, classFileName);
43 if (thisRoot.isFile()) {
44 if (isTestClass(classFileName)) {
45 String className= classNameFromFile(classFileName);
46 result.put(className, className);
47 }
48 return;
49 }
50 String[] contents= thisRoot.list();
51 if (contents != null) {
52 for (int i= 0; i < contents.length; i++)
53 gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
54 }
55 }
56
57 Vector splitClassPath(String classPath) {
58 Vector result= new Vector();
59 String separator= System.getProperty("path.separator");
60 StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
61 while (tokenizer.hasMoreTokens())
62 result.addElement(tokenizer.nextToken());
63 return result;
64 }
65
66 protected boolean isTestClass(String classFileName) {
67 return
68 classFileName.endsWith(".class") &&
69 classFileName.indexOf('$') < 0 &&
70 classFileName.indexOf("Test") > 0;
71 }
72
73 protected String classNameFromFile(String classFileName) {
74 // convert /a/b.class to a.b
75 String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
76 String s2= s.replace(File.separatorChar, '.');
77 if (s2.startsWith("."))
78 return s2.substring(1);
79 return s2;
80 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081}