jdk/test/java/lang/module/AutomaticModulesTest.java
author alanb
Thu, 17 Mar 2016 19:04:16 +0000
changeset 36511 9d0388c6b336
child 38457 3d019217e322
permissions -rw-r--r--
8142968: Module System implementation Summary: Initial integration of JEP 200, JEP 260, JEP 261, and JEP 282 Reviewed-by: alanb, mchung, naoto, rriggs, psandoz, plevart, mullan, ascarpino, vinnie, prr, sherman, dfuchs, mhaupt Contributed-by: alan.bateman@oracle.com, alex.buckley@oracle.com, jonathan.gibbons@oracle.com, karen.kinnear@oracle.com, mandy.chung@oracle.com, mark.reinhold@oracle.com, chris.hegarty@oracle.com, alexandr.scherbatiy@oracle.com, amy.lu@oracle.com, calvin.cheung@oracle.com, daniel.fuchs@oracle.com, erik.joelsson@oracle.com, harold.seigel@oracle.com, jaroslav.bachorik@oracle.com, jean-francois.denise@oracle.com, jan.lahoda@oracle.com, james.laskey@oracle.com, lois.foltan@oracle.com, miroslav.kos@oracle.com, huaming.li@oracle.com, sean.mullan@oracle.com, naoto.sato@oracle.com, masayoshi.okutsu@oracle.com, peter.levart@gmail.com, philip.race@oracle.com, claes.redestad@oracle.com, sergey.bylokhov@oracle.com, alexandre.iline@oracle.com, volker.simonis@gmail.com, staffan.larsen@oracle.com, stuart.marks@oracle.com, semyon.sadetsky@oracle.com, serguei.spitsyn@oracle.com, sundararajan.athijegannathan@oracle.com, valerie.peng@oracle.com, vincent.x.ryan@oracle.com, weijun.wang@oracle.com, yuri.nesterenko@oracle.com, yekaterina.kantserova@oracle.com, alexander.kulyakhtin@oracle.com, felix.yang@oracle.com, andrei.eremeev@oracle.com, frank.yuan@oracle.com, sergei.pikalev@oracle.com, sibabrata.sahoo@oracle.com, tiantian.du@oracle.com, sha.jiang@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     1
/*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     4
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     8
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    13
 * accompanied this code).
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    14
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    18
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    21
 * questions.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    22
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    23
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    24
/**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    25
 * @test
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    26
 * @library /lib/testlibrary
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    27
 * @build AutomaticModulesTest ModuleUtils
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    28
 * @run testng AutomaticModulesTest
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    29
 * @summary Basic tests for automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    30
 */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    31
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    32
import java.io.IOException;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    33
import java.io.OutputStream;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    34
import java.lang.module.Configuration;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    35
import java.lang.module.ModuleDescriptor;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    36
import java.lang.module.ModuleDescriptor.Exports;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    37
import java.lang.module.ModuleDescriptor.Requires.Modifier;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    38
import java.lang.module.ModuleFinder;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    39
import java.lang.module.ModuleReference;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    40
import java.lang.module.ResolvedModule;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    41
import java.lang.reflect.Layer;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    42
import java.lang.reflect.Module;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    43
import java.nio.file.Files;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    44
import java.nio.file.Path;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    45
import java.nio.file.Paths;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    46
import java.util.Optional;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    47
import java.util.Set;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    48
import java.util.jar.Attributes;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    49
import java.util.jar.JarEntry;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    50
import java.util.jar.JarFile;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    51
import java.util.jar.JarOutputStream;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    52
import java.util.jar.Manifest;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    53
import java.util.stream.Collectors;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    54
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    55
import org.testng.annotations.DataProvider;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    56
import org.testng.annotations.Test;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    57
import static org.testng.Assert.*;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    58
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    59
@Test
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    60
public class AutomaticModulesTest {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    61
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    62
    private static final Path USER_DIR
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    63
         = Paths.get(System.getProperty("user.dir"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    64
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    65
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    66
    @DataProvider(name = "names")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    67
    public Object[][] createNames() {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    68
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    69
        return new Object[][] {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    70
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    71
            // JAR file name                module-name[/version]
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    72
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    73
            { "foo.jar",                    "foo" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    74
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    75
            { "foo-1.jar",                  "foo/1" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    76
            { "foo-1.2.jar",                "foo/1.2" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    77
            { "foo-1.2.3.jar",              "foo/1.2.3" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    78
            { "foo-1.2.3.4.jar",            "foo/1.2.3.4" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    79
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    80
            { "foo-10.jar",                 "foo/10" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    81
            { "foo-10.20.jar",              "foo/10.20" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    82
            { "foo-10.20.30.jar",           "foo/10.20.30" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    83
            { "foo-10.20.30.40.jar",        "foo/10.20.30.40" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    84
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    85
            { "foo-bar.jar",                "foo.bar" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    86
            { "foo-bar-1.jar",              "foo.bar/1" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    87
            { "foo-bar-1.2.jar",            "foo.bar/1.2"},
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    88
            { "foo-bar-10.jar",             "foo.bar/10" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    89
            { "foo-bar-10.20.jar",          "foo.bar/10.20" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    90
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    91
            { "foo-1.2-SNAPSHOT.jar",       "foo/1.2-SNAPSHOT" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    92
            { "foo-bar-1.2-SNAPSHOT.jar",   "foo.bar/1.2-SNAPSHOT" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    93
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    94
            { "foo--bar-1.0.jar",           "foo.bar/1.0" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    95
            { "-foo-bar-1.0.jar",           "foo.bar/1.0" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    96
            { "foo-bar--1.0.jar",           "foo.bar/1.0" },
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    97
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    98
        };
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
    99
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   100
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   101
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   102
     * Test mapping of JAR file names to module names
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   103
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   104
    @Test(dataProvider = "names")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   105
    public void testNames(String fn, String mid) throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   106
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   107
        String[] s = mid.split("/");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   108
        String mn = s[0];
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   109
        String vs = (s.length == 2) ? s[1] : null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   110
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   111
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   112
        Path jf = dir.resolve(fn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   113
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   114
        // create empty JAR file
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   115
        createJarFile(jf);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   116
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   117
        // create a ModuleFinder to find modules in the directory
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   118
        ModuleFinder finder = ModuleFinder.of(dir);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   119
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   120
        // a module with the expected name should be found
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   121
        Optional<ModuleReference> mref = finder.find(mn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   122
        assertTrue(mref.isPresent(), mn + " not found");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   123
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   124
        ModuleDescriptor descriptor = mref.get().descriptor();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   125
        assertEquals(descriptor.name(), mn);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   126
        if (vs == null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   127
            assertFalse(descriptor.version().isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   128
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   129
            assertEquals(descriptor.version().get().toString(), vs);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   130
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   131
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   132
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   133
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   134
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   135
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   136
     * Test all packages are exported
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   137
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   138
    public void testExports() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   139
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   140
        createJarFile(dir.resolve("m1.jar"),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   141
                      "p/C1.class", "p/C2.class", "q/C1.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   142
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   143
        ModuleFinder finder = ModuleFinder.of(dir);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   144
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   145
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   146
        Configuration cf = resolve(parent, finder, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   147
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   148
        ModuleDescriptor m1 = findDescriptor(cf, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   149
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   150
        Set<String> exports
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   151
            = m1.exports().stream().map(Exports::source).collect(Collectors.toSet());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   152
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   153
        assertTrue(exports.size() == 2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   154
        assertTrue(exports.contains("p"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   155
        assertTrue(exports.contains("q"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   156
        assertTrue(m1.conceals().isEmpty());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   157
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   158
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   159
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   160
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   161
     * Test that a JAR file with a Main-Class attribute results
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   162
     * in a module with a main class.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   163
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   164
    public void testMainClass() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   165
        String mainClass = "p.Main";
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   166
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   167
        Manifest man = new Manifest();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   168
        Attributes attrs = man.getMainAttributes();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   169
        attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   170
        attrs.put(Attributes.Name.MAIN_CLASS, mainClass);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   171
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   172
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   173
        createJarFile(dir.resolve("m1.jar"), man);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   174
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   175
        ModuleFinder finder = ModuleFinder.of(dir);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   176
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   177
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   178
        Configuration cf = resolve(parent, finder, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   179
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   180
        ModuleDescriptor m1 = findDescriptor(cf, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   181
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   182
        assertTrue(m1.mainClass().isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   183
        assertEquals(m1.mainClass().get(), mainClass);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   184
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   185
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   186
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   187
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   188
     * Basic test of a configuration created with automatic modules.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   189
     *   m1 requires m2*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   190
     *   m1 requires m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   191
     *   m2*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   192
     *   m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   193
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   194
    public void testConfiguration1() throws Exception {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   195
        ModuleDescriptor descriptor1
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   196
            = new ModuleDescriptor.Builder("m1")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   197
                .requires("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   198
                .requires("m3")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   199
                .requires("java.base")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   200
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   201
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   202
        // m2 and m3 are automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   203
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   204
        createJarFile(dir.resolve("m2.jar"), "p/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   205
        createJarFile(dir.resolve("m3.jar"), "q/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   206
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   207
        // module finder locates m1 and the modules in the directory
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   208
        ModuleFinder finder
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   209
            = ModuleFinder.compose(ModuleUtils.finderOf(descriptor1),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   210
                ModuleFinder.of(dir));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   211
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   212
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   213
        Configuration cf = resolve(parent, finder, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   214
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   215
        assertTrue(cf.modules().size() == 3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   216
        assertTrue(cf.findModule("m1").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   217
        assertTrue(cf.findModule("m2").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   218
        assertTrue(cf.findModule("m3").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   219
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   220
        ResolvedModule base = cf.findModule("java.base").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   221
        assertTrue(base.configuration() == Layer.boot().configuration());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   222
        ResolvedModule m1 = cf.findModule("m1").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   223
        ResolvedModule m2 = cf.findModule("m2").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   224
        ResolvedModule m3 = cf.findModule("m3").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   225
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   226
        // m2 && m3 only require java.base
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   227
        assertTrue(m2.reference().descriptor().requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   228
        assertTrue(m3.reference().descriptor().requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   229
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   230
        // readability
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   231
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   232
        assertTrue(m1.reads().size() == 3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   233
        assertTrue(m1.reads().contains(base));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   234
        assertTrue(m1.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   235
        assertTrue(m1.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   236
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   237
        assertTrue(m2.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   238
        assertTrue(m2.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   239
        testReadAllBootModules(cf, "m2");  // m2 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   240
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   241
        assertTrue(m3.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   242
        assertTrue(m3.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   243
        testReadAllBootModules(cf, "m3");  // m3 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   244
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   245
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   246
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   247
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   248
     * Basic test of a configuration created with automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   249
     *   m1 requires m2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   250
     *   m2 requires m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   251
     *   m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   252
     *   m4*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   253
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   254
    public void testInConfiguration2() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   255
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   256
        ModuleDescriptor descriptor1
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   257
            =  new ModuleDescriptor.Builder("m1")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   258
                .requires("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   259
                .requires("java.base")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   260
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   261
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   262
        ModuleDescriptor descriptor2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   263
            =  new ModuleDescriptor.Builder("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   264
                .requires("m3")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   265
                .requires("java.base")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   266
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   267
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   268
        // m3 and m4 are automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   269
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   270
        createJarFile(dir.resolve("m3.jar"), "p/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   271
        createJarFile(dir.resolve("m4.jar"), "q/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   272
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   273
        // module finder locates m1 and the modules in the directory
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   274
        ModuleFinder finder
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   275
            = ModuleFinder.compose(ModuleUtils.finderOf(descriptor1, descriptor2),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   276
                                   ModuleFinder.of(dir));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   277
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   278
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   279
        Configuration cf = resolve(parent, finder, "m1", "m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   280
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   281
        assertTrue(cf.modules().size() == 4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   282
        assertTrue(cf.findModule("m1").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   283
        assertTrue(cf.findModule("m2").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   284
        assertTrue(cf.findModule("m3").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   285
        assertTrue(cf.findModule("m4").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   286
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   287
        // m3 && m4 should only require java.base
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   288
        assertTrue(findDescriptor(cf, "m3").requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   289
        assertTrue(findDescriptor(cf, "m4").requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   290
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   291
        // readability
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   292
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   293
        ResolvedModule base = cf.findModule("java.base").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   294
        assertTrue(base.configuration() == Layer.boot().configuration());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   295
        ResolvedModule m1 = cf.findModule("m1").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   296
        ResolvedModule m2 = cf.findModule("m2").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   297
        ResolvedModule m3 = cf.findModule("m3").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   298
        ResolvedModule m4 = cf.findModule("m4").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   299
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   300
        assertTrue(m1.reads().size() == 2);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   301
        assertTrue(m1.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   302
        assertTrue(m1.reads().contains(base));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   303
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   304
        assertTrue(m2.reads().size() == 3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   305
        assertTrue(m2.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   306
        assertTrue(m2.reads().contains(m4));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   307
        assertTrue(m2.reads().contains(base));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   308
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   309
        assertTrue(m3.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   310
        assertTrue(m3.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   311
        assertTrue(m3.reads().contains(m4));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   312
        testReadAllBootModules(cf, "m3");   // m3 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   313
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   314
        assertTrue(m4.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   315
        assertTrue(m4.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   316
        assertTrue(m4.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   317
        testReadAllBootModules(cf, "m4");    // m4 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   318
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   319
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   320
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   321
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   322
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   323
     * Basic test of a configuration created with automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   324
     *   m1 requires m2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   325
     *   m2 requires public m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   326
     *   m3*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   327
     *   m4*
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   328
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   329
    public void testInConfiguration3() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   330
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   331
        ModuleDescriptor descriptor1
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   332
            =  new ModuleDescriptor.Builder("m1")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   333
                .requires("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   334
                .requires("java.base")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   335
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   336
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   337
        ModuleDescriptor descriptor2
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   338
            =  new ModuleDescriptor.Builder("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   339
                .requires(Modifier.PUBLIC, "m3")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   340
                .requires("java.base")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   341
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   342
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   343
        // m3 and m4 are automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   344
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   345
        createJarFile(dir.resolve("m3.jar"), "p/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   346
        createJarFile(dir.resolve("m4.jar"), "q/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   347
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   348
        // module finder locates m1 and the modules in the directory
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   349
        ModuleFinder finder
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   350
            = ModuleFinder.compose(ModuleUtils.finderOf(descriptor1, descriptor2),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   351
                ModuleFinder.of(dir));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   352
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   353
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   354
        Configuration cf = resolve(parent, finder, "m1", "m4");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   355
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   356
        assertTrue(cf.modules().size() == 4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   357
        assertTrue(cf.findModule("m1").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   358
        assertTrue(cf.findModule("m2").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   359
        assertTrue(cf.findModule("m3").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   360
        assertTrue(cf.findModule("m4").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   361
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   362
        ResolvedModule base = cf.findModule("java.base").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   363
        assertTrue(base.configuration() == Layer.boot().configuration());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   364
        ResolvedModule m1 = cf.findModule("m1").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   365
        ResolvedModule m2 = cf.findModule("m2").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   366
        ResolvedModule m3 = cf.findModule("m3").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   367
        ResolvedModule m4 = cf.findModule("m4").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   368
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   369
        // m3 && m4 should only require java.base
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   370
        assertTrue(findDescriptor(cf, "m3").requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   371
        assertTrue(findDescriptor(cf, "m4").requires().size() == 1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   372
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   373
        // readability
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   374
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   375
        assertTrue(m1.reads().size() == 4);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   376
        assertTrue(m1.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   377
        assertTrue(m1.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   378
        assertTrue(m1.reads().contains(m4));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   379
        assertTrue(m1.reads().contains(base));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   380
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   381
        assertTrue(m2.reads().size() == 3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   382
        assertTrue(m2.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   383
        assertTrue(m2.reads().contains(m4));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   384
        assertTrue(m2.reads().contains(base));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   385
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   386
        assertTrue(reads(cf, "m2", "m3"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   387
        assertTrue(reads(cf, "m2", "m4"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   388
        assertTrue(reads(cf, "m2", "java.base"));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   389
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   390
        assertTrue(m3.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   391
        assertTrue(m3.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   392
        assertTrue(m3.reads().contains(m4));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   393
        testReadAllBootModules(cf, "m3");   // m3 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   394
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   395
        assertTrue(m4.reads().contains(m1));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   396
        assertTrue(m4.reads().contains(m2));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   397
        assertTrue(m4.reads().contains(m3));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   398
        testReadAllBootModules(cf, "m4");    // m4 reads all modules in boot layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   399
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   400
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   401
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   402
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   403
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   404
     * Basic test of Layer containing automatic modules
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   405
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   406
    public void testInLayer() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   407
        ModuleDescriptor descriptor
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   408
            =  new ModuleDescriptor.Builder("m1")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   409
                .requires("m2")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   410
                .requires("m3")
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   411
                .build();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   412
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   413
        // m2 and m3 are simple JAR files
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   414
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   415
        createJarFile(dir.resolve("m2.jar"), "p/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   416
        createJarFile(dir.resolve("m3.jar"), "q/T2.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   417
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   418
        // module finder locates m1 and the modules in the directory
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   419
        ModuleFinder finder
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   420
            = ModuleFinder.compose(ModuleUtils.finderOf(descriptor),
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   421
                ModuleFinder.of(dir));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   422
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   423
        Configuration parent = Layer.boot().configuration();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   424
        Configuration cf = resolve(parent, finder, "m1");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   425
        assertTrue(cf.modules().size() == 3);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   426
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   427
        // each module gets its own loader
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   428
        Layer layer = Layer.boot().defineModules(cf, mn -> new ClassLoader() { });
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   429
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   430
        // an unnamed module
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   431
        Module unnamed = (new ClassLoader() { }).getUnnamedModule();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   432
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   433
        Module m2 = layer.findModule("m2").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   434
        assertTrue(m2.isNamed());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   435
        assertTrue(m2.canRead(unnamed));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   436
        testsReadsAll(m2, layer);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   437
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   438
        Module m3 = layer.findModule("m3").get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   439
        assertTrue(m3.isNamed());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   440
        assertTrue(m2.canRead(unnamed));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   441
        testsReadsAll(m3, layer);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   442
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   443
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   444
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   445
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   446
     * Test miscellaneous methods.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   447
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   448
    public void testMisc() throws IOException {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   449
        Path dir = Files.createTempDirectory(USER_DIR, "mods");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   450
        Path m1_jar = createJarFile(dir.resolve("m1.jar"), "p/T.class");
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   451
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   452
        ModuleFinder finder = ModuleFinder.of(m1_jar);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   453
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   454
        assertTrue(finder.find("m1").isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   455
        ModuleDescriptor m1 = finder.find("m1").get().descriptor();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   456
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   457
        // test miscellaneous methods
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   458
        assertTrue(m1.isAutomatic());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   459
        assertFalse(m1.isSynthetic());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   460
        assertFalse(m1.osName().isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   461
        assertFalse(m1.osArch().isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   462
        assertFalse(m1.osVersion().isPresent());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   463
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   464
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   465
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   466
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   467
     * Invokes parent.resolveRequires to resolve the given root modules.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   468
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   469
    static Configuration resolve(Configuration parent,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   470
                                 ModuleFinder finder,
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   471
                                 String... roots) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   472
        return parent.resolveRequires(finder, ModuleFinder.empty(), Set.of(roots));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   473
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   474
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   475
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   476
     * Finds a module in the given configuration or its parents, returning
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   477
     * the module descriptor (or null if not found)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   478
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   479
    static ModuleDescriptor findDescriptor(Configuration cf, String name) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   480
        Optional<ResolvedModule> om = cf.findModule(name);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   481
        if (om.isPresent()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   482
            return om.get().reference().descriptor();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   483
        } else {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   484
            return null;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   485
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   486
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   487
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   488
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   489
     * Test that a module in a configuration reads all modules in the boot
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   490
     * configuration.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   491
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   492
    static void testReadAllBootModules(Configuration cf, String mn) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   493
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   494
        Set<String> bootModules = Layer.boot().modules().stream()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   495
                .map(Module::getName)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   496
                .collect(Collectors.toSet());
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   497
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   498
        bootModules.forEach(other -> assertTrue(reads(cf, mn, other)));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   499
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   500
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   501
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   502
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   503
     * Test that the given Module reads all module in the given Layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   504
     * and its parent Layers.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   505
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   506
    static void testsReadsAll(Module m, Layer layer) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   507
        while (layer != Layer.empty()) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   508
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   509
            // check that m reads all module in the layer
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   510
            layer.configuration().modules().stream()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   511
                .map(ResolvedModule::name)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   512
                .map(layer::findModule)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   513
                .map(Optional::get)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   514
                .forEach(m2 -> assertTrue(m.canRead(m2)));
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   515
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   516
            layer = layer.parent().get();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   517
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   518
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   519
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   520
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   521
     * Returns {@code true} if the configuration contains module mn1
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   522
     * that reads module mn2.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   523
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   524
    static boolean reads(Configuration cf, String mn1, String mn2) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   525
        Optional<ResolvedModule> om1 = cf.findModule(mn1);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   526
        if (!om1.isPresent())
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   527
            return false;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   528
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   529
        return om1.get().reads().stream()
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   530
                .map(ResolvedModule::name)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   531
                .anyMatch(mn2::equals);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   532
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   533
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   534
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   535
     * Creates a JAR file, optionally with a manifest, and with the given
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   536
     * entries. The entries will be empty in the resulting JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   537
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   538
    static Path createJarFile(Path file, Manifest man, String... entries)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   539
        throws IOException
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   540
    {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   541
        try (OutputStream out = Files.newOutputStream(file)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   542
            try (JarOutputStream jos = new JarOutputStream(out)) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   543
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   544
                if (man != null) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   545
                    JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   546
                    jos.putNextEntry(je);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   547
                    man.write(jos);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   548
                    jos.closeEntry();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   549
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   550
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   551
                for (String entry : entries) {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   552
                    JarEntry je = new JarEntry(entry);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   553
                    jos.putNextEntry(je);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   554
                    jos.closeEntry();
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   555
                }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   556
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   557
            }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   558
        }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   559
        return file;
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   560
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   561
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   562
    /**
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   563
     * Creates a JAR file and with the given entries. The entries will be empty
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   564
     * in the resulting JAR file.
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   565
     */
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   566
    static Path createJarFile(Path file, String... entries)
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   567
        throws IOException
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   568
    {
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   569
        return createJarFile(file, null, entries);
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   570
    }
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   571
9d0388c6b336 8142968: Module System implementation
alanb
parents:
diff changeset
   572
}