duke@1: /* xdono@174: * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ duke@1: duke@1: /* duke@1: * @test duke@1: * @bug 6348193 duke@1: * @summary AS8.1 UR2 BAT test failure with "javac" duke@1: * @compile -proc:none T6348193.java duke@1: * @run main/othervm T6348193 duke@1: */ duke@1: duke@1: import java.io.*; duke@1: import java.net.*; duke@1: import java.util.*; duke@1: import javax.annotation.processing.*; duke@1: import javax.lang.model.element.*; duke@1: import javax.tools.*; duke@1: import com.sun.tools.javac.api.JavacTool; duke@1: duke@1: @SupportedAnnotationTypes({"*"}) duke@1: public class T6348193 extends AbstractProcessor duke@1: { duke@1: private static final boolean verbose = true; duke@1: duke@1: enum NoYes { NO, YES }; duke@1: enum NoGoodBad { NO, GOOD, BAD}; duke@1: duke@1: public static final String myName = T6348193.class.getName(); duke@1: duke@1: public static void main(String... args) throws IOException { duke@1: if (System.getSecurityManager() != null) duke@1: throw new AssertionError("unexpected security manager"); duke@1: duke@1: for (NoYes secMgr: EnumSet.allOf(NoYes.class)) duke@1: for (NoGoodBad config: EnumSet.allOf(NoGoodBad.class)) duke@1: for (NoYes proc: EnumSet.allOf(NoYes.class)) duke@1: test(secMgr, config, proc); duke@1: } duke@1: duke@1: private static File processed = new File("processed"); duke@1: duke@1: public static void test(NoYes secMgr, NoGoodBad config, NoYes proc) throws IOException { duke@1: if (verbose) duke@1: System.err.println("secMgr:" + secMgr + " config:" + config + " proc:" + proc); duke@1: duke@1: if (secMgr == NoYes.YES && System.getSecurityManager() == null) duke@1: System.setSecurityManager(new NoLoaderSecurityManager()); duke@1: duke@1: installConfigFile(config); duke@1: duke@1: processed.delete(); duke@1: duke@1: List args = new ArrayList(); duke@1: //args.add("-XprintRounds"); duke@1: if (proc == NoYes.YES) { duke@1: args.add("-processor"); duke@1: args.add(myName); duke@1: } duke@1: args.add("-processorpath"); duke@1: args.add(System.getProperty("java.class.path")); duke@1: args.add("-d"); duke@1: args.add("."); duke@1: duke@1: JavacTool t = JavacTool.create(); // avoid using class loader duke@1: duke@1: MyDiagListener dl = new MyDiagListener(); duke@1: PrintWriter out = new PrintWriter(System.err, true); duke@1: StandardJavaFileManager fm = t.getStandardFileManager(dl, null, null); duke@1: File file = new File(System.getProperty("test.src"), myName+".java"); duke@1: Iterable files = duke@1: fm.getJavaFileObjectsFromFiles(Arrays.asList(file)); duke@1: boolean ok = t.getTask(out, null, dl, args, null, files).call(); duke@1: duke@1: if (config == NoGoodBad.GOOD || proc == NoYes.YES) { duke@1: if (secMgr == NoYes.YES) { duke@1: if (dl.last == null) duke@1: throw new AssertionError("Security manager installed, and processors present, " duke@1: + " but no diagnostic received"); duke@1: } duke@1: else { duke@1: if (!processed.exists()) duke@1: throw new AssertionError("No security manager installed, and processors present, " duke@1: + " but no processing occurred"); duke@1: } duke@1: } duke@1: else if (config == NoGoodBad.BAD) { duke@1: // TODO: should verify that no compiler crash occurred duke@1: // needs revised JSR199 spec duke@1: } duke@1: else { duke@1: if (processed.exists()) duke@1: throw new AssertionError("No processors present, but processing occurred!"); duke@1: } duke@1: duke@1: if (verbose) duke@1: System.err.println("OK"); duke@1: } duke@1: duke@1: // set up or remove a service configuration file duke@1: static void installConfigFile(NoGoodBad type) throws IOException { jjg@143: File f = new File(System.getProperty("test.classes", ".")); duke@1: for (String s: new String[] { "META-INF", "services", Processor.class.getName() }) duke@1: f = new File(f, s); duke@1: BufferedWriter out; duke@1: switch (type) { duke@1: case GOOD: duke@1: f.getParentFile().mkdirs(); duke@1: out = new BufferedWriter(new FileWriter(f)); duke@1: out.write(myName); duke@1: out.newLine(); duke@1: out.close(); duke@1: break; duke@1: case BAD: duke@1: f.getParentFile().mkdirs(); duke@1: out = new BufferedWriter(new FileWriter(f)); duke@1: out.write("This is not a valid line"); duke@1: out.newLine(); duke@1: out.close(); duke@1: break; duke@1: case NO: duke@1: f.delete(); duke@1: } duke@1: duke@1: duke@1: } duke@1: duke@1: // annotation processor method duke@1: public boolean process(Set tes, RoundEnvironment renv ) duke@1: { duke@1: try { duke@1: // touch a file to indicate we have run duke@1: new FileWriter(processed).close(); duke@1: } catch (IOException e) { duke@1: } duke@1: return true; duke@1: } duke@1: duke@1: static class MyDiagListener implements DiagnosticListener duke@1: { duke@1: public void report(Diagnostic message) { duke@1: if (verbose) duke@1: System.err.println(message); duke@1: last = message; duke@1: } duke@1: duke@1: Diagnostic last; duke@1: } duke@1: duke@1: static class NoLoaderSecurityManager extends SecurityManager duke@1: { duke@1: public void checkCreateClassLoader() { duke@1: throw new SecurityException("Not today, thanks you!"); duke@1: } duke@1: duke@1: public void checkPropertyAccess(String key) { /*OK*/ } duke@1: duke@1: public void checkDelete(String file) { /*OK*/ } duke@1: public void checkRead(FileDescriptor fd) { /*OK*/ } duke@1: public void checkRead(String file) { /*OK*/ } duke@1: public void checkRead(String file, Object context) { /*OK*/ } duke@1: public void checkWrite(String file) { /*OK*/ } duke@1: duke@1: } duke@1: }