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