< prev index next >

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

Print this page

        

@@ -27,45 +27,46 @@
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
 import jdk.jpackage.test.Functional.ThrowingConsumer;
 import jdk.jpackage.test.Functional.ThrowingSupplier;
+import jdk.jpackage.test.PackageTest.PackageHandlers;
 import org.xml.sax.SAXException;
 
 public class MacHelper {
 
     public static void withExplodedDmg(JPackageCommand cmd,
             ThrowingConsumer<Path> consumer) {
         cmd.verifyIsOfType(PackageType.MAC_DMG);
 
-        var plist = readPList(new Executor()
-                .setExecutable("/usr/bin/hdiutil")
+        // Explode DMG assuming this can require interaction, thus use `yes`.
+        var plist = readPList(Executor.of("sh", "-c",
+                String.join(" ", "yes", "|", "/usr/bin/hdiutil", "attach",
+                        JPackageCommand.escapeAndJoin(
+                                cmd.outputBundle().toString()), "-plist"))
                 .dumpOutput()
-                .addArguments("attach", cmd.outputBundle().toString(), "-plist")
                 .executeAndGetOutput());
 
         final Path mountPoint = Path.of(plist.queryValue("mount-point"));
         try {
             Path dmgImage = mountPoint.resolve(cmd.name() + ".app");
             TKit.trace(String.format("Exploded [%s] in [%s] directory",
                     cmd.outputBundle(), dmgImage));
             ThrowingConsumer.toConsumer(consumer).accept(dmgImage);
         } finally {
-            new Executor()
-                    .setExecutable("/usr/bin/hdiutil")
-                    .addArgument("detach").addArgument(mountPoint)
-                    .execute().assertExitCodeIsZero();
+            Executor.of("/usr/bin/hdiutil", "detach").addArgument(mountPoint).execute();
         }
     }
 
     public static PListWrapper readPListFromAppImage(Path appImage) {
         return readPList(appImage.resolve("Contents/Info.plist"));

@@ -80,12 +81,66 @@
     public static PListWrapper readPList(List<String> lines) {
         return readPList(lines.stream());
     }
 
     public static PListWrapper readPList(Stream<String> lines) {
-        return ThrowingSupplier.toSupplier(() -> new PListWrapper(lines.collect(
-                Collectors.joining()))).get();
+        return ThrowingSupplier.toSupplier(() -> new PListWrapper(lines
+                // Skip leading lines before xml declaration
+                .dropWhile(Pattern.compile("\\s?<\\?xml\\b.+\\?>").asPredicate().negate())
+                .collect(Collectors.joining()))).get();
+    }
+
+    static PackageHandlers createDmgPackageHandlers() {
+        PackageHandlers dmg = new PackageHandlers();
+
+        dmg.installHandler = cmd -> {
+            withExplodedDmg(cmd, dmgImage -> {
+                Executor.of("sudo", "cp", "-r")
+                .addArgument(dmgImage)
+                .addArgument("/Applications")
+                .execute();
+            });
+        };
+        dmg.unpackHandler = (cmd, destinationDir) -> {
+            Path[] unpackedFolder = new Path[1];
+            withExplodedDmg(cmd, dmgImage -> {
+                Executor.of("cp", "-r")
+                .addArgument(dmgImage)
+                .addArgument(destinationDir)
+                .execute();
+                unpackedFolder[0] = destinationDir.resolve(dmgImage.getFileName());
+            });
+            return unpackedFolder[0];
+        };
+        dmg.uninstallHandler = cmd -> {
+            cmd.verifyIsOfType(PackageType.MAC_DMG);
+            Executor.of("sudo", "rm", "-rf")
+            .addArgument(cmd.appInstallationDirectory())
+            .execute();
+        };
+
+        return dmg;
+    }
+
+    static PackageHandlers createPkgPackageHandlers() {
+        PackageHandlers pkg = new PackageHandlers();
+
+        pkg.installHandler = cmd -> {
+            cmd.verifyIsOfType(PackageType.MAC_PKG);
+            Executor.of("sudo", "/usr/sbin/installer", "-allowUntrusted", "-pkg")
+            .addArgument(cmd.outputBundle())
+            .addArguments("-target", "/")
+            .execute();
+        };
+        pkg.uninstallHandler = cmd -> {
+            cmd.verifyIsOfType(PackageType.MAC_PKG);
+            Executor.of("sudo", "rm", "-rf")
+            .addArgument(cmd.appInstallationDirectory())
+            .execute();
+        };
+
+        return pkg;
     }
 
     static String getBundleName(JPackageCommand cmd) {
         cmd.verifyIsOfType(PackageType.MAC);
         return String.format("%s-%s%s", getPackageName(cmd), cmd.version(),
< prev index next >