ClassPathTestCollector.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	static final int SUFFIX_LENGTH= ".class".length();
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	public ClassPathTestCollector() {
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	public Enumeration collectTests() {
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		String classPath= System.getProperty("java.class.path");
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		Hashtable result = collectFilesInPath(classPath);
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return result.elements();
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	public Hashtable collectFilesInPath(String classPath) {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		Hashtable result= collectFilesInRoots(splitClassPath(classPath));
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return result;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	Hashtable collectFilesInRoots(Vector roots) {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		Hashtable result= new Hashtable(100);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		Enumeration e= roots.elements();
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		while (e.hasMoreElements())
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			gatherFiles(new File((String)e.nextElement()), "", result);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return result;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	void gatherFiles(File classRoot, String classFileName, Hashtable result) {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		File thisRoot= new File(classRoot, classFileName);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		if (thisRoot.isFile()) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			if (isTestClass(classFileName)) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				String className= classNameFromFile(classFileName);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				result.put(className, className);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			}
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			return;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		}
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		String[] contents= thisRoot.list();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		if (contents != null) {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			for (int i= 0; i < contents.length; i++)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project				gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		}
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	Vector splitClassPath(String classPath) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		Vector result= new Vector();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		String separator= System.getProperty("path.separator");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		while (tokenizer.hasMoreTokens())
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			result.addElement(tokenizer.nextToken());
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return result;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	protected boolean isTestClass(String classFileName) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			classFileName.endsWith(".class") &&
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			classFileName.indexOf('$') < 0 &&
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			classFileName.indexOf("Test") > 0;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	protected String classNameFromFile(String classFileName) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		// convert /a/b.class to a.b
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		String s2= s.replace(File.separatorChar, '.');
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		if (s2.startsWith("."))
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			return s2.substring(1);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		return s2;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
82