< prev index next >
test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java
Print this page
*** 24,61 ****
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WindowsHelper {
static String getBundleName(JPackageCommand cmd) {
cmd.verifyIsOfType(PackageType.WINDOWS);
return String.format("%s-%s%s", cmd.name(), cmd.version(),
cmd.packageType().getSuffix());
}
static Path getInstallationDirectory(JPackageCommand cmd) {
! cmd.verifyIsOfType(PackageType.WINDOWS);
! Path installDir = Path.of(
! cmd.getArgumentValue("--install-dir", () -> cmd.name()));
if (isUserLocalInstall(cmd)) {
! return USER_LOCAL.resolve(installDir);
}
! return PROGRAM_FILES.resolve(installDir);
}
private static boolean isUserLocalInstall(JPackageCommand cmd) {
return cmd.hasArgument("--win-per-user-install");
}
! static class AppVerifier {
! AppVerifier(JPackageCommand cmd) {
cmd.verifyIsOfType(PackageType.WINDOWS);
this.cmd = cmd;
verifyStartMenuShortcut();
verifyDesktopShortcut();
verifyFileAssociationsRegistry();
--- 24,124 ----
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
+ import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+ import jdk.jpackage.test.Functional.ThrowingRunnable;
+ import jdk.jpackage.test.PackageTest.PackageHandlers;
public class WindowsHelper {
static String getBundleName(JPackageCommand cmd) {
cmd.verifyIsOfType(PackageType.WINDOWS);
return String.format("%s-%s%s", cmd.name(), cmd.version(),
cmd.packageType().getSuffix());
}
static Path getInstallationDirectory(JPackageCommand cmd) {
! Path installSubDir = getInstallationSubDirectory(cmd);
if (isUserLocalInstall(cmd)) {
! return USER_LOCAL.resolve(installSubDir);
! }
! return PROGRAM_FILES.resolve(installSubDir);
! }
!
! static Path getInstallationSubDirectory(JPackageCommand cmd) {
! cmd.verifyIsOfType(PackageType.WINDOWS);
! return Path.of(cmd.getArgumentValue("--install-dir", () -> cmd.name()));
}
!
! private static void runMsiexecWithRetries(Executor misexec) {
! Executor.Result result = null;
! for (int attempt = 0; attempt != 3; ++attempt) {
! result = misexec.executeWithoutExitCodeCheck();
! if (result.exitCode == 1618) {
! // Another installation is already in progress.
! // Wait a little and try again.
! ThrowingRunnable.toRunnable(() -> Thread.sleep(3000)).run();
! continue;
! }
! break;
! }
!
! result.assertExitCodeIsZero();
! }
!
! static PackageHandlers createMsiPackageHandlers() {
! BiConsumer<JPackageCommand, Boolean> installMsi = (cmd, install) -> {
! cmd.verifyIsOfType(PackageType.WIN_MSI);
! runMsiexecWithRetries(Executor.of("msiexec", "/qn", "/norestart",
! install ? "/i" : "/x").addArgument(cmd.outputBundle()));
! };
!
! PackageHandlers msi = new PackageHandlers();
! msi.installHandler = cmd -> installMsi.accept(cmd, true);
! msi.uninstallHandler = cmd -> installMsi.accept(cmd, false);
! msi.unpackHandler = (cmd, destinationDir) -> {
! cmd.verifyIsOfType(PackageType.WIN_MSI);
! runMsiexecWithRetries(Executor.of("msiexec", "/a")
! .addArgument(cmd.outputBundle().normalize())
! .addArguments("/qn", String.format("TARGETDIR=%s",
! destinationDir.toAbsolutePath().normalize())));
! return destinationDir.resolve(getInstallationSubDirectory(cmd));
! };
! return msi;
! }
!
! static PackageHandlers createExePackageHandlers() {
! PackageHandlers exe = new PackageHandlers();
! exe.installHandler = cmd -> {
! cmd.verifyIsOfType(PackageType.WIN_EXE);
! new Executor().setExecutable(cmd.outputBundle()).execute();
! };
!
! return exe;
! }
!
! public static String getMsiProperty(JPackageCommand cmd, String propertyName) {
! cmd.verifyIsOfType(PackageType.WIN_MSI);
! return Executor.of("cscript.exe", "//Nologo")
! .addArgument(TKit.TEST_SRC_ROOT.resolve("resources/query-msi-property.js"))
! .addArgument(cmd.outputBundle())
! .addArgument(propertyName)
! .dumpOutput()
! .executeAndGetOutput().stream().collect(Collectors.joining("\n"));
}
private static boolean isUserLocalInstall(JPackageCommand cmd) {
return cmd.hasArgument("--win-per-user-install");
}
! static class DesktopIntegrationVerifier {
! DesktopIntegrationVerifier(JPackageCommand cmd) {
cmd.verifyIsOfType(PackageType.WINDOWS);
this.cmd = cmd;
verifyStartMenuShortcut();
verifyDesktopShortcut();
verifyFileAssociationsRegistry();
*** 199,218 ****
private final JPackageCommand cmd;
}
private static String queryRegistryValue(String keyPath, String valueName) {
! Executor.Result status = new Executor()
! .setExecutable("reg")
.saveOutput()
! .addArguments("query", keyPath, "/v", valueName)
! .execute();
if (status.exitCode == 1) {
// Should be the case of no such registry value or key
String lookupString = "ERROR: The system was unable to find the specified registry key or value.";
! status.getOutput().stream().filter(line -> line.equals(lookupString)).findFirst().orElseThrow(
! () -> new RuntimeException(String.format(
"Failed to find [%s] string in the output",
lookupString)));
TKit.trace(String.format(
"Registry value [%s] at [%s] path not found", valueName,
keyPath));
--- 262,280 ----
private final JPackageCommand cmd;
}
private static String queryRegistryValue(String keyPath, String valueName) {
! var status = Executor.of("reg", "query", keyPath, "/v", valueName)
.saveOutput()
! .executeWithoutExitCodeCheck();
if (status.exitCode == 1) {
// Should be the case of no such registry value or key
String lookupString = "ERROR: The system was unable to find the specified registry key or value.";
! TKit.assertTextStream(lookupString)
! .predicate(String::equals)
! .orElseThrow(() -> new RuntimeException(String.format(
"Failed to find [%s] string in the output",
lookupString)));
TKit.trace(String.format(
"Registry value [%s] at [%s] path not found", valueName,
keyPath));
< prev index next >