1 /* 2 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import java.util.Arrays; 25 import java.util.List; 26 import java.util.Collections; 27 import java.util.ArrayList; 28 29 import java.io.File; 30 import java.io.Writer; 31 import java.io.FileWriter; 32 import java.io.IOException; 33 import java.io.BufferedReader; 34 35 import java.nio.file.Files; 36 import java.nio.file.Paths; 37 import java.nio.file.StandardCopyOption; 38 import java.nio.charset.Charset; 39 40 import jdk.test.lib.JDKToolFinder; 41 import jdk.test.lib.process.OutputAnalyzer; 42 import jdk.test.lib.process.ProcessTools; 43 44 public abstract class CtwTest { 45 private static final String LOG_FILE = "ctw.log"; 46 private static final String[] CTW_COMMAND = { 47 "-Xbootclasspath/a:.", 48 "-XX:+UnlockDiagnosticVMOptions", 49 "-XX:+WhiteBoxAPI", 50 "-Dsun.hotspot.tools.ctw.logfile=" + LOG_FILE, 51 "--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED", 52 "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 53 "--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", 54 sun.hotspot.tools.ctw.CompileTheWorld.class.getName(), 55 }; 56 protected final String[] shouldContain; 57 protected CtwTest(String[] shouldContain) { 58 this.shouldContain = shouldContain; 59 } 60 61 public void run(String[] args) throws Exception { 62 if (args.length == 0) { 63 throw new Error("args is empty"); 64 } 65 switch (args[0]) { 66 case "prepare": 67 prepare(); 68 break; 69 case "check": 70 check(); 71 break; 72 case "compile": 73 compile(args); 74 break; 75 default: 76 throw new Error("unregonized action -- " + args[0]); 77 } 78 } 79 80 protected void prepare() throws Exception { } 81 82 protected void check() throws Exception { 83 try (BufferedReader r = Files.newBufferedReader(Paths.get(LOG_FILE), 84 Charset.defaultCharset())) { 85 OutputAnalyzer output = readOutput(r); 86 for (String test : shouldContain) { 87 output.shouldContain(test); 88 } 89 } 90 } 91 92 protected void compile(String[] args) throws Exception { 93 // concat CTW_COMMAND and args w/o 0th element 94 String[] cmd = Arrays.copyOf(CTW_COMMAND, CTW_COMMAND.length + args.length - 1); 95 System.arraycopy(args, 1, cmd, CTW_COMMAND.length, args.length - 1); 96 97 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmd); 98 OutputAnalyzer output = new OutputAnalyzer(pb.start()); 99 dump(output, "compile"); 100 output.shouldHaveExitValue(0); 101 } 102 103 private static OutputAnalyzer readOutput(BufferedReader reader) 104 throws IOException { 105 StringBuilder builder = new StringBuilder(); 106 String eol = String.format("%n"); 107 String line; 108 109 while ((line = reader.readLine()) != null) { 110 builder.append(line); 111 builder.append(eol); 112 } 113 return new OutputAnalyzer(builder.toString(), ""); 114 } 115 116 protected void dump(OutputAnalyzer output, String name) { 117 try (Writer w = new FileWriter(name + ".out")) { 118 String s = output.getStdout(); 119 w.write(s, s.length(), 0); 120 } catch (IOException io) { 121 io.printStackTrace(); 122 } 123 try (Writer w = new FileWriter(name + ".err")) { 124 String s = output.getStderr(); 125 w.write(s, s.length(), 0); 126 } catch (IOException io) { 127 io.printStackTrace(); 128 } 129 } 130 131 protected ProcessBuilder createJarProcessBuilder(String... command) 132 throws Exception { 133 String javapath = JDKToolFinder.getJDKTool("jar"); 134 135 ArrayList<String> args = new ArrayList<>(); 136 args.add(javapath); 137 Collections.addAll(args, command); 138 139 return new ProcessBuilder(args.toArray(new String[args.size()])); 140 } 141 }