import java.io.*;
import java.net.URL;
import java.security.CodeSource;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.reldb.rel.tests.ClassPathHack;
import org.reldb.rel.v0.version.Version;
public class AllTests {
private static final String tests[] = {
"org.reldb.rel.tests.main",
"org.reldb.rel.tests.external",
"org.reldb.rel.tests.inheritance",
"org.reldb.rel.tests.ext_relvar.csv",
"org.reldb.rel.tests.ext_relvar.xls"
};
/**
* Recursive method used to find all classes in a given directory and subdirs.
*
* @param directory The base directory
* @param packageName The package name for classes found inside the base directory
* @return The classes
* @throws ClassNotFoundException
*/
private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
private static List<Class<?>> getClassesFromDirectory(String packageName) throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private static List<Class<?>> getClassesFromJAR(URL jarURL, String packageName) throws ClassNotFoundException, IOException {
List<Class<?>> classes = new ArrayList<Class<?>>();
ZipInputStream jar = new ZipInputStream(jarURL.openStream());
ZipEntry ze = null;
while ((ze = jar.getNextEntry()) != null) {
String entryName = ze.getName().replace('/', '.');
if (entryName.startsWith(packageName) && entryName.endsWith(".class")) {
String className = entryName.substring(0, entryName.length() - 6);
classes.add(Class.forName(className));
}
}
return classes;
}
/**
* Scans all classes accessible from the context class loader which belong to the given package and subpackages.
*
* @param packageName The base package
* @return The classes
* @throws ClassNotFoundException
* @throws IOException
*/
private static List<Class<?>> getClasses(URL jar, String packageName) throws ClassNotFoundException, IOException {
if (jar == null)
return getClassesFromDirectory(packageName);
else
return getClassesFromJAR(jar, packageName);
}
// As above, but get ArrayList of class names.
private static ArrayList<String> getClassNames(URL jar, String packageName) throws ClassNotFoundException, IOException {
List<Class<?>> classes = getClasses(jar, packageName);
ArrayList<String> names = new ArrayList<String>();
for (Class<?> klass: classes)
names.add(klass.getName());
return names;
}
public static void main(String args[]) {
try {
ClassPathHack.addFile("lib/junit.jar");
ClassPathHack.addFile("lib/commons-cli-1.2.jar");
ClassPathHack.addFile("lib/commons-codec-1.10.jar");
ClassPathHack.addFile("lib/commons-collections4-4.1.jar");
ClassPathHack.addFile("lib/commons-lang-2.6.jar");
ClassPathHack.addFile("lib/commons-logging-1.2.jar");
ClassPathHack.addFile("lib/curvesapi-1.04.jar");
ClassPathHack.addFile("lib/ecj-4.6.1.jar");
ClassPathHack.addFile("lib/fluent-hc-4.5.2.jar");
ClassPathHack.addFile("lib/httpclient-4.5.2.jar");
ClassPathHack.addFile("lib/httpclient-cache-4.5.2.jar");
ClassPathHack.addFile("lib/httpclient-win-4.5.2.jar");
ClassPathHack.addFile("lib/httpcore-4.4.4.jar");
ClassPathHack.addFile("lib/httpcore-4.4.5.jar");
ClassPathHack.addFile("lib/httpcore-ab-4.4.5.jar");
ClassPathHack.addFile("lib/httpcore-nio-4.4.5.jar");
ClassPathHack.addFile("lib/httpmime-4.5.2.jar");
ClassPathHack.addFile("lib/jackcess-2.1.6.jar");
ClassPathHack.addFile("lib/jna-4.1.0.jar");
ClassPathHack.addFile("lib/jna-platform-4.1.0.jar");
ClassPathHack.addFile("lib/junit.jar");
ClassPathHack.addFile("lib/log4j-1.2.17.jar");
ClassPathHack.addFile("lib/mariadb-java-client-1.5.6.jar");
ClassPathHack.addFile("lib/ojdbc7.jar");
ClassPathHack.addFile("lib/poi-3.15.jar");
ClassPathHack.addFile("lib/poi-excelant-3.15.jar");
ClassPathHack.addFile("lib/poi-ooxml-3.15.jar");
ClassPathHack.addFile("lib/poi-ooxml-schemas-3.15.jar");
ClassPathHack.addFile("lib/poi-scratchpad-3.15.jar");
ClassPathHack.addFile("lib/postgresql-9.4.1212.jar");
ClassPathHack.addFile("lib/rel0000.jar");
ClassPathHack.addFile("lib/relclient.jar");
ClassPathHack.addFile("lib/relshared.jar");
ClassPathHack.addFile("lib/jtds-1.3.1.jar");
ClassPathHack.addFile("lib/xmlbeans-2.6.0.jar");
ClassPathHack.addFile("lib/" + Version.getBerkeleyDbJarFilename());
} catch (IOException ioe) {
System.out.println(ioe.toString());
return;
}
ArrayList<String> classes = new ArrayList<String>();
try {
CodeSource src = AllTests.class.getProtectionDomain().getCodeSource();
URL jarURL = null;
if (src != null && src.getLocation().toString().toUpperCase().endsWith(".JAR"))
jarURL = src.getLocation();
for (String testMe: tests)
classes.addAll(getClassNames(jarURL, testMe));
} catch (ClassNotFoundException e) {
System.out.println(e.toString());
e.printStackTrace();
} catch (IOException e) {
System.out.println(e.toString());
e.printStackTrace();
}
System.out.println("Rel tests are running. Please wait.");
org.junit.runner.JUnitCore.main(classes.toArray(new String[0]));
}
}