PlatformProviderTest.java revision 3573:c4a18ee691c4
159243Sobrien/*
259243Sobrien * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
359243Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
459243Sobrien *
559243Sobrien * This code is free software; you can redistribute it and/or modify it
659243Sobrien * under the terms of the GNU General Public License version 2 only, as
759243Sobrien * published by the Free Software Foundation.
859243Sobrien *
959243Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT
1059243Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1159243Sobrien * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1259243Sobrien * version 2 for more details (a copy is included in the LICENSE file that
1359243Sobrien * accompanied this code).
1459243Sobrien *
1559243Sobrien * You should have received a copy of the GNU General Public License version
1659243Sobrien * 2 along with this work; if not, write to the Free Software Foundation,
1759243Sobrien * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1859243Sobrien *
1959243Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2059243Sobrien * or visit www.oracle.com if you need additional information or have any
2159243Sobrien * questions.
2259243Sobrien */
2359243Sobrien
2459243Sobrien/**
2559243Sobrien * @test
2659243Sobrien * @bug 8072480
2759243Sobrien * @summary Ensure all methods of PlatformProvider are called correctly, and their result is used
2859243Sobrien *          correctly.
2959243Sobrien * @library /tools/lib
3059243Sobrien * @modules jdk.compiler/com.sun.tools.javac.api
3159243Sobrien *          jdk.compiler/com.sun.tools.javac.main
3259243Sobrien *          jdk.compiler/com.sun.tools.javac.platform
3359243Sobrien *          jdk.compiler/com.sun.tools.javac.util
3459243Sobrien * @build toolbox.ToolBox PlatformProviderTest
3559243Sobrien * @run main/othervm PlatformProviderTest
3659243Sobrien */
3759243Sobrien
3859243Sobrienimport java.io.IOException;
3959243Sobrienimport java.io.Writer;
4059243Sobrienimport java.lang.reflect.Field;
4159243Sobrienimport java.nio.file.Files;
4259243Sobrienimport java.nio.file.Path;
4359243Sobrienimport java.nio.file.Paths;
4459243Sobrienimport java.util.ArrayList;
4559243Sobrienimport java.util.Arrays;
4659243Sobrienimport java.util.Collection;
4759243Sobrienimport java.util.Collections;
4859243Sobrienimport java.util.List;
4959243Sobrienimport java.util.Map;
5059243Sobrienimport java.util.Set;
5159243Sobrien
5259243Sobrienimport javax.annotation.processing.AbstractProcessor;
5359243Sobrienimport javax.annotation.processing.Processor;
5459243Sobrienimport javax.annotation.processing.RoundEnvironment;
5559243Sobrienimport javax.annotation.processing.SupportedAnnotationTypes;
5659243Sobrienimport javax.annotation.processing.SupportedOptions;
5759243Sobrienimport javax.lang.model.SourceVersion;
5859243Sobrienimport javax.lang.model.element.TypeElement;
5959243Sobrienimport javax.tools.JavaCompiler;
6059243Sobrienimport javax.tools.StandardJavaFileManager;
6159243Sobrienimport javax.tools.StandardLocation;
6259243Sobrienimport javax.tools.ToolProvider;
6359243Sobrien
6459243Sobrien// import com.sun.source.util.JavacTask;
6559243Sobrienimport com.sun.source.util.Plugin;
6659243Sobrienimport com.sun.tools.javac.platform.PlatformDescription;
6759243Sobrienimport com.sun.tools.javac.platform.PlatformProvider;
6859243Sobrienimport com.sun.tools.javac.util.Log;
6959243Sobrien
7059243Sobrienimport toolbox.JavacTask;
7159243Sobrienimport toolbox.Task;
7259243Sobrienimport toolbox.ToolBox;
7359243Sobrien
7459243Sobrienpublic class PlatformProviderTest implements PlatformProvider {
7559243Sobrien
7659243Sobrien    public static void main(String... args) throws IOException {
7759243Sobrien        new PlatformProviderTest().run();
7859243Sobrien    }
7959243Sobrien
8059243Sobrien    void run() throws IOException {
8159243Sobrien        Path registration = Paths.get(System.getProperty("test.classes"),
8259243Sobrien                                      "META-INF",
8359243Sobrien                                      "services",
8459243Sobrien                                      "com.sun.tools.javac.platform.PlatformProvider");
8559243Sobrien        Files.createDirectories(registration.getParent());
8659243Sobrien        try (Writer metaInf = Files.newBufferedWriter(registration)) {
8759243Sobrien            metaInf.write(PlatformProviderTest.class.getName());
8859243Sobrien        }
8959243Sobrien
9059243Sobrien        doTest("name", "");
9159243Sobrien        doTest("name:param", "param");
9259243Sobrien        doTestFailure();
9359243Sobrien    }
9459243Sobrien
9559243Sobrien    void doTest(String platformSpec, String expectedParameter) {
9659243Sobrien        ToolBox tb = new ToolBox();
9759243Sobrien        Task.Result result =
9859243Sobrien                new JavacTask(tb, Task.Mode.EXEC)
9959243Sobrien                  .outdir(".")
10059243Sobrien                  .options("-J--class-path=" + System.getProperty("test.classes"),
10159243Sobrien                           "-J--add-exports=jdk.compiler/com.sun.tools.javac.platform=ALL-UNNAMED",
10259243Sobrien                           "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
10359243Sobrien                           "-XDrawDiagnostics",
10459243Sobrien                           "-release",
10559243Sobrien                           platformSpec,
10659243Sobrien                           System.getProperty("test.src") + "/PlatformProviderTestSource.java")
10759243Sobrien                  .run();
10859243Sobrien
10959243Sobrien        List<String> expectedOutput =
11059243Sobrien                Arrays.asList("getSupportedPlatformNames",
11159243Sobrien                              "getPlatform(name, " + expectedParameter + ")",
11259243Sobrien                              "getSourceVersion",
11359243Sobrien                              "getTargetVersion",
11459243Sobrien                              "getPlatformPath",
11559243Sobrien                              "testPlugin: [testPluginKey=testPluginValue]",
11659243Sobrien                              "process: {testAPKey=testAPValue}",
11759243Sobrien                              "process: {testAPKey=testAPValue}",
11859243Sobrien                              "PlatformProviderTestSource.java:4:49: compiler.warn.raw.class.use: java.util.ArrayList, java.util.ArrayList<E>",
11959243Sobrien                              "compiler.misc.count.warn",
12059243Sobrien                              "close");
12159243Sobrien        List<String> actualOutput = result.getOutputLines(Task.OutputKind.STDERR);
12259243Sobrien        result.writeAll();
12359243Sobrien        if (!expectedOutput.equals(actualOutput)) {
12459243Sobrien            throw new AssertionError(  "Expected output: " + expectedOutput +
12559243Sobrien                                     "; actual output: " + actualOutput);
12659243Sobrien        }
12759243Sobrien        result.writeAll();
12859243Sobrien    }
12959243Sobrien
13059243Sobrien    void doTestFailure() {
13159243Sobrien        ToolBox tb = new ToolBox();
13259243Sobrien        Task.Result result =
13359243Sobrien                new JavacTask(tb, Task.Mode.EXEC)
13459243Sobrien                  .outdir(".")
13559243Sobrien                  .options("-J--class-path=" + System.getProperty("test.classes"),
13659243Sobrien                           "-J--add-exports=jdk.compiler/com.sun.tools.javac.platform=ALL-UNNAMED",
13759243Sobrien                           "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
13859243Sobrien                           "-release",
13959243Sobrien                           "fail",
14059243Sobrien                           System.getProperty("test.src") + "/PlatformProviderTestSource.java")
14159243Sobrien                  .run(Task.Expect.FAIL);
14259243Sobrien
14359243Sobrien        List<String> expectedOutput =
14459243Sobrien                Arrays.asList("getSupportedPlatformNames",
14559243Sobrien                              "getPlatform(fail, )",
14659243Sobrien                              "javac: javac.err.unsupported.release.version",
14759243Sobrien                              "javac.msg.usage");
14859243Sobrien        List<String> actualOutput = result.getOutputLines(Task.OutputKind.STDERR);
14959243Sobrien        result.writeAll();
15059243Sobrien        if (!expectedOutput.equals(actualOutput)) {
15159243Sobrien            throw new AssertionError(  "Expected output: " + expectedOutput +
15259243Sobrien                                     "; actual output: " + actualOutput);
15359243Sobrien        }
15459243Sobrien        result.writeAll();
15559243Sobrien    }
15659243Sobrien
15759243Sobrien    @Override
15859243Sobrien    public Iterable<String> getSupportedPlatformNames() {
15959243Sobrien        System.err.println("getSupportedPlatformNames");
16059243Sobrien        return Arrays.asList("name", "fail");
16159243Sobrien    }
16259243Sobrien
16359243Sobrien    @Override
16459243Sobrien    public PlatformDescription getPlatform(String platformName, String options) throws PlatformNotSupported {
16559243Sobrien        System.err.println("getPlatform(" + platformName + ", " + options + ")");
16659243Sobrien
16759243Sobrien        if ("fail".equals(platformName)) {
16859243Sobrien            throw new PlatformNotSupported();
16959243Sobrien        }
17059243Sobrien
17159243Sobrien        return new DescriptionImpl();
17259243Sobrien    }
17359243Sobrien
17459243Sobrien    static {
17559243Sobrien        try {
17659243Sobrien            Field useRawMessages = Log.class.getDeclaredField("useRawMessages");
17759243Sobrien
17859243Sobrien            useRawMessages.setAccessible(true);
17959243Sobrien            useRawMessages.set(null, true);
18059243Sobrien        } catch (Exception ex) {
18159243Sobrien            throw new IllegalStateException(ex);
18259243Sobrien        }
18359243Sobrien    }
18459243Sobrien
18559243Sobrien    class DescriptionImpl implements PlatformDescription {
18659243Sobrien
18759243Sobrien        private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
18859243Sobrien        private final StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
18959243Sobrien
19059243Sobrien
19159243Sobrien        @Override
19259243Sobrien        public Collection<Path> getPlatformPath() {
19359243Sobrien            System.err.println("getPlatformPath");
19459243Sobrien            List<Path> result = new ArrayList<>();
19559243Sobrien            fm.getLocationAsPaths(StandardLocation.PLATFORM_CLASS_PATH).forEach(p -> { result.add(p); });
19659243Sobrien            return result;
19759243Sobrien        }
19859243Sobrien
19959243Sobrien        @Override
20059243Sobrien        public String getSourceVersion() {
20159243Sobrien            System.err.println("getSourceVersion");
20259243Sobrien            return "8";
20359243Sobrien        }
20459243Sobrien
20559243Sobrien        @Override
20659243Sobrien        public String getTargetVersion() {
20759243Sobrien            System.err.println("getTargetVersion");
20859243Sobrien            return "8";
20959243Sobrien        }
21059243Sobrien
21159243Sobrien        @Override
21259243Sobrien        public List<PluginInfo<Processor>> getAnnotationProcessors() {
21359243Sobrien            return Arrays.asList(new PluginInfo<Processor>() {
21459243Sobrien                @Override
21559243Sobrien                public String getName() {
21659243Sobrien                    return "test";
21759243Sobrien                }
21859243Sobrien                @Override
21959243Sobrien                public Map<String, String> getOptions() {
22059243Sobrien                    return Collections.singletonMap("testAPKey", "testAPValue");
22159243Sobrien                }
22259243Sobrien                @Override
22359243Sobrien                public Processor getPlugin() {
22459243Sobrien                    return new ProcessorImpl();
22559243Sobrien                }
22659243Sobrien            });
22759243Sobrien        }
22859243Sobrien
22959243Sobrien        @Override
23059243Sobrien        public List<PluginInfo<Plugin>> getPlugins() {
23159243Sobrien            return Arrays.asList(new PluginInfo<Plugin>() {
23259243Sobrien                @Override
23359243Sobrien                public String getName() {
23459243Sobrien                    return "testPlugin";
23559243Sobrien                }
23659243Sobrien                @Override
23759243Sobrien                public Map<String, String> getOptions() {
23859243Sobrien                    return Collections.singletonMap("testPluginKey", "testPluginValue");
23959243Sobrien                }
24059243Sobrien                @Override
24159243Sobrien                public Plugin getPlugin() {
24259243Sobrien                    return new PluginImpl();
24359243Sobrien                }
24459243Sobrien            });
24559243Sobrien        }
24659243Sobrien
24759243Sobrien        @Override
24859243Sobrien        public List<String> getAdditionalOptions() {
24959243Sobrien            return Arrays.asList("-Xlint:rawtypes", "-XDrawDiagnostics");
25059243Sobrien        }
25159243Sobrien
25259243Sobrien        @Override
25359243Sobrien        public void close() throws IOException {
25459243Sobrien            System.err.println("close");
25559243Sobrien            fm.close();
25659243Sobrien        }
25759243Sobrien
25859243Sobrien    }
25959243Sobrien
26059243Sobrien    @SupportedAnnotationTypes("*")
26159243Sobrien    @SupportedOptions("testAPKey")
26259243Sobrien    class ProcessorImpl extends AbstractProcessor {
26359243Sobrien
26459243Sobrien        @Override
26559243Sobrien        public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
26659243Sobrien            System.err.println("process: " + processingEnv.getOptions());
26759243Sobrien            return true;
26859243Sobrien        }
26959243Sobrien
27059243Sobrien        @Override
27159243Sobrien        public SourceVersion getSupportedSourceVersion() {
27259243Sobrien            return SourceVersion.latest();
27359243Sobrien        }
27459243Sobrien
27559243Sobrien    }
27659243Sobrien
27759243Sobrien    class PluginImpl implements Plugin {
27859243Sobrien
27959243Sobrien        @Override
28059243Sobrien        public String getName() {
28159243Sobrien            return "testPluginName";
28259243Sobrien        }
28359243Sobrien
28459243Sobrien        @Override
28559243Sobrien        public void init(com.sun.source.util.JavacTask task, String... args) {
28659243Sobrien            System.err.println("testPlugin: " + Arrays.toString(args));
28759243Sobrien        }
28859243Sobrien
28959243Sobrien    }
29059243Sobrien}
29159243Sobrien