diff -r 2c33418a6d57 -r 83b611b88ac8 jdk/test/java/lang/reflect/Layer/BasicLayerTest.java --- a/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java Thu Apr 06 17:01:03 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1219 +0,0 @@ -/* - * Copyright (c) 2014, 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 - * @modules java.base/jdk.internal.misc - * @build BasicLayerTest ModuleUtils - * @compile layertest/Test.java - * @run testng BasicLayerTest - * @summary Basic tests for java.lang.reflect.Layer - */ - -import java.lang.module.Configuration; -import java.lang.module.ModuleDescriptor; -import java.lang.module.ModuleDescriptor.Requires; -import java.lang.module.ModuleFinder; -import java.lang.reflect.Layer; -import java.lang.reflect.LayerInstantiationException; -import java.lang.reflect.Module; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import jdk.internal.misc.SharedSecrets; - -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; -import static org.testng.Assert.*; - -@Test -public class BasicLayerTest { - - /** - * Creates a "non-strict" builder for building a module. This allows the - * test the create ModuleDescriptor objects that do not require java.base. - */ - private static ModuleDescriptor.Builder newBuilder(String mn) { - return SharedSecrets.getJavaLangModuleAccess() - .newModuleBuilder(mn, false, Set.of()); - } - - /** - * Exercise Layer.empty() - */ - public void testEmpty() { - Layer emptyLayer = Layer.empty(); - - assertTrue(emptyLayer.parents().isEmpty()); - - assertTrue(emptyLayer.configuration() == Configuration.empty()); - - assertTrue(emptyLayer.modules().isEmpty()); - - assertFalse(emptyLayer.findModule("java.base").isPresent()); - - try { - emptyLayer.findLoader("java.base"); - assertTrue(false); - } catch (IllegalArgumentException expected) { } - } - - - /** - * Exercise Layer.boot() - */ - public void testBoot() { - Layer bootLayer = Layer.boot(); - - // configuration - Configuration cf = bootLayer.configuration(); - assertTrue(cf.findModule("java.base").get() - .reference() - .descriptor() - .exports() - .stream().anyMatch(e -> (e.source().equals("java.lang") - && !e.isQualified()))); - - // modules - Set modules = bootLayer.modules(); - assertTrue(modules.contains(Object.class.getModule())); - int count = (int) modules.stream().map(Module::getName).count(); - assertEquals(count, modules.size()); // module names are unique - - // findModule - Module base = Object.class.getModule(); - assertTrue(bootLayer.findModule("java.base").get() == base); - assertTrue(base.getLayer() == bootLayer); - - // findLoader - assertTrue(bootLayer.findLoader("java.base") == null); - - // parents - assertTrue(bootLayer.parents().size() == 1); - assertTrue(bootLayer.parents().get(0) == Layer.empty()); - } - - - /** - * Exercise Layer defineModules, created with empty layer as parent - */ - public void testLayerOnEmpty() { - ModuleDescriptor descriptor1 = newBuilder("m1") - .requires("m2") - .exports("p1") - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires("m3") - .build(); - - ModuleDescriptor descriptor3 = newBuilder("m3") - .build(); - - ModuleFinder finder - = ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3); - - Configuration cf = resolve(finder, "m1"); - - // map each module to its own class loader for this test - ClassLoader loader1 = new ClassLoader() { }; - ClassLoader loader2 = new ClassLoader() { }; - ClassLoader loader3 = new ClassLoader() { }; - Map map = new HashMap<>(); - map.put("m1", loader1); - map.put("m2", loader2); - map.put("m3", loader3); - - Layer layer = Layer.empty().defineModules(cf, map::get); - - // configuration - assertTrue(layer.configuration() == cf); - assertTrue(layer.configuration().modules().size() == 3); - - // modules - Set modules = layer.modules(); - assertTrue(modules.size() == 3); - Set names = modules.stream() - .map(Module::getName) - .collect(Collectors.toSet()); - assertTrue(names.contains("m1")); - assertTrue(names.contains("m2")); - assertTrue(names.contains("m3")); - - // findModule - Module m1 = layer.findModule("m1").get(); - Module m2 = layer.findModule("m2").get(); - Module m3 = layer.findModule("m3").get(); - assertEquals(m1.getName(), "m1"); - assertEquals(m2.getName(), "m2"); - assertEquals(m3.getName(), "m3"); - assertTrue(m1.getDescriptor() == descriptor1); - assertTrue(m2.getDescriptor() == descriptor2); - assertTrue(m3.getDescriptor() == descriptor3); - assertTrue(m1.getLayer() == layer); - assertTrue(m2.getLayer() == layer); - assertTrue(m3.getLayer() == layer); - assertTrue(modules.contains(m1)); - assertTrue(modules.contains(m2)); - assertTrue(modules.contains(m3)); - assertFalse(layer.findModule("godot").isPresent()); - - // findLoader - assertTrue(layer.findLoader("m1") == loader1); - assertTrue(layer.findLoader("m2") == loader2); - assertTrue(layer.findLoader("m3") == loader3); - try { - ClassLoader loader = layer.findLoader("godot"); - assertTrue(false); - } catch (IllegalArgumentException ignore) { } - - // parents - assertTrue(layer.parents().size() == 1); - assertTrue(layer.parents().get(0) == Layer.empty()); - } - - - /** - * Exercise Layer defineModules, created with boot layer as parent - */ - public void testLayerOnBoot() { - ModuleDescriptor descriptor1 = newBuilder("m1") - .requires("m2") - .requires("java.base") - .exports("p1") - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires("java.base") - .build(); - - ModuleFinder finder - = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration parent = Layer.boot().configuration(); - Configuration cf = resolve(parent, finder, "m1"); - - ClassLoader loader = new ClassLoader() { }; - - Layer layer = Layer.boot().defineModules(cf, mn -> loader); - - // configuration - assertTrue(layer.configuration() == cf); - assertTrue(layer.configuration().modules().size() == 2); - - // modules - Set modules = layer.modules(); - assertTrue(modules.size() == 2); - Set names = modules.stream() - .map(Module::getName) - .collect(Collectors.toSet()); - assertTrue(names.contains("m1")); - assertTrue(names.contains("m2")); - - // findModule - Module m1 = layer.findModule("m1").get(); - Module m2 = layer.findModule("m2").get(); - assertEquals(m1.getName(), "m1"); - assertEquals(m2.getName(), "m2"); - assertTrue(m1.getDescriptor() == descriptor1); - assertTrue(m2.getDescriptor() == descriptor2); - assertTrue(m1.getLayer() == layer); - assertTrue(m2.getLayer() == layer); - assertTrue(modules.contains(m1)); - assertTrue(modules.contains(m2)); - assertTrue(layer.findModule("java.base").get() == Object.class.getModule()); - assertFalse(layer.findModule("godot").isPresent()); - - // findLoader - assertTrue(layer.findLoader("m1") == loader); - assertTrue(layer.findLoader("m2") == loader); - assertTrue(layer.findLoader("java.base") == null); - - // parents - assertTrue(layer.parents().size() == 1); - assertTrue(layer.parents().get(0) == Layer.boot()); - } - - - /** - * Exercise Layer defineModules with a configuration of two modules that - * have the same module-private package. - */ - public void testPackageContainedInSelfAndOther() { - ModuleDescriptor descriptor1 = newBuilder("m1") - .requires("m2") - .packages(Set.of("p")) - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .packages(Set.of("p")) - .build(); - - ModuleFinder finder - = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration cf = resolve(finder, "m1"); - assertTrue(cf.modules().size() == 2); - - // one loader per module, should be okay - Layer.empty().defineModules(cf, mn -> new ClassLoader() { }); - - // same class loader - try { - ClassLoader loader = new ClassLoader() { }; - Layer.empty().defineModules(cf, mn -> loader); - assertTrue(false); - } catch (LayerInstantiationException expected) { } - } - - - /** - * Exercise Layer defineModules with a configuration that is a partitioned - * graph. The same package is exported in both partitions. - */ - public void testSameExportInPartitionedGraph() { - - // m1 reads m2, m2 exports p to m1 - ModuleDescriptor descriptor1 = newBuilder("m1") - .requires("m2") - .build(); - ModuleDescriptor descriptor2 = newBuilder("m2") - .exports("p", Set.of("m1")) - .build(); - - // m3 reads m4, m4 exports p to m3 - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires("m4") - .build(); - ModuleDescriptor descriptor4 = newBuilder("m4") - .exports("p", Set.of("m3")) - .build(); - - ModuleFinder finder - = ModuleUtils.finderOf(descriptor1, - descriptor2, - descriptor3, - descriptor4); - - Configuration cf = resolve(finder, "m1", "m3"); - assertTrue(cf.modules().size() == 4); - - // one loader per module - Layer.empty().defineModules(cf, mn -> new ClassLoader() { }); - - // m1 & m2 in one loader, m3 & m4 in another loader - ClassLoader loader1 = new ClassLoader() { }; - ClassLoader loader2 = new ClassLoader() { }; - Map map = new HashMap<>(); - map.put("m1", loader1); - map.put("m2", loader1); - map.put("m3", loader2); - map.put("m4", loader2); - Layer.empty().defineModules(cf, map::get); - - // same loader - try { - ClassLoader loader = new ClassLoader() { }; - Layer.empty().defineModules(cf, mn -> loader); - assertTrue(false); - } catch (LayerInstantiationException expected) { } - } - - - /** - * Exercise Layer defineModules with a configuration with a module that - * contains a package that is the same name as a non-exported package in - * a parent layer. - */ - public void testContainsSamePackageAsBootLayer() { - - // check assumption that java.base contains sun.launcher - ModuleDescriptor base = Object.class.getModule().getDescriptor(); - assertTrue(base.packages().contains("sun.launcher")); - - ModuleDescriptor descriptor = newBuilder("m1") - .requires("java.base") - .packages(Set.of("sun.launcher")) - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor); - - Configuration parent = Layer.boot().configuration(); - Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1")); - assertTrue(cf.modules().size() == 1); - - ClassLoader loader = new ClassLoader() { }; - Layer layer = Layer.boot().defineModules(cf, mn -> loader); - assertTrue(layer.modules().size() == 1); - } - - - /** - * Test layers with implied readability. - * - * The test consists of three configurations: - * - Configuration/layer1: m1, m2 requires transitive m1 - * - Configuration/layer2: m3 requires m1 - */ - public void testImpliedReadabilityWithLayers1() { - - // cf1: m1 and m2, m2 requires transitive m1 - - ModuleDescriptor descriptor1 = newBuilder("m1") - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration cf1 = resolve(finder1, "m2"); - - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - - - // cf2: m3, m3 requires m2 - - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires("m2") - .build(); - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3); - - Configuration cf2 = resolve(cf1, finder2, "m3"); - - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - - assertTrue(layer1.parents().size() == 1); - assertTrue(layer1.parents().get(0) == Layer.empty()); - - assertTrue(layer2.parents().size() == 1); - assertTrue(layer2.parents().get(0) == layer1); - - Module m1 = layer2.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - Module m3 = layer2.findModule("m3").get(); - - assertTrue(m1.getLayer() == layer1); - assertTrue(m2.getLayer() == layer1); - assertTrue(m3.getLayer() == layer2); - - assertTrue(m1.getClassLoader() == cl1); - assertTrue(m2.getClassLoader() == cl1); - assertTrue(m3.getClassLoader() == cl2); - - assertTrue(m1.canRead(m1)); - assertFalse(m1.canRead(m2)); - assertFalse(m1.canRead(m3)); - - assertTrue(m2.canRead(m1)); - assertTrue(m2.canRead(m2)); - assertFalse(m2.canRead(m3)); - - assertTrue(m3.canRead(m1)); - assertTrue(m3.canRead(m2)); - assertTrue(m3.canRead(m3)); - } - - - /** - * Test layers with implied readability. - * - * The test consists of three configurations: - * - Configuration/layer1: m1 - * - Configuration/layer2: m2 requires transitive m3, m3 requires m2 - */ - public void testImpliedReadabilityWithLayers2() { - - // cf1: m1 - - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - - Configuration cf1 = resolve(finder1, "m1"); - - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - - - // cf2: m2, m3: m2 requires transitive m1, m3 requires m2 - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires("m2") - .build(); - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2, descriptor3); - - Configuration cf2 = resolve(cf1, finder2, "m3"); - - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - - assertTrue(layer1.parents().size() == 1); - assertTrue(layer1.parents().get(0) == Layer.empty()); - - assertTrue(layer2.parents().size() == 1); - assertTrue(layer2.parents().get(0) == layer1); - - Module m1 = layer2.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - Module m3 = layer2.findModule("m3").get(); - - assertTrue(m1.getLayer() == layer1); - assertTrue(m2.getLayer() == layer2); - assertTrue(m3.getLayer() == layer2); - - assertTrue(m1.canRead(m1)); - assertFalse(m1.canRead(m2)); - assertFalse(m1.canRead(m3)); - - assertTrue(m2.canRead(m1)); - assertTrue(m2.canRead(m2)); - assertFalse(m2.canRead(m3)); - - assertTrue(m3.canRead(m1)); - assertTrue(m3.canRead(m2)); - assertTrue(m3.canRead(m3)); - } - - - /** - * Test layers with implied readability. - * - * The test consists of three configurations: - * - Configuration/layer1: m1 - * - Configuration/layer2: m2 requires transitive m1 - * - Configuration/layer3: m3 requires m1 - */ - public void testImpliedReadabilityWithLayers3() { - - // cf1: m1 - - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - - Configuration cf1 = resolve(finder1, "m1"); - - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - - - // cf2: m2 requires transitive m1 - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); - - Configuration cf2 = resolve(cf1, finder2, "m2"); - - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - - - // cf3: m3 requires m2 - - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires("m2") - .build(); - - ModuleFinder finder3 = ModuleUtils.finderOf(descriptor3); - - Configuration cf3 = resolve(cf2, finder3, "m3"); - - ClassLoader cl3 = new ClassLoader() { }; - Layer layer3 = layer2.defineModules(cf3, mn -> cl3); - - assertTrue(layer1.parents().size() == 1); - assertTrue(layer1.parents().get(0) == Layer.empty()); - - assertTrue(layer2.parents().size() == 1); - assertTrue(layer2.parents().get(0) == layer1); - - assertTrue(layer3.parents().size() == 1); - assertTrue(layer3.parents().get(0) == layer2); - - Module m1 = layer3.findModule("m1").get(); - Module m2 = layer3.findModule("m2").get(); - Module m3 = layer3.findModule("m3").get(); - - assertTrue(m1.getLayer() == layer1); - assertTrue(m2.getLayer() == layer2); - assertTrue(m3.getLayer() == layer3); - - assertTrue(m1.canRead(m1)); - assertFalse(m1.canRead(m2)); - assertFalse(m1.canRead(m3)); - - assertTrue(m2.canRead(m1)); - assertTrue(m2.canRead(m2)); - assertFalse(m2.canRead(m3)); - - assertTrue(m3.canRead(m1)); - assertTrue(m3.canRead(m2)); - assertTrue(m3.canRead(m3)); - } - - - /** - * Test layers with implied readability. - * - * The test consists of two configurations: - * - Configuration/layer1: m1, m2 requires transitive m1 - * - Configuration/layer2: m3 requires transitive m2, m4 requires m3 - */ - public void testImpliedReadabilityWithLayers4() { - - // cf1: m1, m2 requires transitive m1 - - ModuleDescriptor descriptor1 = newBuilder("m1") - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration cf1 = resolve(finder1, "m2"); - - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - - - // cf2: m3 requires transitive m2, m4 requires m3 - - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m2") - .build(); - - ModuleDescriptor descriptor4 = newBuilder("m4") - .requires("m3") - .build(); - - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4); - - Configuration cf2 = resolve(cf1, finder2, "m3", "m4"); - - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - - assertTrue(layer1.parents().size() == 1); - assertTrue(layer1.parents().get(0) == Layer.empty()); - - assertTrue(layer2.parents().size() == 1); - assertTrue(layer2.parents().get(0) == layer1); - - Module m1 = layer2.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - Module m3 = layer2.findModule("m3").get(); - Module m4 = layer2.findModule("m4").get(); - - assertTrue(m1.getLayer() == layer1); - assertTrue(m2.getLayer() == layer1); - assertTrue(m3.getLayer() == layer2); - assertTrue(m4.getLayer() == layer2); - - assertTrue(m1.canRead(m1)); - assertFalse(m1.canRead(m2)); - assertFalse(m1.canRead(m3)); - assertFalse(m1.canRead(m4)); - - assertTrue(m2.canRead(m1)); - assertTrue(m2.canRead(m2)); - assertFalse(m1.canRead(m3)); - assertFalse(m1.canRead(m4)); - - assertTrue(m3.canRead(m1)); - assertTrue(m3.canRead(m2)); - assertTrue(m3.canRead(m3)); - assertFalse(m3.canRead(m4)); - - assertTrue(m4.canRead(m1)); - assertTrue(m4.canRead(m2)); - assertTrue(m4.canRead(m3)); - assertTrue(m4.canRead(m4)); - } - - - /** - * Test layers with a qualified export. The module exporting the package - * does not read the target module. - * - * m1 { exports p to m2 } - * m2 { } - */ - public void testQualifiedExports1() { - ModuleDescriptor descriptor1 = newBuilder("m1"). - exports("p", Set.of("m2")) - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration cf = resolve(finder1, "m1", "m2"); - - ClassLoader cl = new ClassLoader() { }; - Layer layer = Layer.empty().defineModules(cf, mn -> cl); - assertTrue(layer.modules().size() == 2); - - Module m1 = layer.findModule("m1").get(); - Module m2 = layer.findModule("m2").get(); - - // check m1 exports p to m2 - assertFalse(m1.isExported("p")); - assertTrue(m1.isExported("p", m2)); - assertFalse(m1.isOpen("p", m2)); - } - - - /** - * Test layers with a qualified export. The module exporting the package - * reads the target module. - * - * m1 { exports p to m2; } - * m2 { requires m1; } - */ - public void testQualifiedExports2() { - ModuleDescriptor descriptor1 = newBuilder("m1") - .exports("p", Set.of("m2")) - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires("m1") - .build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - - Configuration cf = resolve(finder1, "m2"); - ClassLoader cl = new ClassLoader() { }; - Layer layer = Layer.empty().defineModules(cf, mn -> cl); - assertTrue(layer.modules().size() == 2); - - Module m1 = layer.findModule("m1").get(); - Module m2 = layer.findModule("m2").get(); - - // check m1 exports p to m2 - assertFalse(m1.isExported("p")); - assertTrue(m1.isExported("p", m2)); - assertFalse(m1.isOpen("p", m2)); - } - - - /** - * Test layers with a qualified export. The module exporting the package - * does not read the target module in the parent layer. - * - * - Configuration/layer1: m1 { } - * - Configuration/layer2: m2 { exports p to m1; } - */ - public void testQualifiedExports3() { - // create layer1 with m1 - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - Configuration cf1 = resolve(finder1, "m1"); - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - assertTrue(layer1.modules().size() == 1); - - // create layer2 with m2 - ModuleDescriptor descriptor2 = newBuilder("m2") - .exports("p", Set.of("m1")) - .build(); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); - Configuration cf2 = resolve(cf1, finder2, "m2"); - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - assertTrue(layer2.modules().size() == 1); - - Module m1 = layer1.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - - // check m2 exports p to layer1/m1 - assertFalse(m2.isExported("p")); - assertTrue(m2.isExported("p", m1)); - assertFalse(m2.isOpen("p", m1)); - } - - - /** - * Test layers with a qualified export. The module exporting the package - * reads the target module in the parent layer. - * - * - Configuration/layer1: m1 { } - * - Configuration/layer2: m2 { requires m1; exports p to m1; } - */ - public void testQualifiedExports4() { - // create layer1 with m1 - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - Configuration cf1 = resolve(finder1, "m1"); - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - assertTrue(layer1.modules().size() == 1); - - // create layer2 with m2 - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires("m1") - .exports("p", Set.of("m1")) - .build(); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); - Configuration cf2 = resolve(cf1, finder2, "m2"); - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - assertTrue(layer2.modules().size() == 1); - - Module m1 = layer1.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - - // check m2 exports p to layer1/m1 - assertFalse(m2.isExported("p")); - assertTrue(m2.isExported("p", m1)); - assertFalse(m2.isOpen("p", m1)); - } - - /** - * Test layers with a qualified export. The module exporting the package - * does not read the target module. - * - * - Configuration/layer1: m1 - * - Configuration/layer2: m1, m2 { exports p to m1; } - */ - public void testQualifiedExports5() { - // create layer1 with m1 - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - Configuration cf1 = resolve(finder1, "m1"); - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - assertTrue(layer1.modules().size() == 1); - - // create layer2 with m1 and m2 - ModuleDescriptor descriptor2 = newBuilder("m2").exports("p", Set.of("m1")).build(); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor2); - Configuration cf2 = resolve(cf1, finder2, "m1", "m2"); - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - assertTrue(layer2.modules().size() == 2); - - Module m1_v1 = layer1.findModule("m1").get(); - Module m1_v2 = layer2.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - - // check m2 exports p to layer2/m2 - assertFalse(m2.isExported("p")); - assertTrue(m2.isExported("p", m1_v2)); - assertFalse(m2.isExported("p", m1_v1)); - } - - - /** - * Test layers with a qualified export. The module exporting the package - * reads the target module in the parent layer (due to requires transitive). - * - * - Configuration/layer1: m1, m2 { requires transitive m1; } - * - Configuration/layer2: m1, m3 { requires m2; exports p to m1; } - */ - public void testQualifiedExports6() { - // create layer1 with m1 and m2 - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - Configuration cf1 = resolve(finder1, "m2"); - ClassLoader loader1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> loader1); - assertTrue(layer1.modules().size() == 2); - - // create layer2 with m1 and m3 - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires("m2") - .exports("p", Set.of("m1")) - .build(); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3); - Configuration cf2 = resolve(cf1, finder2, "m1", "m3"); - ClassLoader loader2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> loader2); - assertTrue(layer2.modules().size() == 2); - - Module m1_v1 = layer1.findModule("m1").get(); - Module m2 = layer1.findModule("m2").get(); - - Module m1_v2 = layer2.findModule("m1").get(); - Module m3 = layer2.findModule("m3").get(); - - assertTrue(m3.canRead(m1_v1)); - assertFalse(m3.canRead(m1_v2)); - - assertFalse(m3.isExported("p")); - assertTrue(m3.isExported("p", m1_v1)); - assertFalse(m3.isExported("p", m1_v2)); - assertFalse(m3.isExported("p", m2)); - } - - - /** - * Test layers with a qualified export. The target module is not in any layer. - * - * - Configuration/layer1: m1 { } - * - Configuration/layer2: m2 { exports p to m3; } - */ - public void testQualifiedExports7() { - // create layer1 with m1 - ModuleDescriptor descriptor1 = newBuilder("m1").build(); - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - Configuration cf1 = resolve(finder1, "m1"); - ClassLoader cl1 = new ClassLoader() { }; - Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); - assertTrue(layer1.modules().size() == 1); - - // create layer2 with m2 - ModuleDescriptor descriptor2 = newBuilder("m2") - .exports("p", Set.of("m3")) - .build(); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); - Configuration cf2 = resolve(cf1, finder2, "m2"); - ClassLoader cl2 = new ClassLoader() { }; - Layer layer2 = layer1.defineModules(cf2, mn -> cl2); - assertTrue(layer2.modules().size() == 1); - - Module m1 = layer1.findModule("m1").get(); - Module m2 = layer2.findModule("m2").get(); - - // check m2 does not export p to anyone - assertFalse(m2.isExported("p")); - assertFalse(m2.isExported("p", m1)); - } - - /** - * Attempt to use Layer defineModules to create a layer with a module - * defined to a class loader that already has a module of the same name - * defined to the class loader. - */ - @Test(expectedExceptions = { LayerInstantiationException.class }) - public void testModuleAlreadyDefinedToLoader() { - - ModuleDescriptor md = newBuilder("m") - .requires("java.base") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(md); - - Configuration parent = Layer.boot().configuration(); - - Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m")); - - ClassLoader loader = new ClassLoader() { }; - - Layer.boot().defineModules(cf, mn -> loader); - - // should throw LayerInstantiationException as m1 already defined to loader - Layer.boot().defineModules(cf, mn -> loader); - - } - - - /** - * Attempt to use Layer defineModules to create a Layer with a module - * containing package {@code p} where the class loader already has a module - * defined to it containing package {@code p}. - */ - @Test(expectedExceptions = { LayerInstantiationException.class }) - public void testPackageAlreadyInNamedModule() { - - ModuleDescriptor md1 = newBuilder("m1") - .packages(Set.of("p")) - .requires("java.base") - .build(); - - ModuleDescriptor md2 = newBuilder("m2") - .packages(Set.of("p")) - .requires("java.base") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(md1, md2); - - ClassLoader loader = new ClassLoader() { }; - - // define m1 containing package p to class loader - - Configuration parent = Layer.boot().configuration(); - - Configuration cf1 = parent.resolve(finder, ModuleFinder.of(), Set.of("m1")); - - Layer layer1 = Layer.boot().defineModules(cf1, mn -> loader); - - // attempt to define m2 containing package p to class loader - - Configuration cf2 = parent.resolve(finder, ModuleFinder.of(), Set.of("m2")); - - // should throw exception because p already in m1 - Layer layer2 = Layer.boot().defineModules(cf2, mn -> loader); - - } - - - /** - * Attempt to use Layer defineModules to create a Layer with a module - * containing a package in which a type is already loaded by the class - * loader. - */ - @Test(expectedExceptions = { LayerInstantiationException.class }) - public void testPackageAlreadyInUnnamedModule() throws Exception { - - Class c = layertest.Test.class; - assertFalse(c.getModule().isNamed()); // in unnamed module - - ModuleDescriptor md = newBuilder("m") - .packages(Set.of(c.getPackageName())) - .requires("java.base") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(md); - - Configuration parent = Layer.boot().configuration(); - Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m")); - - Layer.boot().defineModules(cf, mn -> c.getClassLoader()); - } - - - /** - * Attempt to create a Layer with a module named "java.base". - */ - public void testLayerWithJavaBase() { - ModuleDescriptor descriptor = newBuilder("java.base") - .exports("java.lang") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor); - - Configuration cf = Layer.boot() - .configuration() - .resolve(finder, ModuleFinder.of(), Set.of("java.base")); - assertTrue(cf.modules().size() == 1); - - ClassLoader scl = ClassLoader.getSystemClassLoader(); - - try { - Layer.boot().defineModules(cf, mn -> new ClassLoader() { }); - assertTrue(false); - } catch (LayerInstantiationException e) { } - - try { - Layer.boot().defineModulesWithOneLoader(cf, scl); - assertTrue(false); - } catch (LayerInstantiationException e) { } - - try { - Layer.boot().defineModulesWithManyLoaders(cf, scl); - assertTrue(false); - } catch (LayerInstantiationException e) { } - } - - - @DataProvider(name = "javaPackages") - public Object[][] javaPackages() { - return new Object[][] { { "m1", "java" }, { "m2", "java.x" } }; - } - - /** - * Attempt to create a Layer with a module containing a "java" package. - * This should only be allowed when the module is defined to the platform - * class loader. - */ - @Test(dataProvider = "javaPackages") - public void testLayerWithJavaPackage(String mn, String pn) { - ModuleDescriptor descriptor = newBuilder(mn).packages(Set.of(pn)).build(); - ModuleFinder finder = ModuleUtils.finderOf(descriptor); - - Configuration cf = Layer.boot() - .configuration() - .resolve(finder, ModuleFinder.of(), Set.of(mn)); - assertTrue(cf.modules().size() == 1); - - ClassLoader pcl = ClassLoader.getPlatformClassLoader(); - ClassLoader scl = ClassLoader.getSystemClassLoader(); - - try { - Layer.boot().defineModules(cf, _mn -> new ClassLoader() { }); - assertTrue(false); - } catch (LayerInstantiationException e) { } - - try { - Layer.boot().defineModulesWithOneLoader(cf, scl); - assertTrue(false); - } catch (LayerInstantiationException e) { } - - try { - Layer.boot().defineModulesWithManyLoaders(cf, scl); - assertTrue(false); - } catch (LayerInstantiationException e) { } - - // create layer with module defined to platform class loader - Layer layer = Layer.boot().defineModules(cf, _mn -> pcl); - Optional om = layer.findModule(mn); - assertTrue(om.isPresent()); - Module foo = om.get(); - assertTrue(foo.getClassLoader() == pcl); - assertTrue(foo.getPackages().length == 1); - assertTrue(foo.getPackages()[0].equals(pn)); - } - - - /** - * Attempt to create a Layer with a module defined to the boot loader - */ - @Test(expectedExceptions = { LayerInstantiationException.class }) - public void testLayerWithBootLoader() { - ModuleDescriptor descriptor = newBuilder("m1") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor); - - Configuration cf = Layer.boot() - .configuration() - .resolve(finder, ModuleFinder.of(), Set.of("m1")); - assertTrue(cf.modules().size() == 1); - - Layer.boot().defineModules(cf, mn -> null ); - } - - - /** - * Parent of configuration != configuration of parent Layer - */ - @Test(expectedExceptions = { IllegalArgumentException.class }) - public void testIncorrectParent1() { - - ModuleDescriptor descriptor1 = newBuilder("m1") - .requires("java.base") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor1); - - Configuration parent = Layer.boot().configuration(); - Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1")); - - ClassLoader loader = new ClassLoader() { }; - Layer.empty().defineModules(cf, mn -> loader); - } - - - /** - * Parent of configuration != configuration of parent Layer - */ - @Test(expectedExceptions = { IllegalArgumentException.class }) - public void testIncorrectParent2() { - - ModuleDescriptor descriptor1 = newBuilder("m1") - .build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor1); - - Configuration cf = resolve(finder, "m1"); - - ClassLoader loader = new ClassLoader() { }; - Layer.boot().defineModules(cf, mn -> loader); - } - - - // null handling - - @Test(expectedExceptions = { NullPointerException.class }) - public void testCreateWithNull1() { - ClassLoader loader = new ClassLoader() { }; - Layer.empty().defineModules(null, mn -> loader); - } - - @Test(expectedExceptions = { NullPointerException.class }) - public void testCreateWithNull2() { - Configuration cf = resolve(Layer.boot().configuration(), ModuleFinder.of()); - Layer.boot().defineModules(cf, null); - } - - @Test(expectedExceptions = { NullPointerException.class }) - public void testCreateWithNull3() { - ClassLoader scl = ClassLoader.getSystemClassLoader(); - Layer.empty().defineModulesWithOneLoader(null, scl); - } - - @Test(expectedExceptions = { NullPointerException.class }) - public void testCreateWithNull4() { - ClassLoader scl = ClassLoader.getSystemClassLoader(); - Layer.empty().defineModulesWithManyLoaders(null, scl); - } - - @Test(expectedExceptions = { NullPointerException.class }) - public void testFindModuleWithNull() { - Layer.boot().findModule(null); - } - - @Test(expectedExceptions = { NullPointerException.class }) - public void testFindLoaderWithNull() { - Layer.boot().findLoader(null); - } - - - // immutable sets - - @Test(expectedExceptions = { UnsupportedOperationException.class }) - public void testImmutableSet() { - Module base = Object.class.getModule(); - Layer.boot().modules().add(base); - } - - - /** - * Resolve the given modules, by name, and returns the resulting - * Configuration. - */ - private static Configuration resolve(Configuration cf, - ModuleFinder finder, - String... roots) { - return cf.resolve(finder, ModuleFinder.of(), Set.of(roots)); - } - - private static Configuration resolve(ModuleFinder finder, - String... roots) { - return resolve(Configuration.empty(), finder, roots); - } -}