TestReturnCode.java revision 1465:b52a38d4536c
1/*
2 * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 6403468
27 * @summary Test that an erroneous return code results from raising an error.
28 * @author  Joseph D. Darcy
29 * @library /tools/javac/lib
30 * @build JavacTestingAbstractProcessor CompileFail
31 * @compile TestReturnCode.java
32 *
33 * @compile                     -processor TestReturnCode -proc:only                                                                   Foo.java
34 * @run main CompileFail ERROR  -processor TestReturnCode -proc:only                                                    -AErrorOnFirst Foo.java
35 * @run main CompileFail ERROR  -processor TestReturnCode -proc:only                                      -AErrorOnLast                Foo.java
36 * @run main CompileFail ERROR  -processor TestReturnCode -proc:only                                      -AErrorOnLast -AErrorOnFirst Foo.java
37 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only                   -AExceptionOnFirst                              Foo.java
38 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only                   -AExceptionOnFirst               -AErrorOnFirst Foo.java
39 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only                   -AExceptionOnFirst -AErrorOnLast                Foo.java
40 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only                   -AExceptionOnFirst -AErrorOnLast -AErrorOnFirst Foo.java
41 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast                                                 Foo.java
42 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast                                  -AErrorOnFirst Foo.java
43 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast                    -AErrorOnLast                Foo.java
44 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast                    -AErrorOnLast -AErrorOnFirst Foo.java
45 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast -AExceptionOnFirst                              Foo.java
46 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast -AExceptionOnFirst               -AErrorOnFirst Foo.java
47 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast -AExceptionOnFirst -AErrorOnLast                Foo.java
48 * @run main CompileFail SYSERR -processor TestReturnCode -proc:only -AExceptionOnLast -AExceptionOnFirst -AErrorOnLast -AErrorOnFirst Foo.java
49 */
50
51import java.util.Set;
52import java.util.HashSet;
53import java.util.Arrays;
54import javax.annotation.processing.*;
55import javax.lang.model.SourceVersion;
56import javax.lang.model.element.*;
57import javax.lang.model.util.*;
58import static javax.tools.Diagnostic.Kind.*;
59
60
61/**
62 * This processor raises errors or throws exceptions on different
63 * rounds to allow the return code to be test.
64 */
65@SupportedOptions({"ErrorOnFirst",
66                   "ErrorOnLast",
67                   "ExceptionOnFirst",
68                   "ExceptionOnLast"})
69public class TestReturnCode extends JavacTestingAbstractProcessor {
70
71    private boolean errorOnFirst;
72    private boolean errorOnLast;
73    private boolean exceptionOnFirst;
74    private boolean exceptionOnLast;
75
76    public boolean process(Set<? extends TypeElement> annotations,
77                           RoundEnvironment roundEnv) {
78        if (!roundEnv.processingOver()) {
79            System.out.format("Variables: %b\t%b\t%b\t%b%n",
80                              errorOnFirst,
81                              errorOnLast,
82                              exceptionOnFirst,
83                              exceptionOnLast);
84            if (errorOnFirst)
85                messager.printMessage(ERROR, "Error on first round.");
86            if (exceptionOnFirst)
87                throw new RuntimeException("Exception on first round.");
88        } else {
89            if (errorOnLast)
90                messager.printMessage(ERROR, "Error on last round.");
91            if (exceptionOnLast)
92                throw new RuntimeException("Exception on last round.");
93        }
94        return true;
95    }
96
97    @Override
98    public void init(ProcessingEnvironment processingEnv) {
99        super.init(processingEnv);
100        Set<String> keySet = processingEnv.getOptions().keySet();
101        errorOnFirst      = keySet.contains("ErrorOnFirst");
102        errorOnLast     = keySet.contains("ErrorOnLast");
103        exceptionOnFirst  = keySet.contains("ExceptionOnFirst");
104        exceptionOnLast = keySet.contains("ExceptionOnLast");
105    }
106}
107