package jadx.samples; import java.io.File; import java.io.FilenameFilter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Timer; import java.util.TimerTask; public class RunTests { public static void main(String[] args) { ClassLoader clsLoader = ClassLoader.getSystemClassLoader(); List<String> clsList = getClasses(clsLoader, "jadx.samples"); if (clsList.isEmpty()) { System.err.println("No tests found"); System.exit(1); } int timeout = 2 * clsList.size(); System.err.println("Set timeout to " + timeout + " seconds"); new Timer().schedule(new TerminateTask(), timeout * 1000); Collections.sort(clsList); int passed = 0; for (String cls : clsList) { if (runTest(cls)) { passed++; } } int failed = clsList.size() - passed; System.err.println("---"); System.err.println("Total " + clsList.size() + ", Passed: " + passed + ", Failed: " + failed); System.exit(failed); } private static boolean runTest(String clsName) { try { boolean pass = false; String msg = null; Throwable exc = null; Class<?> cls = Class.forName(clsName); if (cls.getSuperclass() == AbstractTest.class) { Method mth = cls.getMethod("testRun"); try { AbstractTest test = (AbstractTest) cls.getConstructor().newInstance(); pass = (Boolean) mth.invoke(test); } catch (InvocationTargetException e) { pass = false; exc = e.getCause(); } catch (Throwable e) { pass = false; exc = e; } } else { msg = "not extends AbstractTest"; } System.err.println(">> " + (pass ? "PASS" : "FAIL") + "\t" + clsName + (msg == null ? "" : "\t - " + msg)); if (exc != null) { exc.printStackTrace(); } return pass; } catch (ClassNotFoundException e) { System.err.println("Class '" + clsName + "' not found"); } catch (Exception e) { e.printStackTrace(); } return false; } private static class TerminateTask extends TimerTask { @Override public void run() { System.err.println("Test timed out"); System.exit(1); } } private static class TestFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { return name.startsWith("Test") && name.endsWith(".class") && !name.contains("$"); } } private static List<String> getClasses(ClassLoader clsLoader, String packageName) { List<String> clsList = new ArrayList<String>(); URL resource = clsLoader.getResource(packageName.replace('.', '/')); if (resource != null) { File path = new File(resource.getFile()); if (path.exists() && path.isDirectory()) { System.out.println("Test classes path: " + path.getAbsolutePath()); String[] files = path.list(new TestFilter()); for (String file : files) { String clsName = packageName + '.' + file.replace(".class", ""); clsList.add(clsName); } } } return clsList; } }