/* * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 6430241 * @summary Hard to disable symbol file feature through API */ import java.io.*; import java.util.*; import javax.tools.*; import com.sun.source.util.JavacTask; import com.sun.tools.javac.api.JavacTool; public class T6430241 { public static void main(String... args) throws Exception { new T6430241().run(); } void run() throws Exception { setup(); testCommandLine(); testSimpleAPI(); testTaskAPI(); if (errors > 0) throw new Exception(errors + " errors found"); } void setup() throws Exception { classesDir = new File("classes"); classesDir.mkdirs(); emptyDir = new File("empty"); emptyDir.mkdirs(); bootClassPath = System.getProperty("sun.boot.class.path"); File srcDir = new File("src"); String test = "import sun.misc.Unsafe; class Test { }"; testFile = writeFile(srcDir, "Test.java", test); } //----- tests for command line invocation void testCommandLine() throws Exception { testCommandLine(true); testCommandLine(true, "-Xbootclasspath/p:" + emptyDir); testCommandLine(false, "-Xbootclasspath:" + bootClassPath); testCommandLine(true, "-Xbootclasspath/a:" + emptyDir); testCommandLine(false, "-XDignore.symbol.file"); System.err.println(); } void testCommandLine(boolean expectWarnings, String... opts) throws Exception { System.err.println("test command line: " + Arrays.asList(opts)); String[] args = initArgs(opts); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); int rc = com.sun.tools.javac.Main.compile(args, pw); String out = showOutput(sw.toString()); checkCompilationOK(rc); checkOutput(out, expectWarnings); } //----- tests for simple API invocation void testSimpleAPI() { testSimpleAPI(true); testSimpleAPI(true, "-Xbootclasspath/p:" + emptyDir); testSimpleAPI(false, "-Xbootclasspath:" + bootClassPath); testSimpleAPI(true, "-Xbootclasspath/a:" + emptyDir); testSimpleAPI(false, "-XDignore.symbol.file"); System.err.println(); } void testSimpleAPI(boolean expectWarnings, String... opts) { System.err.println("test simple API: " + Arrays.asList(opts)); String[] args = initArgs(opts); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); JavacTool tool = JavacTool.create(); int rc = tool.run(null, null, ps, args); String out = showOutput(baos.toString()); checkCompilationOK(rc); checkOutput(out, expectWarnings); } //----- tests for CompilationTask API invocation void testTaskAPI() throws Exception { List<File> bcp = new ArrayList<File>(); for (String f: bootClassPath.split(File.pathSeparator)) { if (!f.isEmpty()) bcp.add(new File(f)); } testTaskAPI(true, null); testTaskAPI(false, bcp); System.err.println(); } void testTaskAPI(boolean expectWarnings, Iterable<? extends File> pcp) throws Exception { System.err.println("test task API: " + pcp); JavacTool tool = JavacTool.create(); StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); if (pcp != null) fm.setLocation(StandardLocation.PLATFORM_CLASS_PATH, pcp); Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(testFile); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); JavacTask task = tool.getTask(pw, fm, null, null, null, files); boolean ok = task.call(); String out = showOutput(sw.toString()); checkCompilationOK(ok); checkOutput(out, expectWarnings); } //----- utility methods /** * Create a file with given content. */ File writeFile(File dir, String path, String content) throws IOException { File f = new File(dir, path); f.getParentFile().mkdirs(); FileWriter out = new FileWriter(f); try { out.write(content); } finally { out.close(); } return f; } /** * Initialize args for compilation with given opts. * @return opts -d classesDir testFile */ String[] initArgs(String[] opts) { List<String> args = new ArrayList<String>(); args.addAll(Arrays.asList(opts)); args.add("-d"); args.add(classesDir.getPath()); args.add(testFile.getPath()); return args.toArray(new String[args.size()]); } /** * Show output from compilation if non empty. */ String showOutput(String out) { if (!out.isEmpty()) System.err.println(out); return out; } /** * Verify compilation succeeeded. */ void checkCompilationOK(boolean ok) { if (!ok) error("compilation failed"); } /** * Verify compilation succeeeded. */ void checkCompilationOK(int rc) { if (rc != 0) error("compilation failed, rc: " + rc); } /** * Check whether output contains warnings if and only if warnings * are expected. */ void checkOutput(String out, boolean expectWarnings) { boolean foundWarnings = out.contains("warning"); if (foundWarnings) { if (!expectWarnings) error("unexpected warnings found"); } else { if (expectWarnings) error("expected warnings not found"); } } /** * Report an error. */ void error(String msg) { System.err.println("error: " + msg); errors++; } String bootClassPath; File classesDir; File emptyDir; File testFile; int errors; }