Path: blob/master/test/jdk/tools/jlink/JLinkTest.java
41144 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* @author Jean-Francois Denise50* @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g)51* @library ../lib52* @modules java.base/jdk.internal.jimage53* jdk.jdeps/com.sun.tools.classfile54* jdk.jlink/jdk.tools.jlink.internal55* jdk.jlink/jdk.tools.jlink.plugin56* jdk.jlink/jdk.tools.jimage57* jdk.compiler58* @build tests.*59* @run main/othervm -Xmx1g JLinkTest60*/61public class JLinkTest {62static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink")63.orElseThrow(() ->64new RuntimeException("jlink tool not found")65);6667// number of built-in plugins from jdk.jlink module68private static int getNumJlinkPlugins() {69ModuleDescriptor desc = Plugin.class.getModule().getDescriptor();70return desc.provides().stream()71.filter(p -> p.service().equals(Plugin.class.getName()))72.map(p -> p.providers().size())73.findAny()74.orElse(0);75}7677private static boolean isOfJLinkModule(Plugin p) {78return p.getClass().getModule() == Plugin.class.getModule();79}8081public static void main(String[] args) throws Exception {8283Helper helper = Helper.newHelper();84if (helper == null) {85System.err.println("Test not run");86return;87}88helper.generateDefaultModules();89// expected num. of plugins from jdk.jlink module90int expectedJLinkPlugins = getNumJlinkPlugins();91int totalPlugins = 0;92{93// number of built-in plugins94List<Plugin> builtInPlugins = new ArrayList<>();95builtInPlugins.addAll(PluginRepository.getPlugins(ModuleLayer.boot()));96totalPlugins = builtInPlugins.size();97// actual num. of plugins loaded from jdk.jlink module98int actualJLinkPlugins = 0;99for (Plugin p : builtInPlugins) {100p.getState();101p.getType();102if (isOfJLinkModule(p)) {103actualJLinkPlugins++;104}105}106if (expectedJLinkPlugins != actualJLinkPlugins) {107throw new AssertionError("Actual plugins loaded from jdk.jlink: " +108actualJLinkPlugins + " which doesn't match expected number : " +109expectedJLinkPlugins);110}111}112113{114// No --module-path specified. $JAVA_HOME/jmods should be assumed.115// The following should succeed as it uses only system modules.116String imageDir = "bug818977-no-modulepath";117JImageGenerator.getJLinkTask()118.output(helper.createNewImageDir(imageDir))119.addMods("jdk.jshell")120.call().assertSuccess();121}122123{124// invalid --module-path specified. java.base not found it it.125// $JAVA_HOME/jmods should be added automatically.126// The following should succeed as it uses only system modules.127String imageDir = "bug8189777-invalid-modulepath";128JImageGenerator.getJLinkTask()129.modulePath("does_not_exist_path")130.output(helper.createNewImageDir(imageDir))131.addMods("jdk.jshell")132.call().assertSuccess();133}134135{136// No --module-path specified. --add-modules ALL-MODULE-PATH specified.137String imageDir = "bug8189777-all-module-path";138JImageGenerator.getJLinkTask()139.output(helper.createNewImageDir(imageDir))140.addMods("ALL-MODULE-PATH")141.call().assertSuccess();142}143144{145String moduleName = "bug8134651";146JImageGenerator.getJLinkTask()147.modulePath(helper.defaultModulePath())148.output(helper.createNewImageDir(moduleName))149.addMods("leaf1")150.call().assertSuccess();151JImageGenerator.getJLinkTask()152.modulePath(helper.defaultModulePath())153.addMods("leaf1")154.option("--output")155.call().assertFailure("Error: no value given for --output");156JImageGenerator.getJLinkTask()157.modulePath("")158.output(helper.createNewImageDir(moduleName))159.addMods("leaf1")160.call().assertFailure("Error: no value given for --module-path");161// do not include standard module path - should be added automatically162JImageGenerator.getJLinkTask()163.modulePath(helper.defaultModulePath(false))164.output(helper.createNewImageDir(moduleName))165.addMods("leaf1")166.call().assertSuccess();167// no --module-path. default sys mod path is assumed - but that won't contain 'leaf1' module168JImageGenerator.getJLinkTask()169.output(helper.createNewImageDir(moduleName))170.addMods("leaf1")171.call().assertFailure("Error: Module leaf1 not found");172}173174{175String moduleName = "m"; // 8163382176Path jmod = helper.generateDefaultJModule(moduleName).assertSuccess();177JImageGenerator.getJLinkTask()178.modulePath(helper.defaultModulePath())179.output(helper.createNewImageDir(moduleName))180.addMods("m")181.call().assertSuccess();182moduleName = "mod";183jmod = helper.generateDefaultJModule(moduleName).assertSuccess();184JImageGenerator.getJLinkTask()185.modulePath(helper.defaultModulePath())186.output(helper.createNewImageDir(moduleName))187.addMods("m")188.call().assertSuccess();189}190191{192String moduleName = "m_8165735"; // JDK-8165735193helper.generateDefaultJModule(moduleName+"dependency").assertSuccess();194Path jmod = helper.generateDefaultJModule(moduleName, moduleName+"dependency").assertSuccess();195JImageGenerator.getJLinkTask()196.modulePath(helper.defaultModulePath())197.repeatedModulePath(".") // second --module-path overrides the first one198.output(helper.createNewImageDir(moduleName))199.addMods(moduleName)200// second --module-path does not have that module201.call().assertFailure("Error: Module m_8165735 not found");202203JImageGenerator.getJLinkTask()204.modulePath(".") // first --module-path overridden later205.repeatedModulePath(helper.defaultModulePath())206.output(helper.createNewImageDir(moduleName))207.addMods(moduleName)208// second --module-path has that module209.call().assertSuccess();210211JImageGenerator.getJLinkTask()212.modulePath(helper.defaultModulePath())213.output(helper.createNewImageDir(moduleName))214.limitMods(moduleName)215.repeatedLimitMods("java.base") // second --limit-modules overrides first216.addMods(moduleName)217.call().assertFailure("Error: Module m_8165735dependency not found, required by m_8165735");218219JImageGenerator.getJLinkTask()220.modulePath(helper.defaultModulePath())221.output(helper.createNewImageDir(moduleName))222.limitMods("java.base")223.repeatedLimitMods(moduleName) // second --limit-modules overrides first224.addMods(moduleName)225.call().assertSuccess();226}227228{229// Help230StringWriter writer = new StringWriter();231PrintWriter pw = new PrintWriter(writer);232JLINK_TOOL.run(pw, pw, "--help");233String output = writer.toString();234if (output.split("\n").length < 10) {235System.err.println(output);236throw new AssertionError("Help");237}238}239240{241// List plugins242StringWriter writer = new StringWriter();243PrintWriter pw = new PrintWriter(writer);244245JLINK_TOOL.run(pw, pw, "--list-plugins");246String output = writer.toString();247List<String> commands = Stream.of(output.split("\\R"))248.filter((s) -> s.matches(" --.*"))249.collect(Collectors.toList());250int number = commands.size();251if (number != totalPlugins) {252System.err.println(output);253throw new AssertionError("Found: " + number + " expected " + totalPlugins);254}255256boolean isSorted = IntStream.range(1, number)257.allMatch((int index) -> commands.get(index).compareTo(commands.get(index - 1)) >= 0);258259if(!isSorted) {260throw new AssertionError("--list-plugins not presented in alphabetical order");261}262263}264265// filter out files and resources + Skip debug + compress266{267String[] userOptions = {"--compress", "2", "--strip-debug",268"--exclude-resources", "*.jcov, */META-INF/*", "--exclude-files",269"*" + Helper.getDebugSymbolsExtension()};270String moduleName = "excludezipskipdebugcomposite2";271helper.generateDefaultJModule(moduleName, "composite2");272String[] res = {".jcov", "/META-INF/"};273String[] files = {Helper.getDebugSymbolsExtension()};274Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();275helper.checkImage(imageDir, moduleName, res, files);276}277278// filter out + Skip debug + compress with filter + sort resources279{280String[] userOptions2 = {"--compress=2:compress-filter=^/java.base/*",281"--strip-debug", "--exclude-resources",282"*.jcov, */META-INF/*", "--order-resources",283"*/module-info.class,/sortcomposite2/*,*/javax/management/*"};284String moduleName = "excludezipfilterskipdebugcomposite2";285helper.generateDefaultJModule(moduleName, "composite2");286String[] res = {".jcov", "/META-INF/"};287Path imageDir = helper.generateDefaultImage(userOptions2, moduleName).assertSuccess();288helper.checkImage(imageDir, moduleName, res, null);289}290291// module-info.class should not be excluded292{293String[] userOptions = { "--exclude-resources", "/jdk_8194922/module-info.class" };294String moduleName = "jdk_8194922";295helper.generateDefaultJModule(moduleName);296helper.generateDefaultImage(userOptions, moduleName).297assertFailure("Cannot exclude /jdk_8194922/module-info.class");298}299300// default compress301{302testCompress(helper, "compresscmdcomposite2", "--compress", "2");303}304305{306testCompress(helper, "compressfiltercmdcomposite2",307"--compress=2:filter=^/java.base/java/lang/*");308}309310// compress 0311{312testCompress(helper, "compress0filtercmdcomposite2",313"--compress=0:filter=^/java.base/java/lang/*");314}315316// compress 1317{318testCompress(helper, "compress1filtercmdcomposite2",319"--compress=1:filter=^/java.base/java/lang/*");320}321322// compress 2323{324testCompress(helper, "compress2filtercmdcomposite2",325"--compress=2:filter=^/java.base/java/lang/*");326}327328// invalid compress level329{330String[] userOptions = {"--compress", "invalid"};331String moduleName = "invalidCompressLevel";332helper.generateDefaultJModule(moduleName, "composite2");333helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: Invalid compression level invalid");334}335336// orphan argument - JDK-8166810337{338String[] userOptions = {"--compress", "2", "foo" };339String moduleName = "orphanarg1";340helper.generateDefaultJModule(moduleName, "composite2");341helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: foo");342}343344// orphan argument - JDK-8166810345{346String[] userOptions = {"--output", "foo", "bar" };347String moduleName = "orphanarg2";348helper.generateDefaultJModule(moduleName, "composite2");349helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: bar");350}351352// basic check for --help - JDK-8173717353{354JImageGenerator.getJLinkTask()355.option("--help")356.call().assertSuccess();357}358359{360String imageDir = "bug8206962";361JImageGenerator.getJLinkTask()362.modulePath(helper.defaultModulePath())363.output(helper.createNewImageDir(imageDir))364.addMods("java.base")365.option("--release-info=del")366.call().assertFailure("Error: No key specified for delete");367}368}369370private static void testCompress(Helper helper, String moduleName, String... userOptions) throws IOException {371helper.generateDefaultJModule(moduleName, "composite2");372Path imageDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();373helper.checkImage(imageDir, moduleName, null, null);374}375}376377378