Path: blob/master/test/jdk/tools/jlink/JLinkNegativeTest.java
41144 views
/*1* Copyright (c) 2015, 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*/2223/*24* @test25* @summary Negative tests for jlink26* @bug 813086127* @bug 817471828* @bug 818967129* @author Andrei Eremeev30* @library ../lib31* @modules java.base/jdk.internal.jimage32* java.base/jdk.internal.module33* jdk.jdeps/com.sun.tools.classfile34* jdk.jlink/jdk.tools.jlink.internal35* jdk.jlink/jdk.tools.jmod36* jdk.jlink/jdk.tools.jimage37* jdk.compiler38* @build tests.*39* @run testng JLinkNegativeTest40*/4142import java.io.File;43import java.io.FileOutputStream;44import java.io.IOException;45import java.io.OutputStream;46import java.lang.module.ModuleDescriptor;47import java.nio.file.FileVisitResult;48import java.nio.file.Files;49import java.nio.file.Path;50import java.nio.file.Paths;51import java.nio.file.SimpleFileVisitor;52import java.nio.file.attribute.BasicFileAttributes;53import java.util.Arrays;54import java.util.Collections;55import java.util.List;56import java.util.Set;57import java.util.jar.JarEntry;58import java.util.jar.JarOutputStream;5960import jdk.internal.module.ModuleInfoWriter;61import org.testng.SkipException;62import org.testng.annotations.BeforeClass;63import org.testng.annotations.Test;64import tests.Helper;65import tests.JImageGenerator;66import tests.JImageGenerator.InMemoryFile;67import tests.Result;6869@Test70public class JLinkNegativeTest {7172private Helper helper;7374@BeforeClass75public void setUp() throws IOException {76helper = Helper.newHelper();77if (helper == null) {78throw new SkipException("Not run");79}80helper.generateDefaultModules();81}8283private void deleteDirectory(Path dir) throws IOException {84Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {85@Override86public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {87Files.delete(file);88return FileVisitResult.CONTINUE;89}9091@Override92public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {93Files.delete(dir);94return FileVisitResult.CONTINUE;95}96});97}9899public void testModuleNotExist() {100helper.generateDefaultImage("failure1").assertFailure("Error: Module failure1 not found");101}102103public void testNotExistInAddMods() {104// cannot find jmod from --add-modules105JImageGenerator.getJLinkTask()106.modulePath(".")107.addMods("not_exist")108.output(helper.getImageDir().resolve("failure2"))109.call().assertFailure("Error: Module not_exist not found");110}111112public void test() throws IOException {113helper.generateDefaultJModule("failure3");114Path image = helper.generateDefaultImage("failure3").assertSuccess();115JImageGenerator.getJLinkTask()116.modulePath(helper.defaultModulePath())117.output(image)118.addMods("leaf1")119.limitMods("leaf1")120.call().assertFailure("Error: directory already exists: .*failure3.image(\n|\r|.)*");121}122123public void testOutputIsFile() throws IOException {124// output == file125Path image = helper.createNewImageDir("failure4");126Files.createFile(image);127JImageGenerator.getJLinkTask()128.modulePath(helper.defaultModulePath())129.output(image)130.addMods("leaf1")131.call().assertFailure("Error: directory already exists: .*failure4.image(\n|\r|.)*");132}133134public void testModuleNotFound() {135// limit module is not found136Path imageFile = helper.createNewImageDir("test");137JImageGenerator.getJLinkTask()138.output(imageFile)139.addMods("leaf1")140.limitMods("leaf1")141.limitMods("failure5")142.modulePath(helper.defaultModulePath())143.call().assertFailure("Error: Module failure5 not found");144}145146public void testJmodIsDir() throws IOException {147Path imageFile = helper.createNewImageDir("test");148Path dirJmod = helper.createNewJmodFile("dir");149Files.createDirectory(dirJmod);150try {151JImageGenerator.getJLinkTask()152.output(imageFile)153.addMods("dir")154.modulePath(helper.defaultModulePath())155.call().assertFailure("Error: Module dir not found");156} finally {157deleteDirectory(dirJmod);158}159}160161public void testJarIsDir() throws IOException {162Path imageFile = helper.createNewImageDir("test");163Path dirJar = helper.createNewJarFile("dir");164Files.createDirectory(dirJar);165try {166JImageGenerator.getJLinkTask()167.output(imageFile)168.addMods("dir")169.modulePath(helper.defaultModulePath())170.call().assertFailure("Error: Module dir not found");171} finally {172deleteDirectory(dirJar);173}174}175176public void testMalformedJar() throws IOException {177Path imageFile = helper.createNewImageDir("test");178Path jar = helper.createNewJarFile("not_zip");179Files.createFile(jar);180try {181JImageGenerator.getJLinkTask()182.output(imageFile)183.addMods("not_zip")184.modulePath(helper.defaultModulePath())185.call().assertFailure("Error: Error reading");186} finally {187deleteDirectory(jar);188}189}190191public void testMalformedJmod() throws IOException {192Path imageFile = helper.createNewImageDir("test");193Path jmod = helper.createNewJmodFile("not_zip");194Files.createFile(jmod);195try {196JImageGenerator.getJLinkTask()197.output(imageFile)198.addMods("not_zip")199.modulePath(helper.defaultModulePath())200.call().assertFailure("Error: java.io.IOException: Invalid JMOD file");201} finally {202deleteDirectory(jmod);203}204}205206private static File createJarFile(File dir, String filename, String pkg, String name) throws IOException {207File jarFile = new File(dir, filename + ".jar");208209try (JarOutputStream output = new JarOutputStream(new FileOutputStream(jarFile))) {210JarEntry entry = new JarEntry(filename + "/" + pkg + "/" + name);211output.putNextEntry(entry);212}213214return jarFile;215}216217public void testAutomaticModuleAsRoot() throws IOException {218Path imageFile = helper.createNewImageDir("test");219String jarName = "myautomod";220File jarFile = createJarFile(new File("jars"), jarName, "com/acme", "Bar.class");221try {222JImageGenerator.getJLinkTask()223.output(imageFile)224.addMods(jarName)225.modulePath(helper.defaultModulePath())226.call().assertFailure("Error: automatic module cannot be used with jlink: " + jarName);227} finally {228jarFile.delete();229}230}231232public void testAutomaticModuleAsDependency() throws IOException {233Path imageFile = helper.createNewImageDir("test");234String autoJarName = "myautomod";235File autoJarFile = createJarFile(new File("jars"), autoJarName, "com/acme", "Bar.class");236String rootMod = "autodepender";237helper.generateDefaultJModule(rootMod, autoJarName).assertSuccess();238try {239JImageGenerator.getJLinkTask()240.output(imageFile)241.addMods(rootMod)242.modulePath(helper.defaultModulePath())243.call().assertFailure("Error: automatic module cannot be used with jlink: " + autoJarName);244} finally {245autoJarFile.delete();246}247}248249// Temporarily exclude; the jmod tool can no longer be used to create a jmod250// with a class in the unnamed package. Find another way, or remove.251// public void testAddDefaultPackage() throws IOException {252// String moduleName = "hacked1";253// Path module = helper.generateModuleCompiledClasses(helper.getJmodSrcDir(), helper.getJmodClassesDir(),254// moduleName, Arrays.asList("hacked1.Main", "A", "B"), "leaf1");255// JImageGenerator256// .getJModTask()257// .addClassPath(module)258// .jmod(helper.getJmodDir().resolve(moduleName + ".jmod"))259// .create().assertSuccess();260// Path image = helper.generateDefaultImage(moduleName).assertSuccess();261// helper.checkImage(image, moduleName, null, null);262// }263264public void testAddSomeTopLevelFiles() throws IOException {265String moduleName = "hacked2";266Path module = helper.generateModuleCompiledClasses(helper.getJmodSrcDir(), helper.getJmodClassesDir(),267moduleName);268Files.createFile(module.resolve("top-level-file"));269Path jmod = JImageGenerator270.getJModTask()271.addClassPath(module)272.jmod(helper.getJmodDir().resolve(moduleName + ".jmod"))273.create().assertSuccess();274try {275Path image = helper.generateDefaultImage(moduleName).assertSuccess();276helper.checkImage(image, moduleName, null, null);277} finally {278deleteDirectory(jmod);279}280}281282public void testAddNonStandardSection() throws IOException {283String moduleName = "hacked3";284Path module = helper.generateDefaultJModule(moduleName).assertSuccess();285JImageGenerator.addFiles(module, new InMemoryFile("unknown/A.class", new byte[0]));286try {287Result result = helper.generateDefaultImage(moduleName);288System.err.println(result.getMessage());289if (result.getExitCode() == 0) {290throw new AssertionError("Crash expected");291}292} finally {293deleteDirectory(module);294}295}296297@Test(enabled = true)298public void testSectionsAreFiles() throws IOException {299String moduleName = "hacked4";300Path jmod = helper.generateDefaultJModule(moduleName).assertSuccess();301JImageGenerator.addFiles(jmod,302new InMemoryFile("/lib", new byte[0]),303new InMemoryFile("/conf", new byte[0]),304new InMemoryFile("/bin", new byte[0]));305try {306Result result = helper.generateDefaultImage(moduleName);307System.err.println(result.getMessage());308if (result.getExitCode() == 0) {309throw new AssertionError("Crash expected");310}311} finally {312deleteDirectory(jmod);313}314}315316public void testDuplicateModule1() throws IOException {317String moduleName1 = "dupRes1Jmod1";318String moduleName2 = "dupRes1Jmod2";319List<String> classNames = Arrays.asList("java.A", "javax.B");320Path module1 = helper.generateModuleCompiledClasses(321helper.getJmodSrcDir(), helper.getJmodClassesDir(), moduleName1, classNames);322Path module2 = helper.generateModuleCompiledClasses(323helper.getJmodSrcDir(), helper.getJmodClassesDir(), moduleName2, classNames);324325try (OutputStream out = Files.newOutputStream(module2.resolve("module-info.class"))) {326ModuleInfoWriter.write(ModuleDescriptor.newModule(moduleName1)327.requires("java.base").build(), out);328}329330Path jmod1 = JImageGenerator.getJModTask()331.addClassPath(module1)332.jmod(helper.createNewJmodFile(moduleName1))333.create()334.assertSuccess();335Path jmod2 = JImageGenerator.getJModTask()336.addClassPath(module2)337.jmod(helper.createNewJmodFile(moduleName2))338.create()339.assertSuccess();340try {341helper.generateDefaultImage(moduleName1)342.assertFailure("Error: Two versions of module dupRes1Jmod1 found in");343} finally {344deleteDirectory(jmod1);345deleteDirectory(jmod2);346}347}348349public void testDuplicateModule2() throws IOException {350String moduleName = "dupRes2Jmod";351List<String> classNames = Arrays.asList("java.A", "javax.B");352Path module1 = helper.generateModuleCompiledClasses(353helper.getJmodSrcDir(), helper.getJmodClassesDir(), moduleName, classNames);354Path module2 = helper.generateModuleCompiledClasses(355helper.getJarSrcDir(), helper.getJarClassesDir(), moduleName, classNames);356357Path jmod = JImageGenerator.getJModTask()358.addClassPath(module1)359.jmod(helper.createNewJmodFile(moduleName))360.create()361.assertSuccess();362Path jar = JImageGenerator.createJarFile(helper.getJarDir().resolve(moduleName + ".jar"), module2);363Path newJar = helper.getJmodDir().resolve(jar.getFileName());364Files.move(jar, newJar);365try {366helper.generateDefaultImage(moduleName)367.assertFailure("Error: Two versions of module dupRes2Jmod found in");368} finally {369deleteDirectory(jmod);370deleteDirectory(newJar);371}372}373374public void testDuplicateModule3() throws IOException {375String moduleName1 = "dupRes3Jar1";376String moduleName2 = "dupRes3Jar2";377List<String> classNames = Arrays.asList("java.A", "javax.B");378Path module1 = helper.generateModuleCompiledClasses(379helper.getJarSrcDir(), helper.getJarClassesDir(), moduleName1, classNames);380Path module2 = helper.generateModuleCompiledClasses(381helper.getJarSrcDir(), helper.getJarClassesDir(), moduleName2, classNames);382383try (OutputStream out = Files.newOutputStream(module2.resolve("module-info.class"))) {384ModuleInfoWriter.write(ModuleDescriptor.newModule(moduleName1)385.requires("java.base").build(), out);386}387388Path jar1 = JImageGenerator.createJarFile(helper.getJarDir().resolve(moduleName1 + ".jar"), module1);389Path jar2 = JImageGenerator.createJarFile(helper.getJarDir().resolve(moduleName2 + ".jar"), module2);390try {391helper.generateDefaultImage(moduleName1)392.assertFailure("Error: Two versions of module dupRes3Jar1 found in");393} finally {394deleteDirectory(jar1);395deleteDirectory(jar2);396}397}398399public void testInconsistentModuleInfo() throws IOException {400String moduleName = "inconsistentJar";401List<String> classNames = Arrays.asList("xorg.acme.internal.B");402Path module = helper.generateModuleCompiledClasses(403helper.getJarSrcDir(), helper.getJarClassesDir(), moduleName, classNames);404405try (OutputStream out = Files.newOutputStream(module.resolve("module-info.class"))) {406ModuleInfoWriter.write(ModuleDescriptor.newModule(moduleName)407.requires("java.base")408.packages(Set.of("org.acme.internal"))409.build(), out);410}411412Path jar = JImageGenerator.createJarFile(helper.getJarDir().resolve(moduleName + ".jar"), module);413try {414helper.generateDefaultImage(moduleName)415.assertFailure("Module inconsistentJar's descriptor indicates the set of packages is : " +416"[org.acme.internal], but module contains packages: [xorg.acme.internal]");417} finally {418deleteDirectory(jar);419}420}421}422423424