--- old/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleWithCustomImageTest.java 2019-07-24 08:26:49.993470369 -0400 +++ /dev/null 2019-07-22 09:37:15.068007775 -0400 @@ -1,185 +0,0 @@ -/** - * Copyright (c) 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. - * - * 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 - * @summary Test archived module graph with custom runtime image - * @requires vm.cds.archived.java.heap - * @library /test/jdk/lib/testlibrary /test/lib /test/hotspot/jtreg/runtime/appcds - * @modules java.base/jdk.internal.module - * java.management - * jdk.jlink - * jdk.compiler - * @build sun.hotspot.WhiteBox - * @compile CheckArchivedModuleApp.java - * @run driver ClassFileInstaller -jar app.jar CheckArchivedModuleApp - * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run driver ArchivedModuleWithCustomImageTest - */ - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import jdk.test.lib.compiler.CompilerUtils; -import jdk.test.lib.process.OutputAnalyzer; -import jdk.test.lib.process.ProcessTools; - -public class ArchivedModuleWithCustomImageTest { - private static final String JAVA_HOME = System.getProperty("java.home"); - private static final String TEST_MODULE = "test"; - private static final Path jdkHome = Paths.get(System.getProperty("test.jdk")); - private static final Path jdkMods = jdkHome.resolve("jmods"); - private static final Path testSrc = Paths.get(System.getProperty("test.src")); - private static final Path src = testSrc.resolve("src").resolve(TEST_MODULE); - private static final Path classes = Paths.get("classes"); - private static final Path jmods = Paths.get("jmods"); - - public static void main(String[] args) throws Throwable { - if (Files.notExists(jdkMods)) { - System.out.println("No jmods/ in test JDK, not supported."); - return; - } - - // compile test module class - if (!CompilerUtils.compile(src, classes)) { - throw new RuntimeException("Compilation failure."); - } - - // create custom runtime image named 'myimage' - Files.createDirectories(jmods); - Path image = Paths.get("myimage"); - runJmod(classes.toString(), TEST_MODULE); - runJlink(image, TEST_MODULE); - - // test using 'myimage' - testArchivedModuleUsingImage(image); - - Files.delete(jmods.resolve(TEST_MODULE + ".jmod")); - } - - private static void runJlink(Path image, String modName) throws Throwable { - Path jlink = Paths.get(JAVA_HOME, "bin", "jlink"); - OutputAnalyzer output = ProcessTools.executeProcess(jlink.toString(), - "--output", image.toString(), - "--add-modules", modName, - "--module-path", jdkMods + File.pathSeparator + jmods); - output.shouldHaveExitValue(0); - } - - private static void runJmod(String cp, String modName) throws Throwable { - Path jmod = Paths.get(JAVA_HOME, "bin", "jmod"); - OutputAnalyzer output = ProcessTools.executeProcess(jmod.toString(), - "create", - "--class-path", cp, - "--module-version", "1.0", - "--main-class", "jdk.test.Test", - jmods.resolve(modName + ".jmod").toString()); - output.shouldHaveExitValue(0); - } - - private static void testArchivedModuleUsingImage(Path image) - throws Throwable { - String wbJar = ClassFileInstaller.getJarPath("WhiteBox.jar"); - String use_whitebox_jar = "-Xbootclasspath/a:" + wbJar; - String appJar = ClassFileInstaller.getJarPath("app.jar"); - Path customJava = Paths.get(image.toString(), "bin", "java"); - - // -Xshare:dump with custom runtime image - String[] dumpCmd = { - customJava.toString(), - "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", - "-Xshare:dump"}; - printCommand(dumpCmd); - ProcessBuilder pbDump = new ProcessBuilder(); - pbDump.command(dumpCmd); - OutputAnalyzer output = TestCommon.executeAndLog( - pbDump, "custom.runtime.image.dump"); - TestCommon.checkDump(output); - - // Test case 1): - // test archived module graph objects are used with custome runtime image - System.out.println("------------------- Test case 1 -------------------"); - String[] runCmd = {customJava.toString(), - use_whitebox_jar, - "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", - "-cp", - appJar, - "-Xshare:on", - "-XX:+UnlockDiagnosticVMOptions", - "-XX:+WhiteBoxAPI", - "CheckArchivedModuleApp", - "yes", - "yes"}; - printCommand(runCmd); - ProcessBuilder pbRun = new ProcessBuilder(); - pbRun.command(runCmd); - output = TestCommon.executeAndLog(pbRun, "custom.runtime.image.run"); - output.shouldHaveExitValue(0); - - - // Test case 2): - // verify --show-module-resolution output - System.out.println("------------------- Test case 2 -------------------"); - - // myimage/bin/java -Xshare:off --show-module-resolution -version - String[] showModuleCmd1 = {customJava.toString(), - "-Xshare:off", - "--show-module-resolution", - "-version"}; - printCommand(showModuleCmd1); - pbRun = new ProcessBuilder(); - pbRun.command(showModuleCmd1); - output = TestCommon.executeAndLog( - pbRun, "custom.runtime.image.showModuleResolution.nocds"); - output.shouldHaveExitValue(0); - String moduleResolutionOut1 = output.getStdout(); - - // myimage/bin/java -Xshare:on --show-module-resolution -version - // -XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa - String[] showModuleCmd2 = { - customJava.toString(), - "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", - "-Xshare:on", - "--show-module-resolution", - "-version"}; - printCommand(showModuleCmd2); - pbRun = new ProcessBuilder(); - pbRun.command(showModuleCmd2); - output = TestCommon.executeAndLog( - pbRun, "custom.runtime.image.showModuleResolution.cds"); - if (output.getStderr().contains("sharing")) { - String moduleResolutionOut2 = output.getStdout(); - TestCommon.checkOutputStrings( - moduleResolutionOut1, moduleResolutionOut2, "\n"); - } - } - - private static void printCommand(String opts[]) { - StringBuilder cmdLine = new StringBuilder(); - for (String cmd : opts) - cmdLine.append(cmd).append(' '); - System.out.println("Command line: [" + cmdLine.toString() + "]"); - } -} --- /dev/null 2019-07-22 09:37:15.068007775 -0400 +++ new/test/hotspot/jtreg/runtime/cds/cacheObject/ArchivedModuleWithCustomImageTest.java 2019-07-24 08:26:49.669470380 -0400 @@ -0,0 +1,185 @@ +/** + * Copyright (c) 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. + * + * 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 + * @summary Test archived module graph with custom runtime image + * @requires vm.cds.archived.java.heap + * @library /test/jdk/lib/testlibrary /test/lib /test/hotspot/jtreg/runtime/cds + * @modules java.base/jdk.internal.module + * java.management + * jdk.jlink + * jdk.compiler + * @build sun.hotspot.WhiteBox + * @compile CheckArchivedModuleApp.java + * @run driver ClassFileInstaller -jar app.jar CheckArchivedModuleApp + * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox + * @run driver ArchivedModuleWithCustomImageTest + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import jdk.test.lib.compiler.CompilerUtils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class ArchivedModuleWithCustomImageTest { + private static final String JAVA_HOME = System.getProperty("java.home"); + private static final String TEST_MODULE = "test"; + private static final Path jdkHome = Paths.get(System.getProperty("test.jdk")); + private static final Path jdkMods = jdkHome.resolve("jmods"); + private static final Path testSrc = Paths.get(System.getProperty("test.src")); + private static final Path src = testSrc.resolve("src").resolve(TEST_MODULE); + private static final Path classes = Paths.get("classes"); + private static final Path jmods = Paths.get("jmods"); + + public static void main(String[] args) throws Throwable { + if (Files.notExists(jdkMods)) { + System.out.println("No jmods/ in test JDK, not supported."); + return; + } + + // compile test module class + if (!CompilerUtils.compile(src, classes)) { + throw new RuntimeException("Compilation failure."); + } + + // create custom runtime image named 'myimage' + Files.createDirectories(jmods); + Path image = Paths.get("myimage"); + runJmod(classes.toString(), TEST_MODULE); + runJlink(image, TEST_MODULE); + + // test using 'myimage' + testArchivedModuleUsingImage(image); + + Files.delete(jmods.resolve(TEST_MODULE + ".jmod")); + } + + private static void runJlink(Path image, String modName) throws Throwable { + Path jlink = Paths.get(JAVA_HOME, "bin", "jlink"); + OutputAnalyzer output = ProcessTools.executeProcess(jlink.toString(), + "--output", image.toString(), + "--add-modules", modName, + "--module-path", jdkMods + File.pathSeparator + jmods); + output.shouldHaveExitValue(0); + } + + private static void runJmod(String cp, String modName) throws Throwable { + Path jmod = Paths.get(JAVA_HOME, "bin", "jmod"); + OutputAnalyzer output = ProcessTools.executeProcess(jmod.toString(), + "create", + "--class-path", cp, + "--module-version", "1.0", + "--main-class", "jdk.test.Test", + jmods.resolve(modName + ".jmod").toString()); + output.shouldHaveExitValue(0); + } + + private static void testArchivedModuleUsingImage(Path image) + throws Throwable { + String wbJar = ClassFileInstaller.getJarPath("WhiteBox.jar"); + String use_whitebox_jar = "-Xbootclasspath/a:" + wbJar; + String appJar = ClassFileInstaller.getJarPath("app.jar"); + Path customJava = Paths.get(image.toString(), "bin", "java"); + + // -Xshare:dump with custom runtime image + String[] dumpCmd = { + customJava.toString(), + "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", + "-Xshare:dump"}; + printCommand(dumpCmd); + ProcessBuilder pbDump = new ProcessBuilder(); + pbDump.command(dumpCmd); + OutputAnalyzer output = TestCommon.executeAndLog( + pbDump, "custom.runtime.image.dump"); + TestCommon.checkDump(output); + + // Test case 1): + // test archived module graph objects are used with custome runtime image + System.out.println("------------------- Test case 1 -------------------"); + String[] runCmd = {customJava.toString(), + use_whitebox_jar, + "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", + "-cp", + appJar, + "-Xshare:on", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+WhiteBoxAPI", + "CheckArchivedModuleApp", + "yes", + "yes"}; + printCommand(runCmd); + ProcessBuilder pbRun = new ProcessBuilder(); + pbRun.command(runCmd); + output = TestCommon.executeAndLog(pbRun, "custom.runtime.image.run"); + output.shouldHaveExitValue(0); + + + // Test case 2): + // verify --show-module-resolution output + System.out.println("------------------- Test case 2 -------------------"); + + // myimage/bin/java -Xshare:off --show-module-resolution -version + String[] showModuleCmd1 = {customJava.toString(), + "-Xshare:off", + "--show-module-resolution", + "-version"}; + printCommand(showModuleCmd1); + pbRun = new ProcessBuilder(); + pbRun.command(showModuleCmd1); + output = TestCommon.executeAndLog( + pbRun, "custom.runtime.image.showModuleResolution.nocds"); + output.shouldHaveExitValue(0); + String moduleResolutionOut1 = output.getStdout(); + + // myimage/bin/java -Xshare:on --show-module-resolution -version + // -XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa + String[] showModuleCmd2 = { + customJava.toString(), + "-XX:SharedArchiveFile=./ArchivedModuleWithCustomImageTest.jsa", + "-Xshare:on", + "--show-module-resolution", + "-version"}; + printCommand(showModuleCmd2); + pbRun = new ProcessBuilder(); + pbRun.command(showModuleCmd2); + output = TestCommon.executeAndLog( + pbRun, "custom.runtime.image.showModuleResolution.cds"); + if (output.getStderr().contains("sharing")) { + String moduleResolutionOut2 = output.getStdout(); + TestCommon.checkOutputStrings( + moduleResolutionOut1, moduleResolutionOut2, "\n"); + } + } + + private static void printCommand(String opts[]) { + StringBuilder cmdLine = new StringBuilder(); + for (String cmd : opts) + cmdLine.append(cmd).append(' '); + System.out.println("Command line: [" + cmdLine.toString() + "]"); + } +}