/* * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 8205593 8240169 8274639 * @summary Javadoc -link makes broken links if module name matches package name * @library /tools/lib ../../lib * @modules * jdk.javadoc/jdk.javadoc.internal.tool * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main * @build javadoc.tester.* * @run main TestLinkOptionWithModule */ import java.nio.file.Path; import java.nio.file.Paths; import builder.ClassBuilder; import builder.ClassBuilder.*; import toolbox.ModuleBuilder; import toolbox.ToolBox; import javadoc.tester.JavadocTester; public class TestLinkOptionWithModule extends JavadocTester { final ToolBox tb; private final Path moduleSrc, packageSrc; public static void main(String... args) throws Exception { var tester = new TestLinkOptionWithModule(); tester.runTests(); } TestLinkOptionWithModule() throws Exception { tb = new ToolBox(); moduleSrc = Paths.get("src", "modules"); packageSrc = Paths.get("src", "packages"); initModulesAndPackages(); } @Test public void testModuleLinkedToModule(Path base) throws Exception { Path out1 = base.resolve("out1a"), out2 = base.resolve("out1b"); javadoc("-d", out1.toString(), "--module-source-path", moduleSrc.toString(), "--module", "com.ex1"); javadoc("-d", out2.toString(), "-Werror", "-Xdoclint:-missing", "--module-source-path", moduleSrc.toString(), "--module", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); checkOutput("com.ex2/com/ex2/B.html", true, """ A"""); } @Test public void testPackageLinkedToPackage(Path base) throws Exception { Path out1 = base.resolve("out2a"), out2 = base.resolve("out2b"); javadoc("-d", out1.toString(), "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex1"); javadoc("-d", out2.toString(), "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); checkOutput("com/ex2/B.html", true, """ A"""); } @Test public void testModuleLinkedToPackage(Path base) throws Exception { Path out1 = base.resolve("out3a"), out2 = base.resolve("out3b"); javadoc("-d", out1.toString(), "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex1"); javadoc("-d", out2.toString(), "--link-modularity-mismatch", "warn", "--module-source-path", moduleSrc.toString(), "--module", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); checkOutput(Output.OUT, true, "warning: The code being documented uses modules but the packages defined " + "in ../out3a/ are in the unnamed module"); checkOutput("com.ex2/com/ex2/B.html", true, """ A"""); } @Test public void testPackageLinkedToModule(Path base) throws Exception { Path out1 = base.resolve("out4a"), out2 = base.resolve("out4b"); javadoc("-d", out1.toString(), "--module-source-path", moduleSrc.toString(), "--module", "com.ex1"); javadoc("-d", out2.toString(), "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); checkOutput(Output.OUT, true, "warning: The code being documented uses packages in the unnamed module, but the packages defined " + "in ../out4a/ are in named modules"); checkOutput("com/ex2/B.html", true, """ A"""); } @Test public void testModuleLinkedToPackageNoWarning(Path base) throws Exception { Path out1 = base.resolve("out5a"), out2 = base.resolve("out5b"); javadoc("-d", out1.toString(), "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex1"); javadoc("-d", out2.toString(), "--link-modularity-mismatch", "info", "-Werror", "-Xdoclint:-missing", "--module-source-path", moduleSrc.toString(), "--module", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); checkOutput(Output.OUT, true, "The code being documented uses modules but the packages defined " + "in ../out5a/ are in the unnamed module"); checkOutput("com.ex2/com/ex2/B.html", true, """ A"""); } @Test public void testPackageLinkedToModuleNoWarning(Path base) throws Exception { Path out1 = base.resolve("out6a"), out2 = base.resolve("out6b"); javadoc("-d", out1.toString(), "--module-source-path", moduleSrc.toString(), "--module", "com.ex1"); javadoc("-d", out2.toString(), "--link-modularity-mismatch", "info", "-quiet", // should not print modularity mismatch info "-Werror", "-Xdoclint:-missing", "-sourcepath", packageSrc.toString(), "-subpackages", "com.ex2", "-link", "../" + out1.getFileName()); checkExit(Exit.OK); // Modularity mismatch diagnostic should not be printed because we're runnning with -quiet option checkOutput(Output.OUT, false, "The code being documented uses packages in the unnamed module, but the packages defined " + "in ../out6a/ are in named modules"); checkOutput("com/ex2/B.html", true, """ A"""); } void initModulesAndPackages() throws Exception{ new ModuleBuilder(tb, "com.ex1") .exports("com.ex1") .classes("package com.ex1; public class A{}") .write(moduleSrc); new ModuleBuilder(tb, "com.ex2") .requires("com.ex1") .exports("com.ex2") .classes(""" package com.ex2;\s import com.ex1.A; public class B{ public B(A obj){} } """) .write(moduleSrc); new ClassBuilder(tb, "com.ex1.A") .setModifiers("public","class") .write(packageSrc); new ClassBuilder(tb, "com.ex2.B") .addImports("com.ex1.A") .setModifiers("public","class") .addMembers(MethodBuilder.parse("public void foo(A a)")) .write(packageSrc); } }