8038587: [TESTBUG] Create CDS tests to exercise region sizes and base address
Summary: Added new tests to cover missing CDS basic funtions
Reviewed-by: coleenp, ctornqvi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java Mon Jun 02 21:36:59 2014 -0400
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2014, 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.
+ *
+ * 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.
+ */
+
+/* @ignore JDK-8043896
+ * @test LimitSharedSizes
+ * @summary Test handling of limits on shared space size
+ * @library /testlibrary
+ * @run main LimitSharedSizes
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class LimitSharedSizes {
+ private static class SharedSizeTestData {
+ public String optionName;
+ public String optionValue;
+ public String expectedErrorMsg;
+
+ public SharedSizeTestData(String name, String value, String msg) {
+ optionName = name;
+ optionValue = value;
+ expectedErrorMsg = msg;
+ }
+ }
+
+ private static final SharedSizeTestData[] testTable = {
+ // values in this part of the test table should cause failure
+ // (shared space sizes are deliberately too small)
+ new SharedSizeTestData("-XX:SharedReadOnlySize", "4M", "read only"),
+ new SharedSizeTestData("-XX:SharedReadWriteSize","4M", "read write"),
+
+ // Known issue, JDK-8038422 (assert() on Windows)
+ // new SharedSizeTestData("-XX:SharedMiscDataSize", "500k", "miscellaneous data"),
+
+ // This will cause a VM crash; commenting out for now; see bug JDK-8038268
+ // @ignore JDK-8038268
+ // new SharedSizeTestData("-XX:SharedMiscCodeSize", "20k", "miscellaneous code"),
+
+ // these values are larger than default ones, but should
+ // be acceptable and not cause failure
+ new SharedSizeTestData("-XX:SharedReadOnlySize", "20M", null),
+ new SharedSizeTestData("-XX:SharedReadWriteSize", "20M", null),
+ new SharedSizeTestData("-XX:SharedMiscDataSize", "20M", null),
+ new SharedSizeTestData("-XX:SharedMiscCodeSize", "20M", null)
+ };
+
+ public static void main(String[] args) throws Exception {
+ String fileName = "test.jsa";
+
+ for (SharedSizeTestData td : testTable) {
+ String option = td.optionName + "=" + td.optionValue;
+ System.out.println("testing option <" + option + ">");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./" + fileName,
+ option,
+ "-Xshare:dump");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ if (td.expectedErrorMsg != null) {
+ output.shouldContain("The shared " + td.expectedErrorMsg
+ + " space is not large enough");
+
+ output.shouldHaveExitValue(2);
+ } else {
+ output.shouldNotContain("space is not large enough");
+ output.shouldHaveExitValue(0);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/SharedBaseAddress.java Mon Jun 02 21:36:59 2014 -0400
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2014, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test SharedBaseAddress
+ * @summary Test variety of values for SharedBaseAddress, making sure
+ * VM handles normal values as well as edge values w/o a crash.
+ * @library /testlibrary
+ * @run main SharedBaseAddress
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class SharedBaseAddress {
+
+ // shared base address test table
+ private static final String[] testTable = {
+ "1g", "8g", "64g","512g", "4t",
+ "32t", "128t", "0",
+ "1", "64k", "64M"
+ };
+
+ public static void main(String[] args) throws Exception {
+ // Known issue on Solaris-Sparc
+ // @ignore JDK-8044600
+ if (Platform.isSolaris() && Platform.isSparc())
+ return;
+
+ for (String testEntry : testTable) {
+ System.out.println("sharedBaseAddress = " + testEntry);
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=test.jsa",
+ "-XX:SharedBaseAddress=" + testEntry,
+ "-Xshare:dump");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ output.shouldContain("Loading classes to share");
+
+ try {
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=test.jsa",
+ "-Xshare:on",
+ "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("sharing");
+ output.shouldHaveExitValue(0);
+ } catch (RuntimeException e) {
+ output.shouldContain("Unable to use shared archive");
+ output.shouldHaveExitValue(1);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/SpaceUtilizationCheck.java Mon Jun 02 21:36:59 2014 -0400
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2014, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test SpaceUtilizationCheck
+ * @summary Check if the space utilization for shared spaces is adequate
+ * @library /testlibrary
+ * @run main SpaceUtilizationCheck
+ */
+
+import com.oracle.java.testlibrary.*;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+import java.util.ArrayList;
+import java.lang.Integer;
+
+public class SpaceUtilizationCheck {
+ // Minimum allowed utilization value (percent)
+ // The goal is to have this number to be 50% for RO and RW regions
+ // Once that feature is implemented, increase the MIN_UTILIZATION to 50
+ private static final int MIN_UTILIZATION = 30;
+
+ // Only RO and RW regions are considered for this check, since they
+ // currently account for the bulk of the shared space
+ private static final int NUMBER_OF_CHECKED_SHARED_REGIONS = 2;
+
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./test.jsa",
+ "-Xshare:dump");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ String stdout = output.getStdout();
+ ArrayList<String> utilization = findUtilization(stdout);
+
+ if (utilization.size() != NUMBER_OF_CHECKED_SHARED_REGIONS )
+ throw new RuntimeException("The output format of sharing summary has changed");
+
+ for(String str : utilization) {
+ int value = Integer.parseInt(str);
+ if (value < MIN_UTILIZATION) {
+ System.out.println(stdout);
+ throw new RuntimeException("Utilization for one of the regions" +
+ "is below a threshold of " + MIN_UTILIZATION + "%");
+ }
+ }
+ }
+
+ public static ArrayList<String> findUtilization(String input) {
+ ArrayList<String> regions = filterRegionsOfInterest(input.split("\n"));
+ return filterByPattern(filterByPattern(regions, "bytes \\[.*% used\\]"), "\\d+");
+ }
+
+ private static ArrayList<String> filterByPattern(Iterable<String> input, String pattern) {
+ ArrayList<String> result = new ArrayList<String>();
+ for (String str : input) {
+ Matcher matcher = Pattern.compile(pattern).matcher(str);
+ if (matcher.find()) {
+ result.add(matcher.group());
+ }
+ }
+ return result;
+ }
+
+ private static ArrayList<String> filterRegionsOfInterest(String[] inputLines) {
+ ArrayList<String> result = new ArrayList<String>();
+ for (String str : inputLines) {
+ if (str.contains("ro space:") || str.contains("rw space:")) {
+ result.add(str);
+ }
+ }
+ return result;
+ }
+}