jdk-24/test/hotspot/jtreg/runtime/cds/appcds/CommonAppClasspath.java
2022-10-25 17:52:18 +00:00

149 lines
6.4 KiB
Java

/*
* Copyright (c) 2022, 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
* @bug 8279366
* @summary Test app class paths checking with the longest common path taken into account.
* @requires vm.cds
* @library /test/lib
* @compile test-classes/Hello.java
* @compile test-classes/HelloMore.java
* @run driver CommonAppClasspath
*/
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import jdk.test.lib.cds.CDSTestUtils;
public class CommonAppClasspath {
private static final Path USER_DIR = Paths.get(CDSTestUtils.getOutputDir());
private static final String failedMessage = "APP classpath mismatch";
private static final String successMessage1 = "Hello source: shared objects file";
private static final String successMessage2 = "HelloMore source: shared objects file";
private static void runtimeTest(String classPath, String mainClass, int expectedExitValue,
String ... checkMessages) throws Exception {
CDSTestUtils.Result result = TestCommon.run(
"-Xshare:on",
"-XX:SharedArchiveFile=" + TestCommon.getCurrentArchiveName(),
"-cp", classPath,
"-Xlog:class+load=trace,class+path=info",
mainClass);
if (expectedExitValue == 0) {
result.assertNormalExit( output -> {
for (String s : checkMessages) {
output.shouldContain(s);
}
});
} else {
result.assertAbnormalExit( output -> {
for (String s : checkMessages) {
output.shouldContain(s);
}
});
}
}
public static void main(String[] args) throws Exception {
String appJar = JarBuilder.getOrCreateHelloJar();
String appJar2 = JarBuilder.build("AppendClasspath_HelloMore", "HelloMore");
// dump an archive with only appJar in the original location
String jars = appJar;
TestCommon.testDump(jars, TestCommon.list("Hello"));
// copy hello.jar to tmp dir
Path destPath = CDSTestUtils.copyFile(appJar, System.getProperty("java.io.tmpdir"));
// Run with appJar relocated to tmp dir - should PASS
runtimeTest(destPath.toString(), "Hello", 0, successMessage1);
// dump an archive with both jars in the original location
jars = appJar + File.pathSeparator + appJar2;
TestCommon.testDump(jars, TestCommon.list("Hello", "HelloMore"));
// copy hello.jar to USER_DIR/deploy
String newDir = USER_DIR.toString() + File.separator + "deploy";
destPath = CDSTestUtils.copyFile(appJar, newDir);
// copy AppendClasspath_HelloMore.jar to USER_DIR/deploy
Path destPath2 = CDSTestUtils.copyFile(appJar2, newDir);
// Run with both jars relocated to USER_DIR/dpeloy - should PASS
runtimeTest(destPath.toString() + File.pathSeparator + destPath2.toString(),
"HelloMore", 0, successMessage1, successMessage2);
// Run with relocation of only the second jar - should FAIL
runtimeTest(appJar + File.pathSeparator + destPath2.toString(),
"HelloMore", 1, failedMessage);
// Run with relocation of only the first jar - should FAIL
runtimeTest(destPath.toString() + File.pathSeparator + appJar2,
"HelloMore", 1, failedMessage);
// Dump CDS archive with the first jar relocated.
jars = destPath.toString() + File.pathSeparator + appJar2;
TestCommon.testDump(jars, TestCommon.list("Hello", "HelloMore"));
// Run with first jar relocated - should PASS
runtimeTest(destPath.toString() + File.pathSeparator + appJar2,
"HelloMore", 0, successMessage1, successMessage2);
// Run with both jars relocated - should FAIL
runtimeTest(destPath.toString() + File.pathSeparator + destPath2.toString(),
"HelloMore", 1, failedMessage);
// Copy hello.jar to USER_DIR/a
destPath = CDSTestUtils.copyFile(appJar, USER_DIR.toString() + File.separator + "a");
// copy AppendClasspath_HelloMore.jar to USER_DIR/aa
destPath2 = CDSTestUtils.copyFile(appJar2, USER_DIR.toString() + File.separator + "aa");
// Dump CDS archive with the both jar files relocated
// appJar to USER_DIR/a
// appJar2 to USER_DIR/aa
jars = destPath.toString() + File.pathSeparator + destPath2.toString();
TestCommon.testDump(jars, TestCommon.list("Hello", "HelloMore"));
// Copy hello.jar to USER_DIR/x/a
Path runPath = CDSTestUtils.copyFile(appJar, USER_DIR.toString() + File.separator + "x" + File.separator + "a");
// copy AppendClasspath_HelloMore.jar to USER_DIR/x/aa
Path runPath2= CDSTestUtils.copyFile(appJar2, USER_DIR.toString() + File.separator + "x" + File.separator + "aa");
// Run with both jars relocated to USER_DIR/x/a and USER_DIR/x/aa dirs - should PASS
runtimeTest(runPath.toString() + File.pathSeparator + runPath2.toString(),
"HelloMore", 0, successMessage1, successMessage2);
// copy AppendClasspath_HelloMore.jar to USER_DIR/x/a
runPath2= CDSTestUtils.copyFile(appJar2, USER_DIR.toString() + File.separator + "x" + File.separator + "a");
// Run with both jars relocated to USER_DIR/x/a dir - should FAIL
runtimeTest(runPath.toString() + File.pathSeparator + runPath2.toString(),
"HelloMore", 1, failedMessage);
}
}