test/langtools/tools/javac/modules/AddReadsTest.java
changeset 47216 71c04702a3d5
parent 43772 4e5350b7be75
child 49822 53aae0c219e6
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 /*
       
    25  * @test
       
    26  * @summary Test the --add-reads option
       
    27  * @library /tools/lib
       
    28  * @modules jdk.compiler/com.sun.tools.javac.api
       
    29  *          jdk.compiler/com.sun.tools.javac.main
       
    30  *          jdk.jdeps/com.sun.tools.javap
       
    31  *          java.desktop
       
    32  * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask toolbox.JavapTask ModuleTestBase
       
    33  * @run main AddReadsTest
       
    34  */
       
    35 
       
    36 import java.nio.file.Files;
       
    37 import java.nio.file.Path;
       
    38 import java.util.Set;
       
    39 
       
    40 import javax.annotation.processing.AbstractProcessor;
       
    41 import javax.annotation.processing.RoundEnvironment;
       
    42 import javax.annotation.processing.SupportedAnnotationTypes;
       
    43 import javax.lang.model.SourceVersion;
       
    44 import javax.lang.model.element.ModuleElement;
       
    45 import javax.lang.model.element.ModuleElement.RequiresDirective;
       
    46 import javax.lang.model.element.TypeElement;
       
    47 import javax.lang.model.util.ElementFilter;
       
    48 
       
    49 import toolbox.JarTask;
       
    50 import toolbox.JavacTask;
       
    51 import toolbox.JavapTask;
       
    52 import toolbox.Task;
       
    53 
       
    54 public class AddReadsTest extends ModuleTestBase {
       
    55 
       
    56     public static void main(String... args) throws Exception {
       
    57         new AddReadsTest().runTests();
       
    58     }
       
    59 
       
    60     @Test
       
    61     public void testAddReads(Path base) throws Exception {
       
    62         Path src = base.resolve("src");
       
    63         Path src_m1 = src.resolve("m1x");
       
    64         tb.writeJavaFiles(src_m1,
       
    65                           "module m1x { exports api; }",
       
    66                           "package api; public class Api { }");
       
    67         Path src_m2 = src.resolve("m2x");
       
    68         tb.writeJavaFiles(src_m2,
       
    69                           "module m2x { }",
       
    70                           "package test; public class Test extends api.Api { }");
       
    71         Path classes = base.resolve("classes");
       
    72         tb.createDirectories(classes);
       
    73 
       
    74         String log = new JavacTask(tb)
       
    75                 .options("-XDrawDiagnostics",
       
    76                          "--module-source-path", src.toString())
       
    77                 .outdir(classes)
       
    78                 .files(findJavaFiles(src))
       
    79                 .run(Task.Expect.FAIL)
       
    80                 .writeAll()
       
    81                 .getOutput(Task.OutputKind.DIRECT);
       
    82 
       
    83         checkOutputContains(log,
       
    84             "Test.java:1:41: compiler.err.package.not.visible: api, (compiler.misc.not.def.access.does.not.read: m2x, api, m1x)");
       
    85 
       
    86         //test add dependencies:
       
    87         new JavacTask(tb)
       
    88                 .options("--add-reads", "m2x=m1x",
       
    89                          "--module-source-path", src.toString(),
       
    90                          "-processor", VerifyRequires.class.getName())
       
    91                 .outdir(classes)
       
    92                 .files(findJavaFiles(src))
       
    93                 .run()
       
    94                 .writeAll();
       
    95 
       
    96         String decompiled = new JavapTask(tb)
       
    97                 .options("-verbose",
       
    98                         classes.resolve("m2x").resolve("module-info.class").toString())
       
    99                 .run()
       
   100                 .getOutput(Task.OutputKind.DIRECT);
       
   101 
       
   102         if (decompiled.contains("m1x")) {
       
   103             throw new Exception("Incorrectly refers to m1x module.");
       
   104         }
       
   105 
       
   106         //cyclic dependencies OK when created through addReads:
       
   107         new JavacTask(tb)
       
   108                 .options("--add-reads", "m2x=m1x",
       
   109                          "--add-reads", "m1x=m2x",
       
   110                          "--module-source-path", src.toString())
       
   111                 .outdir(classes)
       
   112                 .files(findJavaFiles(src))
       
   113                 .run()
       
   114                 .writeAll();
       
   115 
       
   116         tb.writeJavaFiles(src_m2,
       
   117                           "module m2x { requires m1x; }");
       
   118 
       
   119         new JavacTask(tb)
       
   120                 .options("--add-reads", "m1x=m2x",
       
   121                          "--module-source-path", src.toString())
       
   122                 .outdir(classes)
       
   123                 .files(findJavaFiles(src))
       
   124                 .run()
       
   125                 .writeAll();
       
   126     }
       
   127 
       
   128     @SupportedAnnotationTypes("*")
       
   129     public static final class VerifyRequires extends AbstractProcessor {
       
   130 
       
   131         @Override
       
   132         public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
       
   133             ModuleElement m2Module = processingEnv.getElementUtils().getModuleElement("m2x");
       
   134             if (m2Module == null) {
       
   135                 throw new AssertionError("Cannot find the m2x module!");
       
   136             }
       
   137             boolean foundM1 = false;
       
   138             for (RequiresDirective rd : ElementFilter.requiresIn(m2Module.getDirectives())) {
       
   139                 foundM1 |= rd.getDependency().getSimpleName().contentEquals("m1x");
       
   140             }
       
   141             if (!foundM1) {
       
   142                 throw new AssertionError("Cannot find the dependency on m1x module!");
       
   143             }
       
   144             return false;
       
   145         }
       
   146 
       
   147         @Override
       
   148         public SourceVersion getSupportedSourceVersion() {
       
   149             return SourceVersion.latest();
       
   150         }
       
   151 
       
   152     }
       
   153 
       
   154     @Test
       
   155     public void testAddReadsUnnamedModule(Path base) throws Exception {
       
   156         Path jar = prepareTestJar(base);
       
   157 
       
   158         Path moduleSrc = base.resolve("module-src");
       
   159         Path m1 = moduleSrc.resolve("m1x");
       
   160 
       
   161         Path classes = base.resolve("classes");
       
   162 
       
   163         Files.createDirectories(classes);
       
   164 
       
   165         tb.writeJavaFiles(m1,
       
   166                           "module m1x { }",
       
   167                           "package impl; public class Impl { api.Api api; }");
       
   168 
       
   169         new JavacTask(tb)
       
   170           .options("--class-path", jar.toString(),
       
   171                    "--add-reads", "m1x=ALL-UNNAMED",
       
   172                    "-XDrawDiagnostics")
       
   173           .outdir(classes)
       
   174           .files(findJavaFiles(moduleSrc))
       
   175           .run()
       
   176           .writeAll();
       
   177     }
       
   178 
       
   179     @Test
       
   180     public void testAddReadsUnnamedModulePackageConflict(Path base) throws Exception {
       
   181         Path jar = prepareTestJar(base);
       
   182 
       
   183         Path moduleSrc = base.resolve("module-src");
       
   184         Path m1 = moduleSrc.resolve("m1x");
       
   185 
       
   186         Path classes = base.resolve("classes");
       
   187 
       
   188         Files.createDirectories(classes);
       
   189 
       
   190         tb.writeJavaFiles(m1,
       
   191                           "module m1x { }",
       
   192                           "package api; public class Api { public static void test() { } }",
       
   193                           "package impl; public class Impl { { api.Api.test(); } }");
       
   194 
       
   195         new JavacTask(tb)
       
   196           .options("--class-path", jar.toString(),
       
   197                    "--module-source-path", moduleSrc.toString(),
       
   198                    "--add-reads", "m1x=ALL-UNNAMED",
       
   199                    "-XDrawDiagnostics")
       
   200           .outdir(classes)
       
   201           .files(m1.resolve("impl").resolve("Impl.java"))
       
   202           .run()
       
   203           .writeAll();
       
   204     }
       
   205 
       
   206     @Test
       
   207     public void testAddReadsUnnamedToJavaBase(Path base) throws Exception {
       
   208         Path jar = prepareTestJar(base);
       
   209         Path src = base.resolve("src");
       
   210         Path classes = base.resolve("classes");
       
   211 
       
   212         Files.createDirectories(classes);
       
   213 
       
   214         tb.writeJavaFiles(src,
       
   215                           "package impl; public class Impl { api.Api a; }");
       
   216 
       
   217         new JavacTask(tb)
       
   218           .options("--class-path", jar.toString(),
       
   219                    "--add-reads", "java.base=ALL-UNNAMED",
       
   220                    "--patch-module", "java.base=" + src)
       
   221           .outdir(classes)
       
   222           .files(src.resolve("impl").resolve("Impl.java"))
       
   223           .run()
       
   224           .writeAll();
       
   225     }
       
   226 
       
   227     @Test
       
   228     public void testAddReadsToJavaBase(Path base) throws Exception {
       
   229         Path src = base.resolve("src");
       
   230         Path classes = base.resolve("classes");
       
   231 
       
   232         Files.createDirectories(classes);
       
   233 
       
   234         tb.writeJavaFiles(src,
       
   235                           "package impl; public class Impl { javax.swing.JButton b; }");
       
   236 
       
   237         new JavacTask(tb)
       
   238           .options("--add-modules", "java.desktop",
       
   239                    "--add-reads", "java.base=java.desktop",
       
   240                    "--patch-module", "java.base=" + src)
       
   241           .outdir(classes)
       
   242           .files(findJavaFiles(src))
       
   243           .run()
       
   244           .writeAll();
       
   245     }
       
   246 
       
   247     private Path prepareTestJar(Path base) throws Exception {
       
   248         Path legacySrc = base.resolve("legacy-src");
       
   249         tb.writeJavaFiles(legacySrc,
       
   250                           "package api; public abstract class Api {}");
       
   251         Path legacyClasses = base.resolve("legacy-classes");
       
   252         Files.createDirectories(legacyClasses);
       
   253 
       
   254         String log = new JavacTask(tb)
       
   255                 .options()
       
   256                 .outdir(legacyClasses)
       
   257                 .files(findJavaFiles(legacySrc))
       
   258                 .run()
       
   259                 .writeAll()
       
   260                 .getOutput(Task.OutputKind.DIRECT);
       
   261 
       
   262         if (!log.isEmpty()) {
       
   263             throw new Exception("unexpected output: " + log);
       
   264         }
       
   265 
       
   266         Path lib = base.resolve("lib");
       
   267 
       
   268         Files.createDirectories(lib);
       
   269 
       
   270         Path jar = lib.resolve("test-api-1.0.jar");
       
   271 
       
   272         new JarTask(tb, jar)
       
   273           .baseDir(legacyClasses)
       
   274           .files("api/Api.class")
       
   275           .run();
       
   276 
       
   277         return jar;
       
   278     }
       
   279 
       
   280     @Test
       
   281     public void testX(Path base) throws Exception {
       
   282         Path src = base.resolve("src");
       
   283         Path src_m1 = src.resolve("m1x");
       
   284         tb.writeJavaFiles(src_m1,
       
   285                           "module m1x { provides java.lang.Runnable with impl.Impl; }",
       
   286                           "package impl; public class Impl implements Runnable { public void run() { } }");
       
   287         Path classes = base.resolve("classes");
       
   288         tb.createDirectories(classes);
       
   289 
       
   290         new JavacTask(tb)
       
   291                 .options("--module-source-path", src.toString())
       
   292                 .outdir(classes)
       
   293                 .files(findJavaFiles(src))
       
   294                 .run()
       
   295                 .writeAll();
       
   296 
       
   297         Path unnamedSrc = base.resolve("unnamed-src");
       
   298         Path unnamedClasses = base.resolve("unnamed-classes");
       
   299 
       
   300         Files.createDirectories(unnamedClasses);
       
   301 
       
   302         tb.writeJavaFiles(unnamedSrc,
       
   303                           "package impl; public class Impl { }");
       
   304 
       
   305         new JavacTask(tb)
       
   306           .options("--add-reads", "m1x=ALL-UNNAMED",
       
   307                    "--patch-module", "m1x=" + unnamedSrc,
       
   308                    "--module-path", classes.toString())
       
   309           .outdir(unnamedClasses)
       
   310           .files(findJavaFiles(unnamedSrc))
       
   311           .run()
       
   312           .writeAll();
       
   313     }
       
   314 
       
   315     @Test
       
   316     public void testAddSelf(Path base) throws Exception {
       
   317         Path src = base.resolve("src");
       
   318         Path src_m1 = src.resolve("m1x");
       
   319         tb.writeJavaFiles(src_m1,
       
   320                           "module m1x { exports p1; }",
       
   321                           "package p1; public class C1 { }");
       
   322         Path classes = base.resolve("classes");
       
   323         tb.createDirectories(classes);
       
   324 
       
   325         new JavacTask(tb)
       
   326                 .options("--module-source-path", src.toString(),
       
   327                          "--add-reads", "m1x=m1x")
       
   328                 .outdir(classes)
       
   329                 .files(findJavaFiles(src))
       
   330                 .run()
       
   331                 .writeAll();
       
   332     }
       
   333 
       
   334     @Test
       
   335     public void testEmpty(Path base) throws Exception {
       
   336         Path src = base.resolve("src");
       
   337         tb.writeJavaFiles(src, "class Dummy { }");
       
   338         Path classes = base.resolve("classes");
       
   339         tb.createDirectories(classes);
       
   340 
       
   341         testEmpty(src, classes, "--add-reads", "");
       
   342         testEmpty(src, classes, "--add-reads=");
       
   343     }
       
   344 
       
   345     private void testEmpty(Path src, Path classes, String... options) throws Exception {
       
   346         String log = new JavacTask(tb, Task.Mode.CMDLINE)
       
   347                 .options(options)
       
   348                 .outdir(classes)
       
   349                 .files(findJavaFiles(src))
       
   350                 .run(Task.Expect.FAIL)
       
   351                 .writeAll()
       
   352                 .getOutput(Task.OutputKind.DIRECT);
       
   353 
       
   354         checkOutputContains(log,
       
   355             "javac: no value for --add-reads option");
       
   356     }
       
   357 
       
   358     @Test
       
   359     public void testEmptyItem(Path base) throws Exception {
       
   360         Path src = base.resolve("src");
       
   361         Path src_m1 = src.resolve("m1x");
       
   362         tb.writeJavaFiles(src_m1,
       
   363                           "module m1x { exports p1; }",
       
   364                           "package p1; public class C1 { }");
       
   365         Path src_m2 = src.resolve("m2x");
       
   366         tb.writeJavaFiles(src_m2,
       
   367                           "module m2x { }",
       
   368                           "package p2; class C2 { }");
       
   369         Path src_m3 = src.resolve("m3x");
       
   370         tb.writeJavaFiles(src_m3,
       
   371                           "module m3x { }",
       
   372                           "package p3; class C3 { p1.C1 c1; }");
       
   373         Path classes = base.resolve("classes");
       
   374         tb.createDirectories(classes);
       
   375 
       
   376         testEmptyItem(src, classes, "m3x=,m1x");
       
   377         testEmptyItem(src, classes, "m3x=m1x,,m2x");
       
   378         testEmptyItem(src, classes, "m3x=m1x,");
       
   379     }
       
   380 
       
   381     private void testEmptyItem(Path src, Path classes, String option) throws Exception {
       
   382         new JavacTask(tb)
       
   383                 .options("--module-source-path", src.toString(),
       
   384                          "--add-reads", option)
       
   385                 .outdir(classes)
       
   386                 .files(findJavaFiles(src))
       
   387                 .run()
       
   388                 .writeAll();
       
   389     }
       
   390 
       
   391     @Test
       
   392     public void testEmptyList(Path base) throws Exception {
       
   393         Path src = base.resolve("src");
       
   394         Path src_m1 = src.resolve("m1x");
       
   395         tb.writeJavaFiles(src_m1,
       
   396                           "module m1x { exports p1; }",
       
   397                           "package p1; public class C1 { }");
       
   398         Path src_m2 = src.resolve("m2x");
       
   399         tb.writeJavaFiles(src_m2,
       
   400                           "module m2x { }",
       
   401                           "package p2; class C2 { }");
       
   402         Path src_m3 = src.resolve("m3x");
       
   403         tb.writeJavaFiles(src_m3,
       
   404                           "module m3x { }",
       
   405                           "package p3; class C3 { p1.C1 c1; }");
       
   406         Path classes = base.resolve("classes");
       
   407         tb.createDirectories(classes);
       
   408 
       
   409         testEmptyList(src, classes, "m3x=");
       
   410         testEmptyList(src, classes, "m3x=,");
       
   411     }
       
   412 
       
   413     private void testEmptyList(Path src, Path classes, String option) throws Exception {
       
   414         String log = new JavacTask(tb, Task.Mode.CMDLINE)
       
   415                 .options("--module-source-path", src.toString(),
       
   416                          "--add-reads", option)
       
   417                 .outdir(classes)
       
   418                 .files(findJavaFiles(src))
       
   419                 .run(Task.Expect.FAIL)
       
   420                 .writeAll()
       
   421                 .getOutput(Task.OutputKind.DIRECT);
       
   422 
       
   423         checkOutputContains(log,
       
   424             "javac: bad value for --add-reads option: '" + option + "'");
       
   425     }
       
   426 
       
   427     @Test
       
   428     public void testMultipleAddReads_DifferentModules(Path base) throws Exception {
       
   429         Path src = base.resolve("src");
       
   430         Path src_m1 = src.resolve("m1x");
       
   431         tb.writeJavaFiles(src_m1,
       
   432                           "module m1x { exports p1; }",
       
   433                           "package p1; public class C1 { }");
       
   434         Path src_m2 = src.resolve("m2x");
       
   435         tb.writeJavaFiles(src_m2,
       
   436                           "module m2x { }",
       
   437                           "package p2; class C2 { p1.C1 c1; }");
       
   438         Path src_m3 = src.resolve("m3x");
       
   439         tb.writeJavaFiles(src_m3,
       
   440                           "module m3x { }",
       
   441                           "package p3; class C3 { p1.C1 c1; }");
       
   442         Path classes = base.resolve("classes");
       
   443         tb.createDirectories(classes);
       
   444 
       
   445         new JavacTask(tb)
       
   446                 .options("--module-source-path", src.toString(),
       
   447                          "--add-reads", "m2x=m1x",
       
   448                          "--add-reads", "m3x=m1x")
       
   449                 .outdir(classes)
       
   450                 .files(findJavaFiles(src))
       
   451                 .run()
       
   452                 .writeAll();
       
   453     }
       
   454 
       
   455     @Test
       
   456     public void testMultipleAddReads_SameModule(Path base) throws Exception {
       
   457         Path src = base.resolve("src");
       
   458         Path src_m1 = src.resolve("m1x");
       
   459         tb.writeJavaFiles(src_m1,
       
   460                           "module m1x { exports p1; }",
       
   461                           "package p1; public class C1 { }");
       
   462         Path src_m2 = src.resolve("m2x");
       
   463         tb.writeJavaFiles(src_m2,
       
   464                           "module m2x { exports p2; }",
       
   465                           "package p2; public class C2 { }");
       
   466         Path src_m3 = src.resolve("m3x");
       
   467         tb.writeJavaFiles(src_m3,
       
   468                           "module m3x { }",
       
   469                           "package p3; class C3 { p1.C1 c1; p2.C2 c2; }");
       
   470         Path classes = base.resolve("classes");
       
   471         tb.createDirectories(classes);
       
   472 
       
   473         new JavacTask(tb)
       
   474                 .options("--module-source-path", src.toString(),
       
   475                          "--add-reads", "m3x=m1x",
       
   476                          "--add-reads", "m3x=m2x")
       
   477                 .outdir(classes)
       
   478                 .files(findJavaFiles(src))
       
   479                 .run()
       
   480                 .writeAll();
       
   481     }
       
   482 
       
   483     @Test
       
   484     public void testDuplicateAddReads_SameOption(Path base) throws Exception {
       
   485         Path src = base.resolve("src");
       
   486         Path src_m1 = src.resolve("m1x");
       
   487         tb.writeJavaFiles(src_m1,
       
   488                           "module m1x { exports p1; }",
       
   489                           "package p1; public class C1 { }");
       
   490         Path src_m2 = src.resolve("m2x");
       
   491         tb.writeJavaFiles(src_m2,
       
   492                           "module m2x { exports p2; }",
       
   493                           "package p2; class C2 { p1.C1 c1; }");
       
   494         Path classes = base.resolve("classes");
       
   495         tb.createDirectories(classes);
       
   496 
       
   497         new JavacTask(tb)
       
   498                 .options("--module-source-path", src.toString(),
       
   499                          "--add-reads", "m2x=m1x,m1x")
       
   500                 .outdir(classes)
       
   501                 .files(findJavaFiles(src))
       
   502                 .run()
       
   503                 .writeAll();
       
   504     }
       
   505 
       
   506     @Test
       
   507     public void testDuplicateAddReads_MultipleOptions(Path base) throws Exception {
       
   508         Path src = base.resolve("src");
       
   509         Path src_m1 = src.resolve("m1x");
       
   510         tb.writeJavaFiles(src_m1,
       
   511                           "module m1x { exports p1; }",
       
   512                           "package p1; public class C1 { }");
       
   513         Path src_m2 = src.resolve("m2x");
       
   514         tb.writeJavaFiles(src_m2,
       
   515                           "module m2x { }",
       
   516                           "package p2; class C2 { p1.C1 c1; }");
       
   517         Path classes = base.resolve("classes");
       
   518         tb.createDirectories(classes);
       
   519 
       
   520         new JavacTask(tb)
       
   521                 .options("--module-source-path", src.toString(),
       
   522                          "--add-reads", "m2x=m1x",
       
   523                          "--add-reads", "m2x=m1x")
       
   524                 .outdir(classes)
       
   525                 .files(findJavaFiles(src))
       
   526                 .run()
       
   527                 .writeAll();
       
   528     }
       
   529 
       
   530     @Test
       
   531     public void testRepeatedAddReads(Path base) throws Exception {
       
   532         Path src = base.resolve("src");
       
   533         Path src_m1 = src.resolve("m1x");
       
   534         tb.writeJavaFiles(src_m1,
       
   535                           "module m1x { exports p1; }",
       
   536                           "package p1; public class C1 { }");
       
   537         Path src_m2 = src.resolve("m2x");
       
   538         tb.writeJavaFiles(src_m2,
       
   539                           "module m2x { exports p2; }",
       
   540                           "package p2; public class C2 { }");
       
   541         Path src_m3 = src.resolve("m3x");
       
   542         tb.writeJavaFiles(src_m3,
       
   543                           "module m3x { }",
       
   544                           "package p3; class C3 { p1.C1 c1; p2.C2 c2; }");
       
   545         Path classes = base.resolve("classes");
       
   546         tb.createDirectories(classes);
       
   547 
       
   548         new JavacTask(tb)
       
   549                 .options("--module-source-path", src.toString(),
       
   550                          "--add-reads", "m3x=m1x",
       
   551                          "--add-reads", "m3x=m2x")
       
   552                 .outdir(classes)
       
   553                 .files(findJavaFiles(src))
       
   554                 .run()
       
   555                 .writeAll();
       
   556     }
       
   557 
       
   558     @Test
       
   559     public void testNoEquals(Path base) throws Exception {
       
   560         Path src = base.resolve("src");
       
   561         tb.writeJavaFiles(src, "class Dummy { }");
       
   562         Path classes = base.resolve("classes");
       
   563         tb.createDirectories(classes);
       
   564 
       
   565         String log = new JavacTask(tb, Task.Mode.CMDLINE)
       
   566                 .options("-XDrawDiagnostics",
       
   567                          "--add-reads", "m1x:m2x")
       
   568                 .outdir(classes)
       
   569                 .files(findJavaFiles(src))
       
   570                 .run(Task.Expect.FAIL)
       
   571                 .writeAll()
       
   572                 .getOutput(Task.OutputKind.DIRECT);
       
   573 
       
   574         checkOutputContains(log,
       
   575             "javac: bad value for --add-reads option: 'm1x:m2x'");
       
   576     }
       
   577 
       
   578     @Test
       
   579     public void testBadSourceName(Path base) throws Exception {
       
   580         Path src = base.resolve("src");
       
   581         tb.writeJavaFiles(src, "class Dummy { }");
       
   582         Path classes = base.resolve("classes");
       
   583         tb.createDirectories(classes);
       
   584 
       
   585         String log = new JavacTask(tb)
       
   586                 .options("-XDrawDiagnostics",
       
   587                          "--add-reads", "bad*Source=m2x")
       
   588                 .outdir(classes)
       
   589                 .files(findJavaFiles(src))
       
   590                 .run()
       
   591                 .writeAll()
       
   592                 .getOutput(Task.OutputKind.DIRECT);
       
   593 
       
   594         checkOutputContains(log,
       
   595             "- compiler.warn.bad.name.for.option: --add-reads, bad*Source");
       
   596     }
       
   597 
       
   598     @Test
       
   599     public void testBadTargetName(Path base) throws Exception {
       
   600         Path src = base.resolve("src");
       
   601         Path src_m1 = src.resolve("m1x");
       
   602         tb.writeJavaFiles(src_m1,
       
   603                           "module m1x { }",
       
   604                           "package p1; class C1 { }");
       
   605         Path classes = base.resolve("classes");
       
   606         tb.createDirectories(classes);
       
   607 
       
   608         String log = new JavacTask(tb)
       
   609                 .options("-XDrawDiagnostics",
       
   610                          "--add-reads", "m1x=badTarget!")
       
   611                 .outdir(classes)
       
   612                 .files(findJavaFiles(src))
       
   613                 .run()
       
   614                 .writeAll()
       
   615                 .getOutput(Task.OutputKind.DIRECT);
       
   616 
       
   617         checkOutputContains(log,
       
   618             "- compiler.warn.bad.name.for.option: --add-reads, badTarget!");
       
   619     }
       
   620 
       
   621     @Test
       
   622     public void testSourceNameNotFound(Path base) throws Exception {
       
   623         Path src = base.resolve("src");
       
   624         Path src_m1 = src.resolve("m1x");
       
   625         tb.writeJavaFiles(src_m1,
       
   626                           "module m1x { exports p1; }",
       
   627                           "package p1; public class C1 { }");
       
   628         Path classes = base.resolve("classes");
       
   629         tb.createDirectories(classes);
       
   630 
       
   631         String log = new JavacTask(tb)
       
   632                 .options("-XDrawDiagnostics",
       
   633                          "--add-reads", "missingSource=m")
       
   634                 .outdir(classes)
       
   635                 .files(findJavaFiles(src))
       
   636                 .run()
       
   637                 .writeAll()
       
   638                 .getOutput(Task.OutputKind.DIRECT);
       
   639 
       
   640         checkOutputContains(log,
       
   641             "- compiler.warn.module.for.option.not.found: --add-reads, missingSource");
       
   642     }
       
   643 
       
   644     @Test
       
   645     public void testTargetNameNotFound(Path base) throws Exception {
       
   646         Path src = base.resolve("src");
       
   647         Path src_m1 = src.resolve("m1x");
       
   648         tb.writeJavaFiles(src_m1,
       
   649                           "module m1x { exports p1; }",
       
   650                           "package p1; public class C1 { }");
       
   651         Path classes = base.resolve("classes");
       
   652         tb.createDirectories(classes);
       
   653 
       
   654         String log = new JavacTask(tb)
       
   655                 .options("-XDrawDiagnostics",
       
   656                          "--add-reads", "m1x=missingTarget")
       
   657                 .outdir(classes)
       
   658                 .files(findJavaFiles(src))
       
   659                 .run()
       
   660                 .writeAll()
       
   661                 .getOutput(Task.OutputKind.DIRECT);
       
   662 
       
   663         checkOutputContains(log,
       
   664             "- compiler.warn.module.for.option.not.found: --add-reads, missingTarget");
       
   665     }
       
   666 }