1/* 2 * Copyright (c) 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 * @build LayerControllerTest ModuleUtils 28 * @run testng LayerControllerTest 29 * @summary Basic tests for java.lang.ModuleLayer.Controller 30 */ 31 32import java.lang.module.Configuration; 33import java.lang.module.ModuleDescriptor; 34import java.lang.module.ModuleFinder; 35import java.util.List; 36import java.util.Set; 37 38import org.testng.annotations.Test; 39import static org.testng.Assert.*; 40 41@Test 42public class LayerControllerTest { 43 44 /** 45 * Creates a Controller for a module layer containing modules m1 and m2. 46 * Module m1 contains p1, reads java.base, does not export/open any package 47 * Module m2 contains p2, reads java.base, does not export/open any package 48 */ 49 private ModuleLayer.Controller createTestLayer() { 50 ModuleDescriptor descriptor1 51 = ModuleDescriptor.newModule("m1") 52 .packages(Set.of("p1")) 53 .requires("java.base") 54 .build(); 55 56 ModuleDescriptor descriptor2 57 = ModuleDescriptor.newModule("m2") 58 .requires("java.base") 59 .packages(Set.of("p2")) 60 .build(); 61 62 ModuleDescriptor descriptor3 63 = ModuleDescriptor.newModule("m3") 64 .requires("java.base") 65 .packages(Set.of("p3")) 66 .build(); 67 68 ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3); 69 ModuleLayer bootLayer = ModuleLayer.boot(); 70 71 Configuration cf = bootLayer.configuration() 72 .resolve(finder, ModuleFinder.of(), Set.of("m1", "m2", "m3")); 73 74 ClassLoader scl = ClassLoader.getSystemClassLoader(); 75 76 ModuleLayer.Controller controller 77 = ModuleLayer.defineModulesWithOneLoader(cf, List.of(bootLayer), scl); 78 79 ModuleLayer layer = controller.layer(); 80 81 assertTrue(layer.modules().size() == 3); 82 assertTrue(layer.findModule("m1").isPresent()); 83 assertTrue(layer.findModule("m2").isPresent()); 84 assertTrue(layer.findModule("m3").isPresent()); 85 86 return controller; 87 } 88 89 /** 90 * Basic test of Controller to update modules m1 and m2 to read and 91 * open packages to each other. 92 */ 93 public void testBasic() { 94 ModuleLayer.Controller controller = createTestLayer(); 95 ModuleLayer layer = controller.layer(); 96 Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new); 97 Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new); 98 Module m3 = layer.findModule("m3").orElseThrow(RuntimeException::new); 99 100 assertFalse(m1.canRead(m2)); 101 assertFalse(m1.canRead(m3)); 102 assertFalse(m1.isExported("p1")); 103 assertFalse(m1.isOpen("p1")); 104 assertFalse(m1.isExported("p1", m2)); 105 assertFalse(m1.isExported("p1", m3)); 106 assertFalse(m1.isOpen("p1", m2)); 107 assertFalse(m1.isOpen("p1", m3)); 108 109 assertFalse(m2.canRead(m1)); 110 assertFalse(m2.canRead(m3)); 111 assertFalse(m2.isExported("p2")); 112 assertFalse(m2.isOpen("p2")); 113 assertFalse(m2.isExported("p2", m1)); 114 assertFalse(m2.isExported("p2", m3)); 115 assertFalse(m2.isOpen("p2", m1)); 116 assertFalse(m2.isOpen("p2", m3)); 117 118 assertFalse(m3.canRead(m1)); 119 assertFalse(m3.canRead(m2)); 120 assertFalse(m3.isExported("p3")); 121 assertFalse(m3.isOpen("p3")); 122 assertFalse(m3.isExported("p3", m1)); 123 assertFalse(m3.isExported("p3", m2)); 124 assertFalse(m3.isOpen("p3", m1)); 125 assertFalse(m3.isOpen("p3", m2)); 126 127 // update m1 to read m2 128 assertTrue(controller.addReads(m1, m2) == controller); 129 assertTrue(m1.canRead(m2)); 130 assertFalse(m2.canRead(m1)); 131 132 // update m2 to read m1 133 assertTrue(controller.addReads(m2, m1) == controller); 134 assertTrue(m1.canRead(m2)); 135 assertTrue(m1.canRead(m1)); 136 137 // update m1 to export p1 to m2 138 assertTrue(controller.addExports(m1, "p1", m2) == controller); 139 assertTrue(m1.isExported("p1", m2)); 140 assertFalse(m1.isOpen("p1", m2)); 141 assertFalse(m1.isExported("p1")); 142 assertFalse(m1.isOpen("p1")); 143 144 // update m3 to open p3 to m1 145 assertTrue(controller.addExports(m3, "p3", m1) == controller); 146 assertTrue(m3.isExported("p3", m1)); 147 assertFalse(m3.isOpen("p3", m1)); 148 assertFalse(m3.isExported("p3")); 149 assertFalse(m3.isOpen("p3")); 150 151 // update m1 to open p1 to m3 152 assertTrue(controller.addOpens(m1, "p1", m3) == controller); 153 assertTrue(m1.isExported("p1", m3)); 154 assertTrue(m1.isOpen("p1", m3)); 155 assertFalse(m1.isExported("p1")); 156 assertFalse(m1.isOpen("p1")); 157 158 // update m3 to open p3 to m1 159 assertTrue(controller.addOpens(m3, "p3", m1) == controller); 160 assertTrue(m3.isExported("p3", m1)); 161 assertTrue(m3.isOpen("p3", m1)); 162 assertFalse(m3.isExported("p3")); 163 assertFalse(m3.isOpen("p3")); 164 } 165 166 /** 167 * Test invalid argument handling 168 */ 169 public void testBadArguments() { 170 ModuleLayer.Controller controller = createTestLayer(); 171 ModuleLayer layer = controller.layer(); 172 Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new); 173 Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new); 174 Module base = Object.class.getModule(); 175 176 // java.base is not in layer 177 try { 178 controller.addReads(base, m2); 179 assertTrue(false); 180 } catch (IllegalArgumentException expected) { } 181 182 // java.base is not in layer 183 try { 184 controller.addExports(base, "java.lang", m2); 185 assertTrue(false); 186 } catch (IllegalArgumentException expected) { } 187 188 // m1 does not contain java.lang 189 try { 190 controller.addExports(m1, "java.lang", m2); 191 assertTrue(false); 192 } catch (IllegalArgumentException expected) { } 193 194 // java.base is not in layer 195 try { 196 controller.addOpens(base, "java.lang", m2); 197 assertTrue(false); 198 } catch (IllegalArgumentException expected) { } 199 200 // m1 does not contain java.lang 201 try { 202 controller.addOpens(m1, "java.lang", m2); 203 assertTrue(false); 204 } catch (IllegalArgumentException expected) { } 205 } 206 207 /** 208 * Test null handling 209 */ 210 public void testNulls() { 211 ModuleLayer.Controller controller = createTestLayer(); 212 ModuleLayer layer = controller.layer(); 213 Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new); 214 Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new); 215 assertTrue(m1 != null); 216 assertTrue(m2 != null); 217 218 try { 219 controller.addReads(null, m2); 220 assertTrue(false); 221 } catch (NullPointerException expected) { } 222 223 try { 224 controller.addReads(m1, null); 225 assertTrue(false); 226 } catch (NullPointerException expected) { } 227 228 try { 229 controller.addExports(null, "p1", m2); 230 assertTrue(false); 231 } catch (NullPointerException expected) { } 232 233 try { 234 controller.addExports(m1, null, m2); 235 assertTrue(false); 236 } catch (NullPointerException expected) { } 237 238 try { 239 controller.addExports(m1, "p1", null); 240 assertTrue(false); 241 } catch (NullPointerException expected) { } 242 243 try { 244 controller.addOpens(null, "p1", m2); 245 assertTrue(false); 246 } catch (NullPointerException expected) { } 247 248 try { 249 controller.addOpens(m1, null, m2); 250 assertTrue(false); 251 } catch (NullPointerException expected) { } 252 253 try { 254 controller.addOpens(m1, "p1", null); 255 assertTrue(false); 256 } catch (NullPointerException expected) { } 257 } 258} 259