1 /*
2 * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8316969
27 * @summary Test handling of module option (-m).
28 * @requires vm.cds.write.archived.java.heap
29 * @requires vm.flagless
30 * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds
31 * @run driver ModuleOption
32 */
33
34 import jdk.test.lib.process.OutputAnalyzer;
35
36 public class ModuleOption {
37 public static void main(String[] args) throws Exception {
38 final String moduleOption = "jdk.httpserver/sun.net.httpserver.simpleserver.Main";
39 final String incubatorModule = "jdk.incubator.vector";
40 final String loggingOption = "-Xlog:aot=debug,aot+module=debug,aot+heap=info,cds=debug,module=trace";
41 // Pattern of a module version string.
42 // e.g. JDK 22: "java 22"
43 // JDK 22.0.1: "java 22.0.1"
44 final String versionPattern = "java.[0-9][0-9].*";
45 final String subgraphCannotBeUsed = "subgraph jdk.internal.module.ArchivedBootLayer cannot be used because full module graph is disabled";
46 String archiveName = TestCommon.getNewArchiveName("module-option");
47 TestCommon.setCurrentArchiveName(archiveName);
48
49 // dump a base archive with -m jdk.httpserver
50 OutputAnalyzer oa = TestCommon.dumpBaseArchive(
51 archiveName,
52 loggingOption,
53 "-m", moduleOption,
54 "-version");
55 oa.shouldHaveExitValue(0);
56
57 // same module specified during runtime
58 oa = TestCommon.execCommon(
59 loggingOption,
60 "-m", moduleOption,
61 "-version");
62 oa.shouldHaveExitValue(0)
63 // version of the jdk.httpserver module, e.g. java 22-ea
64 .shouldMatch(versionPattern)
65 .shouldMatch("aot,module.*Restored from archive: entry.0x.*name jdk.httpserver");
66
67 // different module specified during runtime
68 oa = TestCommon.execCommon(
69 loggingOption,
70 "-m", "jdk.compiler/com.sun.tools.javac.Main",
71 "-version");
72 oa.shouldHaveExitValue(0)
73 .shouldContain("Mismatched values for property jdk.module.main: runtime jdk.compiler dump time jdk.httpserver")
74 .shouldContain(subgraphCannotBeUsed);
75
76 // no module specified during runtime
77 oa = TestCommon.execCommon(
78 loggingOption,
79 "-version");
80 oa.shouldHaveExitValue(0)
81 .shouldContain("Mismatched values for property jdk.module.main: jdk.httpserver specified during dump time but not during runtime")
82 .shouldContain(subgraphCannotBeUsed);
83
84 // dump an archive without the module option
85 archiveName = TestCommon.getNewArchiveName("no-module-option");
86 TestCommon.setCurrentArchiveName(archiveName);
87 oa = TestCommon.dumpBaseArchive(
88 archiveName,
89 loggingOption,
90 "-version");
91 oa.shouldHaveExitValue(0);
92
93 // run with module option
94 oa = TestCommon.execCommon(
95 loggingOption,
96 "-m", moduleOption,
97 "-version");
98 oa.shouldHaveExitValue(0)
99 .shouldContain("Mismatched values for property jdk.module.main: jdk.httpserver specified during runtime but not during dump time")
100 // version of the jdk.httpserver module, e.g. java 22-ea
101 .shouldMatch(versionPattern)
102 .shouldContain(subgraphCannotBeUsed);
103
104 // dump an archive with an incubator module, -m jdk.incubator.vector
105 archiveName = TestCommon.getNewArchiveName("incubator-module");
106 TestCommon.setCurrentArchiveName(archiveName);
107 oa = TestCommon.dumpBaseArchive(
108 archiveName,
109 loggingOption,
110 "-m", incubatorModule,
111 "-version");
112 oa.shouldHaveExitValue(0)
113 // module graph won't be archived with an incubator module
114 .shouldContain("archivedBootLayer not available, disabling full module graph");
115
116 // run with the same incubator module
117 oa = TestCommon.execCommon(
118 loggingOption,
119 "-m", incubatorModule,
120 "-version");
121 oa.shouldContain("full module graph: disabled")
122 // module is not restored from archive
123 .shouldContain("define_module(): creation of module: jdk.incubator.vector")
124 .shouldContain("WARNING: Using incubator modules: jdk.incubator.vector")
125 .shouldContain("subgraph jdk.internal.module.ArchivedBootLayer is not recorde")
126 .shouldContain("module jdk.incubator.vector does not have a ModuleMainClass attribute, use -m <module>/<main-class>")
127 .shouldHaveExitValue(1);
128 }
129 }