langtools/test/tools/javac/nativeHeaders/NativeHeaderTest.java
author akulyakh
Thu, 21 May 2015 11:41:04 -0700
changeset 30730 d3ce7619db2c
parent 27319 030080f03e4f
permissions -rw-r--r--
8076543: Add @modules as needed to the langtools tests Reviewed-by: jjg, shurailine
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     1
/*
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 27319
diff changeset
     2
 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     4
 *
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     8
 *
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    13
 * accompanied this code).
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    14
 *
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    18
 *
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    21
 * questions.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    22
 */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    23
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    24
/*
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    25
 * @test
17546
06bbe5f5a2b8 8000407: remove @GenerateNativeHeader
jjg
parents: 14539
diff changeset
    26
 * @bug 7150368 8003412 8000407
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    27
 * @summary javac should include basic ability to generate native headers
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 27319
diff changeset
    28
 * @modules jdk.compiler/com.sun.tools.javac.api
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 27319
diff changeset
    29
 *          jdk.compiler/com.sun.tools.javac.file
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    30
 */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    31
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    32
import java.io.File;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    33
import java.io.FileWriter;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    34
import java.io.IOException;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    35
import java.lang.annotation.Annotation;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    36
import java.lang.annotation.Retention;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    37
import java.lang.annotation.RetentionPolicy;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    38
import java.lang.reflect.InvocationTargetException;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    39
import java.lang.reflect.Method;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    40
import java.util.ArrayList;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    41
import java.util.Arrays;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    42
import java.util.HashSet;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    43
import java.util.List;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    44
import java.util.Set;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    45
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    46
import javax.tools.StandardJavaFileManager;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    47
import javax.tools.StandardLocation;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    48
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    49
import com.sun.source.util.JavacTask;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    50
import com.sun.tools.javac.api.JavacTool;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    51
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    52
public class NativeHeaderTest {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    53
    public static void main(String... args) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    54
        new NativeHeaderTest().run();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    55
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    56
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    57
    /** How to invoke javac. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    58
    enum RunKind {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    59
        /** Use the command line entry point. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    60
        CMD,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    61
        /** Use the JavaCompiler API. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    62
        API
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    63
    };
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    64
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    65
    /** Which classes for which to generate headers. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    66
    enum GenKind {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    67
        /** Just classes with native methods or the marker annotation. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    68
        SIMPLE,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    69
        /** All appropriate classes within the top level class. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    70
        FULL
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    71
    };
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    72
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    73
    // ---------- Test cases, invoked reflectively via run. ----------
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    74
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    75
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    76
    void simpleTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    77
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    78
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    79
                "class C { native void m(); }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    80
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    81
        Set<String> expect = createSet("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    82
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    83
        test(rk, gk, files, expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    84
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    85
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    86
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    87
    void nestedClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    88
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    89
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    90
                "class C { static class Inner { native void m(); } }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    91
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    92
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    93
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    94
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    95
        test(rk, gk, files, expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    96
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    97
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    98
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    99
    void localClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   100
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   101
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   102
                "class C { native void m(); void m2() { class Local { } } }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   103
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   104
        Set<String> expect = createSet("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   105
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   106
        test(rk, gk, files, expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   107
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   108
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   109
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   110
    void syntheticClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   111
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   112
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   113
                "class C {\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   114
                + "    private C() { }\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   115
                + "    class Inner extends C { native void m(); }\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   116
                + "}"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   117
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   118
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   119
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   120
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   121
        test(rk, gk, files, expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   122
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   123
        // double check the synthetic class was generated
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   124
        checkEqual("generatedClasses",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   125
                createSet("C.class", "C$1.class", "C$Inner.class"),
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   126
                createSet(classesDir.list()));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   127
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   128
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   129
    @Test
14539
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   130
    void annoTest(RunKind rk, GenKind gk) throws Exception {
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   131
        List<File> files = new ArrayList<File>();
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   132
        files.add(createFile("p/C.java",
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   133
                "class C { @java.lang.annotation.Native public static final int i = 1907; }"));
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   134
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   135
        Set<String> expect = createSet("C.h");
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   136
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   137
        test(rk, gk, files, expect);
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   138
    }
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   139
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   140
    @Test
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   141
    void annoNestedClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   142
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   143
        files.add(createFile("p/C.java",
14539
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   144
                "class C { class Inner { @java.lang.annotation.Native public static final int i = 1907; } }"));
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   145
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   146
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   147
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   148
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   149
        test(rk, gk, files, expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   150
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   151
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   152
    /**
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   153
     * The worker method for each test case.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   154
     * Compile the files and verify that exactly the expected set of header files
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   155
     * is generated.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   156
     */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   157
    void test(RunKind rk, GenKind gk, List<File> files, Set<String> expect) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   158
        List<String> args = new ArrayList<String>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   159
        if (gk == GenKind.FULL)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   160
            args.add("-XDjavah:full");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   161
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   162
        switch (rk) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   163
            case CMD:
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   164
                args.add("-d");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   165
                args.add(classesDir.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   166
                args.add("-h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   167
                args.add(headersDir.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   168
                for (File f: files)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   169
                    args.add(f.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   170
                int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   171
                if (rc != 0)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   172
                    throw new Exception("compilation failed, rc=" + rc);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   173
                break;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   174
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   175
            case API:
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   176
                fm.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(srcDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   177
                fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(classesDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   178
                fm.setLocation(StandardLocation.NATIVE_HEADER_OUTPUT, Arrays.asList(headersDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   179
                JavacTask task = javac.getTask(null, fm, null, args, null,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   180
                        fm.getJavaFileObjectsFromFiles(files));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   181
                if (!task.call())
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   182
                    throw new Exception("compilation failed");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   183
                break;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   184
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   185
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   186
        Set<String> found = createSet(headersDir.list());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   187
        checkEqual("header files", expect, found);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   188
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   189
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   190
    /** Marker annotation for test cases. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   191
    @Retention(RetentionPolicy.RUNTIME)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   192
    @interface Test { }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   193
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   194
    /** Combo test to run all test cases in all modes. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   195
    void run() throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   196
        javac = JavacTool.create();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   197
        fm = javac.getStandardFileManager(null, null, null);
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   198
        try {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   199
            for (RunKind rk: RunKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   200
                for (GenKind gk: GenKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   201
                    for (Method m: getClass().getDeclaredMethods()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   202
                        Annotation a = m.getAnnotation(Test.class);
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   203
                        if (a != null) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   204
                            init(rk, gk, m.getName());
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   205
                            try {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   206
                                m.invoke(this, new Object[] { rk, gk });
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   207
                            } catch (InvocationTargetException e) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   208
                                Throwable cause = e.getCause();
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   209
                                throw (cause instanceof Exception) ? ((Exception) cause) : e;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   210
                            }
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   211
                            System.err.println();
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   212
                        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   213
                    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   214
                }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   215
            }
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   216
            System.err.println(testCount + " tests" + ((errorCount == 0) ? "" : ", " + errorCount + " errors"));
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   217
            if (errorCount > 0)
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   218
                throw new Exception(errorCount + " errors found");
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   219
        } finally {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   220
            fm.close();
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   221
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   222
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   223
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   224
    /**
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   225
     * Init directories for a test case.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   226
     */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   227
    void init(RunKind rk, GenKind gk, String name) throws IOException {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   228
        System.err.println("Test " + rk + " " + gk + " " + name);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   229
        testCount++;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   230
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   231
        testDir = new File(rk.toString().toLowerCase() + "_" + gk.toString().toLowerCase() + "-" + name);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   232
        srcDir = new File(testDir, "src");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   233
        srcDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   234
        classesDir = new File(testDir, "classes");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   235
        classesDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   236
        headersDir = new File(testDir, "headers");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   237
        headersDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   238
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   239
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   240
    /** Create a source file with given body text. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   241
    File createFile(String path, final String body) throws IOException {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   242
        File f = new File(srcDir, path);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   243
        f.getParentFile().mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   244
        try (FileWriter out = new FileWriter(f)) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   245
            out.write(body);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   246
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   247
        return f;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   248
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   249
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   250
    /** Convenience method to create a set of items. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   251
    <T> Set<T> createSet(T... items) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   252
        return new HashSet<T>(Arrays.asList(items));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   253
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   254
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   255
    /** Convenience method to check two values are equal, and report an error if not. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   256
    <T> void checkEqual(String label, T expect, T found) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   257
        if ((found == null) ? (expect == null) : found.equals(expect))
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   258
            return;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   259
        System.err.println("Error: mismatch");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   260
        System.err.println("  expected: " + expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   261
        System.err.println("     found: " + found);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   262
        errorCount++;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   263
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   264
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   265
    // Shared across API test cases
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   266
    JavacTool javac;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   267
    StandardJavaFileManager fm;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   268
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   269
    // Directories set up by init
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   270
    File testDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   271
    File srcDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   272
    File classesDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   273
    File headersDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   274
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   275
    // Statistics
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   276
    int testCount;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   277
    int errorCount;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   278
}
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   279