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.Platform; 41 import jdk.test.lib.JDKToolFinder; 42 import jdk.test.lib.process.OutputAnalyzer; 43 import jdk.test.lib.process.ProcessTools; 44 45 public abstract class CtwTest { 46 private static final String LOG_FILE = "ctw.log"; 47 private static final String[] CTW_COMMAND = { 48 "-Xbootclasspath/a:.", 49 "-XX:+UnlockDiagnosticVMOptions", 50 "-XX:+WhiteBoxAPI", 51 "-Dsun.hotspot.tools.ctw.logfile=" + LOG_FILE, 52 "--add-exports", "java.base/jdk.internal.access=ALL-UNNAMED", 53 "--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED", 54 "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", 55 "--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", 56 sun.hotspot.tools.ctw.CompileTheWorld.class.getName(), 57 }; 58 protected final String[] shouldContain; 59 protected CtwTest(String[] shouldContain) { 60 this.shouldContain = shouldContain; 61 } 62 63 public void run(String[] args) throws Exception { 64 if (args.length == 0) { 65 throw new Error("args is empty"); 66 } 67 switch (args[0]) { 68 case "prepare": 69 prepare(); 70 break; 71 case "check": 72 check(); 73 break; 74 case "compile": 75 compile(args); 76 break; 77 default: 78 throw new Error("unregonized action -- " + args[0]); 79 } 80 } 81 82 protected void prepare() throws Exception { } 83 84 protected void check() throws Exception { 85 try (BufferedReader r = Files.newBufferedReader(Paths.get(LOG_FILE), 86 Charset.defaultCharset())) { 87 OutputAnalyzer output = readOutput(r); 88 for (String test : shouldContain) { 89 output.shouldContain(test); 90 } 91 } 92 } 93 94 protected void compile(String[] args) throws Exception { 95 // concat CTW_COMMAND and args w/o 0th element 96 String[] cmd = Arrays.copyOf(CTW_COMMAND, CTW_COMMAND.length + args.length - 1); 97 System.arraycopy(args, 1, cmd, CTW_COMMAND.length, args.length - 1); 98 if (Platform.isWindows()) { 99 // '*' has to be escaped on windows 100 for (int i = 0; i < cmd.length; ++i) { 101 cmd[i] = cmd[i].replace("*", "\"*\""); 102 } 103 } 104 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmd); 105 OutputAnalyzer output = new OutputAnalyzer(pb.start()); 106 dump(output, "compile"); 107 output.shouldHaveExitValue(0); 108 } 109 110 private static OutputAnalyzer readOutput(BufferedReader reader) 111 throws IOException { 112 StringBuilder builder = new StringBuilder(); 113 String eol = String.format("%n"); 114 String line; 115 116 while ((line = reader.readLine()) != null) { 117 builder.append(line); 118 builder.append(eol); 119 } 120 return new OutputAnalyzer(builder.toString(), ""); 121 } 122 123 protected void dump(OutputAnalyzer output, String name) { 124 try (Writer w = new FileWriter(name + ".out")) { 125 String s = output.getStdout(); 126 w.write(s, s.length(), 0); 127 } catch (IOException io) { 128 io.printStackTrace(); 129 } 130 try (Writer w = new FileWriter(name + ".err")) { 131 String s = output.getStderr(); 132 w.write(s, s.length(), 0); 133 } catch (IOException io) { 134 io.printStackTrace(); 135 } 136 } 137 138 protected ProcessBuilder createJarProcessBuilder(String... command) 139 throws Exception { 140 String javapath = JDKToolFinder.getJDKTool("jar"); 141 142 ArrayList<String> args = new ArrayList<>(); 143 args.add(javapath); 144 Collections.addAll(args, command); 145 146 return new ProcessBuilder(args.toArray(new String[args.size()])); 147 } 148 }