aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.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/TearDownOnVmCrash.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.java144
1 files changed, 144 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.java
new file mode 100644
index 00000000..e381a70c
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.java
@@ -0,0 +1,144 @@
+/*
+ * 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.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+/**
+ * Formatter that doesn't create any output but tries to invoke the
+ * tearDown method on a testcase if that test was forked and caused a
+ * timeout or VM crash.
+ *
+ * <p>This formatter has some limitations, for details see the
+ * &lt;junit&gt; task's manual.</p>
+ *
+ * @since Ant 1.8.0
+ */
+public class TearDownOnVmCrash implements JUnitResultFormatter {
+
+ private String suiteName;
+
+ /**
+ * Records the suite's name to later determine the class to invoke
+ * tearDown on.
+ */
+ public void startTestSuite(final JUnitTest suite) {
+ suiteName = suite.getName();
+ if (suiteName != null &&
+ suiteName.endsWith(JUnitTask.NAME_OF_DUMMY_TEST)) {
+ // no way to know which class caused the timeout
+ suiteName = null;
+ }
+ }
+
+ /**
+ * Only invoke tearDown if the suite is known and not the dummy
+ * test we get when a Batch fails and the error is an actual
+ * error generated by Ant.
+ */
+ public void addError(final Test fakeTest, final Throwable t) {
+ if (suiteName != null
+ && fakeTest instanceof JUnitTaskMirrorImpl.VmExitErrorTest) {
+ tearDown();
+ }
+ }
+
+ // no need to implement the rest
+ public void addFailure(Test test, Throwable t) {}
+
+ public void addFailure(Test test, AssertionFailedError t) {}
+
+ public void startTest(Test test) {}
+
+ public void endTest(Test test) {}
+
+ public void endTestSuite(JUnitTest suite) {}
+
+ public void setOutput(OutputStream out) {}
+
+ public void setSystemOutput(String out) {}
+
+ public void setSystemError(String err) {}
+
+ private void tearDown() {
+ try {
+ // first try to load the class and let's hope it is on our
+ // classpath
+ Class testClass = null;
+ if (Thread.currentThread().getContextClassLoader() != null) {
+ try {
+ testClass = Thread.currentThread().getContextClassLoader()
+ .loadClass(suiteName);
+ } catch (ClassNotFoundException cnfe) {
+ // ignore
+ }
+ }
+ if (testClass == null && getClass().getClassLoader() != null) {
+ try {
+ testClass =
+ getClass().getClassLoader().loadClass(suiteName);
+ } catch (ClassNotFoundException cnfe) {
+ // ignore
+ }
+ }
+ if (testClass == null) {
+ // fall back to system classloader
+ testClass = Class.forName(suiteName);
+ }
+
+ // if the test has a suite method, then we can't know
+ // which test of the executed suite timed out, ignore it
+ try {
+ // check if there is a suite method
+ testClass.getMethod("suite", new Class[0]);
+ return;
+ } catch (NoSuchMethodException e) {
+ // no suite method
+ }
+
+ // a loadable class and no suite method
+ // no reason to check for JUnit 4 since JUnit4TestAdapter
+ // doesn't have any tearDown method.
+
+ try {
+ Method td = testClass.getMethod("tearDown", new Class[0]);
+ if (td.getReturnType() == Void.TYPE) {
+ td.invoke(testClass.newInstance(), new Object[0]);
+ }
+ } catch (NoSuchMethodException nsme) {
+ // no tearDown, fine
+ }
+
+ } catch (ClassNotFoundException cnfe) {
+ // class probably is not in our classpath, there is
+ // nothing we can do
+ } catch (InvocationTargetException ite) {
+ System.err.println("Caught an exception while trying to invoke"
+ + " tearDown: " + ite.getMessage());
+ } catch (Throwable t) {
+ System.err.println("Caught an exception while trying to invoke"
+ + " tearDown: " + t.getMessage());
+ }
+ }
+}