Skip to content

Commit 70e3250

Browse files
author
Alexey Semenyuk
committed
8352419: Test tools/jpackage/share/ErrorTest.java#id0 and #id1 fail
Reviewed-by: almatvee
1 parent 296d9d6 commit 70e3250

File tree

6 files changed

+155
-52
lines changed

6 files changed

+155
-52
lines changed

test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ public PackageTest() {
7777
disabledInstallers = new HashSet<>();
7878
disabledUninstallers = new HashSet<>();
7979
excludeTypes = new HashSet<>();
80+
handlers = NATIVE.stream().collect(Collectors.toMap(v -> v, v -> new Handler()));
8081
forTypes();
8182
setExpectedExitCode(0);
8283
setExpectedInstallExitCode(0);
8384
namedInitializers = new HashSet<>();
84-
handlers = NATIVE.stream()
85-
.collect(Collectors.toMap(v -> v, v -> new Handler()));
8685
}
8786

8887
public PackageTest excludeTypes(PackageType... types) {
@@ -102,6 +101,7 @@ public PackageTest forTypes(PackageType... types) {
102101
newTypes = Stream.of(types).collect(Collectors.toSet());
103102
}
104103
currentTypes = newTypes.stream()
104+
.filter(handlers.keySet()::contains)
105105
.filter(isPackageTypeEnabled)
106106
.filter(Predicate.not(excludeTypes::contains))
107107
.collect(Collectors.toUnmodifiableSet());
@@ -456,9 +456,11 @@ protected void runAction(Action... action) {
456456
}
457457

458458
private List<Consumer<Action>> createPackageTypeHandlers() {
459+
if (handlers.keySet().stream().noneMatch(isPackageTypeEnabled)) {
460+
PackageType.throwSkippedExceptionIfNativePackagingUnavailable();
461+
}
459462
return handlers.entrySet().stream()
460463
.filter(entry -> !entry.getValue().isVoid())
461-
.filter(entry -> NATIVE.contains(entry.getKey()))
462464
.sorted(Comparator.comparing(Map.Entry::getKey))
463465
.map(entry -> {
464466
return createPackageTypeHandler(entry.getKey(), entry.getValue());

test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageType.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,21 @@
2222
*/
2323
package jdk.jpackage.test;
2424

25+
import static jdk.jpackage.internal.util.function.ExceptionBox.rethrowUnchecked;
26+
2527
import java.io.PrintWriter;
2628
import java.lang.reflect.InvocationTargetException;
2729
import java.lang.reflect.Method;
2830
import java.util.Collections;
31+
import java.util.LinkedHashSet;
32+
import java.util.List;
2933
import java.util.Objects;
3034
import java.util.Optional;
3135
import java.util.Set;
3236
import java.util.concurrent.atomic.AtomicBoolean;
3337
import java.util.stream.Collectors;
3438
import java.util.stream.Stream;
3539
import jdk.jpackage.internal.Log;
36-
import static jdk.jpackage.internal.util.function.ExceptionBox.rethrowUnchecked;
3740

3841
/**
3942
* jpackage type traits.
@@ -93,6 +96,15 @@ public String getType() {
9396
return type;
9497
}
9598

99+
public static RuntimeException throwSkippedExceptionIfNativePackagingUnavailable() {
100+
if (NATIVE.stream().noneMatch(PackageType::isSupported)) {
101+
TKit.throwSkippedException("None of the native packagers supported in this environment");
102+
} else if (NATIVE.stream().noneMatch(PackageType::isEnabled)) {
103+
TKit.throwSkippedException("All native packagers supported in this environment are disabled");
104+
}
105+
return null;
106+
}
107+
96108
private static boolean isBundlerSupportedImpl(String bundlerClass) {
97109
try {
98110
Class<?> clazz = Class.forName(bundlerClass);
@@ -131,14 +143,18 @@ private static boolean isBundlerSupported(String bundlerClass) {
131143
return reply.get();
132144
}
133145

146+
private static Set<PackageType> orderedSet(PackageType... types) {
147+
return new LinkedHashSet<>(List.of(types));
148+
}
149+
134150
private final String type;
135151
private final String suffix;
136152
private final boolean enabled;
137153
private final boolean supported;
138154

139-
public static final Set<PackageType> LINUX = Set.of(LINUX_DEB, LINUX_RPM);
140-
public static final Set<PackageType> WINDOWS = Set.of(WIN_EXE, WIN_MSI);
141-
public static final Set<PackageType> MAC = Set.of(MAC_PKG, MAC_DMG);
155+
public static final Set<PackageType> LINUX = orderedSet(LINUX_DEB, LINUX_RPM);
156+
public static final Set<PackageType> WINDOWS = orderedSet(WIN_MSI, WIN_EXE);
157+
public static final Set<PackageType> MAC = orderedSet(MAC_DMG, MAC_PKG);
142158
public static final Set<PackageType> NATIVE = Stream.concat(
143159
Stream.concat(LINUX.stream(), WINDOWS.stream()),
144160
MAC.stream()).collect(Collectors.toUnmodifiableSet());

test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.text.SimpleDateFormat;
4444
import java.util.ArrayList;
4545
import java.util.Arrays;
46+
import java.util.Base64;
4647
import java.util.Collection;
4748
import java.util.Collections;
4849
import java.util.Comparator;
@@ -518,9 +519,9 @@ public static RuntimeException throwUnknownPlatformError() {
518519
}
519520

520521
public static RuntimeException throwSkippedException(String reason) {
521-
RuntimeException ex = ThrowingSupplier.toSupplier(
522-
() -> (RuntimeException) Class.forName("jtreg.SkippedException").getConstructor(
523-
String.class).newInstance(reason)).get();
522+
RuntimeException ex = ThrowingSupplier.toSupplier(() -> {
523+
return JtregSkippedExceptionClass.INSTANCE.getConstructor(String.class).newInstance(reason);
524+
}).get();
524525
return throwSkippedException(ex);
525526
}
526527

@@ -1140,4 +1141,30 @@ static Set<String> tokenizeConfigProperty(String propertyName) {
11401141
VERBOSE_TEST_SETUP = isNonOf.test(Set.of("init", "i"));
11411142
}
11421143
}
1144+
1145+
private static final class JtregSkippedExceptionClass extends ClassLoader {
1146+
@SuppressWarnings("unchecked")
1147+
JtregSkippedExceptionClass() {
1148+
super(TKit.class.getClassLoader());
1149+
1150+
final byte[] bytes = Base64.getDecoder().decode(
1151+
// Base64-encoded "jtreg/SkippedException.class" file
1152+
// emitted by jdk8's javac from "$OPEN_JDK/test/lib/jtreg/SkippedException.java"
1153+
"yv66vgAAADQAFQoABAARCgAEABIHABMHABQBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0"
1154+
+ "YW50VmFsdWUFErH6BHk+kr0BAAY8aW5pdD4BACooTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFu"
1155+
+ "Zy9UaHJvd2FibGU7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAVKExqYXZhL2xhbmcvU3Ry"
1156+
+ "aW5nOylWAQAKU291cmNlRmlsZQEAFVNraXBwZWRFeGNlcHRpb24uamF2YQwACgALDAAKAA4BABZq"
1157+
+ "dHJlZy9Ta2lwcGVkRXhjZXB0aW9uAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24AMQADAAQA"
1158+
+ "AAABABoABQAGAAEABwAAAAIACAACAAEACgALAAEADAAAACMAAwADAAAAByorLLcAAbEAAAABAA0A"
1159+
+ "AAAKAAIAAAAiAAYAIwABAAoADgABAAwAAAAiAAIAAgAAAAYqK7cAArEAAAABAA0AAAAKAAIAAAAm"
1160+
+ "AAUAJwABAA8AAAACABA");
1161+
1162+
clazz = (Class<RuntimeException>)defineClass("jtreg.SkippedException", bytes, 0, bytes.length);
1163+
}
1164+
1165+
private final Class<RuntimeException> clazz;
1166+
1167+
static final Class<RuntimeException> INSTANCE = new JtregSkippedExceptionClass().clazz;
1168+
1169+
}
11431170
}

test/jdk/tools/jpackage/share/ErrorTest.java

Lines changed: 100 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import java.util.regex.Pattern;
4242
import java.util.stream.Stream;
4343
import jdk.jpackage.internal.util.TokenReplace;
44-
import jdk.jpackage.test.Annotations.Parameter;
4544
import jdk.jpackage.test.Annotations.ParameterSupplier;
4645
import jdk.jpackage.test.Annotations.Test;
4746
import jdk.jpackage.test.CannedFormattedString;
@@ -119,13 +118,71 @@ private static String makeToken(String v) {
119118
private final TokenReplace tokenReplace = new TokenReplace(token());
120119
}
121120

122-
public record TestSpec(Optional<PackageType> type, Optional<String> appDesc, List<String> addArgs,
121+
record PackageTypeSpec(Optional<PackageType> type, boolean anyNativeType) implements CannedFormattedString.CannedArgument {
122+
PackageTypeSpec {
123+
Objects.requireNonNull(type);
124+
if (type.isPresent() && anyNativeType) {
125+
throw new IllegalArgumentException();
126+
}
127+
}
128+
129+
PackageTypeSpec(PackageType type) {
130+
this(Optional.of(type), false);
131+
}
132+
133+
boolean isSupported() {
134+
if (anyNativeType) {
135+
return NATIVE_TYPE.isPresent();
136+
} else {
137+
return type.orElseThrow().isSupported();
138+
}
139+
}
140+
141+
PackageType resolvedType() {
142+
return type.or(() -> NATIVE_TYPE).orElseThrow(PackageType::throwSkippedExceptionIfNativePackagingUnavailable);
143+
}
144+
145+
@Override
146+
public String value() {
147+
return resolvedType().getType();
148+
}
149+
150+
@Override
151+
public final String toString() {
152+
if (anyNativeType) {
153+
return "NATIVE";
154+
} else {
155+
return type.orElseThrow().toString();
156+
}
157+
}
158+
159+
private static Optional<PackageType> defaultNativeType() {
160+
final Collection<PackageType> nativeTypes;
161+
if (TKit.isLinux()) {
162+
nativeTypes = PackageType.LINUX;
163+
} else if (TKit.isOSX()) {
164+
nativeTypes = PackageType.MAC;
165+
} else if (TKit.isWindows()) {
166+
nativeTypes = List.of(PackageType.WIN_MSI);
167+
} else {
168+
throw TKit.throwUnknownPlatformError();
169+
}
170+
171+
return nativeTypes.stream().filter(PackageType::isSupported).findFirst();
172+
}
173+
174+
static final PackageTypeSpec NATIVE = new PackageTypeSpec(Optional.empty(), true);
175+
176+
private static final Optional<PackageType> NATIVE_TYPE = defaultNativeType();
177+
}
178+
179+
public record TestSpec(Optional<PackageTypeSpec> type, Optional<String> appDesc, List<String> addArgs,
123180
List<String> removeArgs, List<CannedFormattedString> expectedErrors) {
124181

125182
static final class Builder {
126183

127184
Builder type(PackageType v) {
128-
type = v;
185+
type = Optional.ofNullable(v).map(PackageTypeSpec::new).orElse(null);
129186
return this;
130187
}
131188

@@ -134,7 +191,8 @@ Builder notype() {
134191
}
135192

136193
Builder nativeType() {
137-
return type(NATIVE_TYPE);
194+
type = PackageTypeSpec.NATIVE;
195+
return this;
138196
}
139197

140198
Builder appDesc(String v) {
@@ -207,7 +265,8 @@ Builder error(String key, Object ... args) {
207265
}
208266

209267
Builder invalidTypeArg(String arg, String... otherArgs) {
210-
return addArgs(arg).addArgs(otherArgs).error("ERR_InvalidTypeOption", arg, type.getType());
268+
Objects.requireNonNull(type);
269+
return addArgs(arg).addArgs(otherArgs).error("ERR_InvalidTypeOption", arg, type);
211270
}
212271

213272
Builder unsupportedPlatformOption(String arg, String ... otherArgs) {
@@ -219,7 +278,7 @@ TestSpec create() {
219278
List.copyOf(addArgs), List.copyOf(removeArgs), List.copyOf(expectedErrors));
220279
}
221280

222-
private PackageType type = PackageType.IMAGE;
281+
private PackageTypeSpec type = new PackageTypeSpec(PackageType.IMAGE);
223282
private String appDesc = DEFAULT_APP_DESC;
224283
private List<String> addArgs = new ArrayList<>();
225284
private List<String> removeArgs = new ArrayList<>();
@@ -242,9 +301,13 @@ void test() {
242301
test(Map.of());
243302
}
244303

304+
boolean isSupported() {
305+
return type.map(PackageTypeSpec::isSupported).orElse(true);
306+
}
307+
245308
void test(Map<Token, Function<JPackageCommand, Object>> tokenValueSuppliers) {
246309
final var cmd = appDesc.map(JPackageCommand::helloAppImage).orElseGet(JPackageCommand::new);
247-
type.ifPresent(cmd::setPackageType);
310+
type.map(PackageTypeSpec::resolvedType).ifPresent(cmd::setPackageType);
248311

249312
removeArgs.forEach(cmd::removeArgumentWithValue);
250313
cmd.addArguments(addArgs);
@@ -407,6 +470,7 @@ public static Collection<Object[]> invalidAppVersion() {
407470

408471
@Test
409472
@ParameterSupplier("basic")
473+
@ParameterSupplier("testRuntimeInstallerInvalidOptions")
410474
@ParameterSupplier(value="testWindows", ifOS = WINDOWS)
411475
@ParameterSupplier(value="testMac", ifOS = MACOS)
412476
@ParameterSupplier(value="testLinux", ifOS = LINUX)
@@ -418,19 +482,27 @@ public static void test(TestSpec spec) {
418482
spec.test();
419483
}
420484

421-
@Test
422-
@Parameter({"--input", "foo"})
423-
@Parameter({"--module-path", "dir"})
424-
@Parameter({"--add-modules", "java.base"})
425-
@Parameter({"--main-class", "Hello"})
426-
@Parameter({"--arguments", "foo"})
427-
@Parameter({"--java-options", "-Dfoo.bar=10"})
428-
@Parameter({"--add-launcher", "foo=foo.properties"})
429-
@Parameter({"--app-content", "dir"})
430-
@Parameter(value="--win-console", ifOS = WINDOWS)
431-
public static void testRuntimeInstallerInvalidOptions(String... args) {
432-
testSpec().noAppDesc().nativeType().addArgs("--runtime-image", Token.JAVA_HOME.token()).addArgs(args)
433-
.error("ERR_NoInstallerEntryPoint", args[0]).create().test();
485+
public static Collection<Object[]> testRuntimeInstallerInvalidOptions() {
486+
Stream<List<String>> argsStream = Stream.of(
487+
List.of("--input", "foo"),
488+
List.of("--module-path", "dir"),
489+
List.of("--add-modules", "java.base"),
490+
List.of("--main-class", "Hello"),
491+
List.of("--arguments", "foo"),
492+
List.of("--java-options", "-Dfoo.bar=10"),
493+
List.of("--add-launcher", "foo=foo.properties"),
494+
List.of("--app-content", "dir"));
495+
496+
if (TKit.isWindows()) {
497+
argsStream = Stream.concat(argsStream, Stream.of(List.of("--win-console")));
498+
}
499+
500+
return fromTestSpecBuilders(argsStream.map(args -> {
501+
return testSpec().noAppDesc().nativeType()
502+
.addArgs("--runtime-image", Token.JAVA_HOME.token())
503+
.addArgs(args)
504+
.error("ERR_NoInstallerEntryPoint", args.getFirst());
505+
}));
434506
}
435507

436508
@Test
@@ -567,9 +639,7 @@ public static Collection<Object[]> testLinux() {
567639
testSpec().type(PackageType.LINUX_RPM).addArgs("--linux-package-name", "#")
568640
.error("error.rpm-invalid-value-for-package-name", "#")
569641
.error("error.rpm-invalid-value-for-package-name.advice")
570-
).map(TestSpec.Builder::create).filter(spec -> {
571-
return spec.type().orElseThrow().isSupported();
572-
}).toList());
642+
).map(TestSpec.Builder::create).toList());
573643

574644
return toTestArgs(testCases.stream());
575645
}
@@ -669,20 +739,14 @@ private static void defaultInit(JPackageCommand cmd, List<CannedFormattedString>
669739
cmd.validateOutput(expectedErrors.toArray(CannedFormattedString[]::new));
670740
}
671741

672-
private static PackageType defaultNativeType() {
673-
if (TKit.isLinux()) {
674-
return PackageType.LINUX.stream().filter(PackageType::isSupported).findFirst().orElseThrow();
675-
} else if (TKit.isOSX()) {
676-
return PackageType.MAC_DMG;
677-
} else if (TKit.isWindows()) {
678-
return PackageType.WIN_MSI;
679-
} else {
680-
throw new UnsupportedOperationException();
681-
}
682-
}
683-
684742
private static <T> Collection<Object[]> toTestArgs(Stream<T> stream) {
685-
return stream.map(v -> {
743+
return stream.filter(v -> {
744+
if (v instanceof TestSpec ts) {
745+
return ts.isSupported();
746+
} else {
747+
return true;
748+
}
749+
}).map(v -> {
686750
return new Object[] {v};
687751
}).toList();
688752
}
@@ -696,6 +760,4 @@ private static String adjustTextStreamVerifierArg(String str) {
696760
}
697761

698762
private static final Pattern LINE_SEP_REGEXP = Pattern.compile("\\R");
699-
700-
private static final PackageType NATIVE_TYPE = defaultNativeType();
701763
}

test/jdk/tools/jpackage/share/ServiceTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@
4545
* @test
4646
* @summary Launcher as service packaging test
4747
* @library /test/jdk/tools/jpackage/helpers
48-
* @library /test/lib
4948
* @build jdk.jpackage.test.*
50-
* @build jtreg.SkippedException
5149
* @key jpackagePlatformPackage
5250
* @compile -Xlint:all -Werror ServiceTest.java
5351
* @run main/othervm/timeout=360 -Xmx512m

test/jdk/tools/jpackage/windows/WinLongPathTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,8 @@
4040
* @bug 8289771
4141
* @summary jpackage with long paths on windows
4242
* @library /test/jdk/tools/jpackage/helpers
43-
* @library /test/lib
4443
* @key jpackagePlatformPackage
4544
* @build jdk.jpackage.test.*
46-
* @build jtreg.SkippedException
4745
* @requires (os.family == "windows")
4846
* @compile -Xlint:all -Werror WinLongPathTest.java
4947
* @run main/othervm/timeout=540 -Xmx512m jdk.jpackage.test.Main

0 commit comments

Comments
 (0)