Skip to content

Commit 3e86b3a

Browse files
author
Alexey Semenyuk
committed
8350013: Add a test for JDK-8150442
Reviewed-by: almatvee
1 parent a21302b commit 3e86b3a

File tree

8 files changed

+1715
-477
lines changed

8 files changed

+1715
-477
lines changed

test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java

Lines changed: 894 additions & 0 deletions
Large diffs are not rendered by default.

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import java.io.FileOutputStream;
2727
import java.io.IOException;
28+
import java.nio.charset.StandardCharsets;
2829
import java.nio.file.Files;
2930
import java.nio.file.Path;
3031
import java.security.SecureRandom;
@@ -77,6 +78,7 @@ public JPackageCommand(JPackageCommand cmd) {
7778
appLayoutAsserts = cmd.appLayoutAsserts;
7879
outputValidator = cmd.outputValidator;
7980
executeInDirectory = cmd.executeInDirectory;
81+
winMsiLogFile = cmd.winMsiLogFile;
8082
}
8183

8284
JPackageCommand createImmutableCopy() {
@@ -998,6 +1000,22 @@ JPackageCommand setUnpackedPackageLocation(Path path) {
9981000
return this;
9991001
}
10001002

1003+
JPackageCommand winMsiLogFile(Path v) {
1004+
this.winMsiLogFile = v;
1005+
return this;
1006+
}
1007+
1008+
public Optional<Path> winMsiLogFile() {
1009+
return Optional.ofNullable(winMsiLogFile);
1010+
}
1011+
1012+
public Optional<Stream<String>> winMsiLogFileContents() {
1013+
return winMsiLogFile().map(ThrowingFunction.toFunction(msiLog -> {
1014+
// MSI log files are UTF16LE-encoded
1015+
return Files.lines(msiLog, StandardCharsets.UTF_16LE);
1016+
}));
1017+
}
1018+
10011019
private JPackageCommand adjustArgumentsBeforeExecution() {
10021020
if (!isWithToolProvider()) {
10031021
// if jpackage is launched as a process then set the jlink.debug system property
@@ -1175,6 +1193,7 @@ public void run() {
11751193
private final Actions prerequisiteActions;
11761194
private final Actions verifyActions;
11771195
private Path executeInDirectory;
1196+
private Path winMsiLogFile;
11781197
private Set<AppLayoutAssert> appLayoutAsserts = Set.of(AppLayoutAssert.values());
11791198
private Consumer<Stream<String>> outputValidator;
11801199
private static boolean defaultWithToolProvider;

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

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -195,58 +195,61 @@ public static String getBundleProperty(JPackageCommand cmd,
195195
}
196196

197197
static PackageHandlers createDebPackageHandlers() {
198-
PackageHandlers deb = new PackageHandlers();
199-
deb.installHandler = cmd -> {
200-
cmd.verifyIsOfType(PackageType.LINUX_DEB);
201-
Executor.of("sudo", "dpkg", "-i")
202-
.addArgument(cmd.outputBundle())
203-
.execute();
204-
};
205-
deb.uninstallHandler = cmd -> {
206-
cmd.verifyIsOfType(PackageType.LINUX_DEB);
207-
var packageName = getPackageName(cmd);
208-
String script = String.format("! dpkg -s %s || sudo dpkg -r %s",
209-
packageName, packageName);
210-
Executor.of("sh", "-c", script).execute();
211-
};
212-
deb.unpackHandler = (cmd, destinationDir) -> {
213-
cmd.verifyIsOfType(PackageType.LINUX_DEB);
214-
Executor.of("dpkg", "-x")
215-
.addArgument(cmd.outputBundle())
216-
.addArgument(destinationDir)
217-
.execute();
218-
return destinationDir;
219-
};
220-
return deb;
198+
return new PackageHandlers(LinuxHelper::installDeb, LinuxHelper::uninstallDeb, LinuxHelper::unpackDeb);
199+
}
200+
201+
private static int installDeb(JPackageCommand cmd) {
202+
cmd.verifyIsOfType(PackageType.LINUX_DEB);
203+
return Executor.of("sudo", "dpkg", "-i")
204+
.addArgument(cmd.outputBundle())
205+
.execute().getExitCode();
206+
}
207+
208+
private static void uninstallDeb(JPackageCommand cmd) {
209+
cmd.verifyIsOfType(PackageType.LINUX_DEB);
210+
var packageName = getPackageName(cmd);
211+
String script = String.format("! dpkg -s %s || sudo dpkg -r %s",
212+
packageName, packageName);
213+
Executor.of("sh", "-c", script).execute();
214+
}
215+
216+
private static Path unpackDeb(JPackageCommand cmd, Path destinationDir) {
217+
cmd.verifyIsOfType(PackageType.LINUX_DEB);
218+
Executor.of("dpkg", "-x")
219+
.addArgument(cmd.outputBundle())
220+
.addArgument(destinationDir)
221+
.execute(0);
222+
return destinationDir;
221223
}
222224

223225
static PackageHandlers createRpmPackageHandlers() {
224-
PackageHandlers rpm = new PackageHandlers();
225-
rpm.installHandler = cmd -> {
226-
cmd.verifyIsOfType(PackageType.LINUX_RPM);
227-
Executor.of("sudo", "rpm", "-U")
228-
.addArgument(cmd.outputBundle())
229-
.execute();
230-
};
231-
rpm.uninstallHandler = cmd -> {
232-
cmd.verifyIsOfType(PackageType.LINUX_RPM);
233-
var packageName = getPackageName(cmd);
234-
String script = String.format("! rpm -q %s || sudo rpm -e %s",
235-
packageName, packageName);
236-
Executor.of("sh", "-c", script).execute();
237-
};
238-
rpm.unpackHandler = (cmd, destinationDir) -> {
239-
cmd.verifyIsOfType(PackageType.LINUX_RPM);
240-
Executor.of("sh", "-c", String.format(
241-
"rpm2cpio '%s' | cpio -idm --quiet",
242-
JPackageCommand.escapeAndJoin(
243-
cmd.outputBundle().toAbsolutePath().toString())))
244-
.setDirectory(destinationDir)
245-
.execute();
246-
return destinationDir;
247-
};
226+
return new PackageHandlers(LinuxHelper::installRpm, LinuxHelper::uninstallRpm, LinuxHelper::unpackRpm);
227+
}
248228

249-
return rpm;
229+
private static int installRpm(JPackageCommand cmd) {
230+
cmd.verifyIsOfType(PackageType.LINUX_RPM);
231+
return Executor.of("sudo", "rpm", "-U")
232+
.addArgument(cmd.outputBundle())
233+
.execute().getExitCode();
234+
}
235+
236+
private static void uninstallRpm(JPackageCommand cmd) {
237+
cmd.verifyIsOfType(PackageType.LINUX_RPM);
238+
var packageName = getPackageName(cmd);
239+
String script = String.format("! rpm -q %s || sudo rpm -e %s",
240+
packageName, packageName);
241+
Executor.of("sh", "-c", script).execute();
242+
}
243+
244+
private static Path unpackRpm(JPackageCommand cmd, Path destinationDir) {
245+
cmd.verifyIsOfType(PackageType.LINUX_RPM);
246+
Executor.of("sh", "-c", String.format(
247+
"rpm2cpio '%s' | cpio -idm --quiet",
248+
JPackageCommand.escapeAndJoin(
249+
cmd.outputBundle().toAbsolutePath().toString())))
250+
.setDirectory(destinationDir)
251+
.execute(0);
252+
return destinationDir;
250253
}
251254

252255
static Path getLauncherPath(JPackageCommand cmd) {

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

Lines changed: 94 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -150,113 +150,115 @@ public static PListWrapper readPList(Stream<String> lines) {
150150
}
151151

152152
static PackageHandlers createDmgPackageHandlers() {
153-
PackageHandlers dmg = new PackageHandlers();
153+
return new PackageHandlers(MacHelper::installDmg, MacHelper::uninstallDmg, MacHelper::unpackDmg);
154+
}
154155

155-
dmg.installHandler = cmd -> {
156-
withExplodedDmg(cmd, dmgImage -> {
157-
Executor.of("sudo", "cp", "-r")
158-
.addArgument(dmgImage)
159-
.addArgument(getInstallationDirectory(cmd).getParent())
160-
.execute();
161-
});
162-
};
163-
dmg.unpackHandler = (cmd, destinationDir) -> {
164-
Path unpackDir = destinationDir.resolve(
165-
TKit.removeRootFromAbsolutePath(
166-
getInstallationDirectory(cmd)).getParent());
167-
try {
168-
Files.createDirectories(unpackDir);
169-
} catch (IOException ex) {
170-
throw new RuntimeException(ex);
171-
}
156+
private static int installDmg(JPackageCommand cmd) {
157+
cmd.verifyIsOfType(PackageType.MAC_DMG);
158+
withExplodedDmg(cmd, dmgImage -> {
159+
Executor.of("sudo", "cp", "-r")
160+
.addArgument(dmgImage)
161+
.addArgument(getInstallationDirectory(cmd).getParent())
162+
.execute(0);
163+
});
164+
return 0;
165+
}
172166

173-
withExplodedDmg(cmd, dmgImage -> {
174-
Executor.of("cp", "-r")
175-
.addArgument(dmgImage)
176-
.addArgument(unpackDir)
177-
.execute();
178-
});
179-
return destinationDir;
180-
};
181-
dmg.uninstallHandler = cmd -> {
182-
cmd.verifyIsOfType(PackageType.MAC_DMG);
183-
Executor.of("sudo", "rm", "-rf")
184-
.addArgument(cmd.appInstallationDirectory())
185-
.execute();
186-
};
167+
private static void uninstallDmg(JPackageCommand cmd) {
168+
cmd.verifyIsOfType(PackageType.MAC_DMG);
169+
Executor.of("sudo", "rm", "-rf")
170+
.addArgument(cmd.appInstallationDirectory())
171+
.execute();
172+
}
173+
174+
private static Path unpackDmg(JPackageCommand cmd, Path destinationDir) {
175+
cmd.verifyIsOfType(PackageType.MAC_DMG);
176+
Path unpackDir = destinationDir.resolve(
177+
TKit.removeRootFromAbsolutePath(
178+
getInstallationDirectory(cmd)).getParent());
179+
try {
180+
Files.createDirectories(unpackDir);
181+
} catch (IOException ex) {
182+
throw new RuntimeException(ex);
183+
}
187184

188-
return dmg;
185+
withExplodedDmg(cmd, dmgImage -> {
186+
Executor.of("cp", "-r")
187+
.addArgument(dmgImage)
188+
.addArgument(unpackDir)
189+
.execute();
190+
});
191+
return destinationDir;
189192
}
190193

191194
static PackageHandlers createPkgPackageHandlers() {
192-
PackageHandlers pkg = new PackageHandlers();
195+
return new PackageHandlers(MacHelper::installPkg, MacHelper::uninstallPkg, MacHelper::unpackPkg);
196+
}
197+
198+
private static int installPkg(JPackageCommand cmd) {
199+
cmd.verifyIsOfType(PackageType.MAC_PKG);
200+
return Executor.of("sudo", "/usr/sbin/installer", "-allowUntrusted", "-pkg")
201+
.addArgument(cmd.outputBundle())
202+
.addArguments("-target", "/")
203+
.execute().getExitCode();
204+
}
193205

194-
pkg.installHandler = cmd -> {
195-
cmd.verifyIsOfType(PackageType.MAC_PKG);
196-
Executor.of("sudo", "/usr/sbin/installer", "-allowUntrusted", "-pkg")
197-
.addArgument(cmd.outputBundle())
198-
.addArguments("-target", "/")
206+
private static void uninstallPkg(JPackageCommand cmd) {
207+
cmd.verifyIsOfType(PackageType.MAC_PKG);
208+
if (Files.exists(getUninstallCommand(cmd))) {
209+
Executor.of("sudo", "/bin/sh",
210+
getUninstallCommand(cmd).toString()).execute();
211+
} else {
212+
Executor.of("sudo", "rm", "-rf")
213+
.addArgument(cmd.appInstallationDirectory())
199214
.execute();
200-
};
201-
pkg.unpackHandler = (cmd, destinationDir) -> {
202-
cmd.verifyIsOfType(PackageType.MAC_PKG);
215+
}
216+
}
203217

204-
var dataDir = destinationDir.resolve("data");
218+
private static Path unpackPkg(JPackageCommand cmd, Path destinationDir) {
219+
cmd.verifyIsOfType(PackageType.MAC_PKG);
205220

206-
Executor.of("pkgutil", "--expand")
207-
.addArgument(cmd.outputBundle())
208-
.addArgument(dataDir) // We need non-existing folder
209-
.execute();
221+
var dataDir = destinationDir.resolve("data");
210222

211-
final Path unpackRoot = destinationDir.resolve("unpacked");
212-
213-
// Unpack all ".pkg" files from $dataDir folder in $unpackDir folder
214-
try (var dataListing = Files.list(dataDir)) {
215-
dataListing.filter(file -> {
216-
return ".pkg".equals(PathUtils.getSuffix(file.getFileName()));
217-
}).forEach(ThrowingConsumer.toConsumer(pkgDir -> {
218-
// Installation root of the package is stored in
219-
// /pkg-info@install-location attribute in $pkgDir/PackageInfo xml file
220-
var doc = createDocumentBuilder().parse(
221-
new ByteArrayInputStream(Files.readAllBytes(
222-
pkgDir.resolve("PackageInfo"))));
223-
var xPath = XPathFactory.newInstance().newXPath();
224-
225-
final String installRoot = (String) xPath.evaluate(
226-
"/pkg-info/@install-location", doc,
227-
XPathConstants.STRING);
228-
229-
final Path unpackDir = unpackRoot.resolve(
230-
TKit.removeRootFromAbsolutePath(Path.of(installRoot)));
231-
232-
Files.createDirectories(unpackDir);
233-
234-
Executor.of("tar", "-C")
235-
.addArgument(unpackDir)
236-
.addArgument("-xvf")
237-
.addArgument(pkgDir.resolve("Payload"))
238-
.execute();
239-
}));
240-
} catch (IOException ex) {
241-
throw new RuntimeException(ex);
242-
}
223+
Executor.of("pkgutil", "--expand")
224+
.addArgument(cmd.outputBundle())
225+
.addArgument(dataDir) // We need non-existing folder
226+
.execute();
243227

244-
return unpackRoot;
245-
};
246-
pkg.uninstallHandler = cmd -> {
247-
cmd.verifyIsOfType(PackageType.MAC_PKG);
228+
final Path unpackRoot = destinationDir.resolve("unpacked");
248229

249-
if (Files.exists(getUninstallCommand(cmd))) {
250-
Executor.of("sudo", "/bin/sh",
251-
getUninstallCommand(cmd).toString()).execute();
252-
} else {
253-
Executor.of("sudo", "rm", "-rf")
254-
.addArgument(cmd.appInstallationDirectory())
230+
// Unpack all ".pkg" files from $dataDir folder in $unpackDir folder
231+
try (var dataListing = Files.list(dataDir)) {
232+
dataListing.filter(file -> {
233+
return ".pkg".equals(PathUtils.getSuffix(file.getFileName()));
234+
}).forEach(ThrowingConsumer.toConsumer(pkgDir -> {
235+
// Installation root of the package is stored in
236+
// /pkg-info@install-location attribute in $pkgDir/PackageInfo xml file
237+
var doc = createDocumentBuilder().parse(
238+
new ByteArrayInputStream(Files.readAllBytes(
239+
pkgDir.resolve("PackageInfo"))));
240+
var xPath = XPathFactory.newInstance().newXPath();
241+
242+
final String installRoot = (String) xPath.evaluate(
243+
"/pkg-info/@install-location", doc,
244+
XPathConstants.STRING);
245+
246+
final Path unpackDir = unpackRoot.resolve(
247+
TKit.removeRootFromAbsolutePath(Path.of(installRoot)));
248+
249+
Files.createDirectories(unpackDir);
250+
251+
Executor.of("tar", "-C")
252+
.addArgument(unpackDir)
253+
.addArgument("-xvf")
254+
.addArgument(pkgDir.resolve("Payload"))
255255
.execute();
256-
}
257-
};
256+
}));
257+
} catch (IOException ex) {
258+
throw new RuntimeException(ex);
259+
}
258260

259-
return pkg;
261+
return unpackRoot;
260262
}
261263

262264
static void verifyBundleStructure(JPackageCommand cmd) {

0 commit comments

Comments
 (0)