Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/jdk17u
Path: blob/master/test/jdk/tools/jlink/JLinkTest.java
66643 views
1
/*
2
* Copyright (c) 2015, 2018, 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
import java.io.IOException;
25
import java.io.PrintWriter;
26
import java.io.StringWriter;
27
import java.lang.module.ModuleDescriptor;
28
import java.nio.file.Files;
29
import java.nio.file.Path;
30
import java.nio.file.Paths;
31
import java.util.ArrayList;
32
import java.util.Collections;
33
import java.util.List;
34
import java.util.spi.ToolProvider;
35
import java.util.stream.Collectors;
36
import java.util.stream.IntStream;
37
import java.util.stream.Stream;
38
39
import jdk.tools.jlink.plugin.Plugin;
40
import jdk.tools.jlink.internal.PluginRepository;
41
import tests.Helper;
42
import tests.JImageGenerator;
43
44
/*
45
* @test
46
* @summary Test image creation
47
* @bug 8189777
48
* @bug 8194922
49
* @bug 8206962
50
* @bug 8240349
51
* @author Jean-Francois Denise
52
* @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g)
53
* @library ../lib
54
* @modules java.base/jdk.internal.jimage
55
* jdk.jdeps/com.sun.tools.classfile
56
* jdk.jlink/jdk.tools.jlink.internal
57
* jdk.jlink/jdk.tools.jlink.plugin
58
* jdk.jlink/jdk.tools.jimage
59
* jdk.compiler
60
* @build tests.*
61
* @run main/othervm -Xmx1g JLinkTest
62
*/
63
public class JLinkTest {
64
static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink")
65
.orElseThrow(() ->
66
new RuntimeException("jlink tool not found")
67
);
68
69
// number of built-in plugins from jdk.jlink module
70
private static int getNumJlinkPlugins() {
71
ModuleDescriptor desc = Plugin.class.getModule().getDescriptor();
72
return desc.provides().stream()
73
.filter(p -> p.service().equals(Plugin.class.getName()))
74
.map(p -> p.providers().size())
75
.findAny()
76
.orElse(0);
77
}
78
79
private static boolean isOfJLinkModule(Plugin p) {
80
return p.getClass().getModule() == Plugin.class.getModule();
81
}
82
83
public static void main(String[] args) throws Exception {
84
85
Helper helper = Helper.newHelper();
86
if (helper == null) {
87
System.err.println("Test not run");
88
return;
89
}
90
helper.generateDefaultModules();
91
// expected num. of plugins from jdk.jlink module
92
int expectedJLinkPlugins = getNumJlinkPlugins();
93
int totalPlugins = 0;
94
{
95
// number of built-in plugins
96
List<Plugin> builtInPlugins = new ArrayList<>();
97
builtInPlugins.addAll(PluginRepository.getPlugins(ModuleLayer.boot()));
98
totalPlugins = builtInPlugins.size();
99
// actual num. of plugins loaded from jdk.jlink module
100
int actualJLinkPlugins = 0;
101
for (Plugin p : builtInPlugins) {
102
p.getState();
103
p.getType();
104
if (isOfJLinkModule(p)) {
105
actualJLinkPlugins++;
106
}
107
}
108
if (expectedJLinkPlugins != actualJLinkPlugins) {
109
throw new AssertionError("Actual plugins loaded from jdk.jlink: " +
110
actualJLinkPlugins + " which doesn't match expected number : " +
111
expectedJLinkPlugins);
112
}
113
}
114
115
{
116
// No --module-path specified. $JAVA_HOME/jmods should be assumed.
117
// The following should succeed as it uses only system modules.
118
String imageDir = "bug818977-no-modulepath";
119
JImageGenerator.getJLinkTask()
120
.output(helper.createNewImageDir(imageDir))
121
.addMods("jdk.jshell")
122
.call().assertSuccess();
123
}
124
125
{
126
// invalid --module-path specified. java.base not found it it.
127
// $JAVA_HOME/jmods should be added automatically.
128
// The following should succeed as it uses only system modules.
129
String imageDir = "bug8189777-invalid-modulepath";
130
JImageGenerator.getJLinkTask()
131
.modulePath("does_not_exist_path")
132
.output(helper.createNewImageDir(imageDir))
133
.addMods("jdk.jshell")
134
.call().assertSuccess();
135
}
136
137
{
138
// No --module-path specified. --add-modules ALL-MODULE-PATH specified.
139
String imageDir = "bug8189777-all-module-path";
140
JImageGenerator.getJLinkTask()
141
.output(helper.createNewImageDir(imageDir))
142
.addMods("ALL-MODULE-PATH")
143
.call().assertSuccess();
144
}
145
146
{
147
String moduleName = "bug8134651";
148
JImageGenerator.getJLinkTask()
149
.modulePath(helper.defaultModulePath())
150
.output(helper.createNewImageDir(moduleName))
151
.addMods("leaf1")
152
.call().assertSuccess();
153
JImageGenerator.getJLinkTask()
154
.modulePath(helper.defaultModulePath())
155
.addMods("leaf1")
156
.option("--output")
157
.call().assertFailure("Error: no value given for --output");
158
JImageGenerator.getJLinkTask()
159
.modulePath("")
160
.output(helper.createNewImageDir(moduleName))
161
.addMods("leaf1")
162
.call().assertFailure("Error: no value given for --module-path");
163
// do not include standard module path - should be added automatically
164
JImageGenerator.getJLinkTask()
165
.modulePath(helper.defaultModulePath(false))
166
.output(helper.createNewImageDir(moduleName))
167
.addMods("leaf1")
168
.call().assertSuccess();
169
// no --module-path. default sys mod path is assumed - but that won't contain 'leaf1' module
170
JImageGenerator.getJLinkTask()
171
.output(helper.createNewImageDir(moduleName))
172
.addMods("leaf1")
173
.call().assertFailure("Error: Module leaf1 not found");
174
}
175
176
{
177
String moduleName = "m"; // 8163382
178
Path jmod = helper.generateDefaultJModule(moduleName).assertSuccess();
179
JImageGenerator.getJLinkTask()
180
.modulePath(helper.defaultModulePath())
181
.output(helper.createNewImageDir(moduleName))
182
.addMods("m")
183
.call().assertSuccess();
184
moduleName = "mod";
185
jmod = helper.generateDefaultJModule(moduleName).assertSuccess();
186
JImageGenerator.getJLinkTask()
187
.modulePath(helper.defaultModulePath())
188
.output(helper.createNewImageDir(moduleName))
189
.addMods("m")
190
.call().assertSuccess();
191
}
192
193
{
194
String moduleName = "m_8165735"; // JDK-8165735
195
helper.generateDefaultJModule(moduleName+"dependency").assertSuccess();
196
Path jmod = helper.generateDefaultJModule(moduleName, moduleName+"dependency").assertSuccess();
197
JImageGenerator.getJLinkTask()
198
.modulePath(helper.defaultModulePath())
199
.repeatedModulePath(".") // second --module-path overrides the first one
200
.output(helper.createNewImageDir(moduleName))
201
.addMods(moduleName)
202
// second --module-path does not have that module
203
.call().assertFailure("Error: Module m_8165735 not found");
204
205
JImageGenerator.getJLinkTask()
206
.modulePath(".") // first --module-path overridden later
207
.repeatedModulePath(helper.defaultModulePath())
208
.output(helper.createNewImageDir(moduleName))
209
.addMods(moduleName)
210
// second --module-path has that module
211
.call().assertSuccess();
212
213
JImageGenerator.getJLinkTask()
214
.modulePath(helper.defaultModulePath())
215
.output(helper.createNewImageDir(moduleName))
216
.limitMods(moduleName)
217
.repeatedLimitMods("java.base") // second --limit-modules overrides first
218
.addMods(moduleName)
219
.call().assertFailure("Error: Module m_8165735dependency not found, required by m_8165735");
220
221
JImageGenerator.getJLinkTask()
222
.modulePath(helper.defaultModulePath())
223
.output(helper.createNewImageDir(moduleName))
224
.limitMods("java.base")
225
.repeatedLimitMods(moduleName) // second --limit-modules overrides first
226
.addMods(moduleName)
227
.call().assertSuccess();
228
}
229
230
{
231
// Help
232
StringWriter writer = new StringWriter();
233
PrintWriter pw = new PrintWriter(writer);
234
JLINK_TOOL.run(pw, pw, "--help");
235
String output = writer.toString();
236
if (output.split("\n").length < 10) {
237
System.err.println(output);
238
throw new AssertionError("Help");
239
}
240
}
241
242
{
243
// List plugins
244
StringWriter writer = new StringWriter();
245
PrintWriter pw = new PrintWriter(writer);
246
247
JLINK_TOOL.run(pw, pw, "--list-plugins");
248
String output = writer.toString();
249
List<String> commands = Stream.of(output.split("\\R"))
250
.filter((s) -> s.matches(" --.*"))
251
.collect(Collectors.toList());
252
int number = commands.size();
253
if (number != totalPlugins) {
254
System.err.println(output);
255
throw new AssertionError("Found: " + number + " expected " + totalPlugins);
256
}
257
258
boolean isSorted = IntStream.range(1, number)
259
.allMatch((int index) -> commands.get(index).compareTo(commands.get(index - 1)) >= 0);
260
261
if(!isSorted) {
262
throw new AssertionError("--list-plugins not presented in alphabetical order");
263
}
264
265
}
266
267
// filter out files and resources + Skip debug + compress
268
{
269
String[] userOptions = {"--compress", "2", "--strip-debug",
270
"--exclude-resources", "*.jcov, */META-INF/*", "--exclude-files",
271
"*" + Helper.getDebugSymbolsExtension()};
272
String moduleName = "excludezipskipdebugcomposite2";
273
helper.generateDefaultJModule(moduleName, "composite2");
274
String[] res = {".jcov", "/META-INF/"};
275
String[] files = {Helper.getDebugSymbolsExtension()};
276
Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();
277
helper.checkImage(imageDir, moduleName, res, files);
278
}
279
280
// filter out + Skip debug + compress with filter + sort resources
281
{
282
String[] userOptions2 = {"--compress=2:compress-filter=^/java.base/*",
283
"--strip-debug", "--exclude-resources",
284
"*.jcov, */META-INF/*", "--order-resources",
285
"*/module-info.class,/sortcomposite2/*,*/javax/management/*"};
286
String moduleName = "excludezipfilterskipdebugcomposite2";
287
helper.generateDefaultJModule(moduleName, "composite2");
288
String[] res = {".jcov", "/META-INF/"};
289
Path imageDir = helper.generateDefaultImage(userOptions2, moduleName).assertSuccess();
290
helper.checkImage(imageDir, moduleName, res, null);
291
}
292
293
// module-info.class should not be excluded
294
{
295
String[] userOptions = { "--exclude-resources", "/jdk_8194922/module-info.class" };
296
String moduleName = "jdk_8194922";
297
helper.generateDefaultJModule(moduleName);
298
helper.generateDefaultImage(userOptions, moduleName).
299
assertFailure("Cannot exclude /jdk_8194922/module-info.class");
300
}
301
302
// default compress
303
{
304
testCompress(helper, "compresscmdcomposite2", "--compress", "2");
305
}
306
307
{
308
testCompress(helper, "compressfiltercmdcomposite2",
309
"--compress=2:filter=^/java.base/java/lang/*");
310
}
311
312
// compress 0
313
{
314
testCompress(helper, "compress0filtercmdcomposite2",
315
"--compress=0:filter=^/java.base/java/lang/*");
316
}
317
318
// compress 1
319
{
320
testCompress(helper, "compress1filtercmdcomposite2",
321
"--compress=1:filter=^/java.base/java/lang/*");
322
}
323
324
// compress 2
325
{
326
testCompress(helper, "compress2filtercmdcomposite2",
327
"--compress=2:filter=^/java.base/java/lang/*");
328
}
329
330
// invalid compress level
331
{
332
String[] userOptions = {"--compress", "invalid"};
333
String moduleName = "invalidCompressLevel";
334
helper.generateDefaultJModule(moduleName, "composite2");
335
helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: Invalid compression level invalid");
336
}
337
338
// orphan argument - JDK-8166810
339
{
340
String[] userOptions = {"--compress", "2", "foo" };
341
String moduleName = "orphanarg1";
342
helper.generateDefaultJModule(moduleName, "composite2");
343
helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: foo");
344
}
345
346
// orphan argument - JDK-8166810
347
{
348
String[] userOptions = {"--output", "foo", "bar" };
349
String moduleName = "orphanarg2";
350
helper.generateDefaultJModule(moduleName, "composite2");
351
helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: bar");
352
}
353
354
// basic check for --help - JDK-8173717
355
{
356
JImageGenerator.getJLinkTask()
357
.option("--help")
358
.call().assertSuccess();
359
}
360
361
{
362
String imageDir = "bug8206962";
363
JImageGenerator.getJLinkTask()
364
.modulePath(helper.defaultModulePath())
365
.output(helper.createNewImageDir(imageDir))
366
.addMods("java.base")
367
.option("--release-info=del")
368
.call().assertFailure("Error: No key specified for delete");
369
}
370
{
371
String imageDir = "bug8240349";
372
Path imagePath = helper.createNewImageDir(imageDir);
373
JImageGenerator.getJLinkTask()
374
.modulePath(helper.defaultModulePath())
375
.output(imagePath)
376
.addMods("java.base")
377
.option("--vm=client")
378
.call().assertFailure("Error: Selected VM client doesn't exist");
379
if (!Files.notExists(imagePath)) {
380
throw new RuntimeException("bug8240349 directory not deleted");
381
}
382
}
383
}
384
385
private static void testCompress(Helper helper, String moduleName, String... userOptions) throws IOException {
386
helper.generateDefaultJModule(moduleName, "composite2");
387
Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();
388
helper.checkImage(imageDir, moduleName, null, null);
389
}
390
}
391
392