Modules.java revision 3595:81692f730015
1259698Sdim/* 2259698Sdim * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3259698Sdim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4259698Sdim * 5259698Sdim * This code is free software; you can redistribute it and/or modify it 6259698Sdim * under the terms of the GNU General Public License version 2 only, as 7259698Sdim * published by the Free Software Foundation. 8259698Sdim * 9259698Sdim * This code is distributed in the hope that it will be useful, but WITHOUT 10259698Sdim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11259698Sdim * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12259698Sdim * version 2 for more details (a copy is included in the LICENSE file that 13259698Sdim * accompanied this code). 14259698Sdim * 15259698Sdim * You should have received a copy of the GNU General Public License version 16259698Sdim * 2 along with this work; if not, write to the Free Software Foundation, 17259698Sdim * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18259698Sdim * 19259698Sdim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20259698Sdim * or visit www.oracle.com if you need additional information or have any 21259698Sdim * questions. 22259698Sdim */ 23259698Sdim 24259698Sdim/** 25259698Sdim * @test 26259698Sdim * @bug 8159305 27259698Sdim * @summary Tests primarily the module graph computations. 28259698Sdim * @modules 29259698Sdim * jdk.javadoc/jdk.javadoc.internal.api 30259698Sdim * jdk.javadoc/jdk.javadoc.internal.doclets.standard 31259698Sdim * jdk.javadoc/jdk.javadoc.internal.tool 32259698Sdim * jdk.compiler/com.sun.tools.javac.api 33259698Sdim * jdk.compiler/com.sun.tools.javac.main 34259698Sdim * @library /tools/lib 35259698Sdim * @build toolbox.ToolBox toolbox.TestRunner 36259698Sdim * @run main Modules 37259698Sdim */ 38259698Sdim 39259698Sdimimport java.io.IOException; 40259698Sdimimport java.nio.file.Files; 41259698Sdimimport java.nio.file.Path; 42259698Sdim 43259698Sdimimport toolbox.*; 44259698Sdim 45259698Sdimpublic class Modules extends ModuleTestBase { 46259698Sdim 47259698Sdim public static void main(String... args) throws Exception { 48259698Sdim new Modules().runTests(); 49259698Sdim } 50259698Sdim 51259698Sdim @Test 52259698Sdim public void testBasicMoption(Path base) throws Exception { 53259698Sdim Files.createDirectory(base); 54259698Sdim Path src = base.resolve("src"); 55259698Sdim ModuleBuilder mb = new ModuleBuilder(tb, "m1"); 56259698Sdim mb.comment("The first module.") 57259698Sdim .exports("pub") 58259698Sdim .classes("package pub; /** Klass A */ public class A {}") 59259698Sdim .classes("package pro; /** Klass B */ public class B {}") 60259698Sdim .write(src); 61259698Sdim execTask("-modulesourcepath", src.toString(), 62259698Sdim "--module", "m1"); 63259698Sdim checkModulesSpecified("m1"); 64259698Sdim checkPackagesIncluded("pub"); 65259698Sdim checkTypesIncluded("pub.A"); 66259698Sdim } 67259698Sdim 68259698Sdim @Test 69259698Sdim public void testMultipleModulesOption1(Path base) throws Exception { 70259698Sdim Path src = base.resolve("src"); 71259698Sdim 72259698Sdim ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); 73259698Sdim mb1.comment("The first module.") 74259698Sdim .exports("m1pub") 75259698Sdim .requires("m2") 76259698Sdim .classes("package m1pub; /** Klass A */ public class A {}") 77259698Sdim .classes("package m1pro; /** Klass B */ public class B {}") 78259698Sdim .write(src); 79259698Sdim 80259698Sdim ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); 81259698Sdim mb2.comment("The second module.") 82259698Sdim .exports("m2pub") 83259698Sdim .classes("package m2pub; /** Klass A */ public class A {}") 84259698Sdim .classes("package m2pro; /** Klass B */ public class B {}") 85259698Sdim .write(src); 86259698Sdim execTask("-modulesourcepath", src.toString(), 87259698Sdim "--module", "m1,m2"); 88259698Sdim checkModulesSpecified("m1", "m2"); 89259698Sdim checkPackagesIncluded("m1pub", "m2pub"); 90259698Sdim checkTypesIncluded("m1pub.A", "m2pub.A"); 91259698Sdim 92259698Sdim } 93259698Sdim 94259698Sdim @Test 95259698Sdim public void testMultipleModulesAggregatedModuleOption(Path base) throws Exception { 96259698Sdim Path src = base.resolve("src"); 97259698Sdim 98259698Sdim ModuleBuilder mb1 = new ModuleBuilder(tb, "m1"); 99259698Sdim mb1.comment("The first module.") 100259698Sdim .exports("m1pub") 101259698Sdim .requires("m2") 102259698Sdim .classes("package m1pub; /** Klass A */ public class A {}") 103259698Sdim .classes("package m1pro; /** Klass B */ public class B {}") 104259698Sdim .write(src); 105259698Sdim 106259698Sdim ModuleBuilder mb2 = new ModuleBuilder(tb, "m2"); 107259698Sdim mb2.comment("The second module.") 108259698Sdim .exports("m2pub") 109259698Sdim .classes("package m2pub; /** Klass A */ public class A {}") 110259698Sdim .classes("package m2pro; /** Klass B */ public class B {}") 111259698Sdim .write(src); 112259698Sdim execTask("-modulesourcepath", src.toString(), 113259698Sdim "--module", "m1", 114259698Sdim "--module", "m2"); 115259698Sdim checkModulesSpecified("m1", "m2"); 116259698Sdim checkPackagesIncluded("m1pub", "m2pub"); 117259698Sdim checkTypesIncluded("m1pub.A", "m2pub.A"); 118259698Sdim 119 } 120 121 /** 122 * Tests diamond graph, inspired by javac diamond tests. 123 * 124 * 125 * Module M : test module, with variable requires 126 * 127 * Module N : 128 * requires public O ---> Module O: 129 * requires J ----> Module J: 130 * exports openO exports openJ 131 * 132 * 133 * Module L : 134 * requires public P ---> Module P: 135 * exports openP 136 * 137 * 138 */ 139 140 @Test 141 public void testExpandRequiresNone(Path base) throws Exception { 142 Path src = base.resolve("src"); 143 144 createAuxiliaryModules(src); 145 146 new ModuleBuilder(tb, "M") 147 .comment("The M module.") 148 .requires("N", src) 149 .requires("L", src) 150 .requires("O", src) 151 .exports("p") 152 .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") 153 .write(src); 154 155 execTask("-modulesourcepath", src.toString(), 156 "--module", "M"); 157 158 checkModulesSpecified("M"); 159 checkModulesIncluded("M"); 160 checkPackagesIncluded("p"); 161 checkTypesIncluded("p.Main"); 162 checkPackagesNotIncluded(".*open.*"); 163 } 164 165 @Test 166 public void testExpandRequiresPublic(Path base) throws Exception { 167 Path src = base.resolve("src"); 168 169 createAuxiliaryModules(src); 170 171 new ModuleBuilder(tb, "M") 172 .comment("The M module.") 173 .requiresPublic("N", src) 174 .requires("L", src) 175 .exports("p") 176 .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") 177 .write(src); 178 179 execTask("-modulesourcepath", src.toString(), 180 "--module", "M", 181 "--expand-requires:public"); 182 183 checkModulesSpecified("M", "N", "O"); 184 checkModulesIncluded("M", "N", "O"); 185 checkPackagesIncluded("p", "openN", "openO"); 186 checkTypesIncluded("p.Main", "openN.N", "openO.O"); 187 } 188 189 @Test 190 public void testExpandRequiresAll(Path base) throws Exception { 191 Path src = base.resolve("src"); 192 193 createAuxiliaryModules(src); 194 195 new ModuleBuilder(tb, "M") 196 .comment("The M module.") 197 .requiresPublic("N", src) 198 .requires("L", src) 199 .requires("O", src) 200 .exports("p") 201 .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") 202 .write(src); 203 204 execTask("-modulesourcepath", src.toString(), 205 "--module", "M", 206 "--expand-requires:all"); 207 208 checkModulesSpecified("M", "java.base", "N", "L", "O"); 209 checkModulesIncluded("M", "java.base", "N", "L", "O"); 210 checkModulesNotIncluded("P", "J", "Q"); 211 checkPackagesIncluded("p", "openN", "openL", "openO"); 212 checkPackagesNotIncluded(".*openP.*", ".*openJ.*"); 213 checkTypesIncluded("p.Main", "openN.N", "openL.L", "openO.O"); 214 checkTypesNotIncluded(".*openP.*", ".*openJ.*"); 215 } 216 217 @Test 218 public void testMissingModule(Path base) throws Exception { 219 Path src = base.resolve("src"); 220 221 createAuxiliaryModules(src); 222 223 new ModuleBuilder(tb, "M") 224 .comment("The M module.") 225 .requiresPublic("N", src) 226 .requires("L", src) 227 .requires("O", src) 228 .exports("p") 229 .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") 230 .write(src); 231 232 execNegativeTask("-modulesourcepath", src.toString(), 233 "--module", "MIA", 234 "--expand-requires:all"); 235 236 assertErrorPresent("javadoc: error - module MIA not found."); 237 } 238 239 @Test 240 public void testMissingModuleMultiModuleCmdline(Path base) throws Exception { 241 Path src = base.resolve("src"); 242 243 createAuxiliaryModules(src); 244 245 new ModuleBuilder(tb, "M") 246 .comment("The M module.") 247 .requiresPublic("N", src) 248 .requires("L", src) 249 .requires("O", src) 250 .exports("p") 251 .classes("package p; public class Main { openO.O o; openN.N n; openL.L l; }") 252 .write(src); 253 254 execNegativeTask("-modulesourcepath", src.toString(), 255 "--module", "M,N,L,MIA,O,P", 256 "--expand-requires:all"); 257 258 assertErrorPresent("javadoc: error - module MIA not found"); 259 } 260 261 void createAuxiliaryModules(Path src) throws IOException { 262 263 new ModuleBuilder(tb, "J") 264 .comment("The J module.") 265 .exports("openJ") 266 .classes("package openJ; /** Klass J open. */ public class J { }") 267 .classes("package closedJ; /** Klass J closed. */ public class J { }") 268 .write(src); 269 270 new ModuleBuilder(tb, "L") 271 .comment("The L module.") 272 .exports("openL") 273 .requiresPublic("P") 274 .classes("package openL; /** Klass L open */ public class L { }") 275 .classes("package closedL; /** Klass L closed */ public class L { }") 276 .write(src); 277 278 new ModuleBuilder(tb, "N") 279 .comment("The N module.") 280 .exports("openN") 281 .requiresPublic("O") 282 .classes("package openN; /** Klass N open */ public class N { }") 283 .classes("package closedN; /** Klass N closed */ public class N { }") 284 .write(src); 285 286 new ModuleBuilder(tb, "O") 287 .comment("The O module.") 288 .exports("openO") 289 .requires("J") 290 .classes("package openO; /** Klass O open. */ public class O { openJ.J j; }") 291 .classes("package closedO; /** Klass O closed. */ public class O { }") 292 .write(src); 293 294 new ModuleBuilder(tb, "P") 295 .comment("The O module.") 296 .exports("openP") 297 .requires("J") 298 .classes("package openP; /** Klass O open. */ public class O { openJ.J j; }") 299 .classes("package closedP; /** Klass O closed. */ public class O { }") 300 .write(src); 301 302 new ModuleBuilder(tb, "Q") 303 .comment("The Q module.") 304 .exports("openQ") 305 .requires("J") 306 .classes("package openQ; /** Klass Q open. */ public class Q { openJ.J j; }") 307 .classes("package closedQ; /** Klass Q closed. */ public class Q { }") 308 .write(src); 309 310 } 311} 312