langtools/test/tools/javac/nativeHeaders/NativeHeaderTest.java
author jjg
Wed, 29 Oct 2014 17:25:23 -0700
changeset 27319 030080f03e4f
parent 17546 06bbe5f5a2b8
child 30730 d3ce7619db2c
permissions -rw-r--r--
8062348: langtools tests should close file manager (group 1) Reviewed-by: darcy
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
/*
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
     2
 * Copyright (c) 2012, 2014, 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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    28
 */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    29
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    30
import java.io.File;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    31
import java.io.FileWriter;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    32
import java.io.IOException;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    33
import java.lang.annotation.Annotation;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    34
import java.lang.annotation.Retention;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    35
import java.lang.annotation.RetentionPolicy;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    36
import java.lang.reflect.InvocationTargetException;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    37
import java.lang.reflect.Method;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    38
import java.util.ArrayList;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    39
import java.util.Arrays;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    40
import java.util.HashSet;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    41
import java.util.List;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    42
import java.util.Set;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    43
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    44
import javax.tools.StandardJavaFileManager;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    45
import javax.tools.StandardLocation;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    46
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    47
import com.sun.source.util.JavacTask;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    48
import com.sun.tools.javac.api.JavacTool;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    49
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    50
public class NativeHeaderTest {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    51
    public static void main(String... args) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    52
        new NativeHeaderTest().run();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    53
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    54
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    55
    /** How to invoke javac. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    56
    enum RunKind {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    57
        /** Use the command line entry point. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    58
        CMD,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    59
        /** Use the JavaCompiler API. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    60
        API
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    61
    };
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    62
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    63
    /** Which classes for which to generate headers. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    64
    enum GenKind {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    65
        /** Just classes with native methods or the marker annotation. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    66
        SIMPLE,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    67
        /** All appropriate classes within the top level class. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    68
        FULL
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    69
    };
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    70
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    71
    // ---------- Test cases, invoked reflectively via run. ----------
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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    74
    void simpleTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    75
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    76
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    77
                "class C { native void m(); }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    78
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    79
        Set<String> expect = createSet("C.h");
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
        test(rk, gk, files, expect);
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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    84
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    85
    void nestedClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    86
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    87
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    88
                "class C { static class Inner { native void m(); } }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    89
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    90
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    91
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    92
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    93
        test(rk, gk, files, expect);
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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    96
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    97
    void localClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    98
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
    99
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   100
                "class C { native void m(); void m2() { class Local { } } }"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   101
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   102
        Set<String> expect = createSet("C.h");
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
        test(rk, gk, files, expect);
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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   107
    @Test
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   108
    void syntheticClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   109
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   110
        files.add(createFile("p/C.java",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   111
                "class C {\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   112
                + "    private C() { }\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   113
                + "    class Inner extends C { native void m(); }\n"
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   114
                + "}"));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   115
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   116
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   117
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   118
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   119
        test(rk, gk, files, expect);
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
        // double check the synthetic class was generated
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   122
        checkEqual("generatedClasses",
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   123
                createSet("C.class", "C$1.class", "C$Inner.class"),
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   124
                createSet(classesDir.list()));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   125
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   126
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   127
    @Test
14539
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   128
    void annoTest(RunKind rk, GenKind gk) throws Exception {
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   129
        List<File> files = new ArrayList<File>();
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   130
        files.add(createFile("p/C.java",
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   131
                "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
   132
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   133
        Set<String> expect = createSet("C.h");
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
        test(rk, gk, files, expect);
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
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   138
    @Test
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   139
    void annoNestedClassTest(RunKind rk, GenKind gk) throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   140
        List<File> files = new ArrayList<File>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   141
        files.add(createFile("p/C.java",
14539
507556c4e622 8003412: javac needs to understand java.lang.annotation.Native
jjg
parents: 12213
diff changeset
   142
                "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
   143
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   144
        Set<String> expect = createSet("C_Inner.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   145
        if (gk == GenKind.FULL) expect.add("C.h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   146
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   147
        test(rk, gk, files, expect);
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
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
     * The worker method for each test case.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   152
     * 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
   153
     * is generated.
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   154
     */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   155
    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
   156
        List<String> args = new ArrayList<String>();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   157
        if (gk == GenKind.FULL)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   158
            args.add("-XDjavah:full");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   159
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   160
        switch (rk) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   161
            case CMD:
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   162
                args.add("-d");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   163
                args.add(classesDir.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   164
                args.add("-h");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   165
                args.add(headersDir.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   166
                for (File f: files)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   167
                    args.add(f.getPath());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   168
                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
   169
                if (rc != 0)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   170
                    throw new Exception("compilation failed, rc=" + rc);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   171
                break;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   172
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   173
            case API:
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   174
                fm.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(srcDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   175
                fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(classesDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   176
                fm.setLocation(StandardLocation.NATIVE_HEADER_OUTPUT, Arrays.asList(headersDir));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   177
                JavacTask task = javac.getTask(null, fm, null, args, null,
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   178
                        fm.getJavaFileObjectsFromFiles(files));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   179
                if (!task.call())
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   180
                    throw new Exception("compilation failed");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   181
                break;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   182
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   183
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   184
        Set<String> found = createSet(headersDir.list());
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   185
        checkEqual("header files", expect, found);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   186
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   187
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   188
    /** Marker annotation for test cases. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   189
    @Retention(RetentionPolicy.RUNTIME)
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   190
    @interface Test { }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   191
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   192
    /** 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
   193
    void run() throws Exception {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   194
        javac = JavacTool.create();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   195
        fm = javac.getStandardFileManager(null, null, null);
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   196
        try {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   197
            for (RunKind rk: RunKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   198
                for (GenKind gk: GenKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   199
                    for (Method m: getClass().getDeclaredMethods()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   200
                        Annotation a = m.getAnnotation(Test.class);
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   201
                        if (a != null) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   202
                            init(rk, gk, m.getName());
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   203
                            try {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   204
                                m.invoke(this, new Object[] { rk, gk });
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   205
                            } catch (InvocationTargetException e) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   206
                                Throwable cause = e.getCause();
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   207
                                throw (cause instanceof Exception) ? ((Exception) cause) : e;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   208
                            }
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   209
                            System.err.println();
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   210
                        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   211
                    }
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
            }
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   214
            System.err.println(testCount + " tests" + ((errorCount == 0) ? "" : ", " + errorCount + " errors"));
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   215
            if (errorCount > 0)
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   216
                throw new Exception(errorCount + " errors found");
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   217
        } finally {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 17546
diff changeset
   218
            fm.close();
12213
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   219
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   220
    }
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
     * Init directories for a test case.
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
    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
   226
        System.err.println("Test " + rk + " " + gk + " " + name);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   227
        testCount++;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   228
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   229
        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
   230
        srcDir = new File(testDir, "src");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   231
        srcDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   232
        classesDir = new File(testDir, "classes");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   233
        classesDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   234
        headersDir = new File(testDir, "headers");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   235
        headersDir.mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   236
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   237
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   238
    /** Create a source file with given body text. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   239
    File createFile(String path, final String body) throws IOException {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   240
        File f = new File(srcDir, path);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   241
        f.getParentFile().mkdirs();
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   242
        try (FileWriter out = new FileWriter(f)) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   243
            out.write(body);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   244
        }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   245
        return f;
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
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   248
    /** Convenience method to create a set of items. */
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   249
    <T> Set<T> createSet(T... items) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   250
        return new HashSet<T>(Arrays.asList(items));
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   251
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   252
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   253
    /** 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
   254
    <T> void checkEqual(String label, T expect, T found) {
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   255
        if ((found == null) ? (expect == null) : found.equals(expect))
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   256
            return;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   257
        System.err.println("Error: mismatch");
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   258
        System.err.println("  expected: " + expect);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   259
        System.err.println("     found: " + found);
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   260
        errorCount++;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   261
    }
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   262
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   263
    // Shared across API test cases
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   264
    JavacTool javac;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   265
    StandardJavaFileManager fm;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   266
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   267
    // Directories set up by init
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   268
    File testDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   269
    File srcDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   270
    File classesDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   271
    File headersDir;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   272
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   273
    // Statistics
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   274
    int testCount;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   275
    int errorCount;
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   276
}
516b112d6c68 7150368: javac should include basic ability to generate native headers
jjg
parents:
diff changeset
   277