test/jdk/tools/launcher/modules/addreads/AddReadsTest.java
changeset 47216 71c04702a3d5
parent 45393 de4e1efc8eec
child 51675 b487c1e914d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/launcher/modules/addreads/AddReadsTest.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2015, 2017, 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
+ * @library /lib/testlibrary /test/lib
+ * @modules jdk.compiler
+ * @build AddReadsTest JarUtils jdk.testlibrary.*
+ *        jdk.test.lib.compiler.CompilerUtils
+ * @run testng AddReadsTest
+ * @summary Basic tests for java --add-reads
+ */
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import jdk.test.lib.compiler.CompilerUtils;
+import jdk.testlibrary.OutputAnalyzer;
+import static jdk.testlibrary.ProcessTools.*;
+
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+/**
+ * The tests consists of two modules: m1 and junit.
+ * Code in module m1 calls into code in module junit but the module-info.java
+ * does not have a 'requires'. Instead a read edge is added via the command
+ * line option --add-reads.
+ */
+
+@Test
+public class AddReadsTest {
+
+    private static final String TEST_SRC = System.getProperty("test.src");
+
+    private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
+    private static final Path CLASSES_DIR = Paths.get("classes");
+    private static final Path MODS_DIR = Paths.get("mods");
+
+    private static final String MAIN = "m1/p.Main";
+
+
+    @BeforeTest
+    public void setup() throws Exception {
+
+        // javac -d classes src/junit/**
+        assertTrue(CompilerUtils
+            .compile(SRC_DIR.resolve("junit"), CLASSES_DIR));
+
+        // javac -d mods/m1 -cp classes/ src/m1/**
+        assertTrue(CompilerUtils
+            .compile(SRC_DIR.resolve("m1"),
+                    MODS_DIR.resolve("m1"),
+                    "-cp", CLASSES_DIR.toString(),
+                    "--add-reads", "m1=ALL-UNNAMED"));
+
+        // jar cf mods/junit.jar -C classes .
+        JarUtils.createJarFile(MODS_DIR.resolve("junit.jar"), CLASSES_DIR);
+
+    }
+
+    private OutputAnalyzer run(String... options) throws Exception {
+        return executeTestJava(options)
+            .outputTo(System.out)
+            .errorTo(System.out);
+    }
+
+
+    /**
+     * Run with junit as a module on the module path.
+     */
+    public void testJUnitOnModulePath() throws Exception {
+
+        // java --module-path mods --add-modules junit --add-reads m1=junit -m ..
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "--add-modules", "junit",
+                  "--add-reads", "m1=junit",
+                  "-m", MAIN)
+                .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Exercise --add-reads m1=ALL-UNNAMED by running with junit on the
+     * class path.
+     */
+    public void testJUnitOnClassPath() throws Exception {
+
+        // java --module-path mods -cp mods/junit.jar --add-reads m1=ALL-UNNAMED -m ..
+        String cp = MODS_DIR.resolve("junit.jar").toString();
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "-cp", cp,
+                  "--add-reads", "m1=ALL-UNNAMED",
+                  "-m", MAIN)
+                .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Run with junit as a module on the module path but without --add-reads.
+     */
+    public void testJUnitOnModulePathMissingAddReads() throws Exception {
+        // java --module-path mods --add-modules junit --module ..
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "--add-modules", "junit",
+                  "--module", MAIN)
+                .shouldContain("IllegalAccessError")
+                .getExitValue();
+
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Run with junit on the class path but without --add-reads.
+     */
+    public void testJUnitOnClassPathMissingAddReads() throws Exception {
+        // java --module-path mods -cp mods/junit.jar -m ..
+        String cp = MODS_DIR.resolve("junit.jar").toString();
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "-cp", cp,
+                  "-m", MAIN)
+                .shouldContain("IllegalAccessError")
+                .getExitValue();
+
+        assertTrue(exitValue != 0);
+    }
+
+
+    /**
+     * Exercise --add-reads with a more than one source module.
+     */
+    public void testJUnitWithMultiValueOption() throws Exception {
+
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "--add-modules", "java.xml,junit",
+                  "--add-reads", "m1=java.xml,junit",
+                  "--module", MAIN)
+                .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Exercise --add-reads where the target module is specified more than once
+     */
+    public void testWithTargetSpecifiedManyTimes() throws Exception {
+
+        int exitValue
+            = run("--module-path", MODS_DIR.toString(),
+                  "--add-modules", "java.xml,junit",
+                  "--add-reads", "m1=java.xml",
+                  "--add-reads", "m1=junit",
+                  "-m", MAIN)
+                 .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Exercise --add-reads with missing source
+     */
+    public void testWithMissingSource() throws Exception {
+
+        //  --add-exports $VALUE -version
+        assertTrue(run("--add-reads", "java.base", "-version").getExitValue() != 0);
+    }
+
+
+    /**
+     * Exercise --add-reads with unknown source/target module.
+     * Warning is emitted.
+     */
+    @Test(dataProvider = "badvalues")
+    public void testWithBadValue(String value, String ignore) throws Exception {
+
+        //  --add-exports $VALUE -version
+        int exitValue = run("--add-reads", value, "-version")
+                            .stderrShouldMatch("WARNING: Unknown module: .*.monkey")
+                            .outputTo(System.out)
+                            .errorTo(System.out)
+                            .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+    @DataProvider(name = "badvalues")
+    public Object[][] badValues() {
+        return new Object[][]{
+
+            { "java.monkey=java.base",      null }, // unknown module
+            { "java.base=sun.monkey",       null }, // unknown source
+
+        };
+    }
+}