8227179: Test for new gc+metaspace=info output format
authortonyp
Fri, 19 Jul 2019 12:39:31 -0400
changeset 55751 014decdb5086
parent 55750 6f60cfd502c3
child 55752 8ae33203d600
8227179: Test for new gc+metaspace=info output format Reviewed-by: tschatzl, kbarrett
test/hotspot/jtreg/gc/metaspace/TestSizeTransitions.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/gc/metaspace/TestSizeTransitions.java	Fri Jul 19 12:39:31 2019 -0400
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, Twitter, Inc.
+ * 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.
+ *
+ * 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 gc.metaspace;
+
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+/* @test TestSizeTransitionsSerial
+ * @key gc
+ * @requires vm.gc.Serial
+ * @summary Tests that the metaspace size transition logging is done correctly.
+ * @library /test/lib
+ * @run driver gc.metaspace.TestSizeTransitions false -XX:+UseSerialGC
+ * @run driver gc.metaspace.TestSizeTransitions true  -XX:+UseSerialGC
+ */
+
+/* @test TestSizeTransitionsParallel
+ * @key gc
+ * @requires vm.gc.Parallel
+ * @summary Tests that the metaspace size transition logging is done correctly.
+ * @library /test/lib
+ * @run driver gc.metaspace.TestSizeTransitions false -XX:+UseParallelGC
+ * @run driver gc.metaspace.TestSizeTransitions true  -XX:+UseParallelGC
+ */
+
+/* @test TestSizeTransitionsG1
+ * @key gc
+ * @requires vm.gc.G1
+ * @summary Tests that the metaspace size transition logging is done correctly.
+ * @library /test/lib
+ * @run driver gc.metaspace.TestSizeTransitions false -XX:+UseG1GC
+ * @run driver gc.metaspace.TestSizeTransitions true  -XX:+UseG1GC
+ */
+
+/* @test TestSizeTransitionsCMS
+ * @key gc
+ * @requires vm.gc.ConcMarkSweep
+ * @summary Tests that the metaspace size transition logging is done correctly.
+ * @library /test/lib
+ * @run driver gc.metaspace.TestSizeTransitions false -XX:+UseConcMarkSweepGC
+ * @run driver gc.metaspace.TestSizeTransitions true  -XX:+UseConcMarkSweepGC
+ */
+
+public class TestSizeTransitions {
+  public static class Run {
+    public static void main(String... args) throws Exception {
+      System.out.println("Run started.");
+
+      // easiest way to generate a metaspace transition is to ask for a full GC
+      System.gc();
+
+      System.out.println("Run finished.");
+    }
+  }
+
+  // matches the log tags
+  //   e.g., [0.043s][info][gc]
+  private static final String LOG_TAGS_REGEX = "(\\[.*\\])+ ";
+
+  // matches a size transition
+  //   e.g., 177K(4864K)->177K(4864K)
+  private static final String SIZE_TRANSITION_REGEX = "\\d+K\\(\\d+K\\)->\\d+K\\(\\d+K\\)";
+
+  // matches -coops metaspace size transitions
+  private static final String NO_COOPS_REGEX =
+    String.format("^%s.* Metaspace: %s$",
+                  LOG_TAGS_REGEX,
+                  SIZE_TRANSITION_REGEX);
+
+  // matches +coops metaspace size transitions
+  private static final String COOPS_REGEX =
+    String.format("^%s.* Metaspace: %s NonClass: %s Class: %s$",
+                  LOG_TAGS_REGEX,
+                  SIZE_TRANSITION_REGEX,
+                  SIZE_TRANSITION_REGEX,
+                  SIZE_TRANSITION_REGEX);
+
+  public static void main(String... args) throws Exception {
+    // args: <use-coops> <gc-arg>
+    if (args.length != 2) {
+      throw new RuntimeException("wrong number of args: " + args.length);
+    }
+
+    final boolean useCoops = Boolean.parseBoolean(args[0]);
+    final String gcArg = args[1];
+    final String[] jvmArgs = {
+      useCoops ? "-XX:+UseCompressedOops" : "-XX:-UseCompressedOops",
+      gcArg,
+      "-Xmx256m",
+      "-Xlog:gc,gc+metaspace=info",
+      TestSizeTransitions.Run.class.getName()
+    };
+
+    System.out.println("JVM args:");
+    for (String a : jvmArgs) {
+      System.out.println("  " + a);
+    }
+
+    final ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(jvmArgs);
+    final OutputAnalyzer output = new OutputAnalyzer(pb.start());
+    System.out.println(output.getStdout());
+    output.shouldHaveExitValue(0);
+
+    if (useCoops) {
+      output.stdoutShouldMatch(COOPS_REGEX);
+      output.stdoutShouldNotMatch(NO_COOPS_REGEX);
+    } else {
+      output.stdoutShouldMatch(NO_COOPS_REGEX);
+      output.stdoutShouldNotMatch(COOPS_REGEX);
+    }
+  }
+}