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 
main(String[] args)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 
findJFRFileInCurrentDirectory()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 
testDumponExit(Supplier<Path> p,String... args)96     private static void testDumponExit(Supplier<Path> p,String... args) throws Exception, IOException {
97         ProcessBuilder pb = ProcessTools.createTestJvm(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 {
main(String[] args)109         public static void main(String[] args) throws Exception {
110             System.out.println("Hello from test main");
111         }
112     }
113 
114 }
115