blob: c393d7ec32510648bd1bda36b318df84989757bb [file] [log] [blame]
/**
* 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 main 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() + "]");
}
}