You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2016/05/22 16:38:59 UTC

[1/3] ant git commit: linefeeds

Repository: ant
Updated Branches:
  refs/heads/1.9.x de5b4058b -> e982f0195


linefeeds


Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/3966616f
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/3966616f
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/3966616f

Branch: refs/heads/1.9.x
Commit: 3966616f2cf74ff6b9e1944ff7cf013a6a229d03
Parents: de5b405
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun May 22 18:33:55 2016 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun May 22 18:33:55 2016 +0200

----------------------------------------------------------------------
 .../optional/junit/JUnitTestRunnerTest.java     | 434 +++++++++----------
 1 file changed, 217 insertions(+), 217 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant/blob/3966616f/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
index c0d33e6..a75c5cb 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
@@ -1,217 +1,217 @@
-/*
- *  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 static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.tools.ant.BuildException;
-import org.junit.Test;
-
-/**
- * Small testcase for the runner, tests are very very very basics.
- * They must be enhanced with time.
- *
- */
-public class JUnitTestRunnerTest{
-
-  
-
-    // check that a valid method name generates no errors
-    @Test
-    public void testValidMethod(){
-        TestRunner runner = createRunnerForTestMethod(ValidMethodTestCase.class,"testA");
-        runner.run();
-        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
-    }
-
-    // check that having an invalid method name generates an error
-    @Test
-    public void testInvalidMethod(){
-        TestRunner runner = createRunnerForTestMethod(InvalidMethodTestCase.class,"testInvalid");
-        runner.run();
-        String error = runner.getFormatter().getError();
-        // might be FAILURES or ERRORS depending on JUnit version?
-        assertTrue(error, runner.getRetCode() != JUnitTestRunner.SUCCESS);
-    }    
-    
-    // check that having no suite generates no errors
-    @Test
-    public void testNoSuite(){
-        TestRunner runner = createRunner(NoSuiteTestCase.class);
-        runner.run();
-        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
-    }
-
-    // check that a suite generates no errors
-    @Test
-    public void testSuite(){
-        TestRunner runner = createRunner(SuiteTestCase.class);
-        runner.run();
-        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
-    }
-
-    // check that an invalid suite generates an error.
-    @Test
-    public void testInvalidSuite(){
-        TestRunner runner = createRunner(InvalidSuiteTestCase.class);
-        runner.run();
-        String error = runner.getFormatter().getError();
-        assertEquals(error, JUnitTestRunner.ERRORS, runner.getRetCode());
-        assertTrue(error, error.indexOf("thrown on purpose") != -1);
-    }
-
-    // check that something which is not a testcase generates no errors
-    // at first even though this is incorrect.
-    @Test
-    public void testNoTestCase(){
-        TestRunner runner = createRunner(NoTestCase.class);
-        runner.run();
-        // On junit3 this is a FAILURE, on junit4 this is an ERROR
-        int ret = runner.getRetCode();
-        
-        if (ret != JUnitTestRunner.FAILURES && ret != JUnitTestRunner.ERRORS) {
-            fail("Unexpected result " + ret + " from junit runner");
-        }
-        // JUnit3 test
-        //assertEquals(runner.getFormatter().getError(), JUnitTestRunner.FAILURES, runner.getRetCode());
-    }
-
-    // check that an exception in the constructor is noticed
-    @Test
-    public void testInvalidTestCase(){
-        TestRunner runner = createRunner(InvalidTestCase.class);
-        runner.run();
-        // On junit3 this is a FAILURE, on junit4 this is an ERROR
-        int ret = runner.getRetCode();
-        if (ret != JUnitTestRunner.FAILURES && ret != JUnitTestRunner.ERRORS) {
-            fail("Unexpected result " + ret + " from junit runner");
-        }
-        // JUNIT3 test
-        //assertEquals(error, JUnitTestRunner.FAILURES, runner.getRetCode());
-        //@fixme as of now does not report the original stacktrace.
-        //assertTrue(error, error.indexOf("thrown on purpose") != -1);
-    }
-
-    protected TestRunner createRunner(Class<?> clazz){
-        return new TestRunner(new JUnitTest(clazz.getName()), null, 
-                                            true, true, true);
-    }
-
-    protected TestRunner createRunnerForTestMethod(Class<?> clazz, String method){
-        return new TestRunner(new JUnitTest(clazz.getName()), new String[] {method},
-                                            true, true, true);
-    }    
-    
-    // the test runner that wrap the dummy formatter that interests us
-    private final static class TestRunner extends JUnitTestRunner {
-        private ResultFormatter formatter = new ResultFormatter();
-        TestRunner(JUnitTest test, String[] methods, boolean haltonerror,
-                   boolean filtertrace, boolean haltonfailure){
-            super(test, methods, haltonerror, filtertrace,  haltonfailure, 
-                  false, false, TestRunner.class.getClassLoader());
-            // use the classloader that loaded this class otherwise
-            // it will not be able to run inner classes if this test
-            // is ran in non-forked mode.
-            addFormatter(formatter);
-        }
-        ResultFormatter getFormatter(){
-            return formatter;
-        }
-    }
-
-    // dummy formatter just to catch the error
-    private final static class ResultFormatter implements JUnitResultFormatter {
-        private Throwable error;
-        public void setSystemOutput(String output){}
-        public void setSystemError(String output){}
-        public void startTestSuite(JUnitTest suite) throws BuildException{}
-        public void endTestSuite(JUnitTest suite) throws BuildException{}
-        public void setOutput(java.io.OutputStream out){}
-        public void startTest(junit.framework.Test t) {}
-        public void endTest(junit.framework.Test test) {}
-        public void addFailure(junit.framework.Test test, AssertionFailedError t) { }
-        public void addError(junit.framework.Test test, Throwable t) {
-            error = t;
-        }
-        String getError(){
-            if (error == null){
-                return "";
-            }
-            StringWriter sw = new StringWriter();
-            error.printStackTrace(new PrintWriter(sw));
-            return sw.toString();
-        }
-    }
-
-    public static class NoTestCase {
-    }
-
-    public static class InvalidMethodTestCase extends TestCase {
-        public InvalidMethodTestCase(String name){ super(name); }
-        public void testA(){
-            throw new NullPointerException("thrown on purpose");
-        }
-    }
-
-    public static class ValidMethodTestCase extends TestCase {
-        public ValidMethodTestCase(String name){ super(name); }
-        public void testA(){
-            // expected to be executed
-        }
-        public void testB(){
-            // should not be executed
-            throw new NullPointerException("thrown on purpose");
-        }
-    }    
-    
-    public static class InvalidTestCase extends TestCase {
-        public InvalidTestCase(String name){
-            super(name);
-            throw new NullPointerException("thrown on purpose");
-        }
-    }
-
-    public static class NoSuiteTestCase extends TestCase {
-        public NoSuiteTestCase(String name){ super(name); }
-        public void testA(){}
-    }
-
-    public static class SuiteTestCase extends NoSuiteTestCase {
-        public SuiteTestCase(String name){ super(name); }
-        public static junit.framework.Test suite(){
-            return new TestSuite(SuiteTestCase.class);
-        }
-    }
-
-    public static class InvalidSuiteTestCase extends NoSuiteTestCase {
-        public InvalidSuiteTestCase(String name){ super(name); }
-        public static junit.framework.Test suite(){
-            throw new NullPointerException("thrown on purpose");
-        }
-    }
-}
-
+/*
+ *  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 static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.tools.ant.BuildException;
+import org.junit.Test;
+
+/**
+ * Small testcase for the runner, tests are very very very basics.
+ * They must be enhanced with time.
+ *
+ */
+public class JUnitTestRunnerTest{
+
+  
+
+    // check that a valid method name generates no errors
+    @Test
+    public void testValidMethod(){
+        TestRunner runner = createRunnerForTestMethod(ValidMethodTestCase.class,"testA");
+        runner.run();
+        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
+    }
+
+    // check that having an invalid method name generates an error
+    @Test
+    public void testInvalidMethod(){
+        TestRunner runner = createRunnerForTestMethod(InvalidMethodTestCase.class,"testInvalid");
+        runner.run();
+        String error = runner.getFormatter().getError();
+        // might be FAILURES or ERRORS depending on JUnit version?
+        assertTrue(error, runner.getRetCode() != JUnitTestRunner.SUCCESS);
+    }    
+    
+    // check that having no suite generates no errors
+    @Test
+    public void testNoSuite(){
+        TestRunner runner = createRunner(NoSuiteTestCase.class);
+        runner.run();
+        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
+    }
+
+    // check that a suite generates no errors
+    @Test
+    public void testSuite(){
+        TestRunner runner = createRunner(SuiteTestCase.class);
+        runner.run();
+        assertEquals(runner.getFormatter().getError(), JUnitTestRunner.SUCCESS, runner.getRetCode());
+    }
+
+    // check that an invalid suite generates an error.
+    @Test
+    public void testInvalidSuite(){
+        TestRunner runner = createRunner(InvalidSuiteTestCase.class);
+        runner.run();
+        String error = runner.getFormatter().getError();
+        assertEquals(error, JUnitTestRunner.ERRORS, runner.getRetCode());
+        assertTrue(error, error.indexOf("thrown on purpose") != -1);
+    }
+
+    // check that something which is not a testcase generates no errors
+    // at first even though this is incorrect.
+    @Test
+    public void testNoTestCase(){
+        TestRunner runner = createRunner(NoTestCase.class);
+        runner.run();
+        // On junit3 this is a FAILURE, on junit4 this is an ERROR
+        int ret = runner.getRetCode();
+        
+        if (ret != JUnitTestRunner.FAILURES && ret != JUnitTestRunner.ERRORS) {
+            fail("Unexpected result " + ret + " from junit runner");
+        }
+        // JUnit3 test
+        //assertEquals(runner.getFormatter().getError(), JUnitTestRunner.FAILURES, runner.getRetCode());
+    }
+
+    // check that an exception in the constructor is noticed
+    @Test
+    public void testInvalidTestCase(){
+        TestRunner runner = createRunner(InvalidTestCase.class);
+        runner.run();
+        // On junit3 this is a FAILURE, on junit4 this is an ERROR
+        int ret = runner.getRetCode();
+        if (ret != JUnitTestRunner.FAILURES && ret != JUnitTestRunner.ERRORS) {
+            fail("Unexpected result " + ret + " from junit runner");
+        }
+        // JUNIT3 test
+        //assertEquals(error, JUnitTestRunner.FAILURES, runner.getRetCode());
+        //@fixme as of now does not report the original stacktrace.
+        //assertTrue(error, error.indexOf("thrown on purpose") != -1);
+    }
+
+    protected TestRunner createRunner(Class<?> clazz){
+        return new TestRunner(new JUnitTest(clazz.getName()), null, 
+                                            true, true, true);
+    }
+
+    protected TestRunner createRunnerForTestMethod(Class<?> clazz, String method){
+        return new TestRunner(new JUnitTest(clazz.getName()), new String[] {method},
+                                            true, true, true);
+    }    
+    
+    // the test runner that wrap the dummy formatter that interests us
+    private final static class TestRunner extends JUnitTestRunner {
+        private ResultFormatter formatter = new ResultFormatter();
+        TestRunner(JUnitTest test, String[] methods, boolean haltonerror,
+                   boolean filtertrace, boolean haltonfailure){
+            super(test, methods, haltonerror, filtertrace,  haltonfailure, 
+                  false, false, TestRunner.class.getClassLoader());
+            // use the classloader that loaded this class otherwise
+            // it will not be able to run inner classes if this test
+            // is ran in non-forked mode.
+            addFormatter(formatter);
+        }
+        ResultFormatter getFormatter(){
+            return formatter;
+        }
+    }
+
+    // dummy formatter just to catch the error
+    private final static class ResultFormatter implements JUnitResultFormatter {
+        private Throwable error;
+        public void setSystemOutput(String output){}
+        public void setSystemError(String output){}
+        public void startTestSuite(JUnitTest suite) throws BuildException{}
+        public void endTestSuite(JUnitTest suite) throws BuildException{}
+        public void setOutput(java.io.OutputStream out){}
+        public void startTest(junit.framework.Test t) {}
+        public void endTest(junit.framework.Test test) {}
+        public void addFailure(junit.framework.Test test, AssertionFailedError t) { }
+        public void addError(junit.framework.Test test, Throwable t) {
+            error = t;
+        }
+        String getError(){
+            if (error == null){
+                return "";
+            }
+            StringWriter sw = new StringWriter();
+            error.printStackTrace(new PrintWriter(sw));
+            return sw.toString();
+        }
+    }
+
+    public static class NoTestCase {
+    }
+
+    public static class InvalidMethodTestCase extends TestCase {
+        public InvalidMethodTestCase(String name){ super(name); }
+        public void testA(){
+            throw new NullPointerException("thrown on purpose");
+        }
+    }
+
+    public static class ValidMethodTestCase extends TestCase {
+        public ValidMethodTestCase(String name){ super(name); }
+        public void testA(){
+            // expected to be executed
+        }
+        public void testB(){
+            // should not be executed
+            throw new NullPointerException("thrown on purpose");
+        }
+    }    
+    
+    public static class InvalidTestCase extends TestCase {
+        public InvalidTestCase(String name){
+            super(name);
+            throw new NullPointerException("thrown on purpose");
+        }
+    }
+
+    public static class NoSuiteTestCase extends TestCase {
+        public NoSuiteTestCase(String name){ super(name); }
+        public void testA(){}
+    }
+
+    public static class SuiteTestCase extends NoSuiteTestCase {
+        public SuiteTestCase(String name){ super(name); }
+        public static junit.framework.Test suite(){
+            return new TestSuite(SuiteTestCase.class);
+        }
+    }
+
+    public static class InvalidSuiteTestCase extends NoSuiteTestCase {
+        public InvalidSuiteTestCase(String name){ super(name); }
+        public static junit.framework.Test suite(){
+            throw new NullPointerException("thrown on purpose");
+        }
+    }
+}
+


[3/3] ant git commit: record fix for 58982 by Dana Dahlstrom

Posted by bo...@apache.org.
record fix for 58982 by Dana Dahlstrom

https://bz.apache.org/bugzilla/show_bug.cgi?id=58982


Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/e982f019
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/e982f019
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/e982f019

Branch: refs/heads/1.9.x
Commit: e982f01953984e633e1415b7c06d56afcc2048d7
Parents: 421ae34
Author: Stefan Bodewig <bo...@apache.org>
Authored: Sun May 22 18:38:10 2016 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun May 22 18:38:10 2016 +0200

----------------------------------------------------------------------
 CONTRIBUTORS     | 1 +
 WHATSNEW         | 4 ++++
 contributors.xml | 4 ++++
 3 files changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant/blob/e982f019/CONTRIBUTORS
----------------------------------------------------------------------
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 8e47e05..3b7b5ab 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -77,6 +77,7 @@ D'Arcy Smith
 Dale Anson
 Dale Sherwood
 Dan Armbrust
+Dana Dahlstrom
 Daniel Henrique
 Daniel Ribagnac
 Daniel Spilker

http://git-wip-us.apache.org/repos/asf/ant/blob/e982f019/WHATSNEW
----------------------------------------------------------------------
diff --git a/WHATSNEW b/WHATSNEW
index 25a0464..cddd662 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -27,6 +27,10 @@ Fixed bugs:
 Other changes:
 --------------
 
+ * <junit> now initializes the cause of the AssertionFailedError when
+   converting from AssertionError.
+   Bugzilla Report 58982
+
 Changes from Ant 1.9.6 TO Ant 1.9.7
 ===================================
 

http://git-wip-us.apache.org/repos/asf/ant/blob/e982f019/contributors.xml
----------------------------------------------------------------------
diff --git a/contributors.xml b/contributors.xml
index 2bfa1b0..0a079d2 100644
--- a/contributors.xml
+++ b/contributors.xml
@@ -332,6 +332,10 @@
     <last>Armbrust</last>
   </name>
   <name>
+    <first>Dana</first>
+    <last>Dahlstrom</last>
+  </name>
+  <name>
     <first>Daniel</first>
     <last>Henrique</last>
   </name>


[2/3] ant git commit: Preserve cause of AssertionError

Posted by bo...@apache.org.
Preserve cause of AssertionError

\u2026 when converting to AssertionFailedError in JUnitTestRunner.


Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/421ae34d
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/421ae34d
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/421ae34d

Branch: refs/heads/1.9.x
Commit: 421ae34d7037a8cbdb372e938e269caa081b7166
Parents: 3966616
Author: Dana Dahlstrom <da...@googlers.com>
Authored: Mon Feb 8 21:40:56 2016 -0800
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sun May 22 18:34:28 2016 +0200

----------------------------------------------------------------------
 .../optional/junit/JUnitTestRunner.java         |  1 +
 .../optional/junit/JUnitTestRunnerTest.java     | 30 +++++++++++++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant/blob/421ae34d/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
index a457375..0397d84 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
@@ -1240,6 +1240,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                     final String msg = t.getMessage();
                     final AssertionFailedError failure = msg != null
                         ? new AssertionFailedError(msg) : new AssertionFailedError();
+                    failure.initCause(t.getCause());
                     failure.setStackTrace(t.getStackTrace());
                     testListener.addFailure(test, failure);
                 } else {

http://git-wip-us.apache.org/repos/asf/ant/blob/421ae34d/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
index a75c5cb..e5092fe 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java
@@ -116,6 +116,20 @@ public class JUnitTestRunnerTest{
         //assertTrue(error, error.indexOf("thrown on purpose") != -1);
     }
 
+    // check that JUnit 4 synthetic AssertionFailedError gets message and cause from AssertionError
+    @Test
+    public void testJUnit4AssertionError(){
+        TestRunner runner = createRunnerForTestMethod(AssertionErrorTest.class,"throwsAssertionError");
+        runner.run();
+
+        AssertionFailedError failure = runner.getFormatter().getFailure();
+        assertEquals("failure message", failure.getMessage());
+
+        Throwable cause = failure.getCause();
+        assertEquals(RuntimeException.class, cause.getClass());
+        assertEquals("cause message", cause.getMessage());
+    }
+
     protected TestRunner createRunner(Class<?> clazz){
         return new TestRunner(new JUnitTest(clazz.getName()), null, 
                                             true, true, true);
@@ -145,6 +159,7 @@ public class JUnitTestRunnerTest{
 
     // dummy formatter just to catch the error
     private final static class ResultFormatter implements JUnitResultFormatter {
+        private AssertionFailedError failure;
         private Throwable error;
         public void setSystemOutput(String output){}
         public void setSystemError(String output){}
@@ -153,7 +168,12 @@ public class JUnitTestRunnerTest{
         public void setOutput(java.io.OutputStream out){}
         public void startTest(junit.framework.Test t) {}
         public void endTest(junit.framework.Test test) {}
-        public void addFailure(junit.framework.Test test, AssertionFailedError t) { }
+        public void addFailure(junit.framework.Test test, AssertionFailedError t) {
+            failure = t;
+        }
+        AssertionFailedError getFailure() {
+            return failure;
+        }
         public void addError(junit.framework.Test test, Throwable t) {
             error = t;
         }
@@ -213,5 +233,13 @@ public class JUnitTestRunnerTest{
             throw new NullPointerException("thrown on purpose");
         }
     }
+
+    public static class AssertionErrorTest {
+        @Test public void throwsAssertionError() {
+            AssertionError assertionError = new AssertionError("failure message");
+            assertionError.initCause(new RuntimeException("cause message"));
+            throw assertionError;
+        }
+    }
 }