FDTest.java revision 2868:816bd88d33a8
1/*
2 * Copyright (c) 2012, 2015, 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
24package org.openjdk.tests.javac;
25
26import org.openjdk.tests.shapegen.*;
27
28import com.sun.source.util.JavacTask;
29import com.sun.tools.javac.util.Pair;
30
31import java.io.IOException;
32import java.net.URI;
33import java.util.Arrays;
34import java.util.ArrayList;
35import java.util.Collection;
36import java.util.List;
37
38import javax.tools.Diagnostic;
39import javax.tools.JavaCompiler;
40import javax.tools.JavaFileObject;
41import javax.tools.SimpleJavaFileObject;
42import javax.tools.StandardJavaFileManager;
43import javax.tools.ToolProvider;
44
45import org.testng.annotations.AfterSuite;
46import org.testng.annotations.Test;
47import org.testng.annotations.BeforeSuite;
48import org.testng.annotations.DataProvider;
49import static org.testng.Assert.*;
50
51public class FDTest {
52
53    public enum TestKind {
54        POSITIVE,
55        NEGATIVE;
56
57        Collection<Hierarchy> getHierarchy(HierarchyGenerator hg) {
58            return this == POSITIVE ?
59                    hg.getOK() : hg.getErr();
60        }
61    }
62
63    public static JavaCompiler comp;
64    public static StandardJavaFileManager fm;
65
66    @BeforeSuite
67    static void init() {
68        // create default shared JavaCompiler - reused across multiple
69        // compilations
70
71        comp = ToolProvider.getSystemJavaCompiler();
72        fm = comp.getStandardFileManager(null, null, null);
73    }
74
75    @AfterSuite
76    static void teardown() throws IOException {
77        fm.close();
78    }
79
80    public static void main(String[] args) throws Exception {
81        init();
82
83        for (Pair<TestKind,Hierarchy> fdtest : generateCases()) {
84            runTest(fdtest.fst, fdtest.snd, comp, fm);
85        }
86
87        teardown();
88    }
89
90    @Test(dataProvider = "fdCases")
91    public void testOneCase(TestKind tk, Hierarchy hs)
92            throws Exception {
93        FDTest.runTest(tk, hs, comp, fm);
94    }
95
96    @DataProvider(name = "fdCases")
97    public Object[][] caseGenerator() {
98        List<Pair<TestKind, Hierarchy>> cases = generateCases();
99        Object[][] fdCases = new Object[cases.size()][];
100        for (int i = 0; i < cases.size(); ++i) {
101            fdCases[i] = new Object[2];
102            fdCases[i][0] = cases.get(i).fst;
103            fdCases[i][1] = cases.get(i).snd;
104        }
105        return fdCases;
106    }
107
108    public static List<Pair<TestKind, Hierarchy>> generateCases() {
109        ArrayList<Pair<TestKind,Hierarchy>> list = new ArrayList<>();
110        HierarchyGenerator hg = new HierarchyGenerator();
111        int i = 0;
112        for (TestKind tk : TestKind.values()) {
113            for (Hierarchy hs : tk.getHierarchy(hg)) {
114                list.add((i++ % 2) == 0 ? new Pair<>(tk, hs) {} : new Pair<>(tk, hs));
115            }
116        }
117        return list;
118    }
119
120    public static void runTest(TestKind tk, Hierarchy hs,
121            JavaCompiler comp, StandardJavaFileManager fm) throws Exception {
122        new FDTest(tk, hs).run(comp, fm);
123    }
124
125    TestKind tk;
126    Hierarchy hs;
127    DefenderTestSource source;
128    DiagnosticChecker diagChecker;
129
130    public FDTest() {}
131
132    FDTest(TestKind tk, Hierarchy hs) {
133        this.tk = tk;
134        this.hs = hs;
135        this.source = new DefenderTestSource();
136        this.diagChecker = new DiagnosticChecker();
137    }
138
139    void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception {
140        JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker,
141                null, null, Arrays.asList(source));
142        try {
143            ct.analyze();
144        } catch (Throwable ex) {
145            fail("Error thrown when analyzing the following source:\n" + source.getCharContent(true));
146        }
147        check();
148    }
149
150    void check() {
151        boolean errorExpected = tk == TestKind.NEGATIVE;
152        if (errorExpected != diagChecker.errorFound) {
153            fail("problem in source: \n" +
154                 "\nerror found = " + diagChecker.errorFound +
155                 "\nerror expected = " + errorExpected +
156                 "\n" + dumpHierarchy() +
157                 "\n" + source.getCharContent(true));
158        }
159    }
160
161    String dumpHierarchy() {
162        StringBuilder buf = new StringBuilder();
163        buf.append("root = " + hs.root + "\n");
164        for (ClassCase cc : hs.all) {
165            buf.append("  class name = " + cc.getName() + "\n");
166            buf.append("    class OK = " + cc.get_OK() + "\n");
167            buf.append("    prov = " + cc.get_mprov() + "\n");
168
169        }
170        return buf.toString();
171    }
172
173    class DefenderTestSource extends SimpleJavaFileObject {
174
175        String source;
176
177        public DefenderTestSource() {
178            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
179            StringBuilder buf = new StringBuilder();
180            List<ClassCase> defaultRef = new ArrayList<>();
181            for (ClassCase cc : hs.all) {
182                Hierarchy.genClassDef(buf, cc, null, defaultRef);
183            }
184            source = buf.toString();
185        }
186
187        @Override
188        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
189            return source;
190        }
191    }
192
193    static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
194
195        boolean errorFound;
196
197        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
198            if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
199                errorFound = true;
200            }
201        }
202    }
203}
204