< prev index next >

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

Print this page




   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.io.IOException;
  25 import java.nio.file.Files;
  26 import java.nio.file.Path;
  27 import java.util.List;

  28 import java.util.Arrays;
  29 import java.util.function.Function;
  30 import java.util.stream.Collectors;
  31 import jdk.jpackage.test.JPackageCommand;
  32 import jdk.jpackage.test.PackageType;
  33 import jdk.jpackage.test.PackageTest;
  34 import jdk.jpackage.test.LinuxHelper;
  35 import jdk.jpackage.test.Executor;
  36 import jdk.jpackage.test.Test;
  37 
  38 /**
  39  * Test --license-file parameter. Output of the test should be licensetest*.*
  40  * package bundle. The output package should provide the same functionality as
  41  * the default package and also incorporate license information from
  42  * test/jdk/tools/jpackage/resources/license.txt file from OpenJDK repo.
  43  *
  44  * deb:
  45  *
  46  * Package should install license file /usr/share/doc/licensetest/copyright
  47  * file.
  48  *
  49  * rpm:
  50  *
  51  * Package should install license file in
  52  * %{_defaultlicensedir}/licensetest-1.0/license.txt file.
  53  *
  54  * Mac:
  55  *
  56  * Windows
  57  *
  58  * Installer should display license text matching contents of the license file
  59  * during installation.
  60  */
  61 
  62 /*
  63  * @test
  64  * @summary jpackage with --license-file
  65  * @library ../helpers
  66  * @modules jdk.jpackage/jdk.jpackage.internal
  67  * @run main/othervm/timeout=360 -Xmx512m LicenseTest
  68  */











  69 public class LicenseTest {
  70     public static void main(String[] args) {
  71         Test.run(args, () -> {







  72             new PackageTest().configureHelloApp()
  73             .addInitializer(cmd -> {
  74                 cmd.addArguments("--license-file", LICENSE_FILE);
  75             })
  76             .forTypes(PackageType.LINUX_DEB)
  77             .addBundleVerifier(cmd -> {
  78                 verifyLicenseFileInLinuxPackage(cmd, debLicenseFile(cmd));
  79             })
  80             .addInstallVerifier(cmd -> {
  81                 verifyLicenseFileInstalledDebian(debLicenseFile(cmd));
  82             })
  83             .addUninstallVerifier(cmd -> {
  84                 verifyLicenseFileNotInstalledLinux(debLicenseFile(cmd));
  85             })
  86             .forTypes(PackageType.LINUX_RPM)
  87             .addBundleVerifier(cmd -> {
  88                 verifyLicenseFileInLinuxPackage(cmd,rpmLicenseFile(cmd));
  89             })

  90             .addInstallVerifier(cmd -> {
  91                 verifyLicenseFileInstalledRpm(rpmLicenseFile(cmd));
  92             })
  93             .addUninstallVerifier(cmd -> {
  94                 verifyLicenseFileNotInstalledLinux(rpmLicenseFile(cmd));
  95             })
  96             .run();
  97         });







  98      }
  99 
 100     private static Path rpmLicenseFile(JPackageCommand cmd) {
 101         final Path licenseRoot = Path.of(
 102                 new Executor()
 103                 .setExecutable("rpm")
 104                 .addArguments("--eval", "%{_defaultlicensedir}")
 105                 .executeAndGetFirstLineOfOutput());
 106         final Path licensePath = licenseRoot.resolve(String.format("%s-%s",
 107                 LinuxHelper.getPackageName(cmd), cmd.version())).resolve(
 108                 LICENSE_FILE.getFileName());
 109         return licensePath;
 110     }
 111 














 112     private static Path debLicenseFile(JPackageCommand cmd) {
 113         return cmd.appInstallationDirectory().resolve("share/doc/copyright");
 114     }
 115 
 116     private static void verifyLicenseFileInLinuxPackage(JPackageCommand cmd,
 117             Path expectedLicensePath) {
 118         Test.assertTrue(LinuxHelper.getPackageFiles(cmd).filter(path -> path.equals(
 119                 expectedLicensePath)).findFirst().orElse(null) != null,
 120                 String.format("Check license file [%s] is in %s package",
 121                         expectedLicensePath, LinuxHelper.getPackageName(cmd)));
 122     }
 123 
 124     private static void verifyLicenseFileInstalledRpm(Path licenseFile) {
 125         Test.assertTrue(Files.isReadable(licenseFile), String.format(
 126                 "Check license file [%s] is readable", licenseFile));
 127         try {
 128             Test.assertTrue(Files.readAllLines(licenseFile).equals(
 129                     Files.readAllLines(LICENSE_FILE)), String.format(
 130                     "Check contents of package license file [%s] are the same as contents of source license file [%s]",
 131                     licenseFile, LICENSE_FILE));
 132         } catch (IOException ex) {
 133             throw new RuntimeException(ex);
 134         }
 135     }
 136 
 137     private static void verifyLicenseFileInstalledDebian(Path licenseFile) {
 138         Test.assertTrue(Files.isReadable(licenseFile), String.format(
 139                 "Check license file [%s] is readable", licenseFile));
 140 
 141         Function<List<String>, List<String>> stripper = (lines) -> Arrays.asList(
 142                 String.join("\n", lines).stripTrailing().split("\n"));
 143 
 144         try {
 145             List<String> actualLines = Files.readAllLines(licenseFile).stream().dropWhile(
 146                     line -> !line.startsWith("License:")).collect(
 147                             Collectors.toList());
 148             // Remove leading `License:` followed by the whitespace from the first text line.
 149             actualLines.set(0, actualLines.get(0).split("\\s+", 2)[1]);
 150 
 151             actualLines = stripper.apply(actualLines);
 152 
 153             Test.assertNotEquals(0, String.join("\n", actualLines).length(),
 154                     "Check stripped license text is not empty");
 155 
 156             Test.assertTrue(actualLines.equals(
 157                     stripper.apply(Files.readAllLines(LICENSE_FILE))),
 158                     String.format(
 159                             "Check subset of package license file [%s] is a match of the source license file [%s]",
 160                             licenseFile, LICENSE_FILE));
 161         } catch (IOException ex) {
 162             throw new RuntimeException(ex);
 163         }
 164     }
 165 
 166     private static void verifyLicenseFileNotInstalledLinux(Path licenseFile) {
 167         Test.assertDirectoryExists(licenseFile.getParent(), false);
















































































 168     }
 169 
 170     private static final Path LICENSE_FILE = Test.TEST_SRC_ROOT.resolve(
 171             Path.of("resources", "license.txt"));



 172 }


   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.io.IOException;
  25 import java.nio.file.Files;
  26 import java.nio.file.Path;
  27 import java.util.List;
  28 import java.util.ArrayList;
  29 import java.util.Arrays;
  30 import java.util.function.Function;
  31 import java.util.stream.Collectors;
  32 import jdk.jpackage.test.JPackageCommand;
  33 import jdk.jpackage.test.PackageType;
  34 import jdk.jpackage.test.PackageTest;
  35 import jdk.jpackage.test.LinuxHelper;
  36 import jdk.jpackage.test.Executor;
  37 import jdk.jpackage.test.Test;
  38 
  39 /**
  40  * Test --license-file parameter. Output of the test should be licensetest*.*
  41  * package bundle. The output package should provide the same functionality as
  42  * the default package and also incorporate license information from
  43  * test/jdk/tools/jpackage/resources/license.txt file from OpenJDK repo.
  44  *
  45  * deb:
  46  *
  47  * Package should install license file /usr/share/doc/licensetest/copyright
  48  * file.
  49  *
  50  * rpm:
  51  *
  52  * Package should install license file in
  53  * %{_defaultlicensedir}/licensetest-1.0/license.txt file.
  54  *
  55  * Mac:
  56  *
  57  * Windows
  58  *
  59  * Installer should display license text matching contents of the license file
  60  * during installation.
  61  */
  62 
  63 /*
  64  * @test
  65  * @summary jpackage with --license-file
  66  * @library ../helpers
  67  * @modules jdk.jpackage/jdk.jpackage.internal
  68  * @run main/othervm/timeout=360 -Xmx512m LicenseTest testCommon
  69  */
  70 
  71 /*
  72  * @test
  73  * @summary jpackage with --license-file
  74  * @library ../helpers
  75  * @modules jdk.jpackage/jdk.jpackage.internal
  76  * @requires (os.family == "linux")
  77  * @run main/othervm/timeout=360 -Xmx512m LicenseTest testCustomDebianCopyright
  78  * @run main/othervm/timeout=360 -Xmx512m LicenseTest testCustomDebianCopyrightSubst
  79  */
  80 
  81 public class LicenseTest {
  82     public static void main(String[] args) {
  83         Test.run(args, () -> {
  84             String testFuncName = args[0];
  85             Test.trace(String.format("Running %s...", testFuncName));
  86             Test.getTestClass().getDeclaredMethod(testFuncName).invoke(null);
  87         });
  88     }
  89 
  90     public static void testCommon() {
  91         new PackageTest().configureHelloApp()
  92         .addInitializer(cmd -> {
  93             cmd.addArguments("--license-file", LICENSE_FILE);
  94         })
  95         .forTypes(PackageType.LINUX)
  96         .addBundleVerifier(cmd -> {
  97             verifyLicenseFileInLinuxPackage(cmd, linuxLicenseFile(cmd));
  98         })
  99         .addInstallVerifier(cmd -> {
 100             Test.assertReadableFileExists(linuxLicenseFile(cmd));
 101         })
 102         .addUninstallVerifier(cmd -> {
 103             verifyLicenseFileNotInstalledLinux(linuxLicenseFile(cmd));
 104         })
 105         .forTypes(PackageType.LINUX_DEB)
 106         .addInstallVerifier(cmd -> {
 107             verifyLicenseFileInstalledDebian(debLicenseFile(cmd));
 108         })
 109         .forTypes(PackageType.LINUX_RPM)
 110         .addInstallVerifier(cmd -> {
 111             verifyLicenseFileInstalledRpm(rpmLicenseFile(cmd));
 112         })



 113         .run();
 114     }
 115 
 116     public static void testCustomDebianCopyright() {
 117         new CustomDebianCopyrightTest().run();
 118     }
 119 
 120     public static void testCustomDebianCopyrightSubst() {
 121         new CustomDebianCopyrightTest().withSubstitution(true).run();
 122     }
 123 
 124     private static Path rpmLicenseFile(JPackageCommand cmd) {
 125         final Path licenseRoot = Path.of(
 126                 new Executor()
 127                 .setExecutable("rpm")
 128                 .addArguments("--eval", "%{_defaultlicensedir}")
 129                 .executeAndGetFirstLineOfOutput());
 130         final Path licensePath = licenseRoot.resolve(String.format("%s-%s",
 131                 LinuxHelper.getPackageName(cmd), cmd.version())).resolve(
 132                 LICENSE_FILE.getFileName());
 133         return licensePath;
 134     }
 135 
 136     private static Path linuxLicenseFile(JPackageCommand cmd) {
 137         cmd.verifyIsOfType(PackageType.LINUX);
 138         switch (cmd.packageType()) {
 139             case LINUX_DEB:
 140                 return debLicenseFile(cmd);
 141 
 142             case LINUX_RPM:
 143                 return rpmLicenseFile(cmd);
 144 
 145             default:
 146                 return null;
 147         }
 148     }
 149 
 150     private static Path debLicenseFile(JPackageCommand cmd) {
 151         return cmd.appInstallationDirectory().resolve("share/doc/copyright");
 152     }
 153 
 154     private static void verifyLicenseFileInLinuxPackage(JPackageCommand cmd,
 155             Path expectedLicensePath) {
 156         Test.assertTrue(LinuxHelper.getPackageFiles(cmd).filter(path -> path.equals(
 157                 expectedLicensePath)).findFirst().orElse(null) != null,
 158                 String.format("Check license file [%s] is in %s package",
 159                         expectedLicensePath, LinuxHelper.getPackageName(cmd)));
 160     }
 161 
 162     private static void verifyLicenseFileInstalledRpm(Path licenseFile) throws
 163             IOException {
 164         Test.assertStringListEquals(Files.readAllLines(LICENSE_FILE),
 165                 Files.readAllLines(licenseFile), String.format(


 166                 "Check contents of package license file [%s] are the same as contents of source license file [%s]",
 167                 licenseFile, LICENSE_FILE));



 168     }
 169 
 170     private static void verifyLicenseFileInstalledDebian(Path licenseFile)
 171             throws IOException {




 172 

 173         List<String> actualLines = Files.readAllLines(licenseFile).stream().dropWhile(
 174                 line -> !line.startsWith("License:")).collect(
 175                         Collectors.toList());
 176         // Remove leading `License:` followed by the whitespace from the first text line.
 177         actualLines.set(0, actualLines.get(0).split("\\s+", 2)[1]);
 178 
 179         actualLines = DEBIAN_COPYRIGT_FILE_STRIPPER.apply(actualLines);
 180 
 181         Test.assertNotEquals(0, String.join("\n", actualLines).length(),
 182                 "Check stripped license text is not empty");
 183 
 184         Test.assertStringListEquals(DEBIAN_COPYRIGT_FILE_STRIPPER.apply(
 185                 Files.readAllLines(LICENSE_FILE)), actualLines, String.format(

 186                 "Check subset of package license file [%s] is a match of the source license file [%s]",
 187                 licenseFile, LICENSE_FILE));



 188     }
 189 
 190     private static void verifyLicenseFileNotInstalledLinux(Path licenseFile) {
 191         Test.assertPathExists(licenseFile.getParent(), false);
 192     }
 193 
 194     private static class CustomDebianCopyrightTest {
 195         CustomDebianCopyrightTest() {
 196             withSubstitution(false);
 197         }
 198 
 199         private List<String> licenseFileText(String copyright, String licenseText) {
 200             List<String> lines = new ArrayList(List.of(
 201                     String.format("Copyright=%s", copyright),
 202                     "Foo",
 203                     "Bar",
 204                     "Buz"));
 205             lines.addAll(List.of(licenseText.split("\\R", -1)));
 206             return lines;
 207         }
 208 
 209         private List<String> licenseFileText() {
 210             if (withSubstitution) {
 211                 return licenseFileText("APPLICATION_COPYRIGHT",
 212                         "APPLICATION_LICENSE_TEXT");
 213             } else {
 214                 return expetedLicenseFileText();
 215             }
 216         }
 217 
 218         private List<String> expetedLicenseFileText() {
 219             return licenseFileText(copyright, licenseText);
 220         }
 221 
 222         CustomDebianCopyrightTest withSubstitution(boolean v) {
 223             withSubstitution = v;
 224             // Different values just to make easy to figure out from the test log which test was executed.
 225             if (v) {
 226                 copyright = "Duke (C)";
 227                 licenseText = "The quick brown fox\n jumps over the lazy dog";
 228             } else {
 229                 copyright = "Java (C)";
 230                 licenseText = "How vexingly quick daft zebras jump!";
 231             }
 232             return this;
 233         }
 234 
 235         void run() {
 236             final Path srcLicenseFile = Test.workDir().resolve("license");
 237             new PackageTest().configureHelloApp().forTypes(PackageType.LINUX_DEB)
 238             .addInitializer(cmd -> {
 239                 // Create source license file.
 240                 Files.write(srcLicenseFile, List.of(
 241                         licenseText.split("\\R", -1)));
 242 
 243                 cmd.setFakeRuntime();
 244                 cmd.setArgumentValue("--name", String.format("%s%s",
 245                         withSubstitution ? "CustomDebianCopyrightWithSubst" : "CustomDebianCopyright",
 246                         cmd.name()));
 247                 cmd.addArguments("--license-file", srcLicenseFile);
 248                 cmd.addArguments("--copyright", copyright);
 249                 cmd.addArguments("--resource-dir", RESOURCE_DIR);
 250 
 251                 // Create copyright template file in a resource dir.
 252                 Files.createDirectories(RESOURCE_DIR);
 253                 Files.write(RESOURCE_DIR.resolve("copyright"),
 254                         licenseFileText());
 255             })
 256             .addInstallVerifier(cmd -> {
 257                 Path installedLicenseFile = debLicenseFile(cmd);
 258                 Test.assertStringListEquals(expetedLicenseFileText(),
 259                         DEBIAN_COPYRIGT_FILE_STRIPPER.apply(Files.readAllLines(
 260                                 installedLicenseFile)), String.format(
 261                                 "Check contents of package license file [%s] are the same as contents of source license file [%s]",
 262                                 installedLicenseFile, srcLicenseFile));
 263             })
 264             .run();
 265         }
 266 
 267         private boolean withSubstitution;
 268         private String copyright;
 269         private String licenseText;
 270 
 271         private final Path RESOURCE_DIR = Test.workDir().resolve("resources");
 272     }
 273 
 274     private static final Path LICENSE_FILE = Test.TEST_SRC_ROOT.resolve(
 275             Path.of("resources", "license.txt"));
 276 
 277     private static final Function<List<String>, List<String>> DEBIAN_COPYRIGT_FILE_STRIPPER = (lines) -> Arrays.asList(
 278             String.join("\n", lines).stripTrailing().split("\n"));
 279 }
< prev index next >