1 /* 2 * Copyright (c) 2013, 2019, 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.testlibrary.Asserts; 38 import jdk.testlibrary.OutputAnalyzer; 39 import jdk.testlibrary.ProcessTools; 40 import jdk.testlibrary.jfr.StartupHelper; 41 42 /* 43 * @test 44 * @summary Start a FlightRecording with dumponexit. Verify dump exists. 45 * @key jfr 46 * @library /lib/testlibrary 47 * @run main/othervm jdk.jfr.startupargs.TestDumpOnExit 48 */ 49 public class TestDumpOnExit { 50 51 public static void main(String[] args) throws Throwable { 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 with security manager and a file name relative to current directory 61 testDumponExit(() -> dumpPath, 62 // "-Xlog:jfr=trace", 63 "-XX:StartFlightRecording=filename=./dumped.jfr,dumponexit=true,settings=profile", 64 "-Djava.security.manager", 65 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 66 ); 67 // Test with security manager but without a name 68 testDumponExit(() -> findJFRFileInCurrentDirectory(), 69 // "-Xlog:jfr=trace", 70 "-XX:StartFlightRecording=dumponexit=true,settings=profile", 71 "-Djava.security.manager", 72 "jdk.jfr.startupargs.TestDumpOnExit$TestMain" 73 ); 74 } 75 76 private static Path findJFRFileInCurrentDirectory() { 77 try { 78 DirectoryStream<Path> ds = Files.newDirectoryStream(Paths.get("."), "*pid-*.jfr"); 79 Iterator<Path> pathIterator = ds.iterator(); 80 if (!pathIterator.hasNext()) { 81 throw new RuntimeException("Could not find jfr file in current directory"); 82 } 83 return pathIterator.next(); 84 } catch (IOException e) { 85 throw new RuntimeException("Could not list jfr file in current directory"); 86 } 87 } 88 89 private static void testDumponExit(Supplier<Path> p,String... args) throws Throwable { 90 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, args); 91 OutputAnalyzer output = ProcessTools.executeProcess(pb); 92 System.out.println(output.getOutput()); 93 output.shouldHaveExitValue(0); 94 Path dump = p.get(); 95 Asserts.assertTrue(Files.isRegularFile(dump), "No recording dumped " + dump); 96 System.out.println("Dumped recording size=" + Files.size(dump)); 97 Asserts.assertFalse(RecordingFile.readAllEvents(dump).isEmpty(), "No events in dump"); 98 } 99 100 @SuppressWarnings("unused") 101 private static class TestMain { 102 public static void main(String[] args) throws Exception { 103 System.out.println("Hello from test main"); 104 } 105 } 106 107 }