package qat.parser.junitparser;
// JDK imports
import java.io.*;
import java.util.*;
import java.net.*;
import java.lang.reflect.*;
// junit imports
import junit.framework.TestCase;
import junit.framework.TestSuite;
// qat imports
import qat.parser.TestFinderInterface;
import qat.parser.ParserInterface;
public class JUnitTestFinder extends Object implements TestFinderInterface {
/**
* This is the file extension this TestFinder uses to determine whether a file will be
* treated as a test or not.
*/
private static final String TEST_FILE_SUFFIX = ".class";
private String rootDirectory;
private FileClassLoader classLoader;
private Properties properties;
public JUnitTestFinder() {
}
/**
* This method sets any default properties which will be required
* for parsing this file.
*/
public void setProperties(java.util.Properties p) {
this.properties = p;
}
/**
* This method returns all the properties obtained by parsing this test file.
*/
public java.util.Properties getProperties() {
return properties;
}
public String getProperty(String name) {
return properties.getProperty(name);
}
public String getProperty(String name, String defaultValue) {
return properties.getProperty(name,defaultValue);
}
public void setProjectRoot(String rootDirectory) {
this.rootDirectory = rootDirectory;
try {
classLoader = new FileClassLoader(getClass().getClassLoader(),
rootDirectory+File.pathSeparator+getProperty("junit.classpath"));
}
catch (Throwable t) {
t.printStackTrace();
}
}
/**
* Return true if this file is a JUnit file.
*/
public boolean isTestFile(File file) {
if ((file.getName().toLowerCase().endsWith(TEST_FILE_SUFFIX))&&
(!isExcludePath(file))) {
try {
String className = convertPathToClassName(file.getCanonicalPath(),rootDirectory);
//System.out.println("Trying too load "+className+" from root "+rootDirectory);
Class possibleTest = classLoader.loadClass(className);
//System.out.println("possibleTest="+possibleTest);
if (TestCase.class.isAssignableFrom(possibleTest)) {
if (!Modifier.isAbstract(possibleTest.getModifiers())) {
TestSuite suite = new TestSuite(possibleTest);
return suite.countTestCases()>0;
}
}
else {
return false;
}
}
catch (Throwable t) {
// not a test file - ignore it
t.printStackTrace();
}
}
return false;
}
public static String convertPathToClassName(String pathToFile, String rootDirectory) {
try {
String className;
// remove the suffix
className = pathToFile.substring(0,pathToFile.lastIndexOf(TEST_FILE_SUFFIX));
// remove the root path info
className = className.substring(className.indexOf(rootDirectory)+rootDirectory.length()+1,
className.length());
// convert to package name
className = className.replace('\\','.');
className = className.replace('/','.');
return className;
}
catch (Throwable t) {
//t.printStackTrace();
return t.toString();
}
}
private boolean isExcludePath(File file) {
String path = file.getPath();
return ((path.indexOf("SCCS")>=0)|
(path.indexOf("deleted_files")>=0));
}
/**
* Return a parser for the specified file type, or null
* if it's not one we recognise.
*/
public ParserInterface getParser(File file) {
if (isTestFile(file)) {
JUnitParser parser = new qat.parser.junitparser.JUnitParser();
parser.setProjectRoot(rootDirectory);
return parser;
}
return null;
}
}