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