test/langtools/tools/javac/modules/JavaBaseTest.java
author jlahoda
Thu, 14 Jun 2018 13:16:21 +0200
changeset 50566 c0b896fc3f08
parent 48723 6cb86bf0b51e
permissions -rw-r--r--
8196618: Create API to list supported values for javac --release option 8194308: jdeprscan will need updates to deal with the removal of the Java EE modules Summary: Generalizing tests to run over all supported --release keys; fixing jdeprscan to work with --release 11. Reviewed-by: smarks, vromero
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     1
/*
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     2
 * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     4
 *
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     8
 *
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    13
 * accompanied this code).
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    14
 *
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    18
 *
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    21
 * questions.
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    22
 */
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    23
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    24
/**
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    25
 * @test
48723
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
    26
 * @bug 8193125 8196623
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    27
 * @summary test modifiers with java.base
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    28
 * @library /tools/lib
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    29
 * @modules
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    30
 *      jdk.compiler/com.sun.tools.javac.api
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    31
 *      jdk.compiler/com.sun.tools.javac.jvm
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    32
 *      jdk.compiler/com.sun.tools.javac.main
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    33
 *      jdk.compiler/com.sun.tools.javac.platform
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    34
 *      jdk.jdeps/com.sun.tools.classfile
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    35
 * @build toolbox.ToolBox toolbox.JavacTask
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    36
 * @run main JavaBaseTest
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    37
 */
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    38
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    39
import java.nio.file.Files;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    40
import java.nio.file.Path;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    41
import java.nio.file.Paths;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    42
import java.util.LinkedHashMap;
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    43
import java.util.LinkedHashSet;
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    44
import java.util.List;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    45
import java.util.Map;
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    46
import java.util.Set;
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    47
import java.util.stream.StreamSupport;
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    48
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    49
import com.sun.tools.classfile.Attribute;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    50
import com.sun.tools.classfile.Attributes;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    51
import com.sun.tools.classfile.ClassFile;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    52
import com.sun.tools.classfile.ClassWriter;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    53
import com.sun.tools.classfile.Module_attribute;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    54
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    55
import com.sun.tools.javac.jvm.Target;
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    56
import com.sun.tools.javac.platform.JDKPlatformProvider;
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    57
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    58
import toolbox.JavacTask;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    59
import toolbox.Task;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    60
import toolbox.ToolBox;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    61
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    62
public class JavaBaseTest {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    63
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    64
    public static void main(String... args) throws Exception {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    65
        JavaBaseTest t = new JavaBaseTest();
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    66
        t.run();
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    67
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    68
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    69
    final List<List<String>> modifiers = List.of(
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    70
        List.of("static"),
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    71
        List.of("transitive"),
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    72
        List.of("static", "transitive")
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    73
    );
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    74
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    75
    enum Mode { SOURCE, CLASS };
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    76
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    77
    ToolBox tb = new ToolBox();
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    78
    int testCount = 0;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    79
    int errorCount = 0;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    80
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    81
    void run() throws Exception {
50566
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    82
        Set<String> targets = new LinkedHashSet<>();
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    83
        StreamSupport.stream(new JDKPlatformProvider().getSupportedPlatformNames()
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    84
                                                      .spliterator(),
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    85
                             false)
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    86
                     .filter(p -> Integer.parseInt(p) >= 9)
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    87
                     .forEach(targets::add);
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    88
        //run without --release:
c0b896fc3f08 8196618: Create API to list supported values for javac --release option
jlahoda
parents: 48723
diff changeset
    89
        targets.add("current");
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    90
        for (List<String> mods : modifiers) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    91
            for (String target : targets) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    92
                for (Mode mode : Mode.values()) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    93
                    test(mods, target, mode);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    94
                }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    95
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    96
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    97
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    98
        System.err.println(testCount + " tests");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
    99
        if (errorCount > 0) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   100
            throw new Exception(errorCount + " errors found");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   101
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   102
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   103
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   104
    void test(List<String> mods, String target, Mode mode) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   105
        System.err.println("Test " + mods + " " + target + " " + mode);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   106
        testCount++;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   107
        try {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   108
            Path base = Paths.get(String.join("-", mods))
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   109
                    .resolve(target).resolve(mode.name().toLowerCase());
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   110
            Files.createDirectories(base);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   111
            switch (mode) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   112
                case SOURCE:
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   113
                    testSource(base, mods, target);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   114
                    break;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   115
                case CLASS:
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   116
                    testClass(base, mods, target);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   117
                    break;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   118
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   119
        } catch (Exception e) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   120
            error("Exception: " + e);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   121
            e.printStackTrace();
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   122
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   123
        System.err.println();
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   124
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   125
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   126
    void testSource(Path base, List<String> mods, String target) throws Exception {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   127
        Path src = base.resolve("src");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   128
        tb.writeJavaFiles(src,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   129
                "module m { requires " + String.join(" ", mods) + " java.base; }");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   130
        Path modules = Files.createDirectories(base.resolve("modules"));
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   131
        boolean expectOK = target.equals("9");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   132
48723
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   133
        JavacTask jct = new JavacTask(tb)
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   134
            .outdir(modules);
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   135
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   136
        if (target.equals("current"))
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   137
            jct.options("-XDrawDiagnostics");
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   138
        else
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   139
            jct.options("-XDrawDiagnostics", "--release", target);
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   140
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   141
        String log = jct.files(tb.findJavaFiles(src))
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   142
            .run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL)
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   143
            .writeAll()
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   144
            .getOutput(Task.OutputKind.DIRECT);
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   145
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   146
        if (!expectOK) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   147
            boolean foundErrorMessage = false;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   148
            for (String mod : mods) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   149
                String key = mod.equals("static")
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   150
                    ? "compiler.err.mod.not.allowed.here"
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   151
                    : "compiler.err.modifier.not.allowed.here";
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   152
                String message = "module-info.java:1:12: " + key + ": " + mod;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   153
                if (log.contains(message)) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   154
                    foundErrorMessage = true;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   155
                }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   156
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   157
            if (!foundErrorMessage) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   158
                throw new Exception("expected error message not found");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   159
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   160
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   161
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   162
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   163
    void testClass(Path base, List<String> mods, String target) throws Exception {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   164
        createClass(base, mods, target);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   165
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   166
        Path src = base.resolve("src");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   167
        tb.writeJavaFiles(src,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   168
                "module mx { requires m; }");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   169
        Path modules = Files.createDirectories(base.resolve("modules"));
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   170
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   171
        boolean expectOK = target.equals("9");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   172
        String log = new JavacTask(tb)
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   173
                .outdir(modules)
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   174
                .options("-XDrawDiagnostics",
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   175
                        "--module-path", base.resolve("test-modules").toString())
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   176
                .files(tb.findJavaFiles(src))
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   177
                .run(expectOK ? Task.Expect.SUCCESS : Task.Expect.FAIL)
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   178
                .writeAll()
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   179
                .getOutput(Task.OutputKind.DIRECT);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   180
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   181
        if (!expectOK) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   182
            boolean foundErrorMessage = false;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   183
            for (String mod : mods) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   184
                String flag = mod.equals("static")
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   185
                    ? "ACC_STATIC_PHASE (0x0040)"
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   186
                    : "ACC_TRANSITIVE (0x0020)";
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   187
                String message = "- compiler.err.cant.access: m.module-info,"
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   188
                        + " (compiler.misc.bad.class.file.header: module-info.class,"
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   189
                        + " (compiler.misc.bad.requires.flag: " + flag + ")";
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   190
                if (log.contains(message)) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   191
                    foundErrorMessage = true;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   192
                }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   193
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   194
            if (!foundErrorMessage) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   195
                throw new Exception("expected error message not found");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   196
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   197
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   198
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   199
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   200
    void createClass(Path base, List<String> mods, String target) throws Exception {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   201
        Path src1 = base.resolve("interim-src");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   202
        tb.writeJavaFiles(src1,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   203
                "module m { requires java.base; }");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   204
        Path modules1 = Files.createDirectories(base.resolve("interim-modules"));
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   205
48723
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   206
        JavacTask jct = new JavacTask(tb)
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   207
            .outdir(modules1);
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   208
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   209
        if (!target.equals("current")) {
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   210
            jct.options("--release", target);
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   211
        }
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   212
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   213
        jct.files(tb.findJavaFiles(src1))
6cb86bf0b51e 8196623: Update JavaBaseTest.java to be version agnostic
darcy
parents: 48427
diff changeset
   214
            .run(Task.Expect.SUCCESS);
48427
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   215
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   216
        ClassFile cf1 = ClassFile.read(modules1.resolve("module-info.class"));
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   217
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   218
        Map<String,Attribute> attrMap = new LinkedHashMap<>(cf1.attributes.map);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   219
        Module_attribute modAttr1 = (Module_attribute) attrMap.get("Module");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   220
        Module_attribute.RequiresEntry[] requires =
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   221
                new Module_attribute.RequiresEntry[modAttr1.requires_count];
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   222
        for (int i = 0; i < modAttr1.requires_count; i++) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   223
            Module_attribute.RequiresEntry e1 = modAttr1.requires[i];
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   224
            int flags = e1.requires_flags;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   225
            Module_attribute.RequiresEntry e2;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   226
            if (e1.getRequires(cf1.constant_pool).equals("java.base")) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   227
                for (String mod : mods) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   228
                    switch (mod) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   229
                        case "static":
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   230
                            flags |= Module_attribute.ACC_STATIC_PHASE;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   231
                            break;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   232
                        case "transitive":
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   233
                            flags |= Module_attribute.ACC_TRANSITIVE;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   234
                            break;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   235
                    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   236
                }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   237
                e2 = new Module_attribute.RequiresEntry(
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   238
                        e1.requires_index,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   239
                        flags,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   240
                        e1.requires_version_index);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   241
            } else {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   242
                e2 = e1;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   243
            }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   244
            requires[i] = e2;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   245
        }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   246
        Module_attribute modAttr2 = new Module_attribute(
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   247
                modAttr1.attribute_name_index,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   248
                modAttr1.module_name,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   249
                modAttr1.module_flags,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   250
                modAttr1.module_version_index,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   251
                requires,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   252
                modAttr1.exports,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   253
                modAttr1.opens,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   254
                modAttr1.uses_index,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   255
                modAttr1.provides);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   256
        attrMap.put("Module", modAttr2);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   257
        Attributes attributes = new Attributes(attrMap);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   258
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   259
        ClassFile cf2 = new ClassFile(
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   260
                cf1.magic, cf1.minor_version, cf1.major_version,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   261
                cf1.constant_pool, cf1.access_flags,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   262
                cf1.this_class, cf1.super_class, cf1.interfaces,
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   263
                cf1.fields, cf1.methods, attributes);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   264
        Path modInfo = base.resolve("test-modules").resolve("module-info.class");
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   265
        Files.createDirectories(modInfo.getParent());
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   266
        new ClassWriter().write(cf2, modInfo.toFile());
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   267
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   268
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   269
    private void error(String message) {
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   270
        System.err.println("Error: " + message);
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   271
        errorCount++;
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   272
    }
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   273
}
b08405cc467a 8193125: javac should not compile a module if it requires java.base with modifiers
jjg
parents:
diff changeset
   274