blob: 2da921d4d8c30c6727bbf96c36b57835550f7073 [file] [log] [blame]
/*
* Copyright (c) 2016, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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 8159262
* @summary Test differing scenarios where a module's readability list and a package's exportability list should be walked
* @modules java.base/jdk.internal.misc
* @library /test/lib
* @compile ../AccessCheck/ModuleLibrary.java
* @compile ModuleSameCLMain.java
* @compile ModuleNonBuiltinCLMain.java
* @compile CustomSystemClassLoader.java
* @run main/othervm ModuleStress
*/
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.InMemoryJavaCompiler;
import java.io.File;
public class ModuleStress {
public static void main(String[] args) throws Exception {
// Test #1: java -version
// All modules' readability lists and packages' exportability
// lists should contain only modules defined to the 3 builtin
// loaders (boot, application, platform). Thus there is
// not a need to walk those lists at a GC safepoint since
// those loaders never die.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-Xlog:modules=trace",
"-version");
OutputAnalyzer oa = new OutputAnalyzer(pb.start());
oa.shouldNotContain("must be walked")
.shouldNotContain("being walked")
.shouldHaveExitValue(0);
// Next 2 tests involve the use of class p1.c1 and p2.c2
String source1 = "package p1;" +
"import p2.c2;" +
"public class c1 {" +
" public c1() {" +
" p2.c2 c2_obj = new p2.c2();" +
" c2_obj.method2();" +
" }" +
"}";
String source2 = "package p2;" +
"public class c2 {" +
" public void method2() { }" +
"}";
ClassFileInstaller.writeClassToDisk("p2/c2",
InMemoryJavaCompiler.compile("p2.c2", source2), System.getProperty("test.classes"));
ClassFileInstaller.writeClassToDisk("p1/c1",
InMemoryJavaCompiler.compile("p1.c1", source1), System.getProperty("test.classes"));
// Test #2: Load two modules defined to the same customer class loader.
// m1's module readability list and package p2's exportability should
// not be walked at a GC safepoint since both modules are defined to
// the same loader and thus have the exact same life cycle.
pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-Xlog:modules=trace",
"ModuleSameCLMain");
oa = new OutputAnalyzer(pb.start());
oa.shouldNotContain("must be walked")
.shouldNotContain("being walked")
.shouldHaveExitValue(0);
// Test #3: Load two modules in differing custom class loaders.
// m1's module readability list and package p2's exportability list must
// be walked at a GC safepoint since both modules are defined to non-builtin
// class loaders which could die and thus be unloaded.
pb = ProcessTools.createJavaProcessBuilder(
"-Xbootclasspath/a:.",
"-Xlog:modules=trace",
"ModuleNonBuiltinCLMain");
oa = new OutputAnalyzer(pb.start());
oa.shouldContain("module m1 reads list must be walked")
.shouldContain("package p2 defined in module m2, exports list must be walked")
.shouldNotContain("module m2 reads list must be walked")
.shouldHaveExitValue(0);
// Test #4: Load two modules in differing custom class loaders,
// of which one has been designated as the custom system class loader
// via -Djava.system.class.loader=CustomSystemClassLoader. Since
// m3 is defined to the system class loader, m2's module readability
// list does not have to be walked at a GC safepoint, but package p2's
// exportability list does.
pb = ProcessTools.createJavaProcessBuilder(
"-Djava.system.class.loader=CustomSystemClassLoader",
"-Xbootclasspath/a:.",
"-Xlog:modules=trace",
"ModuleNonBuiltinCLMain");
oa = new OutputAnalyzer(pb.start());
oa.shouldContain("package p2 defined in module m2, exports list must be walked")
.shouldNotContain("module m2 reads list must be walked")
.shouldHaveExitValue(0);
}
}