LUtils.java revision 10967:e336cbd8b15e
138032Speter/* 238032Speter * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 338032Speter * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 438032Speter * 538032Speter * This code is free software; you can redistribute it and/or modify it 638032Speter * under the terms of the GNU General Public License version 2 only, as 738032Speter * published by the Free Software Foundation. 838032Speter * 938032Speter * This code is distributed in the hope that it will be useful, but WITHOUT 1038032Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1138032Speter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1238032Speter * version 2 for more details (a copy is included in the LICENSE file that 1338032Speter * accompanied this code). 1438032Speter * 1538032Speter * You should have received a copy of the GNU General Public License version 1638032Speter * 2 along with this work; if not, write to the Free Software Foundation, 1738032Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1838032Speter * 1938032Speter * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2038032Speter * or visit www.oracle.com if you need additional information or have any 2138032Speter * questions. 2238032Speter */ 2338032Speter 2438032Speterimport java.io.BufferedReader; 2538032Speterimport java.io.File; 2638032Speterimport java.io.IOException; 2738032Speterimport java.io.InputStreamReader; 2838032Speterimport java.io.PrintWriter; 2938032Speterimport java.io.StringWriter; 3038032Speterimport java.nio.charset.Charset; 3138032Speterimport java.nio.file.Files; 3238032Speterimport java.util.ArrayList; 3338032Speterimport java.util.List; 3438032Speterimport java.util.Map; 3538032Speter 3638032Speter/* 3738032Speter * support infrastructure to invoke a java class from the command line 3838032Speter */ 3938032Speterclass LUtils { 4038032Speter static final com.sun.tools.javac.Main javac = 4138032Speter new com.sun.tools.javac.Main(); 4238032Speter static final File cwd = new File(".").getAbsoluteFile(); 4338032Speter static final String JAVAHOME = System.getProperty("java.home"); 4438032Speter static final boolean isWindows = 4538032Speter System.getProperty("os.name", "unknown").startsWith("Windows"); 4638032Speter static final File JAVA_BIN_FILE = new File(JAVAHOME, "bin"); 4738032Speter static final File JAVA_CMD = new File(JAVA_BIN_FILE, 4838032Speter isWindows ? "java.exe" : "java"); 4938032Speter static final File JAR_BIN_FILE = new File(JAVAHOME, "bin"); 5038032Speter static final File JAR_CMD = new File(JAR_BIN_FILE, 5138032Speter isWindows ? "jar.exe" : "jar"); 5238032Speter 5338032Speter protected LUtils() { 5438032Speter } 5538032Speter 5638032Speter public static void compile(String... args) { 5738032Speter if (javac.compile(args) != 0) { 5838032Speter throw new RuntimeException("compilation fails"); 5938032Speter } 6038032Speter } 6138032Speter 6238032Speter static void createFile(File outFile, List<String> content) { 6338032Speter try { 6438032Speter Files.write(outFile.getAbsoluteFile().toPath(), content, 6538032Speter Charset.defaultCharset()); 6638032Speter } catch (IOException ex) { 6738032Speter throw new RuntimeException(ex); 6838032Speter } 6938032Speter } 7038032Speter 7138032Speter static File getClassFile(File javaFile) { 7238032Speter return javaFile.getName().endsWith(".java") 7338032Speter ? new File(javaFile.getName().replace(".java", ".class")) 7438032Speter : null; 7538032Speter } 7638032Speter 7738032Speter static String getSimpleName(File inFile) { 7838032Speter String fname = inFile.getName(); 7938032Speter return fname.substring(0, fname.indexOf(".")); 8038032Speter } 8138032Speter 8238032Speter static TestResult doExec(String... cmds) { 8338032Speter return doExec(null, null, cmds); 8438032Speter } 8538032Speter 8638032Speter /* 8738032Speter * A method which executes a java cmd and returns the results in a container 8838032Speter */ 8938032Speter static TestResult doExec(Map<String, String> envToSet, 9038032Speter java.util.Set<String> envToRemove, String... cmds) { 9138032Speter String cmdStr = ""; 9238032Speter for (String x : cmds) { 9338032Speter cmdStr = cmdStr.concat(x + " "); 9438032Speter } 9538032Speter ProcessBuilder pb = new ProcessBuilder(cmds); 9638032Speter Map<String, String> env = pb.environment(); 9738032Speter if (envToRemove != null) { 9838032Speter for (String key : envToRemove) { 9938032Speter env.remove(key); 10038032Speter } 10138032Speter } 10238032Speter if (envToSet != null) { 10338032Speter env.putAll(envToSet); 10438032Speter } 10538032Speter BufferedReader rdr = null; 10638032Speter try { 10738032Speter List<String> outputList = new ArrayList<>(); 10838032Speter pb.redirectErrorStream(true); 10938032Speter Process p = pb.start(); 11038032Speter rdr = new BufferedReader(new InputStreamReader(p.getInputStream())); 11138032Speter String in = rdr.readLine(); 11238032Speter while (in != null) { 11338032Speter outputList.add(in); 11438032Speter in = rdr.readLine(); 11538032Speter } 11638032Speter p.waitFor(); 11738032Speter p.destroy(); 11838032Speter 11938032Speter return new TestResult(cmdStr, p.exitValue(), outputList, 12038032Speter env, new Throwable("current stack of the test")); 12138032Speter } catch (Exception ex) { 12238032Speter ex.printStackTrace(); 12338032Speter throw new RuntimeException(ex.getMessage()); 12438032Speter } 12538032Speter } 12638032Speter 12738032Speter static class TestResult { 12838032Speter String cmd; 12938032Speter int exitValue; 13038032Speter List<String> testOutput; 13138032Speter Map<String, String> env; 13238032Speter Throwable t; 13338032Speter 13438032Speter public TestResult(String str, int rv, List<String> oList, 13538032Speter Map<String, String> env, Throwable t) { 13638032Speter cmd = str; 13738032Speter exitValue = rv; 13838032Speter testOutput = oList; 13938032Speter this.env = env; 14038032Speter this.t = t; 14138032Speter } 14238032Speter 14338032Speter void assertZero(String message) { 14438032Speter if (exitValue != 0) { 14538032Speter System.err.println(this); 14638032Speter throw new RuntimeException(message); 14738032Speter } 14838032Speter } 14938032Speter 15038032Speter @Override 15138032Speter public String toString() { 15238032Speter StringWriter sw = new StringWriter(); 15338032Speter PrintWriter status = new PrintWriter(sw); 15438032Speter status.println("Cmd: " + cmd); 15538032Speter status.println("Return code: " + exitValue); 15638032Speter status.println("Environment variable:"); 15738032Speter for (String x : env.keySet()) { 15838032Speter status.println("\t" + x + "=" + env.get(x)); 15938032Speter } 16038032Speter status.println("Output:"); 16138032Speter for (String x : testOutput) { 16238032Speter status.println("\t" + x); 16338032Speter } 16438032Speter status.println("Exception:"); 16538032Speter status.println(t.getMessage()); 16638032Speter t.printStackTrace(status); 16738032Speter 16838032Speter return sw.getBuffer().toString(); 16938032Speter } 17038032Speter } 17138032Speter} 17238032Speter