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