1 /*
   2  * Copyright (c) 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package jdk.incubator.jpackage.internal;
  26 
  27 import java.io.IOException;
  28 import java.nio.file.Files;
  29 import java.nio.file.Path;
  30 import java.nio.file.StandardOpenOption;
  31 import java.util.ArrayList;
  32 import java.util.List;
  33 import java.util.Map;
  34 import java.util.LinkedHashMap;
  35 import org.junit.Assert;
  36 import org.junit.Test;
  37 import org.junit.Rule;
  38 import org.junit.rules.TemporaryFolder;
  39 
  40 public class AppImageFileTest {
  41 
  42     @Rule
  43     public final TemporaryFolder tempFolder = new TemporaryFolder();
  44 
  45     @Test
  46     public void testIdentity() throws IOException {
  47         Map<String, ? super Object> params = new LinkedHashMap<>();
  48         params.put("name", "Foo");
  49         params.put("app-version", "2.3");
  50         params.put("description", "Duck is the King");
  51         AppImageFile aif = create(params);
  52 
  53         Assert.assertEquals("Foo", aif.getLauncherName());
  54     }
  55 
  56     @Test
  57     public void testInvalidCommandLine() throws IOException {
  58         // Just make sure AppImageFile will tolerate jpackage params that would
  59         // never create app image at both load/save phases.
  60         // People would edit this file just because they can.
  61         // We should be ready to handle curious minds.
  62         Map<String, ? super Object> params = new LinkedHashMap<>();
  63         params.put("invalidParamName", "randomStringValue");
  64         create(params);
  65 
  66         params = new LinkedHashMap<>();
  67         params.put("name", "foo");
  68         params.put("app-version", "");
  69         create(params);
  70     }
  71 
  72     @Test
  73     public void testInavlidXml() throws IOException {
  74         assertInvalid(createFromXml("<foo/>"));
  75         assertInvalid(createFromXml("<jpackage-state/>"));
  76         assertInvalid(createFromXml(
  77                 "<jpackage-state>",
  78                     "<main-launcher></main-launcher>",
  79                 "</jpackage-state>"));
  80         assertInvalid(createFromXml(
  81                 "<jpackage-state>",
  82                     "<launcher>A</launcher>",
  83                     "<launcher>B</launcher>",
  84                 "</jpackage-state>"));
  85     }
  86 
  87     @Test
  88     public void testValidXml() throws IOException {
  89         Assert.assertEquals("Foo", (createFromXml(
  90                 "<jpackage-state>",
  91                     "<main-launcher>Foo</main-launcher>",
  92                 "</jpackage-state>")).getLauncherName());
  93 
  94         Assert.assertEquals("Boo", (createFromXml(
  95                 "<jpackage-state>",
  96                     "<main-launcher>Boo</main-launcher>",
  97                     "<main-launcher>Bar</main-launcher>",
  98                 "</jpackage-state>")).getLauncherName());
  99 
 100         var file = createFromXml(
 101                 "<jpackage-state>",
 102                     "<main-launcher>Foo</main-launcher>",
 103                     "<launcher></launcher>",
 104                 "</jpackage-state>");
 105         Assert.assertEquals("Foo", file.getLauncherName());
 106         Assert.assertArrayEquals(new String[0],
 107                 file.getAddLauncherNames().toArray(String[]::new));
 108     }
 109 
 110     @Test
 111     public void testMainLauncherName() throws IOException {
 112         Map<String, ? super Object> params = new LinkedHashMap<>();
 113         params.put("name", "Foo");
 114         params.put("description", "Duck App Description");
 115         AppImageFile aif = create(params);
 116 
 117         Assert.assertEquals("Foo", aif.getLauncherName());
 118     }
 119 
 120     @Test
 121     public void testAddLauncherNames() throws IOException {
 122         Map<String, ? super Object> params = new LinkedHashMap<>();
 123         List<Map<String, ? super Object>> launchersAsMap = new ArrayList<>();
 124 
 125         Map<String, ? super Object> addLauncher2Params = new LinkedHashMap();
 126         addLauncher2Params.put("name", "Launcher2Name");
 127         launchersAsMap.add(addLauncher2Params);
 128 
 129         Map<String, ? super Object> addLauncher3Params = new LinkedHashMap();
 130         addLauncher3Params.put("name", "Launcher3Name");
 131         launchersAsMap.add(addLauncher3Params);
 132 
 133         params.put("name", "Duke App");
 134         params.put("description", "Duke App Description");
 135         params.put("add-launcher", launchersAsMap);
 136         AppImageFile aif = create(params);
 137 
 138         List<String> addLauncherNames = aif.getAddLauncherNames();
 139         Assert.assertEquals(2, addLauncherNames.size());
 140         Assert.assertTrue(addLauncherNames.contains("Launcher2Name"));
 141         Assert.assertTrue(addLauncherNames.contains("Launcher3Name"));
 142 
 143     }
 144 
 145     private AppImageFile create(Map<String, Object> params) throws IOException {
 146         AppImageFile.save(tempFolder.getRoot().toPath(), params);
 147         return AppImageFile.load(tempFolder.getRoot().toPath());
 148     }
 149 
 150     private void assertInvalid(AppImageFile file) {
 151         Assert.assertNull(file.getLauncherName());
 152         Assert.assertNull(file.getAddLauncherNames());
 153     }
 154 
 155     private AppImageFile createFromXml(String... xmlData) throws IOException {
 156         Path directory = tempFolder.getRoot().toPath();
 157         Path path = AppImageFile.getPathInAppImage(directory);
 158         path.toFile().mkdirs();
 159         Files.delete(path);
 160 
 161         ArrayList<String> data = new ArrayList();
 162         data.add("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>");
 163         data.addAll(List.of(xmlData));
 164 
 165         Files.write(path, data, StandardOpenOption.CREATE,
 166                     StandardOpenOption.TRUNCATE_EXISTING);
 167 
 168         AppImageFile image = AppImageFile.load(directory);
 169         return image;
 170     }
 171 
 172 }