package jayhorn.test; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.lang.ProcessBuilder.Redirect; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import com.google.common.io.Files; public final class Util { private static final String USER_DIR = System.getProperty("user.dir") + "/"; private static final String TEST_ROOT = USER_DIR + "src/test/resources/"; private Util(){ throw new Error("Utility class"); } public static String testDirectoryPath(String name){ return TEST_ROOT + name + "/"; } public static File testDirectory(String name){ return new File(testDirectoryPath(name)); } @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "DM_DEFAULT_ENCODING") public static String fileToString(File f) { StringBuffer sb = new StringBuffer(); try (FileReader fileRead = new FileReader(f); BufferedReader reader = new BufferedReader(fileRead);) { String line; while (true) { line = reader.readLine(); if (line == null) break; sb.append(line); sb.append("\n"); } } catch (Throwable e) { } return sb.toString(); } @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "DM_DEFAULT_ENCODING") public static boolean compareFiles(File out, File gold) { try (FileReader fR1 = new FileReader(out); FileReader fR2 = new FileReader(gold); BufferedReader reader1 = new BufferedReader(fR1); BufferedReader reader2 = new BufferedReader(fR2);) { String line1, line2; while (true) // Continue while there are equal lines { line1 = reader1.readLine(); line2 = reader2.readLine(); // End of file 1 if (line1 == null) { // Equal only if file 2 also ended return (line2 == null ? true : false); } // Different lines, or end of file 2 if (!line1.equalsIgnoreCase(line2)) { return false; } } } catch (IOException e) { e.printStackTrace(); } return false; } /** * Compiles a sourceFile into a temp folder and returns this folder or null * if compilation fails. * * @param sourceFile the source file to compile * @return the folder that contains the class file(s) or null if compilation * fails. * @throws IOException */ public static File compileJavaFile(File sourceFile) throws IOException { final File tempDir = getTempDir(); final String javac_command = String.format("javac -cp %s -g %s -d %s", sourceFile.getParent(), sourceFile.getAbsolutePath(), tempDir.getAbsolutePath()); ProcessBuilder pb = new ProcessBuilder(javac_command.split(" ")); pb.redirectOutput(Redirect.INHERIT); pb.redirectError(Redirect.INHERIT); Process p = pb.start(); try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); return null; } return tempDir; } /** * Compiles a set of sourceFiles into a temp folder and returns this folder * or null if compilation fails. * * @param sourceFiles an array of files to compile * @return the folder that contains the class file(s) or null if compilation * fails. * @throws IOException */ public static File compileJavaFiles(File[] sourceFiles) throws IOException { final File tempDir = getTempDir(); StringBuilder sb = new StringBuilder(); for (File f : sourceFiles) { sb.append(f.getAbsolutePath()); sb.append(" "); } final String javac_command = String.format("javac -g -d %s %s", tempDir.getAbsolutePath(), sb.toString()); System.out.println(javac_command); ProcessBuilder pb = new ProcessBuilder(javac_command.split(" ")); pb.redirectOutput(Redirect.INHERIT); pb.redirectError(Redirect.INHERIT); Process p = pb.start(); try { p.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); return null; } return tempDir; } public static File getTempDir() throws IOException { final File tempDir = File.createTempFile("bixie_test_temp", Long.toString(System.nanoTime())); if (!(tempDir.delete())) { throw new IOException("Could not delete temp file: " + tempDir.getAbsolutePath()); } if (!(tempDir.mkdir())) { throw new IOException("Could not create temp directory: " + tempDir.getAbsolutePath()); } return tempDir; } public static List<Object[]> getData(File testDirectory){ final Path start = Paths.get(testDirectory.toString()); final List<Object[]> data = new CopyOnWriteArrayList<>(); try { java.nio.file.Files.walkFileTree(start, new SimpleFileVisitor<Path>(){ @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { data.add(new Object[] {file.toFile(), file.toFile().getName()}); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { // ignores malformed files } return data; } public static Class<?> loadClass(File classDir) throws Throwable { final StringBuilder classNameBuilder = new StringBuilder(); File dir = classDir; while (dir.isDirectory()) { final File[] files = (dir.listFiles() == null ? new File[0] : dir.listFiles() ); if (files != null && files.length > 0) { dir = files[0]; classNameBuilder.append(Util.getNameWithoutExtension(dir.getAbsolutePath())); if (dir.isFile() && "class".equals(Util.getFileExtension(dir.getAbsolutePath()))) { break; } else { classNameBuilder.append("."); } } } final String className = classNameBuilder.toString(); try (URLClassLoader classLoader = createClassLoader(classDir)) { return classLoader.loadClass(className); } catch (Throwable e) { e.printStackTrace(System.err); throw e; } } private static URLClassLoader createClassLoader(final File classDir) { return AccessController.<URLClassLoader>doPrivileged(new PrivilegedAction<URLClassLoader>() { @Override public URLClassLoader run() { try { return new URLClassLoader(new URL[] { classDir.toURI().toURL() }); } catch (MalformedURLException mue){ throw new RuntimeException("malformed URL"); } } }); } public static String getNameWithoutExtension(String fullpath){ return Files.getNameWithoutExtension(fullpath); } public static String getFileExtension(String fullpath){ return Files.getFileExtension(fullpath); } }