| /* |
| * Copyright (c) 2012, 2013, 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. |
| */ |
| |
| // this test has been disabled because of timeout issues. |
| // see JDK-8006746 |
| |
| package org.openjdk.tests.vm; |
| |
| import java.util.*; |
| |
| import org.testng.ITestResult; |
| import org.testng.annotations.Test; |
| import org.testng.annotations.DataProvider; |
| import org.testng.annotations.AfterMethod; |
| import org.testng.annotations.AfterSuite; |
| |
| import org.openjdk.tests.separate.*; |
| import org.openjdk.tests.separate.Compiler; |
| |
| import org.openjdk.tests.shapegen.Hierarchy; |
| import org.openjdk.tests.shapegen.HierarchyGenerator; |
| import org.openjdk.tests.shapegen.ClassCase; |
| |
| import static org.testng.Assert.*; |
| import static org.openjdk.tests.separate.SourceModel.*; |
| import static org.openjdk.tests.separate.SourceModel.Class; |
| import static org.openjdk.tests.separate.SourceModel.Method; |
| import static org.openjdk.tests.separate.SourceModel.Type; |
| |
| public class FDSeparateCompilationTest extends TestHarness { |
| |
| private static String EMPTY = "\"\""; |
| |
| public FDSeparateCompilationTest() { |
| super(false, true); |
| } |
| |
| @DataProvider(name = "allShapes", parallel = true) |
| public Object[][] hierarchyGenerator() { |
| ArrayList<Object[]> allCases = new ArrayList<>(); |
| |
| HierarchyGenerator hg = new HierarchyGenerator(); |
| for (Object x : hg.getOK()) { |
| allCases.add(new Object[]{x}); |
| } |
| for (Object x : hg.getErr()) { |
| allCases.add(new Object[]{x}); |
| } |
| return allCases.toArray(new Object[0][]); |
| } |
| |
| // The expected value obtained when invoking the method from the specified |
| // class. If returns null, then an AbstractMethodError is expected. |
| private static String getExpectedResult(ClassCase cc) { |
| Set<ClassCase> provs = cc.get_mprov(); |
| if (cc.get_mres() != null) { |
| return cc.get_mres().getName(); |
| } else if (provs != null && provs.size() == 1) { |
| ClassCase cand = provs.iterator().next(); |
| switch (cand.kind) { |
| case CCONCRETE: |
| case IDEFAULT: |
| return cand.getName(); |
| case CNONE: |
| case IVAC: |
| return getExpectedResult(cand); |
| } |
| } |
| return null; |
| } |
| |
| private static final ConcreteMethod canonicalMethod = new ConcreteMethod( |
| "String", "m", "returns " + EMPTY + ";", AccessFlag.PUBLIC); |
| |
| @Test(enabled = false, groups = "vm", dataProvider = "allShapes") |
| public void separateCompilationTest(Hierarchy hs) { |
| ClassCase cc = hs.root; |
| Type type = sourceTypeFrom(hs.root); |
| |
| Class specimen = null; |
| if (type instanceof Class) { |
| Class ctype = (Class)type; |
| if (ctype.isAbstract()) { |
| specimen = new Class("Test" + ctype.getName(), ctype); |
| } else { |
| specimen = ctype; |
| } |
| } else { |
| specimen = new Class("Test" + type.getName(), (Interface)type); |
| } |
| |
| String value = getExpectedResult(cc); |
| if (value != null) { |
| assertInvokeVirtualEquals(value, specimen, canonicalMethod, EMPTY); |
| } else { |
| assertThrows(AbstractMethodError.class, specimen, |
| canonicalMethod, EMPTY); |
| } |
| } |
| |
| @AfterMethod |
| public void printCaseError(ITestResult result) { |
| if (result.getStatus() == ITestResult.FAILURE) { |
| Hierarchy hs = (Hierarchy)result.getParameters()[0]; |
| System.out.println("Separate compilation case " + hs); |
| printCaseDetails(hs); |
| } |
| } |
| |
| @AfterSuite |
| public void cleanupCompilerCache() { |
| Compiler.purgeCache(); |
| } |
| |
| private void printCaseDetails(Hierarchy hs) { |
| String exp = getExpectedResult(hs.root); |
| for (String s : hs.getDescription()) { |
| System.out.println(" " + s); |
| } |
| if (exp != null) { |
| System.out.println(" Expected \"" + exp + "\""); |
| } else { |
| System.out.println(" Expected AbstractMethodError"); |
| } |
| } |
| |
| private Type sourceTypeFrom(ClassCase cc) { |
| Type type = null; |
| |
| if (cc.isInterface()) { |
| Interface iface = new Interface(cc.getName()); |
| for (ClassCase scc : cc.getInterfaces()) { |
| Interface supertype = (Interface)sourceTypeFrom(scc); |
| iface.addSuperType(supertype); |
| } |
| type = iface; |
| } else { |
| Class cls = new Class(cc.getName()); |
| if (cc.hasSuperclass()) { |
| Class superc = (Class)sourceTypeFrom(cc.getSuperclass()); |
| cls.setSuperClass(superc); |
| } |
| for (ClassCase scc : cc.getInterfaces()) { |
| Interface supertype = (Interface)sourceTypeFrom(scc); |
| cls.addSuperType(supertype); |
| } |
| if (cc.isAbstract()) { |
| cls.getAccessFlags().add(AccessFlag.ABSTRACT); |
| } |
| type = cls; |
| } |
| Method method = methodFrom(cc); |
| if (method != null) { |
| type.addMethod(method); |
| } |
| return type; |
| } |
| |
| private Method methodFrom(ClassCase cc) { |
| switch (cc.kind) { |
| case IVAC: |
| case CNONE: return null; |
| case IPRESENT: |
| case CABSTRACT: |
| return new AbstractMethod("String", "m", AccessFlag.PUBLIC); |
| case IDEFAULT: |
| return new DefaultMethod( |
| "String", "m", "return \"" + cc.getName() + "\";"); |
| case CCONCRETE: |
| return new ConcreteMethod( |
| "String", "m", "return \"" + cc.getName() + "\";", |
| AccessFlag.PUBLIC); |
| default: |
| fail("Unknown method type in class"); |
| return null; |
| } |
| } |
| } |