1 /* 2 * Copyright (c) 2013, 2018, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.jfr.startupargs; 27 28 import java.io.IOException; 29 import java.nio.file.DirectoryStream; 30 import java.nio.file.Files; 31 import java.nio.file.Path; 32 import java.nio.file.Paths; 33 import java.util.Iterator; 34 import java.util.function.Supplier; 35 36 import jdk.jfr.consumer.RecordingFile; 37 import jdk.test.lib.Asserts; 38 import jdk.test.lib.process.OutputAnalyzer; 39 import jdk.test.lib.process.ProcessTools; 40 41 /** 42 * @test 43 * @summary Start a FlightRecording with dumponexit. Verify dump exists. 44 * @key jfr 45 * @requires vm.hasJFR 46 * @library /test/lib 47 * @run main/othervm jdk.jfr.startupargs.TestDumpOnExit 48 */ 49 public class TestDumpOnExit { 50 51 public static void main(String[] args) throws Exception { 52 Path dumpPath = Paths.get(".", "dumped.jfr"); 53 54 // Test without security manager and a file name relative to current directory 55 testDumponExit(() -> dumpPath, 56 "-Xlog:jfr=trace", 57 "-XX:StartFlightRecording=filename=./dumped.jfr,dumponexit=true,settings=profile", 58 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 59 ); 60 // Test a memory recording without a security manager 61 testDumponExit(() -> findJFRFileInCurrentDirectory(), 62 "-Xlog:jfr=trace", 63 "-XX:StartFlightRecording=dumponexit=true,disk=false", 64 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 65 ); 66 67 // Test with security manager and a file name relative to current directory 68 testDumponExit(() -> dumpPath, 69 "-Xlog:jfr=trace", 70 "-XX:StartFlightRecording=filename=./dumped.jfr,dumponexit=true,settings=profile", 71 "-Djava.security.manager", 72 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 73 ); 74 // Test with security manager but without a name 75 testDumponExit(() -> findJFRFileInCurrentDirectory(), 76 "-Xlog:jfr=trace", 77 "-XX:StartFlightRecording=dumponexit=true,settings=profile", 78 "-Djava.security.manager", 79 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 80 ); 81 } 82 83 private static Path findJFRFileInCurrentDirectory() { 84 try { 85 DirectoryStream<Path> ds = Files.newDirectoryStream(Paths.get("."), "*pid-*.jfr"); 86 Iterator<Path> pathIterator = ds.iterator(); 87 if (!pathIterator.hasNext()) { 88 throw new RuntimeException("Could not find jfr file in current directory"); 89 } 90 return pathIterator.next(); 91 } catch (IOException e) { 92 throw new RuntimeException("Could not list jfr file in current directory"); 93 } 94 } 95 96 private static void testDumponExit(Supplier<Path> p,String... args) throws Exception, IOException { 97 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, args); 98 OutputAnalyzer output = ProcessTools.executeProcess(pb); 99 System.out.println(output.getOutput()); 100 output.shouldHaveExitValue(0); 101 Path dump = p.get(); 102 Asserts.assertTrue(Files.isRegularFile(dump), "No recording dumped " + dump); 103 System.out.println("Dumped recording size=" + Files.size(dump)); 104 Asserts.assertFalse(RecordingFile.readAllEvents(dump).isEmpty(), "No events in dump"); 105 } 106 107 @SuppressWarnings("unused") 108 private static class TestMain { 109 public static void main(String[] args) throws Exception { 110 System.out.println("Hello from test main"); 111 } 112 } 113 114 }