jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java
author alanb
Fri, 10 Feb 2017 09:04:39 +0000
changeset 43712 5dfd0950317c
parent 42338 a60f280f803c
permissions -rw-r--r--
8173393: Module system implementation refresh (2/2017) Reviewed-by: dfuchs, psandoz, mchung, alanb Contributed-by: alan.bateman@oracle.com, mandy.chung@oracle.com, claes.redestad@oracle.com, alex.buckley@oracle.com, mark.reinhold@oracle.com, john.r.rose@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     1
/*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     4
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     8
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    13
 * accompanied this code).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    14
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    18
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    21
 * questions.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    22
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    23
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    24
/**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    25
 * @test
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    26
 * @library /lib/testlibrary
38378
3ae899b05d36 8156972: java/lang/reflect/Layer/LayerAndLoadersTest.java test requires jdk.compiler
alanb
parents: 36511
diff changeset
    27
 * @modules jdk.compiler
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    28
 * @build LayerAndLoadersTest CompilerUtils ModuleUtils
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    29
 * @run testng LayerAndLoadersTest
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    30
 * @summary Tests for java.lang.reflect.Layer@createWithXXX methods
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    31
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    32
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
    33
import java.io.IOException;
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
    34
import java.io.InputStream;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    35
import java.lang.module.Configuration;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    36
import java.lang.module.ModuleDescriptor;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    37
import java.lang.module.ModuleFinder;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    38
import java.lang.module.ModuleReference;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    39
import java.lang.reflect.Layer;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    40
import java.lang.reflect.LayerInstantiationException;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    41
import java.lang.reflect.Method;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    42
import java.lang.reflect.Module;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
    43
import java.net.URL;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    44
import java.nio.file.Path;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    45
import java.nio.file.Paths;
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
    46
import java.util.Enumeration;
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    47
import java.util.HashMap;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    48
import java.util.Iterator;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    49
import java.util.Map;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    50
import java.util.Optional;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    51
import java.util.ServiceLoader;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    52
import java.util.Set;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    53
import java.util.stream.Collectors;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    54
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    55
import org.testng.annotations.BeforeTest;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    56
import org.testng.annotations.Test;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    57
import static org.testng.Assert.*;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    58
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    59
@Test
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    60
public class LayerAndLoadersTest {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    61
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    62
    private static final String TEST_SRC = System.getProperty("test.src");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    63
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    64
    private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    65
    private static final Path MODS_DIR = Paths.get("mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    66
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    67
    @BeforeTest
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    68
    public void setup() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    69
40261
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 38564
diff changeset
    70
        // javac -d mods --module-source-path src src/**
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    71
        assertTrue(CompilerUtils.compile(SRC_DIR, MODS_DIR,
40261
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 38564
diff changeset
    72
                "--module-source-path", SRC_DIR.toString()));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    73
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    74
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    75
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    76
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
    77
     * Basic test of Layer defineModulesWithOneLoader
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    78
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    79
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    80
     *   m1 requires m2 and m3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    81
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    82
    public void testWithOneLoader() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    83
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
    84
        Configuration cf = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    85
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    86
        ClassLoader scl = ClassLoader.getSystemClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    87
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    88
        Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    89
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    90
        checkLayer(layer, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    91
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    92
        ClassLoader cl1 = layer.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    93
        ClassLoader cl2 = layer.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    94
        ClassLoader cl3 = layer.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    95
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    96
        assertTrue(cl1.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    97
        assertTrue(cl2 == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    98
        assertTrue(cl3 == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    99
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   100
        invoke(layer, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   101
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   102
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   103
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   104
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   105
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   106
     * Basic test of Layer defineModulesWithManyLoaders
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   107
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   108
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   109
     *   m1 requires m2 and m3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   110
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   111
    public void testWithManyLoaders() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   112
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   113
        Configuration cf = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   114
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   115
        ClassLoader scl = ClassLoader.getSystemClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   116
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   117
        Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   118
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   119
        checkLayer(layer, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   120
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   121
        ClassLoader cl1 = layer.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   122
        ClassLoader cl2 = layer.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   123
        ClassLoader cl3 = layer.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   124
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   125
        assertTrue(cl1.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   126
        assertTrue(cl2.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   127
        assertTrue(cl3.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   128
        assertTrue(cl2 != cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   129
        assertTrue(cl3 != cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   130
        assertTrue(cl3 != cl2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   131
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   132
        invoke(layer, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   133
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   134
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   135
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   136
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   137
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   138
     * Basic test of Layer defineModulesWithOneLoader where one of the modules
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   139
     * is a service provider module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   140
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   141
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   142
     *    m1 requires m2 and m3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   143
     *    m1 uses S
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   144
     *    m4 provides S with ...
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   145
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   146
    public void testServicesWithOneLoader() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   147
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   148
        Configuration cf = resolveAndBind("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   149
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   150
        ClassLoader scl = ClassLoader.getSystemClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   151
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   152
        Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   153
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   154
        checkLayer(layer, "m1", "m2", "m3", "m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   155
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   156
        ClassLoader cl1 = layer.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   157
        ClassLoader cl2 = layer.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   158
        ClassLoader cl3 = layer.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   159
        ClassLoader cl4 = layer.findLoader("m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   160
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   161
        assertTrue(cl1.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   162
        assertTrue(cl2 == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   163
        assertTrue(cl3 == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   164
        assertTrue(cl4 == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   165
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   166
        Class<?> serviceType = cl1.loadClass("p.Service");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   167
        assertTrue(serviceType.getClassLoader() == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   168
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   169
        Iterator<?> iter = ServiceLoader.load(serviceType, cl1).iterator();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   170
        Object provider = iter.next();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   171
        assertTrue(serviceType.isInstance(provider));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   172
        assertTrue(provider.getClass().getClassLoader() == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   173
        assertFalse(iter.hasNext());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   174
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   175
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   176
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   177
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   178
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   179
     * Basic test of Layer defineModulesWithManyLoaders where one of the
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   180
     * modules is a service provider module.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   181
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   182
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   183
     *    m1 requires m2 and m3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   184
     *    m1 uses S
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   185
     *    m4 provides S with ...
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   186
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   187
    public void testServicesWithManyLoaders() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   188
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   189
        Configuration cf = resolveAndBind("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   190
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   191
        ClassLoader scl = ClassLoader.getSystemClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   192
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   193
        Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   194
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   195
        checkLayer(layer, "m1", "m2", "m3", "m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   196
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   197
        ClassLoader cl1 = layer.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   198
        ClassLoader cl2 = layer.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   199
        ClassLoader cl3 = layer.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   200
        ClassLoader cl4 = layer.findLoader("m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   201
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   202
        assertTrue(cl1.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   203
        assertTrue(cl2.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   204
        assertTrue(cl3.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   205
        assertTrue(cl4.getParent() == scl);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   206
        assertTrue(cl2 != cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   207
        assertTrue(cl3 != cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   208
        assertTrue(cl3 != cl2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   209
        assertTrue(cl4 != cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   210
        assertTrue(cl4 != cl2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   211
        assertTrue(cl4 != cl3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   212
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   213
        Class<?> serviceType = cl1.loadClass("p.Service");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   214
        assertTrue(serviceType.getClassLoader() == cl1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   215
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   216
        // Test that the service provider can be located via any of
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   217
        // the class loaders in the layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   218
        for (Module m : layer.modules()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   219
            ClassLoader loader = m.getClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   220
            Iterator<?> iter = ServiceLoader.load(serviceType, loader).iterator();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   221
            Object provider = iter.next();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   222
            assertTrue(serviceType.isInstance(provider));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   223
            assertTrue(provider.getClass().getClassLoader() == cl4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   224
            assertFalse(iter.hasNext());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   225
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   226
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   227
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   228
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   229
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   230
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   231
     * Tests that the class loaders created by defineModulesWithXXX delegate
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   232
     * to the given parent class loader.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   233
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   234
    public void testDelegationToParent() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   235
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   236
        Configuration cf = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   237
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   238
        ClassLoader parent = this.getClass().getClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   239
        String cn = this.getClass().getName();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   240
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   241
        // one loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   242
        Layer layer = Layer.boot().defineModulesWithOneLoader(cf, parent);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   243
        testLoad(layer, cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   244
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   245
         // one loader with boot loader as parent
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   246
        layer = Layer.boot().defineModulesWithOneLoader(cf, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   247
        testLoadFail(layer, cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   248
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   249
        // many loaders
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   250
        layer = Layer.boot().defineModulesWithManyLoaders(cf, parent);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   251
        testLoad(layer, cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   252
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   253
        // many loader with boot loader as parent
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   254
        layer = Layer.boot().defineModulesWithManyLoaders(cf, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   255
        testLoadFail(layer, cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   256
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   257
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   258
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   259
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   260
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   261
     * Test defineModulesWithXXX when modules that have overlapping packages.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   262
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   263
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   264
     *   m1 exports p
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   265
     *   m2 exports p
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   266
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   267
    public void testOverlappingPackages() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   268
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   269
        ModuleDescriptor descriptor1
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   270
            = ModuleDescriptor.newModule("m1").exports("p").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   271
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   272
        ModuleDescriptor descriptor2
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   273
            = ModuleDescriptor.newModule("m2").exports("p").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   274
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   275
        ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   276
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   277
        Configuration cf = Layer.boot()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   278
            .configuration()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   279
            .resolve(finder, ModuleFinder.of(), Set.of("m1", "m2"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   280
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   281
        // cannot define both module m1 and m2 to the same class loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   282
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   283
            Layer.boot().defineModulesWithOneLoader(cf, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   284
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   285
        } catch (LayerInstantiationException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   286
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   287
        // should be okay to have one module per class loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   288
        Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   289
        checkLayer(layer, "m1", "m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   290
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   291
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   292
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   293
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   294
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   295
     * Test Layer defineModulesWithXXX with split delegation.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   296
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   297
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   298
     *   layer1: m1 exports p, m2 exports p
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   299
     *   layer2: m3 reads m1, m4 reads m2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   300
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   301
    public void testSplitDelegation() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   302
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   303
        ModuleDescriptor descriptor1
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   304
            = ModuleDescriptor.newModule("m1").exports("p").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   305
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   306
        ModuleDescriptor descriptor2
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   307
            = ModuleDescriptor.newModule("m2").exports("p").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   308
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   309
        ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   310
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   311
        Configuration cf1 = Layer.boot()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   312
            .configuration()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   313
            .resolve(finder1, ModuleFinder.of(), Set.of("m1", "m2"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   314
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   315
        Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   316
        checkLayer(layer1, "m1", "m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   317
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   318
        ModuleDescriptor descriptor3
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   319
            = ModuleDescriptor.newModule("m3").requires("m1").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   320
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   321
        ModuleDescriptor descriptor4
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   322
            = ModuleDescriptor.newModule("m4").requires("m2").build();
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   323
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   324
        ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   325
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   326
        Configuration cf2 = cf1.resolve(finder2, ModuleFinder.of(),
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   327
                                                Set.of("m3", "m4"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   328
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   329
        // package p cannot be supplied by two class loaders
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   330
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   331
            layer1.defineModulesWithOneLoader(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   332
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   333
        } catch (LayerInstantiationException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   334
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   335
        // no split delegation when modules have their own class loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   336
        Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   337
        checkLayer(layer2, "m3", "m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   338
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   339
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   340
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   341
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   342
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   343
     * Test Layer defineModulesWithXXX when the modules that override same
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   344
     * named modules in the parent layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   345
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   346
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   347
     *   layer1: m1, m2, m3 => same loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   348
     *   layer2: m1, m2, m4 => same loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   349
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   350
    public void testOverriding1() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   351
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   352
        Configuration cf1 = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   353
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   354
        Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   355
        checkLayer(layer1, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   356
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   357
        ModuleFinder finder = ModuleFinder.of(MODS_DIR);
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   358
        Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   359
                                                Set.of("m1"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   360
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   361
        Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   362
        checkLayer(layer2, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   363
        invoke(layer1, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   364
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   365
        ClassLoader loader1 = layer1.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   366
        ClassLoader loader2 = layer1.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   367
        ClassLoader loader3 = layer1.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   368
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   369
        ClassLoader loader4 = layer2.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   370
        ClassLoader loader5 = layer2.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   371
        ClassLoader loader6 = layer2.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   372
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   373
        assertTrue(loader1 == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   374
        assertTrue(loader1 == loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   375
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   376
        assertTrue(loader4 == loader5);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   377
        assertTrue(loader4 == loader6);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   378
        assertTrue(loader4 != loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   379
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   380
        assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   381
        assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   382
        assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   383
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   384
        assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   385
        assertTrue(loader4.loadClass("q.Hello").getClassLoader() == loader4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   386
        assertTrue(loader4.loadClass("w.Hello").getClassLoader() == loader4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   387
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   388
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   389
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   390
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   391
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   392
     * Test Layer defineModulesWithXXX when the modules that override same
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   393
     * named modules in the parent layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   394
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   395
     * Test scenario:
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   396
     *   layer1: m1, m2, m3 => loader pool
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   397
     *   layer2: m1, m2, m3 => loader pool
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   398
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   399
    public void testOverriding2() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   400
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   401
        Configuration cf1 = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   402
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   403
        Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   404
        checkLayer(layer1, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   405
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   406
        ModuleFinder finder = ModuleFinder.of(MODS_DIR);
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   407
        Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   408
                                                Set.of("m1"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   409
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   410
        Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   411
        checkLayer(layer2, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   412
        invoke(layer1, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   413
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   414
        ClassLoader loader1 = layer1.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   415
        ClassLoader loader2 = layer1.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   416
        ClassLoader loader3 = layer1.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   417
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   418
        ClassLoader loader4 = layer2.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   419
        ClassLoader loader5 = layer2.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   420
        ClassLoader loader6 = layer2.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   421
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   422
        assertTrue(loader4 != loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   423
        assertTrue(loader5 != loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   424
        assertTrue(loader6 != loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   425
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   426
        assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   427
        assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   428
        assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   429
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   430
        // p.Main is not visible via loader2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   431
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   432
            loader2.loadClass("p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   433
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   434
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   435
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   436
        // w.Hello is not visible via loader2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   437
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   438
            loader2.loadClass("w.Hello");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   439
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   440
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   441
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   442
        // p.Main is not visible via loader3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   443
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   444
            loader3.loadClass("p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   445
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   446
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   447
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   448
        // q.Hello is not visible via loader3
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   449
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   450
            loader3.loadClass("q.Hello");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   451
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   452
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   453
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   454
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   455
        assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   456
        assertTrue(loader5.loadClass("q.Hello").getClassLoader() == loader5);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   457
        assertTrue(loader6.loadClass("w.Hello").getClassLoader() == loader6);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   458
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   459
        // p.Main is not visible via loader5
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   460
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   461
            loader5.loadClass("p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   462
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   463
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   464
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   465
        // w.Hello is not visible via loader5
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   466
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   467
            loader5.loadClass("w.Hello");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   468
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   469
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   470
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   471
        // p.Main is not visible via loader6
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   472
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   473
            loader6.loadClass("p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   474
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   475
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   476
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   477
        // q.Hello is not visible via loader6
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   478
        try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   479
            loader6.loadClass("q.Hello");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   480
            assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   481
        } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   482
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   483
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   484
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   485
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   486
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   487
     * Test Layer defineModulesWithXXX when the modules that override same
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   488
     * named modules in the parent layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   489
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   490
     * layer1: m1, m2, m3 => same loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   491
     * layer2: m1, m3 => same loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   492
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   493
    public void testOverriding3() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   494
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   495
        Configuration cf1 = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   496
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   497
        Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   498
        checkLayer(layer1, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   499
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   500
        ModuleFinder finder = finderFor("m1", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   501
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   502
        Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   503
                                                Set.of("m1"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   504
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   505
        Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   506
        checkLayer(layer2, "m1", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   507
        invoke(layer1, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   508
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   509
        ClassLoader loader1 = layer1.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   510
        ClassLoader loader2 = layer2.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   512
        assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   513
        assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   514
        assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   515
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   516
        assertTrue(loader2.loadClass("p.Main").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   517
        assertTrue(loader2.loadClass("q.Hello").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   518
        assertTrue(loader2.loadClass("w.Hello").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   519
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   520
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   521
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   522
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   523
    /**
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   524
     * Test Layer defineModulesWithXXX when the modules that override same
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   525
     * named modules in the parent layer.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   526
     *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   527
     * layer1: m1, m2, m3 => loader pool
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   528
     * layer2: m1, m3 => loader pool
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   529
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   530
    public void testOverriding4() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   531
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   532
        Configuration cf1 = resolve("m1");
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   533
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   534
        Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   535
        checkLayer(layer1, "m1", "m2", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   536
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   537
        ModuleFinder finder = finderFor("m1", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   538
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   539
        Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
38564
8c49d605b024 8150668: Layer.defineModulesXXX with a Configuration containing java.base throws undocumented exception
alanb
parents: 38457
diff changeset
   540
                                                Set.of("m1"));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   541
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   542
        Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   543
        checkLayer(layer2, "m1", "m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   544
        invoke(layer1, "m1", "p.Main");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   545
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   546
        ClassLoader loader1 = layer1.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   547
        ClassLoader loader2 = layer1.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   548
        ClassLoader loader3 = layer1.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   549
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   550
        ClassLoader loader4 = layer2.findLoader("m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   551
        ClassLoader loader5 = layer2.findLoader("m2");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   552
        ClassLoader loader6 = layer2.findLoader("m3");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   553
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   554
        assertTrue(loader4 != loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   555
        assertTrue(loader5 == loader2);  // m2 not overridden
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   556
        assertTrue(loader6 != loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   557
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   558
        assertTrue(loader1.loadClass("p.Main").getClassLoader() == loader1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   559
        assertTrue(loader1.loadClass("q.Hello").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   560
        assertTrue(loader1.loadClass("w.Hello").getClassLoader() == loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   561
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   562
        assertTrue(loader2.loadClass("q.Hello").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   563
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   564
        assertTrue(loader3.loadClass("w.Hello").getClassLoader() == loader3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   565
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   566
        assertTrue(loader4.loadClass("p.Main").getClassLoader() == loader4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   567
        assertTrue(loader4.loadClass("q.Hello").getClassLoader() == loader2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   568
        assertTrue(loader4.loadClass("w.Hello").getClassLoader() == loader6);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   569
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   570
        assertTrue(loader6.loadClass("w.Hello").getClassLoader() == loader6);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   571
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   572
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   573
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   574
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   575
    /**
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   576
     * Basic test of resource loading with a class loader created by
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   577
     * Layer.defineModulesWithOneLoader.
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   578
     */
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   579
    public void testResourcesOneLoader() throws Exception {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   580
        Configuration cf = resolve("m1");
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   581
        ClassLoader scl = ClassLoader.getSystemClassLoader();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   582
        Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   583
        ClassLoader loader = layer.findLoader("m1");
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   584
        testResourceLoading(loader, "p/Main.class");
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   585
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   586
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   587
    /**
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   588
     * Basic test of resource loading with a class loader created by
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   589
     * Layer.defineModulesWithOneLoader.
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   590
     */
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   591
    public void testResourcesManyLoaders() throws Exception {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   592
        Configuration cf = resolve("m1");
42338
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   593
        ClassLoader scl = ClassLoader.getSystemClassLoader();
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   594
        Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   595
        ClassLoader loader = layer.findLoader("m1");
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   596
        testResourceLoading(loader, "p/Main.class");
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   597
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   598
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   599
    /**
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   600
     * Test that a resource is located by a class loader.
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   601
     */
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   602
    private void testResourceLoading(ClassLoader loader, String name)
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   603
        throws IOException
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   604
    {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   605
        URL url = loader.getResource(name);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   606
        assertNotNull(url);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   607
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   608
        try (InputStream in = loader.getResourceAsStream(name)) {
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   609
            assertNotNull(in);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   610
        }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   611
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   612
        Enumeration<URL> urls = loader.getResources(name);
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   613
        assertTrue(urls.hasMoreElements());
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   614
    }
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   615
a60f280f803c 8169069: Module system implementation refresh (11/2016)
alanb
parents: 40261
diff changeset
   616
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   617
    // -- supporting methods --
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   618
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   619
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   620
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   621
     * Resolve the given modules, by name, and returns the resulting
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   622
     * Configuration.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   623
     */
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   624
    private static Configuration resolve(String... roots) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   625
        ModuleFinder finder = ModuleFinder.of(MODS_DIR);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   626
        return Layer.boot()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   627
            .configuration()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   628
            .resolve(finder, ModuleFinder.of(), Set.of(roots));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   629
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   630
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   631
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   632
     * Resolve the given modules, by name, and returns the resulting
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   633
     * Configuration.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   634
     */
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   635
    private static Configuration resolveAndBind(String... roots) {
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   636
        ModuleFinder finder = ModuleFinder.of(MODS_DIR);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   637
        return Layer.boot()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   638
            .configuration()
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42338
diff changeset
   639
            .resolveAndBind(finder, ModuleFinder.of(), Set.of(roots));
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   640
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   641
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   642
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   643
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   644
     * Invokes the static void main(String[]) method on the given class
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   645
     * in the given module.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   646
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   647
    private static void invoke(Layer layer, String mn, String mc) throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   648
        ClassLoader loader = layer.findLoader(mn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   649
        Class<?> c = loader.loadClass(mc);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   650
        Method mainMethod = c.getMethod("main", String[].class);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   651
        mainMethod.invoke(null, (Object)new String[0]);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   652
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   653
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   654
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   655
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   656
     * Checks that the given layer contains exactly the expected modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   657
     * (by name).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   658
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   659
    private void checkLayer(Layer layer, String ... expected) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   660
        Set<String> names = layer.modules().stream()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   661
                .map(Module::getName)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   662
                .collect(Collectors.toSet());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   663
        assertTrue(names.size() == expected.length);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   664
        for (String name : expected) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   665
            assertTrue(names.contains(name));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   666
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   667
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   668
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   669
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   670
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   671
     * Test that a class can be loaded via the class loader of all modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   672
     * in the given layer.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   673
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   674
    static void testLoad(Layer layer, String cn) throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   675
        for (Module m : layer.modules()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   676
            ClassLoader l = m.getClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   677
            l.loadClass(cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   678
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   679
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   680
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   681
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   682
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   683
     * Test that a class cannot be loaded via any of the class loaders of
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   684
     * the modules in the given layer.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   685
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   686
    static void testLoadFail(Layer layer, String cn) throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   687
        for (Module m : layer.modules()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   688
            ClassLoader l = m.getClassLoader();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   689
            try {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   690
                l.loadClass(cn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   691
                assertTrue(false);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   692
            } catch (ClassNotFoundException expected) { }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   693
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   694
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   695
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   696
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   697
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   698
     * Returns a ModuleFinder that only finds the given test modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   699
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   700
    static ModuleFinder finderFor(String... names) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   701
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   702
        ModuleFinder finder = ModuleFinder.of(MODS_DIR);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   703
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   704
        Map<String, ModuleReference> mrefs = new HashMap<>();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   705
        for (String name : names) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   706
            Optional<ModuleReference> omref = finder.find(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   707
            assert omref.isPresent();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   708
            mrefs.put(name, omref.get());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   709
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   710
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   711
        return new ModuleFinder() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   712
            @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   713
            public Optional<ModuleReference> find(String name) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   714
                ModuleReference mref = mrefs.get(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   715
                return Optional.ofNullable(mref);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   716
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   717
            @Override
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   718
            public Set<ModuleReference> findAll() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   719
                return mrefs.values().stream().collect(Collectors.toSet());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   720
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   721
        };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   722
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   723
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   724
}