Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/tools/jar/multiRelease/Basic.java
41149 views
1
/*
2
* Copyright (c) 2016, 2019, 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 8186087 8196748 8212807
27
* @library /test/lib
28
* @modules java.base/jdk.internal.misc
29
* jdk.compiler
30
* jdk.jartool
31
* @build jdk.test.lib.util.FileUtils
32
* jdk.test.lib.Utils
33
* jdk.test.lib.Asserts
34
* jdk.test.lib.JDKToolFinder
35
* jdk.test.lib.JDKToolLauncher
36
* jdk.test.lib.Platform
37
* jdk.test.lib.process.*
38
* MRTestBase
39
* @run testng Basic
40
*/
41
42
import jdk.test.lib.util.FileUtils;
43
import org.testng.annotations.*;
44
45
import java.io.File;
46
import java.nio.file.Files;
47
import java.nio.file.Path;
48
import java.nio.file.Paths;
49
import java.util.List;
50
import java.util.Map;
51
import java.util.jar.JarFile;
52
import java.util.zip.ZipFile;
53
54
import static org.testng.Assert.*;
55
56
public class Basic extends MRTestBase {
57
58
@Test
59
// create a regular, non-multi-release jar
60
public void test00() throws Throwable {
61
String jarfile = "test.jar";
62
63
compile("test01"); //use same data as test01
64
65
Path classes = Paths.get("classes");
66
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".")
67
.shouldHaveExitValue(SUCCESS);
68
69
checkMultiRelease(jarfile, false);
70
71
Map<String, String[]> names = Map.of(
72
"version/Main.class",
73
new String[]{"base", "version", "Main.class"},
74
75
"version/Version.class",
76
new String[]{"base", "version", "Version.class"}
77
);
78
79
compare(jarfile, names);
80
81
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
82
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
83
}
84
85
@Test
86
// create a multi-release jar
87
public void test01() throws Throwable {
88
String jarfile = "test.jar";
89
90
compile("test01");
91
92
Path classes = Paths.get("classes");
93
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
94
"--release", "9", "-C", classes.resolve("v9").toString(), ".",
95
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
96
.shouldHaveExitValue(SUCCESS);
97
98
checkMultiRelease(jarfile, true);
99
100
Map<String, String[]> names = Map.of(
101
"version/Main.class",
102
new String[]{"base", "version", "Main.class"},
103
104
"version/Version.class",
105
new String[]{"base", "version", "Version.class"},
106
107
"META-INF/versions/9/version/Version.class",
108
new String[]{"v9", "version", "Version.class"},
109
110
"META-INF/versions/10/version/Version.class",
111
new String[]{"v10", "version", "Version.class"}
112
);
113
114
compare(jarfile, names);
115
116
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
117
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
118
}
119
120
@Test
121
public void versionFormat() throws Throwable {
122
String jarfile = "test.jar";
123
124
compile("test01");
125
126
Path classes = Paths.get("classes");
127
128
// valid
129
for (String release : List.of("10000", "09", "00010", "10")) {
130
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
131
"--release", release, "-C", classes.resolve("v10").toString(), ".")
132
.shouldHaveExitValue(SUCCESS)
133
.shouldBeEmptyIgnoreVMWarnings();
134
}
135
// invalid
136
for (String release : List.of("9.0", "8", "v9",
137
"9v", "0", "-10")) {
138
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
139
"--release", release, "-C", classes.resolve("v10").toString(), ".")
140
.shouldNotHaveExitValue(SUCCESS)
141
.shouldContain("release " + release + " not valid");
142
}
143
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
144
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
145
}
146
147
@Test
148
// update a regular jar to a multi-release jar
149
public void test02() throws Throwable {
150
String jarfile = "test.jar";
151
152
compile("test01"); //use same data as test01
153
154
Path classes = Paths.get("classes");
155
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".")
156
.shouldHaveExitValue(SUCCESS);
157
158
checkMultiRelease(jarfile, false);
159
160
jarTool("uf", jarfile,
161
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
162
.shouldHaveExitValue(SUCCESS);
163
164
checkMultiRelease(jarfile, true);
165
166
Map<String, String[]> names = Map.of(
167
"version/Main.class",
168
new String[]{"base", "version", "Main.class"},
169
170
"version/Version.class",
171
new String[]{"base", "version", "Version.class"},
172
173
"META-INF/versions/9/version/Version.class",
174
new String[]{"v9", "version", "Version.class"}
175
);
176
177
compare(jarfile, names);
178
179
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
180
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
181
}
182
183
@Test
184
// replace a base entry and a versioned entry
185
public void test03() throws Throwable {
186
String jarfile = "test.jar";
187
188
compile("test01"); //use same data as test01
189
190
Path classes = Paths.get("classes");
191
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
192
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
193
.shouldHaveExitValue(SUCCESS);
194
195
checkMultiRelease(jarfile, true);
196
197
Map<String, String[]> names = Map.of(
198
"version/Main.class",
199
new String[]{"base", "version", "Main.class"},
200
201
"version/Version.class",
202
new String[]{"base", "version", "Version.class"},
203
204
"META-INF/versions/9/version/Version.class",
205
new String[]{"v9", "version", "Version.class"}
206
);
207
208
compare(jarfile, names);
209
210
// write the v9 version/Version.class entry in base and the v10
211
// version/Version.class entry in versions/9 section
212
jarTool("uf", jarfile, "-C", classes.resolve("v9").toString(), "version",
213
"--release", "9", "-C", classes.resolve("v10").toString(), ".")
214
.shouldHaveExitValue(SUCCESS);
215
216
checkMultiRelease(jarfile, true);
217
218
names = Map.of(
219
"version/Main.class",
220
new String[]{"base", "version", "Main.class"},
221
222
"version/Version.class",
223
new String[]{"v9", "version", "Version.class"},
224
225
"META-INF/versions/9/version/Version.class",
226
new String[]{"v10", "version", "Version.class"}
227
);
228
229
compare(jarfile, names);
230
231
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
232
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
233
}
234
235
/*
236
* The following tests exercise the jar validator
237
*/
238
239
@Test
240
// META-INF/versions/9 class has different api than base class
241
public void test04() throws Throwable {
242
String jarfile = "test.jar";
243
244
compile("test01"); //use same data as test01
245
246
Path classes = Paths.get("classes");
247
248
// replace the v9 class
249
Path source = Paths.get(src, "data", "test04", "v9", "version");
250
javac(classes.resolve("v9"), source.resolve("Version.java"));
251
252
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
253
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
254
.shouldNotHaveExitValue(SUCCESS)
255
.shouldContain("different api from earlier");
256
257
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
258
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
259
}
260
261
@Test
262
// META-INF/versions/9 contains an extra public class
263
public void test05() throws Throwable {
264
String jarfile = "test.jar";
265
266
compile("test01"); //use same data as test01
267
268
Path classes = Paths.get("classes");
269
270
// add the new v9 class
271
Path source = Paths.get(src, "data", "test05", "v9", "version");
272
javac(classes.resolve("v9"), source.resolve("Extra.java"));
273
274
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
275
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
276
.shouldNotHaveExitValue(SUCCESS)
277
.shouldContain("contains a new public class");
278
279
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
280
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
281
}
282
283
@Test
284
// META-INF/versions/9 contains an extra package private class -- this is okay
285
public void test06() throws Throwable {
286
String jarfile = "test.jar";
287
288
compile("test01"); //use same data as test01
289
290
Path classes = Paths.get("classes");
291
292
// add the new v9 class
293
Path source = Paths.get(src, "data", "test06", "v9", "version");
294
javac(classes.resolve("v9"), source.resolve("Extra.java"));
295
296
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
297
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
298
.shouldHaveExitValue(SUCCESS);
299
300
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
301
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
302
}
303
304
@Test
305
// META-INF/versions/9 contains an identical class to base entry class
306
// this is okay but produces warning
307
public void test07() throws Throwable {
308
String jarfile = "test.jar";
309
310
compile("test01"); //use same data as test01
311
312
Path classes = Paths.get("classes");
313
314
// add the new v9 class
315
Path source = Paths.get(src, "data", "test01", "base", "version");
316
javac(classes.resolve("v9"), source.resolve("Version.java"));
317
318
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
319
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
320
.shouldHaveExitValue(SUCCESS)
321
.shouldContain("contains a class that")
322
.shouldContain("is identical");
323
324
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
325
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
326
}
327
328
@Test
329
// META-INF/versions/9 contains an identical class to previous version entry class
330
// this is okay but produces warning
331
public void identicalClassToPreviousVersion() throws Throwable {
332
String jarfile = "test.jar";
333
334
compile("test01"); //use same data as test01
335
336
Path classes = Paths.get("classes");
337
338
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
339
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
340
.shouldHaveExitValue(SUCCESS)
341
.shouldBeEmptyIgnoreVMWarnings();
342
jarTool("uf", jarfile,
343
"--release", "10", "-C", classes.resolve("v9").toString(), ".")
344
.shouldHaveExitValue(SUCCESS)
345
.shouldContain("contains a class that")
346
.shouldContain("is identical");
347
348
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
349
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
350
}
351
352
@Test
353
// a class with an internal name different from the external name
354
public void test09() throws Throwable {
355
String jarfile = "test.jar";
356
357
compile("test01"); //use same data as test01
358
359
Path classes = Paths.get("classes");
360
361
Path base = classes.resolve("base").resolve("version");
362
363
Files.copy(base.resolve("Main.class"), base.resolve("Foo.class"));
364
365
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
366
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
367
.shouldNotHaveExitValue(SUCCESS)
368
.shouldContain("names do not match");
369
370
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
371
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
372
}
373
374
@Test
375
// assure that basic nested classes are acceptable
376
public void test10() throws Throwable {
377
String jarfile = "test.jar";
378
379
compile("test01"); //use same data as test01
380
381
Path classes = Paths.get("classes");
382
383
// add a base class with a nested class
384
Path source = Paths.get(src, "data", "test10", "base", "version");
385
javac(classes.resolve("base"), source.resolve("Nested.java"));
386
387
// add a versioned class with a nested class
388
source = Paths.get(src, "data", "test10", "v9", "version");
389
javac(classes.resolve("v9"), source.resolve("Nested.java"));
390
391
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
392
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
393
.shouldHaveExitValue(SUCCESS);
394
395
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
396
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
397
}
398
399
@Test
400
// a base entry contains a nested class that doesn't have a matching top level class
401
public void test11() throws Throwable {
402
String jarfile = "test.jar";
403
404
compile("test01"); //use same data as test01
405
406
Path classes = Paths.get("classes");
407
408
// add a base class with a nested class
409
Path source = Paths.get(src, "data", "test10", "base", "version");
410
javac(classes.resolve("base"), source.resolve("Nested.java"));
411
412
// remove the top level class, thus isolating the nested class
413
Files.delete(classes.resolve("base").resolve("version").resolve("Nested.class"));
414
415
// add a versioned class with a nested class
416
source = Paths.get(src, "data", "test10", "v9", "version");
417
javac(classes.resolve("v9"), source.resolve("Nested.java"));
418
419
List<String> output = jarTool("cf", jarfile,
420
"-C", classes.resolve("base").toString(), ".",
421
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
422
.shouldNotHaveExitValue(SUCCESS)
423
.asLinesWithoutVMWarnings();
424
425
/* "META-INF/versions/9/version/Nested$nested.class" is really NOT isolated
426
assertTrue(output.size() == 4);
427
assertTrue(output.size() == 3);
428
assertTrue(output.get(0).contains("an isolated nested class"),
429
output.get(0));
430
assertTrue(output.get(1).contains("contains a new public class"),
431
output.get(1));
432
assertTrue(output.get(2).contains("an isolated nested class"),
433
output.get(2));
434
assertTrue(output.get(3).contains("invalid multi-release jar file"),
435
output.get(3));
436
assertTrue(output.get(2).contains("invalid multi-release jar file"),
437
output.get(2));
438
*/
439
440
assertTrue(output.size() == 3);
441
assertTrue(output.get(0).contains("an isolated nested class"),
442
output.get(0));
443
assertTrue(output.get(1).contains("contains a new public class"),
444
output.get(1));
445
assertTrue(output.get(2).contains("invalid multi-release jar file"),
446
output.get(2));
447
448
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
449
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
450
}
451
452
@Test
453
// a versioned entry contains a nested class that doesn't have a matching top level class
454
public void test12() throws Throwable {
455
String jarfile = "test.jar";
456
457
compile("test01"); //use same data as test01
458
459
Path classes = Paths.get("classes");
460
461
// add a base class with a nested class
462
Path source = Paths.get(src, "data", "test10", "base", "version");
463
javac(classes.resolve("base"), source.resolve("Nested.java"));
464
465
// add a versioned class with a nested class
466
source = Paths.get(src, "data", "test10", "v9", "version");
467
javac(classes.resolve("v9"), source.resolve("Nested.java"));
468
469
// remove the top level class, thus isolating the nested class
470
Files.delete(classes.resolve("v9").resolve("version").resolve("Nested.class"));
471
472
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
473
"--release", "9", "-C", classes.resolve("v9").toString(), ".")
474
.shouldNotHaveExitValue(SUCCESS)
475
.shouldContain("an isolated nested class");
476
477
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
478
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
479
}
480
481
@Test
482
// assure the nested-nested classes are acceptable
483
public void test13() throws Throwable {
484
String jarfile = "test.jar";
485
486
compile("test01"); //use same data as test01
487
488
Path classes = Paths.get("classes");
489
490
// add a base class with a nested and nested-nested class
491
Path source = Paths.get(src, "data", "test13", "base", "version");
492
javac(classes.resolve("base"), source.resolve("Nested.java"));
493
494
// add a versioned class with a nested and nested-nested class
495
source = Paths.get(src, "data", "test13", "v10", "version");
496
javac(classes.resolve("v10"), source.resolve("Nested.java"));
497
498
jarTool("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
499
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
500
.shouldHaveExitValue(SUCCESS);
501
502
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
503
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
504
}
505
506
@Test
507
public void testCustomManifest() throws Throwable {
508
String jarfile = "test.jar";
509
510
compile("test01");
511
512
Path classes = Paths.get("classes");
513
Path manifest = Paths.get("Manifest.txt");
514
515
// create
516
Files.write(manifest, "Class-Path: MyUtils.jar\n".getBytes());
517
518
jarTool("cfm", jarfile, manifest.toString(),
519
"-C", classes.resolve("base").toString(), ".",
520
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
521
.shouldHaveExitValue(SUCCESS)
522
.shouldBeEmptyIgnoreVMWarnings();
523
524
try (JarFile jf = new JarFile(new File(jarfile), true,
525
ZipFile.OPEN_READ, JarFile.runtimeVersion())) {
526
assertTrue(jf.isMultiRelease(), "Not multi-release jar");
527
assertEquals(jf.getManifest()
528
.getMainAttributes()
529
.getValue("Class-Path"),
530
"MyUtils.jar");
531
}
532
533
// update
534
Files.write(manifest, "Multi-release: false\n".getBytes());
535
536
jar("ufm", jarfile, manifest.toString(),
537
"-C", classes.resolve("base").toString(), ".",
538
"--release", "9", "-C", classes.resolve("v10").toString(), ".")
539
.shouldHaveExitValue(SUCCESS)
540
.shouldContain("WARNING: Duplicate name in Manifest: Multi-release.");
541
542
try (JarFile jf = new JarFile(new File(jarfile), true,
543
ZipFile.OPEN_READ, JarFile.runtimeVersion())) {
544
assertTrue(jf.isMultiRelease(), "Not multi-release jar");
545
assertEquals(jf.getManifest()
546
.getMainAttributes()
547
.getValue("Class-Path"),
548
"MyUtils.jar");
549
}
550
551
FileUtils.deleteFileIfExistsWithRetry(Paths.get(jarfile));
552
FileUtils.deleteFileTreeWithRetry(Paths.get(usr, "classes"));
553
}
554
}
555
556