--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/runtime/cds/appcds/ClassPathAttr.java Mon Jul 29 10:34:20 2019 -0400
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2014, 2019, 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 Class-Path: attribute in MANIFEST file
+ * @requires vm.cds
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ * java.management
+ * jdk.jartool/sun.tools.jar
+ * @run driver ClassPathAttr
+ */
+
+import jdk.test.lib.process.OutputAnalyzer;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.Paths;
+
+
+public class ClassPathAttr {
+
+ public static void main(String[] args) throws Exception {
+ buildCpAttr("cpattr1", "cpattr1.mf", "CpAttr1", "CpAttr1");
+ buildCpAttr("cpattr1_long", "cpattr1_long.mf", "CpAttr1", "CpAttr1");
+ buildCpAttr("cpattr2", "cpattr2.mf", "CpAttr2", "CpAttr2");
+ buildCpAttr("cpattr3", "cpattr3.mf", "CpAttr3", "CpAttr2", "CpAttr3");
+ buildCpAttr("cpattr4", "cpattr4.mf", "CpAttr4",
+ "CpAttr2", "CpAttr3", "CpAttr4", "CpAttr5");
+ buildCpAttr("cpattr5_123456789_223456789_323456789_423456789_523456789_623456789", "cpattr5_extra_long.mf", "CpAttr5", "CpAttr5");
+
+ for (int i=1; i<=2; i++) {
+ String jar1 = TestCommon.getTestJar("cpattr1.jar");
+ String jar4 = TestCommon.getTestJar("cpattr4.jar");
+ if (i == 2) {
+ // Test case #2 -- same as #1, except we use cpattr1_long.jar, which has a super-long
+ // Class-Path: attribute.
+ jar1 = TestCommon.getTestJar("cpattr1_long.jar");
+ }
+ String cp = jar1 + File.pathSeparator + jar4;
+
+ TestCommon.testDump(cp, TestCommon.list("CpAttr1",
+ "CpAttr2",
+ "CpAttr3",
+ "CpAttr4",
+ "CpAttr5"));
+
+ TestCommon.run(
+ "-cp", cp,
+ "CpAttr1")
+ .assertNormalExit();
+
+ // Logging test for class+path.
+ TestCommon.run(
+ "-Xlog:class+path",
+ "-cp", cp,
+ "CpAttr1")
+ .assertNormalExit(output -> {
+ output.shouldMatch("checking shared classpath entry: .*cpattr2.jar");
+ output.shouldMatch("checking shared classpath entry: .*cpattr3.jar");
+ });
+
+ // Make sure aliased TraceClassPaths still works
+ TestCommon.run(
+ "-XX:+TraceClassPaths",
+ "-cp", cp,
+ "CpAttr1")
+ .assertNormalExit(output -> {
+ output.shouldMatch("checking shared classpath entry: .*cpattr2.jar");
+ output.shouldMatch("checking shared classpath entry: .*cpattr3.jar");
+ });
+ }
+ }
+
+ private static void buildCpAttr(String jarName, String manifest, String enclosingClassName, String ...testClassNames) throws Exception {
+ String jarClassesDir = System.getProperty("test.classes") + File.separator + jarName + "_classes";
+ try { Files.createDirectory(Paths.get(jarClassesDir)); } catch (FileAlreadyExistsException e) { }
+
+ JarBuilder.compile(jarClassesDir, System.getProperty("test.src") + File.separator +
+ "test-classes" + File.separator + enclosingClassName + ".java");
+ JarBuilder.buildWithManifest(jarName, manifest, jarClassesDir, testClassNames);
+ }
+}