test/hotspot/jtreg/runtime/InvocationTests/shared/AbstractGenerator.java
changeset 55497 d3a33953b936
child 55552 9bd13d6dea77
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/runtime/InvocationTests/shared/AbstractGenerator.java	Wed Jun 26 09:06:32 2019 -0400
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2009, 2019, 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.
+ *
+ */
+
+package shared;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ *
+ */
+public abstract class AbstractGenerator {
+    protected final boolean dumpClasses;
+    protected final boolean executeTests;
+    private static int testNum = 0;
+
+    protected AbstractGenerator(String[] args) {
+        List<String> params = new ArrayList<String>(Arrays.asList(args));
+
+        if (params.contains("--help")) {
+            Utils.printHelp();
+            System.exit(0);
+        }
+
+        dumpClasses = params.contains("--dump");
+        executeTests = !params.contains("--noexecute");
+
+        params.remove("--dump");
+        params.remove("--noexecute");
+
+        Utils.init(params);
+    }
+
+    /*******************************************************************/
+    public static void writeToFile(File dir, Map<String, byte[]> classes) {
+        for (String name : classes.keySet()) {
+            try {
+                writeToFile(dir, name, classes.get(name));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /*******************************************************************/
+    public static void writeToFile(File dir, String fullName, byte[] classBytecode) {
+        if (!dir.isDirectory()) {
+            throw new RuntimeException("Invalid parameter: dir doesn't point to an existing directory");
+        }
+
+        File classFile =
+            new File(
+                    dir.getPath() + File.separator
+                    + fullName.replaceAll("\\.", File.separator)
+                    + ".class"
+                    );
+
+        classFile.getParentFile().mkdirs();
+
+        try {
+            FileOutputStream fos = new FileOutputStream(classFile);
+            try {
+                fos.write(classBytecode);
+            } finally {
+                fos.close();
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected boolean exec(Map<String, byte[]> classes, String description, String calleeClassName, String classNameC, String[] callSites) throws ClassNotFoundException {
+        boolean isPassed = true;
+
+        testNum++;
+
+        String caseDescription = String.format("%4d| %s", testNum, description);
+
+        // Create test executor for a single case
+        classes.put(
+                ExecutorGenerator.className
+                , new ExecutorGenerator(
+                        caseDescription
+                        , calleeClassName
+                        , classNameC
+                    ).generateExecutor(callSites)
+        );
+
+        // Dump generated set to disk, if needed
+        if (dumpClasses) {
+            File dir = new File("classes" + File.separator + String.format("%04d", testNum));
+            dir.mkdirs();
+            writeToFile(dir, classes);
+        }
+
+        ByteArrayClassLoader loader = new ByteArrayClassLoader(classes);
+
+        Class paramClass;
+        Class targetClass;
+        Checker checker;
+
+        try {
+            paramClass = loader.loadClass(calleeClassName);
+            targetClass = loader.loadClass(classNameC);
+
+            checker = getChecker(paramClass, targetClass);
+        } catch (Throwable e) {
+            String result = Checker.abbreviateResult(e.getClass().getName());
+
+            System.out.printf(caseDescription);
+
+            for (String site : callSites) {
+                System.out.printf(" %7s", result);
+            }
+
+            System.out.println("");
+
+            return true;
+        }
+
+        if (executeTests) {
+            // Check runtime behavior
+            Caller caller = new Caller(loader, checker, paramClass, targetClass);
+            boolean printedCaseDes = false;
+            for (String site : callSites) {
+                String callResult = caller.call(site);
+
+                if (!caller.isPassed()) {
+                    isPassed = false;
+                    if (!printedCaseDes) {
+                        System.out.printf(caseDescription);
+                        printedCaseDes = true;
+                    }
+                    System.out.printf(" %7s", callResult);
+                }
+            }
+            if (!caller.isPassed()) {
+                System.out.println(" |   FAILED");
+            }
+        } else {
+            for (String site : callSites) {
+                String result = checker.check(loader.loadClass(site));
+                System.out.printf(" %7s", Checker.abbreviateResult(result));
+            }
+        }
+
+        return isPassed;
+    }
+
+    protected abstract Checker getChecker(Class paramClass, Class targetClass);
+}