Path: blob/master/test/langtools/jdk/javadoc/tool/modules/Modules.java
40974 views
/*1* Copyright (c) 2016, 2021, 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* @bug 8159305 8166127 8175860 8176481 823957526* @summary Tests primarily the module graph computations.27* @modules28* jdk.javadoc/jdk.javadoc.internal.api29* jdk.javadoc/jdk.javadoc.internal.tool30* jdk.compiler/com.sun.tools.javac.api31* jdk.compiler/com.sun.tools.javac.main32* @library /tools/lib33* @build toolbox.ToolBox toolbox.TestRunner34* @run main Modules35*/3637import java.io.IOException;38import java.nio.file.Files;39import java.nio.file.Path;40import java.nio.file.Paths;4142import toolbox.*;43import toolbox.Task.Expect;44import toolbox.Task.OutputKind;4546public class Modules extends ModuleTestBase {4748public static void main(String... args) throws Exception {49new Modules().runTests();50}5152@Test53public void testBasicMoption(Path base) throws Exception {54Files.createDirectory(base);55Path src = base.resolve("src");56ModuleBuilder mb = new ModuleBuilder(tb, "m1");57mb.comment("The first module.")58.exports("pub")59.classes("package pub; /** Class A */ public class A {}")60.classes("package pro; /** Class B */ public class B {}")61.write(src);62execTask("--module-source-path", src.toString(),63"--module", "m1");64checkModulesSpecified("m1");65checkPackagesIncluded("pub");66checkTypesIncluded("pub.A");67}6869@Test70public void testMultipleModulesOption1(Path base) throws Exception {71Path src = base.resolve("src");7273ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");74mb1.comment("The first module.")75.exports("m1pub")76.requires("m2")77.classes("package m1pub; /** Class A */ public class A {}")78.classes("package m1pro; /** Class B */ public class B {}")79.write(src);8081ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");82mb2.comment("The second module.")83.exports("m2pub")84.classes("package m2pub; /** Class A */ public class A {}")85.classes("package m2pro; /** Class B */ public class B {}")86.write(src);87execTask("--module-source-path", src.toString(),88"--module", "m1,m2");89checkModulesSpecified("m1", "m2");90checkPackagesIncluded("m1pub", "m2pub");91checkTypesIncluded("m1pub.A", "m2pub.A");9293}9495@Test96public void testMissingModuleWithSourcePath(Path base) throws Exception {97Path src = base.resolve("src");98Path mod = src.resolve("m1");99100ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");101mb1.comment("The first module.")102.exports("m1pub")103.requires("m2")104.classes("package m1pub; /** Class A */ public class A {}")105.classes("package m1pro; /** Class B */ public class B {}")106.write(src);107108Path javafile = Paths.get(mod.toString(), "m1pub/A.java");109110execNegativeTask("--source-path", mod.toString(),111javafile.toString());112113assertMessagePresent("error: cannot access module-info");114assertMessageNotPresent("error: fatal error encountered");115116}117118@Test119public void testMultipleModulesAggregatedModuleOption(Path base) throws Exception {120Path src = base.resolve("src");121122ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");123mb1.comment("The first module.")124.exports("m1pub")125.requires("m2")126.classes("package m1pub; /** Class A */ public class A {}")127.classes("package m1pro; /** Class B */ public class B {}")128.write(src);129130ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");131mb2.comment("The second module.")132.exports("m2pub")133.classes("package m2pub; /** Class A */ public class A {}")134.classes("package m2pro; /** Class B */ public class B {}")135.write(src);136execTask("--module-source-path", src.toString(),137"--module", "m1",138"--module", "m2");139checkModulesSpecified("m1", "m2");140checkPackagesIncluded("m1pub", "m2pub");141checkTypesIncluded("m1pub.A", "m2pub.A");142143}144145@Test146public void testModulePathOption(Path base) throws Exception {147Path src = base.resolve("src");148Path modulePath = base.resolve("modules");149150ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");151mb1.comment("Module on module path.")152.exports("pkg1")153.classes("package pkg1; /** Class A */ public class A { }")154.build(modulePath);155156ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");157mb2.comment("The second module.")158.exports("pkg2")159.requires("m1")160.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }")161.write(src);162execTask("--module-source-path", src.toString(),163"--module-path", modulePath.toString(),164"--module", "m2");165checkModulesSpecified("m2");166checkPackagesIncluded("pkg2");167checkMembersSelected("pkg2.B.f");168169// module path option "-p"170execTask("--module-source-path", src.toString(),171"-p", modulePath.toString(),172"--module", "m2");173// no module path174execNegativeTask("--module-source-path", src.toString(),175"--module", "m2");176assertMessagePresent("error: module not found: m1");177}178179@Test180public void testUpgradeModulePathOption(Path base) throws Exception {181Path src = base.resolve("src");182Path modulePath = base.resolve("modules");183Path upgradePath = base.resolve("upgrades");184185ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");186mb1.comment("Module on module path.")187.exports("pkg1")188.classes("package pkg1; /** Class A */ public class A { }")189.build(modulePath);190191ModuleBuilder mbUpgrade = new ModuleBuilder(tb, "m1");192mbUpgrade.comment("Module on upgrade module path.")193.exports("pkg1")194.classes("package pkg1; /** Class C */ public class C { }")195.build(upgradePath);196197ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");198mb2.comment("The second module.")199.exports("pkg2")200.requires("m1")201.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.C f; }")202.write(src);203execTask("--module-source-path", src.toString(),204"--module-path", modulePath.toString(),205"--upgrade-module-path", upgradePath.toString(),206"--module", "m2");207checkModulesSpecified("m2");208checkPackagesIncluded("pkg2");209checkMembersSelected("pkg2.B.f");210211// no upgrade module path212execNegativeTask("--module-source-path", src.toString(),213"--module-path", modulePath.toString(),214"--module", "m2");215assertMessagePresent("error: cannot find symbol");216217// dependency from module path218ModuleBuilder mb3 = new ModuleBuilder(tb, "m3");219mb3.comment("The third module.")220.exports("pkg3")221.requires("m1")222.classes("package pkg3; /** Class Z */ public class Z { /** Field f */ public pkg1.A f; }")223.write(src);224execNegativeTask("--module-source-path", src.toString(),225"--module-path", modulePath.toString(),226"--upgrade-module-path", upgradePath.toString(),227"--module", "m3");228assertMessagePresent("Z.java:1: error: cannot find symbol");229}230231@Test232public void testAddModulesOption(Path base) throws Exception {233Path src = base.resolve("src");234Path modulePath = base.resolve("modules");235236ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");237mb1.comment("Module on module path.")238.exports("pkg1")239.classes("package pkg1; /** Class A */ public class A { }")240.build(modulePath);241242ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");243mb2.comment("The second module.")244.exports("pkg2")245.classes("package pkg2; /** @see pkg1.A */ public class B { }")246.write(src);247248Path out = base.resolve("out-1");249Files.createDirectories(out);250String log = new JavadocTask(tb)251.outdir(out)252.options("--module-source-path", src.toString(),253"--module-path", modulePath.toString(),254"--module", "m2")255.run(Expect.FAIL)256.writeAll()257.getOutput(OutputKind.DIRECT);258if (!log.contains("B.java:1: error: reference not found")) {259throw new Exception("Error not found");260}261262out = base.resolve("out-2");263Files.createDirectories(out);264new JavadocTask(tb)265.outdir(out)266.options("--module-source-path", src.toString(),267"--module-path", modulePath.toString(),268"--add-modules", "m1",269"--module", "m2")270.run()271.writeAll();272}273274@Test275public void testLimitModulesOption(Path base) throws Exception {276Path src = base.resolve("src");277Path modulePath = base.resolve("modules");278279ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");280mb1.comment("Module on module path.")281.build(modulePath);282283ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");284mb2.comment("The second module.")285.exports("pkg2")286.requires("m1")287.classes("package pkg2; /** Class B */ public class B { }")288.write(src);289290execNegativeTask("--module-source-path", src.toString(),291"--module-path", modulePath.toString(),292"--limit-modules", "java.base",293"--module", "m2");294assertMessagePresent("error: module not found: m1");295}296297@Test298public void testAddExportsOption(Path base) throws Exception {299Path src = base.resolve("src");300Path modulePath = base.resolve("modules");301302ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");303mb1.comment("Module on module path.")304.classes("package pkg1; /** Class A */ public class A { }")305.build(modulePath);306307ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");308mb2.comment("The second module.")309.exports("pkg2")310.requires("m1")311.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f; }")312.write(src);313execTask("--module-source-path", src.toString(),314"--module-path", modulePath.toString(),315"--add-exports", "m1/pkg1=m2",316"--module", "m2");317checkModulesSpecified("m2");318checkPackagesIncluded("pkg2");319checkMembersSelected("pkg2.B.f");320}321322@Test323public void testAddReadsOption(Path base) throws Exception {324Path src = base.resolve("src");325Path modulePath = base.resolve("modules");326327ModuleBuilder mb1 = new ModuleBuilder(tb, "m1");328mb1.comment("Module on module path.")329.exports("pkg1")330.classes("package pkg1; /** Class A */ public class A {}")331.build(modulePath);332333ModuleBuilder mb2 = new ModuleBuilder(tb, "m2");334mb2.comment("The second module.")335.exports("pkg2")336.classes("package pkg2; /** Class B */ public class B { /** Field f */ public pkg1.A f;}")337.write(src);338execTask("--module-source-path", src.toString(),339"--module-path", modulePath.toString(),340"--add-modules", "m1",341"--add-reads", "m2=m1",342"--module", "m2");343checkModulesSpecified("m2");344checkPackagesIncluded("pkg2");345checkMembersSelected("pkg2.B.f");346}347348@Test349public void testModuleOptionsWithLegacy(Path base) throws Exception {350Files.createDirectory(base);351Path src = base.resolve("src");352Path classpath = base.resolve("classpath");353Path modulePath = base.resolve("modules");354355tb.writeJavaFiles(classpath, "package pkg1; /** Class C */ public class C { }");356new JavacTask(tb)357.files(classpath.resolve("pkg1/C.java"))358.run();359360ModuleBuilder mb = new ModuleBuilder(tb, "m1");361mb.comment("The first module.")362.exports("pub")363.classes("package pub; /** Class M */ public class M { }")364.build(modulePath);365366tb.writeJavaFiles(src, "package pkg; /** Class L */ public class L { public pkg1.C f1; public pub.M f2; }");367368execTask("--source-path", src.toString(),369"--class-path", classpath.toString(),370"--module-path", modulePath.toString(),371"--add-modules", "m1",372"pkg");373checkPackagesIncluded("pkg");374checkTypesIncluded("pkg.L");375checkMembersSelected("pkg.L.f1");376checkMembersSelected("pkg.L.f2");377assertAbsent("error", OutputKind.DIRECT);378}379380/**381* Tests diamond graph, inspired by javac diamond tests.382*383*384* Module M : test module, with variable requires385*386* Module N :387* requires transitive O ---> Module O:388* requires J ----> Module J:389* exports openO exports openJ390*391*392* Module L :393* requires transitive P ---> Module P:394* exports openP395*396*397*/398399@Test400public void testExpandRequiresNone(Path base) throws Exception {401Path src = base.resolve("src");402403createAuxiliaryModules(src);404405new ModuleBuilder(tb, "M")406.comment("The M module.")407.requires("N", src)408.requires("L", src)409.requires("O", src)410.exports("p")411.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")412.write(src);413414execTask("--module-source-path", src.toString(),415"--module", "M");416417checkModulesSpecified("M");418checkModulesIncluded("M");419checkPackagesIncluded("p");420checkTypesIncluded("p.Main");421checkPackagesNotIncluded(".*open.*");422assertMessageNotPresent("warning");423}424425@Test426public void testExpandRequiresTransitive(Path base) throws Exception {427Path src = base.resolve("src");428429createAuxiliaryModules(src);430431new ModuleBuilder(tb, "M")432.comment("The M module.")433.requiresTransitive("N", src)434.requires("L", src)435.exports("p")436.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")437.write(src);438439execTask("--module-source-path", src.toString(),440"--module", "M",441"--expand-requires", "transitive");442443checkModulesSpecified("M", "N", "O");444checkModulesNotSpecified("java.base");445checkModulesIncluded("M", "N", "O");446checkModulesNotIncluded("java.base");447checkPackagesIncluded("p", "openN", "openO");448checkTypesIncluded("p.Main", "openN.N", "openO.O");449assertMessageNotPresent("warning");450}451452@Test453public void testExpandRequiresTransitiveWithMandated(Path base) throws Exception {454Path src = base.resolve("src");455456createAuxiliaryModules(src);457458Path patchSrc = Paths.get(src.toString(), "patch");459460new ModuleBuilder(tb, "M")461.comment("The M module.")462.requiresTransitive("N", src)463.requires("L", src)464.exports("p")465.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")466.write(src);467468// build the patching module469tb.writeJavaFiles(patchSrc, """470package pkg1;471/** Class A */ public class A extends java.util.ArrayList { }""");472tb.writeJavaFiles(patchSrc, """473package pkg1;474/** Class B */ public class B { }""");475476execTask("--module-source-path", src.toString(),477"--patch-module", "java.base=" + patchSrc.toString(),478"--module", "M",479"--expand-requires", "transitive");480481checkModulesSpecified("java.base", "M", "N", "O");482checkModulesIncluded("java.base", "M", "N", "O");483checkPackagesIncluded("p", "openN", "openO");484checkTypesIncluded("p.Main", "openN.N", "openO.O");485assertMessageNotPresent("warning");486}487488@Test489public void testExpandRequiresAll(Path base) throws Exception {490Path src = base.resolve("src");491492createAuxiliaryModules(src);493494new ModuleBuilder(tb, "M")495.comment("The M module.")496.requiresTransitive("N", src)497.requires("L", src)498.requires("O", src)499.exports("p")500.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")501.write(src);502503execTask("--module-source-path", src.toString(),504"--module", "M",505"--expand-requires", "all");506507checkModulesSpecified("M", "N", "L", "O");508checkModulesIncluded("M", "N", "L", "O");509checkModulesNotIncluded("P", "J", "Q");510checkPackagesIncluded("p", "openN", "openL", "openO");511checkPackagesNotIncluded(".*openP.*", ".*openJ.*");512checkTypesIncluded("p.Main", "openN.N", "openL.L", "openO.O");513checkTypesNotIncluded(".*openP.*", ".*openJ.*");514assertMessageNotPresent("warning");515}516517@Test518public void testMissingModule(Path base) throws Exception {519Path src = base.resolve("src");520521createAuxiliaryModules(src);522523new ModuleBuilder(tb, "M")524.comment("The M module.")525.requiresTransitive("N", src)526.requires("L", src)527.requires("O", src)528.exports("p")529.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")530.write(src);531532execNegativeTask("--module-source-path", src.toString(),533"--module", "MIA",534"--expand-requires", "all");535536assertMessagePresent("error: module MIA not found");537}538539@Test540public void testMissingModuleMultiModuleCmdline(Path base) throws Exception {541Path src = base.resolve("src");542543createAuxiliaryModules(src);544545new ModuleBuilder(tb, "M")546.comment("The M module.")547.requiresTransitive("N", src)548.requires("L", src)549.requires("O", src)550.exports("p")551.classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }")552.write(src);553554execNegativeTask("--module-source-path", src.toString(),555"--module", "M,N,L,MIA,O,P",556"--expand-requires", "all");557558assertMessagePresent("error: module MIA not found");559}560561@Test562public void testSingleModuleOptionWithSourcePath(Path base) throws Exception {563Path src = base.resolve("src");564Path mod = createSimpleModule(src, "m1");565execTask("--source-path", mod.toString(),566"--module", "m1");567checkModulesSpecified("m1");568checkPackagesIncluded("p");569checkTypesIncluded("p.C");570}571572@Test573public void testSingleModuleOptionWithMissingModuleInSourcePath(Path base) throws Exception {574Path src = base.resolve("src");575Path mod = createSimpleModule(src, "m1");576execNegativeTask("--source-path", mod.toString(),577"--module", "m2");578assertMessagePresent("source path does not contain module m2");579}580581@Test582public void testMultipleModuleOptionWithSourcePath(Path base) throws Exception {583Path src = base.resolve("src");584Path mod = createSimpleModule(src, "m1");585execNegativeTask("--source-path", mod.toString(),586"--module", "m1,m2,m3");587assertMessagePresent("cannot use source path for multiple modules m1, m2, m3");588}589590@Test591public void testSingleModuleOptionWithNoModuleOnSourcePath(Path base) throws Exception {592Path src = base.resolve("src");593Path mod1 = Paths.get(src.toString(), "m1");594execNegativeTask("--source-path", mod1.toString(),595"--module", "m1");596assertMessagePresent("module m1 not found on source path");597}598599Path createSimpleModule(Path src, String mname) throws IOException {600Path mpath = Paths.get(src.toString(), mname);601tb.writeJavaFiles(mpath,602"module " + mname + " { exports p; }",603"package p; public class C { }");604return mpath;605}606607void createAuxiliaryModules(Path src) throws IOException {608609new ModuleBuilder(tb, "J")610.comment("The J module.")611.exports("openJ")612.classes("package openJ; /** Class J open. */ public class J { }")613.classes("package closedJ; /** Class J closed. */ public class J { }")614.write(src);615616new ModuleBuilder(tb, "L")617.comment("The L module.")618.exports("openL")619.requiresTransitive("P")620.classes("package openL; /** Class L open */ public class L { }")621.classes("package closedL; /** Class L closed */ public class L { }")622.write(src);623624new ModuleBuilder(tb, "N")625.comment("The N module.")626.exports("openN")627.requiresTransitive("O")628.classes("package openN; /** Class N open */ public class N { }")629.classes("package closedN; /** Class N closed */ public class N { }")630.write(src);631632new ModuleBuilder(tb, "O")633.comment("The O module.")634.exports("openO")635.requires("J")636.classes("package openO; /** Class O open. */ public class O { openJ.J j; }")637.classes("package closedO; /** Class O closed. */ public class O { }")638.write(src);639640new ModuleBuilder(tb, "P")641.comment("The P module.")642.exports("openP")643.requires("J")644.classes("package openP; /** Class O open. */ public class O { openJ.J j; }")645.classes("package closedP; /** Class O closed. */ public class O { }")646.write(src);647648new ModuleBuilder(tb, "Q")649.comment("The Q module.")650.exports("openQ")651.requires("J")652.classes("package openQ; /** Class Q open. */ public class Q { openJ.J j; }")653.classes("package closedQ; /** Class Q closed. */ public class Q { }")654.write(src);655656}657658@Test659public void testSingleModuleOptionWithSourcePathAndAnnotatedModule(Path base) throws Exception {660Path src = base.resolve("src");661Path mod = Paths.get(src.toString(), "m1");662tb.writeJavaFiles(mod,663"@Deprecated module m1 { exports p; }",664"package p; public class C { }",665"package p; public class P { }");666execTask("--source-path", mod.toString(),667"--module", "m1");668checkModulesSpecified("m1");669checkPackagesIncluded("p");670checkTypesIncluded("p.C");671checkTypesIncluded("p.P");672}673674}675676677