aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java179
1 files changed, 179 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java
new file mode 100644
index 00000000..9a21caee
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs.optional.junit;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * Work around for some changes to the public JUnit API between
+ * different JUnit releases.
+ * @since Ant 1.7
+ */
+// CheckStyle:HideUtilityClassConstructorCheck OFF (bc)
+public class JUnitVersionHelper {
+
+ private static Method testCaseName = null;
+
+ /**
+ * Name of the JUnit4 class we look for.
+ * {@value}
+ * @since Ant 1.7.1
+ */
+ public static final String JUNIT_FRAMEWORK_JUNIT4_TEST_CASE_FACADE
+ = "junit.framework.JUnit4TestCaseFacade";
+ private static final String UNKNOWN_TEST_CASE_NAME = "unknown";
+
+ static {
+ try {
+ testCaseName = TestCase.class.getMethod("getName", new Class[0]);
+ } catch (NoSuchMethodException e) {
+ // pre JUnit 3.7
+ try {
+ testCaseName = TestCase.class.getMethod("name", new Class[0]);
+ } catch (NoSuchMethodException ignored) {
+ // ignore
+ }
+ }
+ }
+
+ /**
+ * JUnit 3.7 introduces TestCase.getName() and subsequent versions
+ * of JUnit remove the old name() method. This method provides
+ * access to the name of a TestCase via reflection that is
+ * supposed to work with version before and after JUnit 3.7.
+ *
+ * <p>since Ant 1.5.1 this method will invoke &quot;<code>public
+ * String getName()</code>&quot; on any implementation of Test if
+ * it exists.</p>
+ *
+ * <p>Since Ant 1.7 also checks for JUnit4TestCaseFacade explicitly.
+ * This is used by junit.framework.JUnit4TestAdapter.</p>
+ * @param t the test.
+ * @return the name of the test.
+ */
+ public static String getTestCaseName(Test t) {
+ if (t == null) {
+ return UNKNOWN_TEST_CASE_NAME;
+ }
+ if (t.getClass().getName().equals(JUNIT_FRAMEWORK_JUNIT4_TEST_CASE_FACADE)) {
+ // Self-describing as of JUnit 4 (#38811). But trim "(ClassName)".
+ String name = t.toString();
+ if (name.endsWith(")")) {
+ int paren = name.lastIndexOf('(');
+ return name.substring(0, paren);
+ } else {
+ return name;
+ }
+ }
+ if (t instanceof TestCase && testCaseName != null) {
+ try {
+ return (String) testCaseName.invoke(t, new Object[0]);
+ } catch (Throwable ignored) {
+ // ignore
+ }
+ } else {
+ try {
+ Method getNameMethod = null;
+ try {
+ getNameMethod =
+ t.getClass().getMethod("getName", new Class [0]);
+ } catch (NoSuchMethodException e) {
+ getNameMethod = t.getClass().getMethod("name",
+ new Class [0]);
+ }
+ if (getNameMethod != null
+ && getNameMethod.getReturnType() == String.class) {
+ return (String) getNameMethod.invoke(t, new Object[0]);
+ }
+ } catch (Throwable ignored) {
+ // ignore
+ }
+ }
+ return UNKNOWN_TEST_CASE_NAME;
+ }
+
+ /**
+ * Tries to find the name of the class which a test represents
+ * across JUnit 3 and 4. For JUnit4 it parses the toString() value of the
+ * test, and extracts it from there.
+ * @since Ant 1.7.1 (it was private until then)
+ * @param test test case to look at
+ * @return the extracted class name.
+ */
+ public static String getTestCaseClassName(Test test) {
+ String className = test.getClass().getName();
+ if (test instanceof JUnitTaskMirrorImpl.VmExitErrorTest) {
+ className = ((JUnitTaskMirrorImpl.VmExitErrorTest) test).getClassName();
+ } else
+ if (className.equals(JUNIT_FRAMEWORK_JUNIT4_TEST_CASE_FACADE)) {
+ // JUnit 4 wraps solo tests this way. We can extract
+ // the original test name with a little hack.
+ String name = test.toString();
+ int paren = name.lastIndexOf('(');
+ if (paren != -1 && name.endsWith(")")) {
+ className = name.substring(paren + 1, name.length() - 1);
+ }
+ }
+ return className;
+ }
+
+ public static String getIgnoreMessage(Test test) {
+ String message = null;
+
+ try {
+ Class<?> junit4FacadeClass = Class.forName("junit.framework.JUnit4TestCaseFacade");
+ if (test != null && test.getClass().isAssignableFrom(junit4FacadeClass)) {
+ //try and get the message coded as part of the ignore
+ /*
+ * org.junit.runner.Description contains a getAnnotation(Class) method... but this
+ * wasn't in older versions of JUnit4 so we have to try and do this by reflection
+ */
+ Class<?> testClass = Class.forName(JUnitVersionHelper.getTestCaseClassName(test));
+
+ Method testMethod = testClass.getMethod(JUnitVersionHelper.getTestCaseName(test));
+ Class ignoreAnnotation = Class.forName("org.junit.Ignore");
+ Annotation annotation = testMethod.getAnnotation(ignoreAnnotation);
+ if (annotation != null) {
+ Method valueMethod = annotation.getClass().getMethod("value");
+ String value = (String) valueMethod.invoke(annotation);
+ if (value != null && value.length() > 0) {
+ message = value;
+ }
+ }
+
+ }
+ } catch (NoSuchMethodException e) {
+ // silently ignore - we'll report a skip with no message
+ } catch (ClassNotFoundException e) {
+ // silently ignore - we'll report a skip with no message
+ } catch (InvocationTargetException e) {
+ // silently ignore - we'll report a skip with no message
+ } catch (IllegalAccessException e) {
+ // silently ignore - we'll report a skip with no message
+ }
+ return message;
+
+ }
+
+}