1 /*
2  * Copyright (c) 2009, 2013, 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 6813059
27  * @summary
28  */
29 
30 import java.io.*;
31 import java.util.*;
32 
33 // Simple test of -XDshouldStopPolicy.
34 // For each of the permissable values, we compile a file with an error in it,
35 // then using -XDverboseCompilePolicy we check that the compilation gets as
36 // far as expected, but no further.
37 
38 public class Test {
39     enum ShouldStopPolicy {
40         BLANK(false, null, "attr"),
41         PROCESS(true, null, "attr"),
42         ATTR(true, "attr", "flow"),
43         FLOW(true, "flow", "desugar"),
44         TRANSTYPES(true, "desugar", "generate"),
45         LOWER(true, "desugar", "generate"),
46         GENERATE(true, "generate", null);
ShouldStopPolicy(boolean needOption, String expect, String dontExpect)47         ShouldStopPolicy(boolean needOption, String expect, String dontExpect) {
48             this.needOption = needOption;
49             this.expect = expect;
50             this.dontExpect = dontExpect;
51         }
52         boolean needOption;
53         String expect;
54         String dontExpect;
55     }
56 
57     enum CompilePolicy {
58         BYFILE,
59         BYTODO
60     }
61 
main(String... args)62     public static void main(String... args) throws Exception {
63         new Test().run();
64     }
65 
run()66     public void run() throws Exception {
67         for (CompilePolicy cp: CompilePolicy.values()) {
68             for (ShouldStopPolicy ssp: ShouldStopPolicy.values()) {
69                 test(cp, ssp);
70             }
71         }
72 
73         if (errors > 0)
74             throw new Exception(errors + " errors occurred");
75     }
76 
test(CompilePolicy cp, ShouldStopPolicy ssp)77     public void test(CompilePolicy cp, ShouldStopPolicy ssp) {
78         System.err.println();
79         System.err.println("test " + cp + " " + ssp);
80         List<String> args = new ArrayList<String>();
81         args.add("-XDverboseCompilePolicy");
82         args.add("-XDcompilePolicy=" + cp.toString().toLowerCase());
83         args.add("-d");
84         args.add(".");
85         if (ssp.needOption)
86             args.add("-XDshouldStopPolicy=" + ssp);
87         args.add(new File(System.getProperty("test.src", "."), "A.java").getPath());
88 
89         StringWriter sw = new StringWriter();
90         PrintWriter pw = new PrintWriter(sw);
91         System.err.println("compile " + args);
92         int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw);
93         if (rc == 0)
94             throw new Error("compilation succeeded unexpectedly");
95         //System.err.println(sw);
96 
97         // The following is a workaround for the current javac implementation,
98         // that in bytodo mode, it will still attribute files after syntax errors.
99         // Changing that behavior may surprise existing users, so for now, we
100         // work around it.
101         if (cp == CompilePolicy.BYTODO && ssp == ShouldStopPolicy.PROCESS)
102             ssp = ShouldStopPolicy.ATTR;
103 
104         boolean foundExpected = (ssp.expect == null);
105         String[] lines = sw.toString().split("\n");
106         for (String line: lines) {
107             if (ssp.expect != null && line.startsWith("[" + ssp.expect))
108                 foundExpected = true;
109             if (ssp.dontExpect != null && line.startsWith("[" + ssp.dontExpect)) {
110                 error("Unexpected output: " + ssp.dontExpect + "\n" + sw);
111                 return;
112             }
113         }
114 
115         if (!foundExpected)
116             error("Expected output not found: " + ssp.expect + "\n" + sw);
117     }
118 
error(String message)119     void error(String message) {
120         System.err.println(message);
121         errors++;
122     }
123 
124     int errors;
125 }
126