19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage junit.runner;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.*;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.*;
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An implementation of a TestCollector that consults the
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class path. It considers all classes on the class path
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * excluding classes in JARs. It leaves it up to subclasses
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to decide whether a class is a runnable Test.
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see TestCollector
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} - Not needed for 1.0 SDK
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class ClassPathTestCollector implements TestCollector {
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    static final int SUFFIX_LENGTH= ".class".length();
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    public ClassPathTestCollector() {
20f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
21f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
22f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    public Enumeration collectTests() {
23f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        String classPath= System.getProperty("java.class.path");
24f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        Hashtable result = collectFilesInPath(classPath);
25f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return result.elements();
26f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
27f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
28f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    public Hashtable collectFilesInPath(String classPath) {
29f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        Hashtable result= collectFilesInRoots(splitClassPath(classPath));
30f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return result;
31f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
32f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
33f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    Hashtable collectFilesInRoots(Vector roots) {
34f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        Hashtable result= new Hashtable(100);
35f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        Enumeration e= roots.elements();
36f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        while (e.hasMoreElements())
37f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            gatherFiles(new File((String)e.nextElement()), "", result);
38f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return result;
39f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
40f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
41f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    void gatherFiles(File classRoot, String classFileName, Hashtable result) {
42f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        File thisRoot= new File(classRoot, classFileName);
43f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        if (thisRoot.isFile()) {
44f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            if (isTestClass(classFileName)) {
45f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                String className= classNameFromFile(classFileName);
46f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                result.put(className, className);
47f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            }
48f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            return;
49f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        }
50f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        String[] contents= thisRoot.list();
51f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        if (contents != null) {
52f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            for (int i= 0; i < contents.length; i++)
53f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
54f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        }
55f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
56f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
57f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    Vector splitClassPath(String classPath) {
58f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        Vector result= new Vector();
59f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        String separator= System.getProperty("path.separator");
60f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
61f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        while (tokenizer.hasMoreTokens())
62f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            result.addElement(tokenizer.nextToken());
63f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return result;
64f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
65f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
66f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    protected boolean isTestClass(String classFileName) {
67f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return
68f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                classFileName.endsWith(".class") &&
69f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                classFileName.indexOf('$') < 0 &&
70f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot                classFileName.indexOf("Test") > 0;
71f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
72f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot
73f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    protected String classNameFromFile(String classFileName) {
74f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        // convert /a/b.class to a.b
75f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
76f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        String s2= s.replace(File.separatorChar, '.');
77f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        if (s2.startsWith("."))
78f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot            return s2.substring(1);
79f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot        return s2;
80f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
82