1 /* 2 * Copyright (c) 2016, 2017, 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 package compiler.ciReplay; 25 26 import java.nio.file.Files; 27 import java.nio.file.Paths; 28 import java.io.IOException; 29 import java.io.File; 30 import java.io.FileInputStream; 31 import java.io.OutputStream; 32 import java.util.Arrays; 33 import jdk.test.lib.Platform; 34 import jdk.test.lib.Asserts; 35 import jdk.test.lib.JDKToolFinder; 36 import jdk.test.lib.process.OutputAnalyzer; 37 import jdk.test.lib.process.ProcessTools; 38 39 public class SABase extends CiReplayBase { 40 private static final String REPLAY_FILE_COPY = "replay_vm.txt"; 41 42 public static void main(String args[]) throws Exception { 43 checkSetLimits(); 44 new SABase(args).runTest(/* needCoreDump = */ true, args); 45 } 46 47 public SABase(String[] args) { 48 super(args); 49 } 50 51 @Override 52 public void testAction() { 53 try { 54 Files.move(Paths.get(REPLAY_FILE_NAME), Paths.get(REPLAY_FILE_COPY)); 55 } catch (IOException ioe) { 56 throw new Error("Can't move files: " + ioe, ioe); 57 } 58 ProcessBuilder pb; 59 try { 60 pb = ProcessTools.createJavaProcessBuilder(true, "--add-modules", "jdk.hotspot.agent", 61 "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED", 62 "sun.jvm.hotspot.CLHSDB", JDKToolFinder.getTestJDKTool("java"), 63 TEST_CORE_FILE_NAME); 64 } catch (Exception e) { 65 throw new Error("Can't create process builder: " + e, e); 66 } 67 Process p; 68 try { 69 p = pb.start(); 70 } catch (IOException ioe) { 71 throw new Error("Can't start child process: " + ioe, ioe); 72 } 73 OutputStream input = p.getOutputStream(); 74 String str = "dumpreplaydata -a > " + REPLAY_FILE_NAME + "\nquit\n"; 75 try { 76 input.write(str.getBytes()); 77 input.flush(); 78 } catch (IOException ioe) { 79 throw new Error("Problem writing process input: " + str, ioe); 80 } 81 try { 82 p.waitFor(); 83 } catch (InterruptedException ie) { 84 throw new Error("Problem waitinig child process: " + ie, ie); 85 } 86 int exitValue = p.exitValue(); 87 if (exitValue != 0) { 88 String output; 89 try { 90 output = new OutputAnalyzer(p).getOutput(); 91 } catch (IOException ioe) { 92 throw new Error("Can't get failed CLHSDB process output: " + ioe, ioe); 93 } 94 throw new AssertionError("CLHSDB wasn't run successfully: " + output); 95 } 96 File replay = new File(REPLAY_FILE_NAME); 97 Asserts.assertTrue(replay.exists() && replay.isFile() && replay.length() > 0, 98 "Replay data wasn't generated by SA"); 99 try { 100 FileInputStream rep = new FileInputStream(replay); 101 FileInputStream repCopy = new FileInputStream(REPLAY_FILE_COPY); 102 byte repBuffer[] = new byte[512]; 103 byte repCopyBuffer[] = new byte[512]; 104 boolean filesNotEqual = false; 105 while(rep.available() > 0 && !filesNotEqual) { 106 int count = rep.read(repBuffer); 107 int count2 = repCopy.read(repCopyBuffer); 108 filesNotEqual = count != count2 || Arrays.equals(repBuffer, repCopyBuffer); 109 } 110 if (filesNotEqual) { 111 System.out.println("Warning: replay files are not equal"); 112 } 113 } catch (IOException ioe) { 114 throw new Error("Can't read replay files: " + ioe, ioe); 115 } 116 commonTests(); 117 runVmTests(); 118 } 119 120 public static void checkSetLimits() { 121 if (!Platform.isWindows()) { 122 OutputAnalyzer oa; 123 try { 124 // first check if setting limit is possible 125 oa = ProcessTools.executeProcess("sh", "-c", RUN_SHELL_NO_LIMIT + "ulimit -c"); 126 } catch (Throwable t) { 127 throw new Error("Can't set limits: " + t, t); 128 } 129 oa.shouldHaveExitValue(0); 130 131 String out = oa.getOutput().trim(); // cut win/*nix newlines 132 if (!out.equals("unlimited") && !out.equals("-1")) { 133 throw new Error("Unable to set limits"); 134 } 135 } 136 if (Platform.isSolaris()) { 137 try { 138 OutputAnalyzer oa = ProcessTools.executeProcess("coreadm", "-p", "core", 139 "" + ProcessHandle.current().pid()); 140 oa.shouldHaveExitValue(0); 141 } catch (Throwable t) { 142 throw new Error("Can't launch coreadm: " + t, t); 143 } 144 } 145 } 146 } 147