Path: blob/master/test/jdk/tools/jlink/JLinkTest.java
66643 views
/*1* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.io.IOException;24import java.io.PrintWriter;25import java.io.StringWriter;26import java.lang.module.ModuleDescriptor;27import java.nio.file.Files;28import java.nio.file.Path;29import java.nio.file.Paths;30import java.util.ArrayList;31import java.util.Collections;32import java.util.List;33import java.util.spi.ToolProvider;34import java.util.stream.Collectors;35import java.util.stream.IntStream;36import java.util.stream.Stream;3738import jdk.tools.jlink.plugin.Plugin;39import jdk.tools.jlink.internal.PluginRepository;40import tests.Helper;41import tests.JImageGenerator;4243/*44* @test45* @summary Test image creation46* @bug 818977747* @bug 819492248* @bug 820696249* @bug 824034950* @author Jean-Francois Denise51* @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g)52* @library ../lib53* @modules java.base/jdk.internal.jimage54* jdk.jdeps/com.sun.tools.classfile55* jdk.jlink/jdk.tools.jlink.internal56* jdk.jlink/jdk.tools.jlink.plugin57* jdk.jlink/jdk.tools.jimage58* jdk.compiler59* @build tests.*60* @run main/othervm -Xmx1g JLinkTest61*/62public class JLinkTest {63static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink")64.orElseThrow(() ->65new RuntimeException("jlink tool not found")66);6768// number of built-in plugins from jdk.jlink module69private static int getNumJlinkPlugins() {70ModuleDescriptor desc = Plugin.class.getModule().getDescriptor();71return desc.provides().stream()72.filter(p -> p.service().equals(Plugin.class.getName()))73.map(p -> p.providers().size())74.findAny()75.orElse(0);76}7778private static boolean isOfJLinkModule(Plugin p) {79return p.getClass().getModule() == Plugin.class.getModule();80}8182public static void main(String[] args) throws Exception {8384Helper helper = Helper.newHelper();85if (helper == null) {86System.err.println("Test not run");87return;88}89helper.generateDefaultModules();90// expected num. of plugins from jdk.jlink module91int expectedJLinkPlugins = getNumJlinkPlugins();92int totalPlugins = 0;93{94// number of built-in plugins95List<Plugin> builtInPlugins = new ArrayList<>();96builtInPlugins.addAll(PluginRepository.getPlugins(ModuleLayer.boot()));97totalPlugins = builtInPlugins.size();98// actual num. of plugins loaded from jdk.jlink module99int actualJLinkPlugins = 0;100for (Plugin p : builtInPlugins) {101p.getState();102p.getType();103if (isOfJLinkModule(p)) {104actualJLinkPlugins++;105}106}107if (expectedJLinkPlugins != actualJLinkPlugins) {108throw new AssertionError("Actual plugins loaded from jdk.jlink: " +109actualJLinkPlugins + " which doesn't match expected number : " +110expectedJLinkPlugins);111}112}113114{115// No --module-path specified. $JAVA_HOME/jmods should be assumed.116// The following should succeed as it uses only system modules.117String imageDir = "bug818977-no-modulepath";118JImageGenerator.getJLinkTask()119.output(helper.createNewImageDir(imageDir))120.addMods("jdk.jshell")121.call().assertSuccess();122}123124{125// invalid --module-path specified. java.base not found it it.126// $JAVA_HOME/jmods should be added automatically.127// The following should succeed as it uses only system modules.128String imageDir = "bug8189777-invalid-modulepath";129JImageGenerator.getJLinkTask()130.modulePath("does_not_exist_path")131.output(helper.createNewImageDir(imageDir))132.addMods("jdk.jshell")133.call().assertSuccess();134}135136{137// No --module-path specified. --add-modules ALL-MODULE-PATH specified.138String imageDir = "bug8189777-all-module-path";139JImageGenerator.getJLinkTask()140.output(helper.createNewImageDir(imageDir))141.addMods("ALL-MODULE-PATH")142.call().assertSuccess();143}144145{146String moduleName = "bug8134651";147JImageGenerator.getJLinkTask()148.modulePath(helper.defaultModulePath())149.output(helper.createNewImageDir(moduleName))150.addMods("leaf1")151.call().assertSuccess();152JImageGenerator.getJLinkTask()153.modulePath(helper.defaultModulePath())154.addMods("leaf1")155.option("--output")156.call().assertFailure("Error: no value given for --output");157JImageGenerator.getJLinkTask()158.modulePath("")159.output(helper.createNewImageDir(moduleName))160.addMods("leaf1")161.call().assertFailure("Error: no value given for --module-path");162// do not include standard module path - should be added automatically163JImageGenerator.getJLinkTask()164.modulePath(helper.defaultModulePath(false))165.output(helper.createNewImageDir(moduleName))166.addMods("leaf1")167.call().assertSuccess();168// no --module-path. default sys mod path is assumed - but that won't contain 'leaf1' module169JImageGenerator.getJLinkTask()170.output(helper.createNewImageDir(moduleName))171.addMods("leaf1")172.call().assertFailure("Error: Module leaf1 not found");173}174175{176String moduleName = "m"; // 8163382177Path jmod = helper.generateDefaultJModule(moduleName).assertSuccess();178JImageGenerator.getJLinkTask()179.modulePath(helper.defaultModulePath())180.output(helper.createNewImageDir(moduleName))181.addMods("m")182.call().assertSuccess();183moduleName = "mod";184jmod = helper.generateDefaultJModule(moduleName).assertSuccess();185JImageGenerator.getJLinkTask()186.modulePath(helper.defaultModulePath())187.output(helper.createNewImageDir(moduleName))188.addMods("m")189.call().assertSuccess();190}191192{193String moduleName = "m_8165735"; // JDK-8165735194helper.generateDefaultJModule(moduleName+"dependency").assertSuccess();195Path jmod = helper.generateDefaultJModule(moduleName, moduleName+"dependency").assertSuccess();196JImageGenerator.getJLinkTask()197.modulePath(helper.defaultModulePath())198.repeatedModulePath(".") // second --module-path overrides the first one199.output(helper.createNewImageDir(moduleName))200.addMods(moduleName)201// second --module-path does not have that module202.call().assertFailure("Error: Module m_8165735 not found");203204JImageGenerator.getJLinkTask()205.modulePath(".") // first --module-path overridden later206.repeatedModulePath(helper.defaultModulePath())207.output(helper.createNewImageDir(moduleName))208.addMods(moduleName)209// second --module-path has that module210.call().assertSuccess();211212JImageGenerator.getJLinkTask()213.modulePath(helper.defaultModulePath())214.output(helper.createNewImageDir(moduleName))215.limitMods(moduleName)216.repeatedLimitMods("java.base") // second --limit-modules overrides first217.addMods(moduleName)218.call().assertFailure("Error: Module m_8165735dependency not found, required by m_8165735");219220JImageGenerator.getJLinkTask()221.modulePath(helper.defaultModulePath())222.output(helper.createNewImageDir(moduleName))223.limitMods("java.base")224.repeatedLimitMods(moduleName) // second --limit-modules overrides first225.addMods(moduleName)226.call().assertSuccess();227}228229{230// Help231StringWriter writer = new StringWriter();232PrintWriter pw = new PrintWriter(writer);233JLINK_TOOL.run(pw, pw, "--help");234String output = writer.toString();235if (output.split("\n").length < 10) {236System.err.println(output);237throw new AssertionError("Help");238}239}240241{242// List plugins243StringWriter writer = new StringWriter();244PrintWriter pw = new PrintWriter(writer);245246JLINK_TOOL.run(pw, pw, "--list-plugins");247String output = writer.toString();248List<String> commands = Stream.of(output.split("\\R"))249.filter((s) -> s.matches(" --.*"))250.collect(Collectors.toList());251int number = commands.size();252if (number != totalPlugins) {253System.err.println(output);254throw new AssertionError("Found: " + number + " expected " + totalPlugins);255}256257boolean isSorted = IntStream.range(1, number)258.allMatch((int index) -> commands.get(index).compareTo(commands.get(index - 1)) >= 0);259260if(!isSorted) {261throw new AssertionError("--list-plugins not presented in alphabetical order");262}263264}265266// filter out files and resources + Skip debug + compress267{268String[] userOptions = {"--compress", "2", "--strip-debug",269"--exclude-resources", "*.jcov, */META-INF/*", "--exclude-files",270"*" + Helper.getDebugSymbolsExtension()};271String moduleName = "excludezipskipdebugcomposite2";272helper.generateDefaultJModule(moduleName, "composite2");273String[] res = {".jcov", "/META-INF/"};274String[] files = {Helper.getDebugSymbolsExtension()};275Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();276helper.checkImage(imageDir, moduleName, res, files);277}278279// filter out + Skip debug + compress with filter + sort resources280{281String[] userOptions2 = {"--compress=2:compress-filter=^/java.base/*",282"--strip-debug", "--exclude-resources",283"*.jcov, */META-INF/*", "--order-resources",284"*/module-info.class,/sortcomposite2/*,*/javax/management/*"};285String moduleName = "excludezipfilterskipdebugcomposite2";286helper.generateDefaultJModule(moduleName, "composite2");287String[] res = {".jcov", "/META-INF/"};288Path imageDir = helper.generateDefaultImage(userOptions2, moduleName).assertSuccess();289helper.checkImage(imageDir, moduleName, res, null);290}291292// module-info.class should not be excluded293{294String[] userOptions = { "--exclude-resources", "/jdk_8194922/module-info.class" };295String moduleName = "jdk_8194922";296helper.generateDefaultJModule(moduleName);297helper.generateDefaultImage(userOptions, moduleName).298assertFailure("Cannot exclude /jdk_8194922/module-info.class");299}300301// default compress302{303testCompress(helper, "compresscmdcomposite2", "--compress", "2");304}305306{307testCompress(helper, "compressfiltercmdcomposite2",308"--compress=2:filter=^/java.base/java/lang/*");309}310311// compress 0312{313testCompress(helper, "compress0filtercmdcomposite2",314"--compress=0:filter=^/java.base/java/lang/*");315}316317// compress 1318{319testCompress(helper, "compress1filtercmdcomposite2",320"--compress=1:filter=^/java.base/java/lang/*");321}322323// compress 2324{325testCompress(helper, "compress2filtercmdcomposite2",326"--compress=2:filter=^/java.base/java/lang/*");327}328329// invalid compress level330{331String[] userOptions = {"--compress", "invalid"};332String moduleName = "invalidCompressLevel";333helper.generateDefaultJModule(moduleName, "composite2");334helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: Invalid compression level invalid");335}336337// orphan argument - JDK-8166810338{339String[] userOptions = {"--compress", "2", "foo" };340String moduleName = "orphanarg1";341helper.generateDefaultJModule(moduleName, "composite2");342helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: foo");343}344345// orphan argument - JDK-8166810346{347String[] userOptions = {"--output", "foo", "bar" };348String moduleName = "orphanarg2";349helper.generateDefaultJModule(moduleName, "composite2");350helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: bar");351}352353// basic check for --help - JDK-8173717354{355JImageGenerator.getJLinkTask()356.option("--help")357.call().assertSuccess();358}359360{361String imageDir = "bug8206962";362JImageGenerator.getJLinkTask()363.modulePath(helper.defaultModulePath())364.output(helper.createNewImageDir(imageDir))365.addMods("java.base")366.option("--release-info=del")367.call().assertFailure("Error: No key specified for delete");368}369{370String imageDir = "bug8240349";371Path imagePath = helper.createNewImageDir(imageDir);372JImageGenerator.getJLinkTask()373.modulePath(helper.defaultModulePath())374.output(imagePath)375.addMods("java.base")376.option("--vm=client")377.call().assertFailure("Error: Selected VM client doesn't exist");378if (!Files.notExists(imagePath)) {379throw new RuntimeException("bug8240349 directory not deleted");380}381}382}383384private static void testCompress(Helper helper, String moduleName, String... userOptions) throws IOException {385helper.generateDefaultJModule(moduleName, "composite2");386Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();387helper.checkImage(imageDir, moduleName, null, null);388}389}390391392