Path: blob/master/test/langtools/tools/jdeps/modules/TransitiveDeps.java
41149 views
/*1* Copyright (c) 2016, 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 Tests jdeps -m and -mp options on named modules and unnamed modules26* @library ../lib27* @build CompilerUtils JdepsUtil28* @modules jdk.jdeps/com.sun.tools.jdeps29* @run testng TransitiveDeps30*/3132import java.io.File;33import java.io.IOException;3435import java.nio.file.Files;36import java.nio.file.Path;37import java.nio.file.Paths;38import java.util.*;39import java.util.function.Function;40import java.util.stream.Collectors;41import java.util.stream.Stream;424344import com.sun.tools.jdeps.DepsAnalyzer;45import com.sun.tools.jdeps.Graph;46import org.testng.annotations.DataProvider;47import org.testng.annotations.BeforeTest;48import org.testng.annotations.Test;4950import static org.testng.Assert.assertTrue;5152public class TransitiveDeps {53private static final String TEST_SRC = System.getProperty("test.src");5455private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");56private static final Path MODS_DIR = Paths.get("mods");57private static final Path LIBS_DIR = Paths.get("libs");5859// the names of the modules in this test60private static String[] modules = new String[] {"unsafe", "mVI", "mVII"};61/**62* Compiles all modules used by the test63*/64@BeforeTest65public void compileAll() throws Exception {66CompilerUtils.cleanDir(MODS_DIR);67CompilerUtils.cleanDir(LIBS_DIR);6869for (String mn : modules) {70// compile a module71assertTrue(CompilerUtils.compileModule(SRC_DIR, MODS_DIR, mn));7273// create JAR files with no module-info.class74Path root = MODS_DIR.resolve(mn);75try (Stream<Path> stream = Files.walk(root, Integer.MAX_VALUE)) {76Stream<Path> entries = stream.filter(f -> {77String fn = f.getFileName().toString();78return fn.endsWith(".class") && !fn.equals("module-info.class");79});80JdepsUtil.createJar(LIBS_DIR.resolve(mn + ".jar"), root, entries);81}82}83}8485@DataProvider(name = "modules")86public Object[][] expected1() {87return new Object[][]{88{ "mVII",89List.of(new ModuleMetaData("mVII")90.requires("mVI")91.requires("unsafe")92.reference("p7.Main", "java.lang.Object", "java.base")93.reference("p7.Main", "java.lang.String", "java.base")94.reference("p7.Main", "org.safe.Lib", "unsafe")95.reference("p7.Main", "p6.safe.Lib", "mVI"),96new ModuleMetaData("mVI")97.requires("unsafe")98.reference("p6.indirect.UnsafeRef", "java.lang.Object", "java.base")99.reference("p6.indirect.UnsafeRef", "org.unsafe.UseUnsafe ", "unsafe")100.reference("p6.safe.Lib", "java.io.PrintStream", "java.base")101.reference("p6.safe.Lib", "java.lang.Class", "java.base")102.reference("p6.safe.Lib", "java.lang.Object", "java.base")103.reference("p6.safe.Lib", "java.lang.String", "java.base")104.reference("p6.safe.Lib", "java.lang.System", "java.base")105.reference("p6.safe.Lib", "org.safe.Lib", "unsafe"),106new ModuleMetaData("unsafe")107.requires("jdk.unsupported")108.reference("org.indirect.UnsafeRef", "java.lang.Object", "java.base")109.reference("org.safe.Lib", "java.io.PrintStream", "java.base")110.reference("org.safe.Lib", "java.lang.Class", "java.base")111.reference("org.safe.Lib", "java.lang.Object", "java.base")112.reference("org.safe.Lib", "java.lang.String", "java.base")113.reference("org.safe.Lib", "java.lang.System", "java.base")114.reference("org.unsafe.UseUnsafe", "java.lang.Object", "java.base")115.jdkInternal("org.unsafe.UseUnsafe", "sun.misc.Unsafe", "java.base")116)117},118};119}120121@Test(dataProvider = "modules")122public void testModulePath(String name, List<ModuleMetaData> data) throws IOException {123Set<String> roots = Set.of("mVI", "unsafe");124125String cmd1 = String.format("jdeps --module-path %s --add-modules %s -m %s%n", MODS_DIR,126roots.stream().collect(Collectors.joining(",")), name);127try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd1)) {128jdeps.verbose("-verbose:class")129.appModulePath(MODS_DIR.toString())130.addmods(roots)131.addmods(Set.of(name));132133runJdeps(jdeps, data);134}135// run automatic modules136roots = Set.of("ALL-MODULE-PATH", "jdk.unsupported");137138String cmd2 = String.format("jdeps --module-path %s --add-modules %s -m %s%n", LIBS_DIR,139roots.stream().collect(Collectors.joining(",")), name);140141try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd2)) {142jdeps.verbose("-verbose:class")143.appModulePath(LIBS_DIR.toString())144.addmods(roots)145.addmods(Set.of(name));146147runJdeps(jdeps, data);148}149}150151@DataProvider(name = "jars")152public Object[][] expected2() {153return new Object[][]{154{ "mVII", List.of(new ModuleMetaData("mVII.jar")155.requires("mVI.jar")156.requires("unsafe.jar")157.reference("p7.Main", "java.lang.Object", "java.base")158.reference("p7.Main", "java.lang.String", "java.base")159.reference("p7.Main", "org.safe.Lib", "unsafe.jar")160.reference("p7.Main", "p6.safe.Lib", "mVI.jar"))161},162};163}164165@Test(dataProvider = "jars")166public void testClassPath(String name, List<ModuleMetaData> data) throws IOException {167String cpath = Arrays.stream(modules)168.filter(mn -> !mn.equals(name))169.map(mn -> LIBS_DIR.resolve(mn + ".jar").toString())170.collect(Collectors.joining(File.pathSeparator));171172Path jarfile = LIBS_DIR.resolve(name + ".jar");173174String cmd = String.format("jdeps -classpath %s %s%n", cpath, jarfile);175try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd)) {176jdeps.verbose("-verbose:class")177.addClassPath(cpath)178.addRoot(jarfile);179180runJdeps(jdeps, data);181}182}183184@DataProvider(name = "compileTimeView")185public Object[][] expected3() {186return new Object[][] {187{"mVII",188List.of(new ModuleMetaData("mVII.jar")189.requires("mVI.jar")190.requires("unsafe.jar")191.reference("p7.Main", "java.lang.Object", "java.base")192.reference("p7.Main", "java.lang.String", "java.base")193.reference("p7.Main", "org.safe.Lib", "unsafe.jar")194.reference("p7.Main", "p6.safe.Lib", "mVI.jar"),195new ModuleMetaData("mVI.jar")196.requires("unsafe.jar")197.reference("p6.indirect.UnsafeRef", "java.lang.Object", "java.base")198.reference("p6.indirect.UnsafeRef", "org.unsafe.UseUnsafe ", "unsafe.jar")199.reference("p6.safe.Lib", "java.io.PrintStream", "java.base")200.reference("p6.safe.Lib", "java.lang.Class", "java.base")201.reference("p6.safe.Lib", "java.lang.Object", "java.base")202.reference("p6.safe.Lib", "java.lang.String", "java.base")203.reference("p6.safe.Lib", "java.lang.System", "java.base")204.reference("p6.safe.Lib", "org.safe.Lib", "unsafe.jar"),205new ModuleMetaData("unsafe.jar")206.requires("jdk.unsupported")207.reference("org.indirect.UnsafeRef", "java.lang.Object", "java.base")208.reference("org.safe.Lib", "java.io.PrintStream", "java.base")209.reference("org.safe.Lib", "java.lang.Class", "java.base")210.reference("org.safe.Lib", "java.lang.Object", "java.base")211.reference("org.safe.Lib", "java.lang.String", "java.base")212.reference("org.safe.Lib", "java.lang.System", "java.base")213.reference("org.unsafe.UseUnsafe", "java.lang.Object", "java.base")214.jdkInternal("org.unsafe.UseUnsafe", "sun.misc.Unsafe", "java.base")215)216},217};218}219220@Test(dataProvider = "compileTimeView")221public void compileTimeView(String name, List<ModuleMetaData> data) throws IOException {222String cpath = Arrays.stream(modules)223.filter(mn -> !mn.equals(name))224.map(mn -> LIBS_DIR.resolve(mn + ".jar").toString())225.collect(Collectors.joining(File.pathSeparator));226227Path jarfile = LIBS_DIR.resolve(name + ".jar");228229String cmd = String.format("jdeps -ct -classpath %s %s%n", cpath, jarfile);230try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd)) {231jdeps.verbose("-verbose:class")232.addClassPath(cpath)233.addRoot(jarfile);234235runJdeps(jdeps, data, true, 0 /* -recursive */);236}237}238239@DataProvider(name = "recursiveDeps")240public Object[][] expected4() {241return new Object[][] {242{"mVII",243List.of(new ModuleMetaData("mVII.jar")244.requires("mVI.jar")245.requires("unsafe.jar")246.reference("p7.Main", "java.lang.Object", "java.base")247.reference("p7.Main", "java.lang.String", "java.base")248.reference("p7.Main", "org.safe.Lib", "unsafe.jar")249.reference("p7.Main", "p6.safe.Lib", "mVI.jar"),250new ModuleMetaData("mVI.jar")251.requires("unsafe.jar")252.reference("p6.safe.Lib", "java.io.PrintStream", "java.base")253.reference("p6.safe.Lib", "java.lang.Class", "java.base")254.reference("p6.safe.Lib", "java.lang.Object", "java.base")255.reference("p6.safe.Lib", "java.lang.String", "java.base")256.reference("p6.safe.Lib", "java.lang.System", "java.base")257.reference("p6.safe.Lib", "org.safe.Lib", "unsafe.jar"),258new ModuleMetaData("unsafe.jar")259.requires("jdk.unsupported")260.reference("org.indirect.UnsafeRef", "java.lang.Object", "java.base")261.reference("org.safe.Lib", "java.io.PrintStream", "java.base")262.reference("org.safe.Lib", "java.lang.Class", "java.base")263.reference("org.safe.Lib", "java.lang.Object", "java.base")264.reference("org.safe.Lib", "java.lang.String", "java.base")265.reference("org.safe.Lib", "java.lang.System", "java.base")266)267},268};269}270@Test(dataProvider = "recursiveDeps")271public void recursiveDeps(String name, List<ModuleMetaData> data) throws IOException {272String cpath = Arrays.stream(modules)273.filter(mn -> !mn.equals(name))274.map(mn -> LIBS_DIR.resolve(mn + ".jar").toString())275.collect(Collectors.joining(File.pathSeparator));276277Path jarfile = LIBS_DIR.resolve(name + ".jar");278279String cmd = String.format("jdeps -R -classpath %s %s%n", cpath, jarfile);280try (JdepsUtil.Command jdeps = JdepsUtil.newCommand(cmd)) {281jdeps.verbose("-verbose:class").filter("-filter:archive")282.addClassPath(cpath)283.addRoot(jarfile);284285runJdeps(jdeps, data, true, 0 /* -recursive */);286}287}288289private void runJdeps(JdepsUtil.Command jdeps, List<ModuleMetaData> data)290throws IOException291{292runJdeps(jdeps, data, false, 1 /* depth */);293}294295private void runJdeps(JdepsUtil.Command jdeps, List<ModuleMetaData> data,296boolean compileTimeView, int depth)297throws IOException298{299// run the analyzer300DepsAnalyzer analyzer = jdeps.getDepsAnalyzer();301assertTrue(analyzer.run(compileTimeView, depth));302jdeps.dumpOutput(System.err);303304// analyze result305Graph<DepsAnalyzer.Node> g1 = analyzer.moduleGraph();306Map<String, ModuleMetaData> dataMap = data.stream()307.collect(Collectors.toMap(ModuleMetaData::name, Function.identity()));308309// the returned graph contains all nodes such as java.base and jdk.unsupported310g1.nodes().stream()311.filter(u -> dataMap.containsKey(u.name))312.forEach(u -> {313ModuleMetaData md = dataMap.get(u.name);314md.checkRequires(u.name, g1.adjacentNodes(u));315});316317Graph<DepsAnalyzer.Node> g2 = analyzer.dependenceGraph();318319g2.nodes().stream()320.filter(u -> dataMap.containsKey(u.name))321.forEach(u -> {322ModuleMetaData md = dataMap.get(u.name);323md.checkDependences(u.name, g2.adjacentNodes(u));324});325}326}327328329