hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java
changeset 43665 4bb003cad9b9
parent 42307 cefc81dc1d52
child 44520 0553e129e0ec
equal deleted inserted replaced
43606:a5aa7536131c 43665:4bb003cad9b9
     1 /*
     1 /*
     2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     7  * published by the Free Software Foundation.  Oracle designates this
    23  * questions.
    23  * questions.
    24  */
    24  */
    25 
    25 
    26 /*
    26 /*
    27  * @test
    27  * @test
    28  * @summary Test that if module m1 can read module m2, but package p2 in m2
    28  * @summary Test that if module m1x can read module m2x, but package p2 in m2x
    29  *          is exported specifically to module m3, then class p1.c1 in m1 can not
    29  *          is exported specifically to module m3x, then class p1.c1 in m1x can not
    30  *          access p2.c2 in m2.
    30  *          access p2.c2 in m2x.
    31  * @modules java.base/jdk.internal.misc
    31  * @modules java.base/jdk.internal.misc
    32  * @library /test/lib
    32  * @library /test/lib
    33  * @compile myloaders/MySameClassLoader.java
    33  * @compile myloaders/MySameClassLoader.java
    34  * @compile p2/c2.java
    34  * @compile p2/c2.java
    35  * @compile p1/c1.java
    35  * @compile p1/c1.java
    46 import java.util.Map;
    46 import java.util.Map;
    47 import java.util.Set;
    47 import java.util.Set;
    48 import myloaders.MySameClassLoader;
    48 import myloaders.MySameClassLoader;
    49 
    49 
    50 //
    50 //
    51 // ClassLoader1 --> defines m1 --> packages p1
    51 // ClassLoader1 --> defines m1x --> packages p1
    52 //                  defines m2 --> packages p2
    52 //                  defines m2x --> packages p2
    53 //                  defines m3 --> packages p3
    53 //                  defines m3x --> packages p3
    54 //
    54 //
    55 // m1 can read m2
    55 // m1x can read m2x
    56 // package p2 in m2 is exported to m3
    56 // package p2 in m2x is exported to m3x
    57 //
    57 //
    58 // class p1.c1 defined in m1 tries to access p2.c2 defined in m2
    58 // class p1.c1 defined in m1x tries to access p2.c2 defined in m2x
    59 // Access denied since although m1 can read m2, p2 is exported only to m3.
    59 // Access denied since although m1x can read m2x, p2 is exported only to m3x.
    60 //
    60 //
    61 public class ExpQualOther {
    61 public class ExpQualOther {
    62 
    62 
    63     // Create a Layer over the boot layer.
    63     // Create a Layer over the boot layer.
    64     // Define modules within this layer to test access between
    64     // Define modules within this layer to test access between
    65     // publically defined classes within packages of those modules.
    65     // publically defined classes within packages of those modules.
    66     public void createLayerOnBoot() throws Throwable {
    66     public void createLayerOnBoot() throws Throwable {
    67 
    67 
    68         // Define module:     m1
    68         // Define module:     m1x
    69         // Can read:          java.base, m2, m3
    69         // Can read:          java.base, m2x, m3x
    70         // Packages:          p1
    70         // Packages:          p1
    71         // Packages exported: p1 is exported unqualifiedly
    71         // Packages exported: p1 is exported unqualifiedly
    72         ModuleDescriptor descriptor_m1 =
    72         ModuleDescriptor descriptor_m1x =
    73                 ModuleDescriptor.module("m1")
    73                 ModuleDescriptor.newModule("m1x")
    74                         .requires("java.base")
    74                         .requires("java.base")
    75                         .requires("m2")
    75                         .requires("m2x")
    76                         .requires("m3")
    76                         .requires("m3x")
    77                         .exports("p1")
    77                         .exports("p1")
    78                         .build();
    78                         .build();
    79 
    79 
    80         // Define module:     m2
    80         // Define module:     m2x
    81         // Can read:          java.base
    81         // Can read:          java.base
    82         // Packages:          p2
    82         // Packages:          p2
    83         // Packages exported: p2 is exported to m3
    83         // Packages exported: p2 is exported to m3x
    84         ModuleDescriptor descriptor_m2 =
    84         ModuleDescriptor descriptor_m2x =
    85                 ModuleDescriptor.module("m2")
    85                 ModuleDescriptor.newModule("m2x")
    86                         .requires("java.base")
    86                         .requires("java.base")
    87                         .exports("p2", Set.of("m3"))
    87                         .exports("p2", Set.of("m3x"))
    88                         .build();
    88                         .build();
    89 
    89 
    90         // Define module:     m3
    90         // Define module:     m3x
    91         // Can read:          java.base, m2
    91         // Can read:          java.base, m2x
    92         // Packages:          p3
    92         // Packages:          p3
    93         // Packages exported: none
    93         // Packages exported: none
    94         ModuleDescriptor descriptor_m3 =
    94         ModuleDescriptor descriptor_m3x =
    95                 ModuleDescriptor.module("m3")
    95                 ModuleDescriptor.newModule("m3x")
    96                         .requires("java.base")
    96                         .requires("java.base")
    97                         .requires("m2")
    97                         .requires("m2x")
    98                         .contains("p3")
    98                         .packages(Set.of("p3"))
    99                         .build();
    99                         .build();
   100 
   100 
   101         // Set up a ModuleFinder containing all modules for this layer.
   101         // Set up a ModuleFinder containing all modules for this layer.
   102         ModuleFinder finder = ModuleLibrary.of(descriptor_m1, descriptor_m2, descriptor_m3);
   102         ModuleFinder finder = ModuleLibrary.of(descriptor_m1x, descriptor_m2x, descriptor_m3x);
   103 
   103 
   104         // Resolves "m1"
   104         // Resolves "m1x"
   105         Configuration cf = Layer.boot()
   105         Configuration cf = Layer.boot()
   106                 .configuration()
   106                 .configuration()
   107                 .resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
   107                 .resolve(finder, ModuleFinder.of(), Set.of("m1x"));
   108 
   108 
   109         // map each module to differing class loaders for this test
   109         // map each module to differing class loaders for this test
   110         Map<String, ClassLoader> map = new HashMap<>();
   110         Map<String, ClassLoader> map = new HashMap<>();
   111         map.put("m1", MySameClassLoader.loader1);
   111         map.put("m1x", MySameClassLoader.loader1);
   112         map.put("m2", MySameClassLoader.loader1);
   112         map.put("m2x", MySameClassLoader.loader1);
   113         map.put("m3", MySameClassLoader.loader1);
   113         map.put("m3x", MySameClassLoader.loader1);
   114 
   114 
   115         // Create Layer that contains m1 & m2
   115         // Create Layer that contains m1x & m2x
   116         Layer layer = Layer.boot().defineModules(cf, map::get);
   116         Layer layer = Layer.boot().defineModules(cf, map::get);
   117 
   117 
   118         assertTrue(layer.findLoader("m1") == MySameClassLoader.loader1);
   118         assertTrue(layer.findLoader("m1x") == MySameClassLoader.loader1);
   119         assertTrue(layer.findLoader("m2") == MySameClassLoader.loader1);
   119         assertTrue(layer.findLoader("m2x") == MySameClassLoader.loader1);
   120         assertTrue(layer.findLoader("m3") == MySameClassLoader.loader1);
   120         assertTrue(layer.findLoader("m3x") == MySameClassLoader.loader1);
   121         assertTrue(layer.findLoader("java.base") == null);
   121         assertTrue(layer.findLoader("java.base") == null);
   122 
   122 
   123         // now use the same loader to load class p1.c1
   123         // now use the same loader to load class p1.c1
   124         Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1");
   124         Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1");
   125         try {
   125         try {
   126             p1_c1_class.newInstance();
   126             p1_c1_class.newInstance();
   127             throw new RuntimeException("Failed to get IAE (p2 in m2 is exported to m3 not to m1)");
   127             throw new RuntimeException("Failed to get IAE (p2 in m2x is exported to m3x not to m1x)");
   128         } catch (IllegalAccessError e) {
   128         } catch (IllegalAccessError e) {
   129             System.out.println(e.getMessage());
   129             System.out.println(e.getMessage());
   130             if (!e.getMessage().contains("does not export")) {
   130             if (!e.getMessage().contains("does not export")) {
   131                 throw new RuntimeException("Wrong message: " + e.getMessage());
   131                 throw new RuntimeException("Wrong message: " + e.getMessage());
   132             }
   132             }