1 /*
   2  * Copyright (c) 2014, 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  * @library /lib/testlibrary
  27  * @modules java.desktop java.compact1 jdk.compiler
  28  * @build LimitModsTest CompilerUtils jdk.testlibrary.*
  29  * @run testng LimitModsTest
  30  * @summary Basic tests for java -limitmods
  31  */
  32 
  33 import java.nio.file.Path;
  34 import java.nio.file.Paths;
  35 
  36 import static jdk.testlibrary.ProcessTools.*;
  37 
  38 import org.testng.annotations.BeforeTest;
  39 import org.testng.annotations.Test;
  40 import static org.testng.Assert.*;
  41 
  42 
  43 @Test
  44 public class LimitModsTest {
  45 
  46     private static final String TEST_SRC = System.getProperty("test.src");
  47 
  48     private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
  49     private static final Path MODS_DIR = Paths.get("mods");
  50 
  51     // the module name / main class of the test module
  52     private static final String TEST_MODULE = "test";
  53     private static final String MAIN_CLASS = "jdk.test.UseAWT";
  54 
  55 
  56     @BeforeTest
  57     public void compileTestModule() throws Exception {
  58 
  59         // javac -d mods/$TESTMODULE src/$TESTMODULE/**
  60         boolean compiled
  61             = CompilerUtils.compile(SRC_DIR.resolve(TEST_MODULE),
  62                 MODS_DIR.resolve(TEST_MODULE));
  63 
  64         assertTrue(compiled, "test module did not compile");
  65     }
  66 
  67 
  68     /**
  69      * Basic test of -limitmods to limit which platform modules are observable.
  70      */
  71     public void testLimitingPlatformModules() throws Exception {
  72         int exitValue;
  73 
  74         // java -limitmods java.base -listmods
  75         exitValue = executeTestJava("-limitmods", "java.base", "-listmods")
  76             .outputTo(System.out)
  77             .errorTo(System.out)
  78             .shouldContain("java.base")
  79             .shouldNotContain("java.logging")
  80             .shouldNotContain("java.xml")
  81             .getExitValue();
  82 
  83         assertTrue(exitValue == 0);
  84 
  85 
  86         // java -limitmods java.compact1 -listmods
  87         exitValue = executeTestJava("-limitmods", "java.compact1", "-listmods")
  88             .outputTo(System.out)
  89             .errorTo(System.out)
  90             .shouldContain("java.base")
  91             .shouldContain("java.logging")
  92             .shouldContain("java.compact1")
  93             .shouldNotContain("java.xml")
  94             .getExitValue();
  95 
  96         assertTrue(exitValue == 0);
  97     }
  98 
  99 
 100     /**
 101      * Test -limitmods with -addmods
 102      */
 103     public void testWithAddMods() throws Exception {
 104         int exitValue;
 105 
 106         // java -limitmods java.base -addmods java.logging -listmods
 107         exitValue = executeTestJava("-limitmods", "java.base",
 108                                     "-addmods", "java.logging",
 109                                     "-listmods")
 110             .outputTo(System.out)
 111             .errorTo(System.out)
 112             .shouldContain("java.base")
 113             .shouldContain("java.logging")
 114             .shouldNotContain("java.xml")
 115             .getExitValue();
 116 
 117         assertTrue(exitValue == 0);
 118 
 119 
 120         // java -limitmods java.base -addmods java.sql -listmods
 121         // This should fail because java.sql has dependences beyond java.base
 122         exitValue = executeTestJava("-limitmods", "java.base",
 123                                     "-addmods", "java.sql",
 124                                     "-listmods")
 125             .outputTo(System.out)
 126             .errorTo(System.out)
 127             .getExitValue();
 128 
 129         assertTrue(exitValue != 0);
 130     }
 131 
 132 
 133     /**
 134      * Run class path application with -limitmods
 135      */
 136     public void testUnnamedModule() throws Exception {
 137         String classpath = MODS_DIR.resolve(TEST_MODULE).toString();
 138 
 139         // java -limitmods java.base -cp mods/$TESTMODULE ...
 140         int exitValue1
 141             = executeTestJava("-limitmods", "java.base",
 142                               "-cp", classpath,
 143                               MAIN_CLASS)
 144                 .outputTo(System.out)
 145                 .errorTo(System.out)
 146                 .shouldContain("NoClassDefFoundError")
 147                 .getExitValue();
 148 
 149         assertTrue(exitValue1 != 0);
 150 
 151 
 152         // java -limitmods java.base -cp mods/$TESTMODULE ...
 153         int exitValue2
 154             = executeTestJava("-limitmods", "java.desktop",
 155                               "-cp", classpath,
 156                              MAIN_CLASS)
 157                 .outputTo(System.out)
 158                 .errorTo(System.out)
 159                 .getExitValue();
 160 
 161         assertTrue(exitValue2 == 0);
 162     }
 163 
 164 
 165     /**
 166      * Run named module with -limitmods
 167      */
 168     public void testNamedModule() throws Exception {
 169 
 170         String modulepath = MODS_DIR.toString();
 171         String mid = TEST_MODULE + "/" + MAIN_CLASS;
 172 
 173         // java -limitmods java.base -mp mods -m $TESTMODULE/$MAINCLASS
 174         int exitValue = executeTestJava("-limitmods", "java.base",
 175                                         "-mp", modulepath,
 176                                         "-m", mid)
 177                 .outputTo(System.out)
 178                 .errorTo(System.out)
 179                 .getExitValue();
 180 
 181         assertTrue(exitValue != 0);
 182 
 183         // java -limitmods java.desktop -mp mods -m $TESTMODULE/$MAINCLASS
 184         exitValue = executeTestJava("-limitmods", "java.desktop",
 185                                     "-mp", modulepath,
 186                                     "-m", mid)
 187                 .outputTo(System.out)
 188                 .errorTo(System.out)
 189                 .getExitValue();
 190 
 191         assertTrue(exitValue == 0);
 192     }
 193 
 194 }