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