test/jdk/jdk/jfr/cmd/TestSplit.java
changeset 50113 caf115bb98ad
child 51214 67736b4846a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/jfr/cmd/TestSplit.java	Tue May 15 20:24:34 2018 +0200
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jfr.cmd;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import jdk.jfr.Configuration;
+import jdk.jfr.Recording;
+import jdk.jfr.consumer.RecordingFile;
+import jdk.test.lib.process.OutputAnalyzer;
+
+/*
+ * @test
+ * @summary Test jfr split
+ * @key jfr
+ * @library /test/lib /test/jdk
+ * @run main/othervm jdk.jfr.cmd.TestSplit
+ */
+public class TestSplit {
+
+    public static void main(String[] args) throws Exception {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
+        String dateText = formatter.format(new Date());
+
+        Path recordingFileA = Paths.get("many-chunks-A-" + dateText + ".jfr");
+        Path recordingFileB = Paths.get("many-chunks-B-" + dateText + ".jfr");
+        makeRecordingWithChunks(6, recordingFileA);
+        Files.copy(recordingFileA, recordingFileB);
+
+        String fileAText = recordingFileA.toAbsolutePath().toString();
+        String fileBText = recordingFileB.toAbsolutePath().toString();
+
+        OutputAnalyzer output = ExecuteHelper.run("split");
+        output.shouldContain("Missing file");
+
+        output = ExecuteHelper.run("split", "--wrongOption1", "..wrongOption2", "..wrongOption3", fileAText);
+        output.shouldContain("Too many arguments");
+
+        output = ExecuteHelper.run("split", "--wrongOption", fileAText);
+        output.shouldContain("Unknown option");
+
+        output = ExecuteHelper.run("split", "--wrongOption", "1", fileAText);
+        output.shouldContain("Unknown option");
+
+        output = ExecuteHelper.run("split", "--maxchunks", "-3", fileAText);
+        output.shouldContain("Must be at least one chunk per file");
+
+        output = ExecuteHelper.run("split", "--maxchunks", "1000", fileAText);
+        output.shouldContain("Number of chunks in recording");
+        output.shouldContain("doesn't exceed max chunks");
+        output = ExecuteHelper.run("split", fileAText); // maxchunks is 5 by
+                                                        // default
+        System.out.println(output.getOutput());
+        System.out.println(fileAText);
+        verifyRecording(fileAText.substring(0, fileAText.length() - 4) + "_1.jfr");
+        verifyRecording(fileAText.substring(0, fileAText.length() - 4) + "_2.jfr");
+
+        output = ExecuteHelper.run("split", "--maxchunks", "2", fileBText);
+
+        verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_1.jfr");
+        verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_2.jfr");
+        verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_3.jfr");
+
+        output = ExecuteHelper.run("split", "--maxchunks", "2", fileBText);
+        output.shouldContain("file with that name already exist");
+    }
+
+    private static void verifyRecording(String name) throws IOException {
+        System.out.println("split name " + name);
+        try (RecordingFile rf = new RecordingFile(Paths.get(name))) {
+            rf.readEvent();
+        }
+    }
+
+    // Will create at least 2 * count + 1 chunks.
+    private static void makeRecordingWithChunks(int count, Path file) throws IOException, ParseException {
+        Recording main = new Recording(Configuration.getConfiguration("default"));
+        main.setToDisk(true);
+        main.start();
+        for (int i = 0; i < count; i++) {
+            Recording r = new Recording();
+            r.setToDisk(true);
+            r.start();
+            r.stop();
+            r.close();
+        }
+        main.stop();
+        main.dump(file);
+        main.close();
+    }
+}