test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/shared/executor/AbstractReflectionTest.java
changeset 50243 4fac3c99487d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/vm/runtime/defmeth/shared/executor/AbstractReflectionTest.java	Wed May 23 17:09:49 2018 -0700
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2013, 2018, 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 vm.runtime.defmeth.shared.executor;
+
+import nsk.share.Pair;
+import vm.runtime.defmeth.shared.Constants;
+import vm.runtime.defmeth.shared.DefMethTest;
+import vm.runtime.defmeth.shared.MemoryClassLoader;
+import vm.runtime.defmeth.shared.Util;
+import vm.runtime.defmeth.shared.builder.TestBuilder;
+import vm.runtime.defmeth.shared.data.Clazz;
+import vm.runtime.defmeth.shared.data.ParamValueExtractor;
+import vm.runtime.defmeth.shared.data.Tester;
+import vm.runtime.defmeth.shared.data.method.param.Param;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Commmon ancestor for reflection-based tests (Method.invoke & MethodHandle.invokeWithArguments).
+ * Encapsulates all necessary state for test execution and contains some utility methods.
+ */
+public abstract class AbstractReflectionTest implements TestExecutor {
+    protected MemoryClassLoader cl;
+    protected Collection<? extends Tester> tests;
+    protected DefMethTest testInstance;
+
+    public AbstractReflectionTest(DefMethTest testInstance, MemoryClassLoader cl, Collection<? extends Tester> tests) {
+        this.testInstance = testInstance;
+        this.cl = cl;
+        this.tests = tests;
+    }
+
+    @Override
+    public MemoryClassLoader getLoader() {
+        return cl;
+    }
+
+    protected Class[] paramType(String desc) throws ClassNotFoundException {
+        Pair<String[],String> p = Util.parseDesc(desc);
+        Class[] ptypes = new Class[p.first.length];
+        for (int i = 0; i < ptypes.length; i++) {
+            ptypes[i] = Util.decodeClass(p.first[i], getLoader());
+        }
+        return ptypes;
+    }
+
+    public Class resolve(Clazz clazz) {
+        try {
+            return cl.loadClass(clazz.name());
+        } catch (ClassNotFoundException e) {
+            throw new Error(e);
+        }
+    }
+
+    protected Object[] values(Param[] params) {
+        Object[] result = new Object[params.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = new ParamValueExtractor(this, params[i]).value();
+        }
+        return result;
+    }
+
+    public List<Pair<Tester,Throwable>> run() {
+        List<Pair<Tester,Throwable>> errors = new ArrayList<>();
+
+        if (tests.isEmpty()) {
+            throw new IllegalStateException("No tests to run");
+        }
+
+        for (Tester t : tests) {
+            StringBuilder msg =
+                    new StringBuilder(String.format("\t%-30s: ", t.name()));
+
+            Throwable error = null;
+            try {
+                run(t);
+
+                msg.append("PASSED");
+            } catch (Throwable e) {
+                error = e;
+                errors.add(Pair.of(t,e));
+                msg.append("FAILED");
+            } finally {
+                testInstance.getLog().info(msg.toString());
+                if (error != null) {
+                    //testInstance.getLog().info("\t\t"+error.getMessage());
+                    testInstance.getLog().info("\t\t"+error);
+                    if (Constants.PRINT_STACK_TRACE) {
+                        error.printStackTrace();
+                    }
+                }
+            }
+        }
+
+        testInstance.addFailureCount(errors.isEmpty() ? 0 : 1);
+        return errors;
+    }
+}