8015324: Create tests for CDS feature
Summary: Wrote tests for use of CDS with ObjectAlignmentInBytes CL option
Reviewed-by: coleenp, ctornqvi, hseigel
Contributed-by: Mikhailo Seledtsov <mikhailo.seledtsov@oracle.com>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java Thu Jun 13 22:00:06 2013 +0200
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2013, 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 CdsDifferentObjectAlignment
+ * @summary Testing CDS (class data sharing) using varying object alignment.
+ * Using different object alignment for each dump/load pair.
+ * This is a negative test; using object alignment for loading that
+ * is different from object alignment for creating a CDS file
+ * should fail when loading.
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class CdsDifferentObjectAlignment {
+ public static void main(String[] args) throws Exception {
+ String nativeWordSize = System.getProperty("sun.arch.data.model");
+ if (!Platform.is64bit()) {
+ System.out.println("ObjectAlignmentInBytes for CDS is only " +
+ "supported on 64bit platforms; this plaform is " +
+ nativeWordSize);
+ System.out.println("Skipping the test");
+ } else {
+ createAndLoadSharedArchive(16, 64);
+ createAndLoadSharedArchive(64, 32);
+ }
+ }
+
+
+ // Parameters are object alignment expressed in bytes
+ private static void
+ createAndLoadSharedArchive(int createAlignment, int loadAlignment)
+ throws Exception {
+ String createAlignmentArgument = "-XX:ObjectAlignmentInBytes=" +
+ createAlignment;
+ String loadAlignmentArgument = "-XX:ObjectAlignmentInBytes=" +
+ loadAlignment;
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./sample.jsa",
+ "-Xshare:dump",
+ createAlignmentArgument);
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Loading classes to share");
+ output.shouldHaveExitValue(0);
+
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./sample.jsa",
+ "-Xshare:on",
+ loadAlignmentArgument,
+ "-version");
+
+ output = new OutputAnalyzer(pb.start());
+ String expectedErrorMsg =
+ String.format(
+ "The shared archive file's ObjectAlignmentInBytes of %d " +
+ "does not equal the current ObjectAlignmentInBytes of %d",
+ createAlignment,
+ loadAlignment);
+
+ output.shouldContain(expectedErrorMsg);
+ output.shouldHaveExitValue(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/CdsSameObjectAlignment.java Thu Jun 13 22:00:06 2013 +0200
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2013, 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 CdsSameObjectAlignment
+ * @summary Testing CDS (class data sharing) using varying object alignment.
+ * Using same object alignment for each dump/load pair
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class CdsSameObjectAlignment {
+ public static void main(String[] args) throws Exception {
+ String nativeWordSize = System.getProperty("sun.arch.data.model");
+ if (!Platform.is64bit()) {
+ System.out.println("ObjectAlignmentInBytes for CDS is only " +
+ "supported on 64bit platforms; this plaform is " +
+ nativeWordSize);
+ System.out.println("Skipping the test");
+ } else {
+ dumpAndLoadSharedArchive(8);
+ dumpAndLoadSharedArchive(16);
+ dumpAndLoadSharedArchive(32);
+ dumpAndLoadSharedArchive(64);
+ }
+ }
+
+ private static void
+ dumpAndLoadSharedArchive(int objectAlignmentInBytes) throws Exception {
+ String objectAlignmentArg = "-XX:ObjectAlignmentInBytes="
+ + objectAlignmentInBytes;
+ System.out.println("dumpAndLoadSharedArchive(): objectAlignmentInBytes = "
+ + objectAlignmentInBytes);
+
+ // create shared archive
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./sample.jsa",
+ "-Xshare:dump",
+ objectAlignmentArg);
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Loading classes to share");
+ output.shouldHaveExitValue(0);
+
+
+ // run using the shared archive
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./sample.jsa",
+ "-Xshare:on",
+ objectAlignmentArg,
+ "-version");
+
+ output = new OutputAnalyzer(pb.start());
+
+ try {
+ output.shouldContain("sharing");
+ output.shouldHaveExitValue(0);
+ } catch (RuntimeException e) {
+ // CDS uses absolute addresses for performance.
+ // It will try to reserve memory at a specific address;
+ // there is a chance such reservation will fail
+ // If it does, it is NOT considered a failure of the feature,
+ // rather a possible expected outcome, though not likely
+ output.shouldContain(
+ "Unable to reserve shared space at required address");
+ output.shouldHaveExitValue(1);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Thu Jun 13 22:00:06 2013 +0200
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2013, 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.
+ */
+
+package com.oracle.java.testlibrary;
+
+public class Platform {
+ private static final String osName = System.getProperty("os.name");
+ private static final String dataModel = System.getProperty("sun.arch.data.model");
+ private static final String vmVersion = System.getProperty("java.vm.version");
+
+ public static boolean is64bit() {
+ return dataModel.equals("64");
+ }
+
+ public static boolean isSolaris() {
+ return osName.toLowerCase().startsWith("sunos");
+ }
+
+ public static boolean isWindows() {
+ return osName.toLowerCase().startsWith("win");
+ }
+
+ public static boolean isOSX() {
+ return osName.toLowerCase().startsWith("mac");
+ }
+
+ public static boolean isLinux() {
+ return osName.toLowerCase().startsWith("linux");
+ }
+
+ public static String getOsName() {
+ return osName;
+ }
+
+ public static boolean isDebugBuild() {
+ return vmVersion.toLowerCase().contains("debug");
+ }
+
+ public static String getVMVersion() {
+ return vmVersion;
+ }
+}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Thu Jun 13 21:57:56 2013 +0200
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Thu Jun 13 22:00:06 2013 +0200
@@ -112,10 +112,8 @@
* @return String[] with platform specific arguments, empty if there are none
*/
public static String[] getPlatformSpecificVMArgs() {
- String osName = System.getProperty("os.name");
- String dataModel = System.getProperty("sun.arch.data.model");
- if (osName.equals("SunOS") && dataModel.equals("64")) {
+ if (Platform.is64bit() && Platform.isSolaris()) {
return new String[] { "-d64" };
}