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