This is a refactoring that have too much impact on the Ant JUnit code, therefore I'm experimenting some ideas here. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270535 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,127 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit; | |||||
| import java.lang.reflect.Method; | |||||
| import junit.framework.Test; | |||||
| import junit.framework.TestSuite; | |||||
| /** | |||||
| * A set of helpers functions to deal with JUnit. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public final class JUnitHelper { | |||||
| private static final String SUITE_METHODNAME = "suite"; | |||||
| /** | |||||
| * This method parse the output of the method <tt>toString()</tt> | |||||
| * from the <tt>TestCase</tt> class. The format returned is: | |||||
| * <tt>name(classname)</tt> | |||||
| * @return an array with the elements in the order name, classname. | |||||
| */ | |||||
| public static String[] parseTestString(String testname){ | |||||
| int p1 = testname.indexOf('('); | |||||
| int p2 = testname.indexOf(')', p1); | |||||
| return new String[]{ | |||||
| testname.substring(0, p1), | |||||
| testname.substring(p1 + 1, p2) }; | |||||
| } | |||||
| /** | |||||
| * Returns the Test corresponding to to the given class name | |||||
| * @param classname the classname of the test we want to extract. | |||||
| * @throws Exception a generic exception | |||||
| */ | |||||
| public static Test getTest(ClassLoader loader, String classname) throws Exception { | |||||
| Class clazz = null; | |||||
| if (loader == null) { | |||||
| clazz = Class.forName(classname); | |||||
| } else { | |||||
| loader.loadClass(classname); | |||||
| } | |||||
| return getTest(clazz); | |||||
| } | |||||
| /** | |||||
| * Extract a test from a given class | |||||
| * @param clazz the class to extract a test from. | |||||
| * @throws Exception a generic exception | |||||
| */ | |||||
| public static Test getTest(Class clazz) { | |||||
| try { | |||||
| Object obj = clazz.newInstance(); | |||||
| if (obj instanceof TestSuite){ | |||||
| return (TestSuite) obj; | |||||
| } | |||||
| } catch (Exception e){ | |||||
| } | |||||
| try { | |||||
| // check if there is a suite method | |||||
| Method suiteMethod = clazz.getMethod(SUITE_METHODNAME, new Class[0]); | |||||
| return (Test) suiteMethod.invoke(null, new Class[0]); | |||||
| } catch (Exception e) { | |||||
| } | |||||
| // try to extract a test suite automatically | |||||
| // this will generate warnings if the class is no suitable Test | |||||
| try { | |||||
| return new TestSuite(clazz); | |||||
| } catch (Exception e){ | |||||
| } | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,120 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit; | |||||
| import java.util.Properties; | |||||
| /** | |||||
| * A test sequence listener listening for a batch test run. | |||||
| * | |||||
| * <i> | |||||
| * This code is based on the code from Erich Gamma made for the | |||||
| * JUnit plugin for Eclipse. {@link http://www.eclipse.org} and is merged | |||||
| * with code originating from Ant 1.4.x. | |||||
| * </i> | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public interface TestRunListener { | |||||
| /** Some tests failed. */ | |||||
| public final static int STATUS_FAILURE = 1; | |||||
| /** An error occured. */ | |||||
| public final static int STATUS_ERROR = 2; | |||||
| /** | |||||
| * A test has started. | |||||
| * @param a testname made of the testname and testcase classname. | |||||
| * in the following format: <tt><testname>(<testcase>)</tt> | |||||
| */ | |||||
| public void testStarted(String testname); | |||||
| /** | |||||
| * A test ended. | |||||
| * @param a testname made of the testname and testcase classname. | |||||
| * in the following format: <tt><testname>(<testcase>)</tt> | |||||
| */ | |||||
| public void testEnded(String testname); | |||||
| /** | |||||
| * A test has failed. | |||||
| * @param status failure or error status code. | |||||
| * @param a testname made of the testname and testcase classname. | |||||
| * in the following format: <tt><testname>(<testcase>)</tt> | |||||
| * @param trace the error/failure stacktrace. | |||||
| * @todo change this to a testFailure / testError ? | |||||
| */ | |||||
| public void testFailed(int status, String testname, String trace); | |||||
| /** test logged this line on stdout */ | |||||
| public void testStdOutLine(String testname, String line); | |||||
| /** test logged this line on sterr */ | |||||
| public void testStdErrLine(String testname, String line); | |||||
| /** these system properties are used on the remote client */ | |||||
| public void testRunSystemProperties(Properties props); | |||||
| /** starting a sequence of <tt>testcount</tt> tests. */ | |||||
| public void testRunStarted(int testcount); | |||||
| /** ending gracefully the sequence after <tt>elapsedtime</tt> ms. */ | |||||
| public void testRunEnded(long elapsedtime); | |||||
| /** stopping the sequence after <tt>elapsedtime</tt> ms. */ | |||||
| public void testRunStopped(long elapsedtime); | |||||
| } | |||||
| @@ -0,0 +1,115 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit; | |||||
| import junit.extensions.TestDecorator; | |||||
| import junit.framework.AssertionFailedError; | |||||
| import junit.framework.Test; | |||||
| import junit.framework.TestResult; | |||||
| /** | |||||
| * A Test decorator that allows to cancel a test if it exceeds | |||||
| * a certain time. It can be used globally or individually over | |||||
| * each testcase. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class WatchdogTest extends TestDecorator { | |||||
| /** the time out delay in msecs */ | |||||
| protected long timeOut; | |||||
| /** | |||||
| * Create a new watchdog. | |||||
| * @param test the test to watch for | |||||
| * @param msecs the time out delay in msecs. | |||||
| */ | |||||
| public WatchdogTest(Test test, long msecs) { | |||||
| super(test); | |||||
| timeOut = msecs; | |||||
| } | |||||
| public void run(TestResult result) { | |||||
| Thread worker = createWorker(result); | |||||
| worker.start(); | |||||
| try { | |||||
| // wait at most the timeOut time. | |||||
| worker.join(timeOut); | |||||
| // if the thread is still alive, it must be killed. | |||||
| if (worker.isAlive()) { | |||||
| worker.interrupt(); | |||||
| result.addFailure(getTest(), | |||||
| new AssertionFailedError("Timed out after " + timeOut + "ms")); | |||||
| } | |||||
| } catch (InterruptedException e) { | |||||
| worker.interrupt(); | |||||
| result.addError(getTest(), e); | |||||
| result.stop(); | |||||
| } | |||||
| } | |||||
| /** create a new worker thread */ | |||||
| protected Thread createWorker(final TestResult result) { | |||||
| Thread worker = new Thread("JUnit Test Worker") { | |||||
| public void run() { | |||||
| getTest().run(result); | |||||
| } | |||||
| }; | |||||
| return worker; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,160 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.io.BufferedWriter; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStream; | |||||
| import java.io.OutputStreamWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.util.Properties; | |||||
| /** | |||||
| * Provide a common set of attributes and methods to factorize | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public abstract class BaseFormatter implements Formatter { | |||||
| protected OutputStream out; | |||||
| protected PrintWriter writer; | |||||
| protected int errorCount; | |||||
| protected int failureCount; | |||||
| protected int runCount; | |||||
| protected Properties props; | |||||
| public void setOutput(OutputStream value) { | |||||
| out = value; | |||||
| try { | |||||
| writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, "UTF8")), true); | |||||
| } catch (IOException e){ | |||||
| // should not happen | |||||
| throw new IllegalStateException(e.getMessage()); | |||||
| } | |||||
| } | |||||
| protected void finalize() throws Throwable { | |||||
| super.finalize(); | |||||
| close(); | |||||
| } | |||||
| public void setSystemOutput(String out) { | |||||
| } | |||||
| public void setSystemError(String err) { | |||||
| } | |||||
| public void testStdOutLine(String testname, String line) { | |||||
| } | |||||
| public void testStdErrLine(String testname, String line) { | |||||
| } | |||||
| public void testRunSystemProperties(Properties props) { | |||||
| } | |||||
| public void testStarted(String testname) { | |||||
| } | |||||
| public void testEnded(String testname) { | |||||
| } | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| if (status == STATUS_ERROR) { | |||||
| errorCount++; | |||||
| } else if (status == STATUS_FAILURE) { | |||||
| failureCount++; | |||||
| } | |||||
| } | |||||
| public void testRunStarted(int testcount) { | |||||
| runCount = testcount; | |||||
| } | |||||
| public void testRunEnded(long elapsedtime) { | |||||
| finished(elapsedtime); | |||||
| } | |||||
| public void testRunStopped(long elapsedtime) { | |||||
| finished(elapsedtime); | |||||
| } | |||||
| protected void finished(long elapsedtime) { | |||||
| close(); | |||||
| } | |||||
| /** helper method to flush and close all streams */ | |||||
| protected void close() { | |||||
| try { | |||||
| if (writer != null) { | |||||
| writer.flush(); | |||||
| writer = null; | |||||
| } | |||||
| } finally { | |||||
| // make sure we're not closing System.out or System.err... | |||||
| if (out != null && out != System.err && out != System.out) { | |||||
| try { | |||||
| out.close(); | |||||
| out = null; | |||||
| } catch (IOException e) { | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,80 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| /** | |||||
| * Display additional messages from a <tt>SummaryFormatter</tt> | |||||
| * for failures and errors. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class BriefFormatter extends SummaryFormatter { | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| writer.print("TestCase: "); | |||||
| writer.print(testname); | |||||
| if (status == STATUS_ERROR) { | |||||
| writer.print("\tCaused an ERROR"); | |||||
| } else if (status == STATUS_FAILURE) { | |||||
| writer.write("\tFAILED"); | |||||
| } | |||||
| writer.println(); | |||||
| writer.print(trace); | |||||
| writer.println(); | |||||
| writer.println(); | |||||
| super.testFailed(status, testname, trace); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,94 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.util.Properties; | |||||
| import org.apache.tools.ant.taskdefs.optional.junit.TestRunListener; | |||||
| /** | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class DefaultTestRunListener implements TestRunListener { | |||||
| public void testStarted(String testname) { | |||||
| System.out.println("Started " + testname); | |||||
| } | |||||
| public void testEnded(String testname) { | |||||
| System.out.println("Ended " + testname); | |||||
| } | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| System.out.println(testname + " failed with status " + status); | |||||
| System.out.println(trace); | |||||
| } | |||||
| public void testRunSystemProperties(Properties props) { | |||||
| System.out.println("properties: " + props); | |||||
| } | |||||
| public void testRunStarted(int testcount) { | |||||
| System.out.println("testsuite: " + testcount); | |||||
| } | |||||
| public void testRunEnded(long elapsedtime) { | |||||
| System.out.println("testsuite ended after: " + elapsedtime); | |||||
| } | |||||
| public void testRunStopped(long elapsedtime) { | |||||
| System.out.println("testsuite stopped after: " + elapsedtime); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,111 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.io.OutputStream; | |||||
| import java.util.Properties; | |||||
| /** | |||||
| * A base class that can be used to filter data. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public abstract class FilterFormatter implements Formatter { | |||||
| protected Formatter formatter; | |||||
| protected FilterFormatter(Formatter value){ | |||||
| formatter = value; | |||||
| } | |||||
| public void setOutput(OutputStream out) { | |||||
| formatter.setOutput(out); | |||||
| } | |||||
| public void testStarted(String testname) { | |||||
| formatter.testStarted(testname); | |||||
| } | |||||
| public void setSystemOutput(String out) { | |||||
| formatter.setSystemOutput(out); | |||||
| } | |||||
| public void testEnded(String testname) { | |||||
| formatter.testEnded(testname); | |||||
| } | |||||
| public void setSystemError(String err) { | |||||
| formatter.setSystemError(err); | |||||
| } | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| formatter.testFailed(status, testname, trace); | |||||
| } | |||||
| public void testRunSystemProperties(Properties props) { | |||||
| formatter.testRunSystemProperties(props); | |||||
| } | |||||
| public void testRunStarted(int testcount) { | |||||
| formatter.testRunStarted(testcount); | |||||
| } | |||||
| public void testRunEnded(long elapsedtime) { | |||||
| formatter.testRunEnded(elapsedtime); | |||||
| } | |||||
| public void testRunStopped(long elapsedtime) { | |||||
| formatter.testRunEnded(elapsedtime); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,132 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.io.StringWriter; | |||||
| import java.io.PrintWriter; | |||||
| import java.io.StringReader; | |||||
| import java.io.BufferedReader; | |||||
| import java.util.StringTokenizer; | |||||
| import org.apache.tools.ant.util.StringUtils; | |||||
| /** | |||||
| * Filtered Formatter that strips out unwanted stack frames from the full | |||||
| * stack trace, for instance it will filter the lines containing the | |||||
| * following matches: | |||||
| * <pre> | |||||
| * junit.framework.TestCase | |||||
| * junit.framework.TestResult | |||||
| * junit.framework.TestSuite | |||||
| * junit.framework.Assert. | |||||
| * junit.swingui.TestRunner | |||||
| * junit.awtui.TestRunner | |||||
| * junit.textui.TestRunner | |||||
| * java.lang.reflect.Method.invoke( | |||||
| * org.apache.tools.ant. | |||||
| * </pre> | |||||
| * Removing all the above will help to make stacktrace more readable. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class FilterStackFormatter extends FilterFormatter { | |||||
| /** the set of matches to look for in a stack trace */ | |||||
| private final static String[] DEFAULT_TRACE_FILTERS = new String[] { | |||||
| "junit.framework.TestCase", | |||||
| "junit.framework.TestResult", | |||||
| "junit.framework.TestSuite", | |||||
| "junit.framework.Assert.", // don't filter AssertionFailure | |||||
| "junit.swingui.TestRunner", | |||||
| "junit.awtui.TestRunner", | |||||
| "junit.textui.TestRunner", | |||||
| "java.lang.reflect.Method.invoke(", | |||||
| "org.apache.tools.ant." | |||||
| }; | |||||
| /** | |||||
| * Creates a new <tt>FilterStackFormatter</tt> | |||||
| * @param formatter the formatter to be filtered. | |||||
| */ | |||||
| public FilterStackFormatter(Formatter formatter){ | |||||
| super(formatter); | |||||
| } | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| StringTokenizer st = new StringTokenizer(trace,"\r\n"); | |||||
| StringBuffer buf = new StringBuffer(trace.length()); | |||||
| while ( st.hasMoreTokens() ){ | |||||
| String line = st.nextToken(); | |||||
| if ( accept(line) ){ | |||||
| buf.append(line).append(StringUtils.LINE_SEP); | |||||
| } | |||||
| } | |||||
| super.testFailed(status, testname, buf.toString()); | |||||
| } | |||||
| /** | |||||
| * Check whether or not the line should be accepted. | |||||
| * @param the line to be check for acceptance. | |||||
| * @return <tt>true</tt> if the line is accepted, <tt>false</tt> if not. | |||||
| */ | |||||
| protected boolean accept(String line){ | |||||
| for (int i = 0; i < DEFAULT_TRACE_FILTERS.length; i++) { | |||||
| if (line.indexOf(DEFAULT_TRACE_FILTERS[i]) > 0) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,80 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.io.OutputStream; | |||||
| import org.apache.tools.ant.taskdefs.optional.junit.TestRunListener; | |||||
| /** | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public interface Formatter extends TestRunListener { | |||||
| /** | |||||
| * Sets the stream the formatter is supposed to write its results to. | |||||
| */ | |||||
| public void setOutput( OutputStream out ); | |||||
| /** | |||||
| * This is what the test has written to System.out | |||||
| */ | |||||
| public void setSystemOutput( String out ); | |||||
| /** | |||||
| * This is what the test has written to System.err | |||||
| */ | |||||
| public void setSystemError( String err ); | |||||
| } | |||||
| @@ -0,0 +1,87 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.text.MessageFormat; | |||||
| /** | |||||
| * Display a summary message at the end of a testsuite stating | |||||
| * runs, failures, errors, and elapsed time. | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class SummaryFormatter extends BaseFormatter { | |||||
| protected MessageFormat mf = new MessageFormat( | |||||
| "Tests run: {0, number, integer}" + | |||||
| ", Failures: {1, number, integer}" + | |||||
| ", Errors: {2, number, integer}" + | |||||
| ", Time elapsed: {3, number, integer} sec"); | |||||
| protected void finished(long elapsedtime) { | |||||
| writer.print("Testsuite: "); | |||||
| writer.println(); | |||||
| String line = mf.format(new Object[]{ | |||||
| new Integer(runCount), | |||||
| new Integer(failureCount), | |||||
| new Integer(errorCount), | |||||
| new Long(elapsedtime / 1000) | |||||
| }); | |||||
| writer.print(line); | |||||
| writer.println(); | |||||
| writer.println(); | |||||
| close(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,223 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional.junit.formatter; | |||||
| import java.util.Hashtable; | |||||
| import javax.xml.parsers.DocumentBuilder; | |||||
| import javax.xml.parsers.DocumentBuilderFactory; | |||||
| import org.w3c.dom.Document; | |||||
| import org.w3c.dom.Element; | |||||
| import org.w3c.dom.Text; | |||||
| import org.apache.tools.ant.taskdefs.optional.junit.TestRunListener; | |||||
| /** | |||||
| * | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class XMLFormatter extends BaseFormatter { | |||||
| /** the testsuites element for the aggregate document */ | |||||
| public final static String TESTSUITES = "testsuites"; | |||||
| /** the testsuite element */ | |||||
| public final static String TESTSUITE = "testsuite"; | |||||
| /** the testcase element */ | |||||
| public final static String TESTCASE = "testcase"; | |||||
| /** the error element */ | |||||
| public final static String ERROR = "error"; | |||||
| /** the failure element */ | |||||
| public final static String FAILURE = "failure"; | |||||
| /** the system-err element */ | |||||
| public final static String SYSTEM_ERR = "system-err"; | |||||
| /** the system-out element */ | |||||
| public final static String SYSTEM_OUT = "system-out"; | |||||
| /** package attribute for the aggregate document */ | |||||
| public final static String ATTR_PACKAGE = "package"; | |||||
| /** name attribute for property, testcase and testsuite elements */ | |||||
| public final static String ATTR_NAME = "name"; | |||||
| /** time attribute for testcase and testsuite elements */ | |||||
| public final static String ATTR_TIME = "time"; | |||||
| /** errors attribute for testsuite elements */ | |||||
| public final static String ATTR_ERRORS = "errors"; | |||||
| /** failures attribute for testsuite elements */ | |||||
| public final static String ATTR_FAILURES = "failures"; | |||||
| /** tests attribute for testsuite elements */ | |||||
| public final static String ATTR_TESTS = "tests"; | |||||
| /** type attribute for failure and error elements */ | |||||
| public final static String ATTR_TYPE = "type"; | |||||
| /** message attribute for failure elements */ | |||||
| public final static String ATTR_MESSAGE = "message"; | |||||
| /** the properties element */ | |||||
| public final static String PROPERTIES = "properties"; | |||||
| /** the property element */ | |||||
| public final static String PROPERTY = "property"; | |||||
| /** value attribute for property elements */ | |||||
| public final static String ATTR_VALUE = "value"; | |||||
| /** The XML document. */ | |||||
| private Document doc; | |||||
| /** The wrapper for the whole testsuite. */ | |||||
| private Element rootElement; | |||||
| /** Element for the current test. */ | |||||
| private Hashtable testElements = new Hashtable(); | |||||
| /** Timing helper. */ | |||||
| private Hashtable testStarts = new Hashtable(); | |||||
| public void testStarted(String testname) { | |||||
| //@fixme, eh, a testname only can obviouslly be a duplicate... | |||||
| testStarts.put(testname, new Long(System.currentTimeMillis())); | |||||
| Element currentTest = doc.createElement(TESTCASE); | |||||
| currentTest.setAttribute(ATTR_NAME, testname); | |||||
| rootElement.appendChild(currentTest); | |||||
| testElements.put(testname, currentTest); | |||||
| super.testStarted(testname); | |||||
| } | |||||
| public void testEnded(String testname) { | |||||
| Element currentTest = (Element) testElements.get(testname); | |||||
| // with a TestSetup, startTest and endTest are not called. | |||||
| if (currentTest == null){ | |||||
| testStarted(testname); | |||||
| currentTest = (Element) testElements.get(testname); | |||||
| } | |||||
| Long l = (Long) testStarts.get(testname); | |||||
| float time = ((System.currentTimeMillis()-l.longValue()) / 1000.0f); | |||||
| currentTest.setAttribute(ATTR_TIME, Float.toString(time)); | |||||
| super.testEnded(testname); | |||||
| // remove the test objects | |||||
| testStarts.remove(testname); | |||||
| testElements.remove(testname); | |||||
| } | |||||
| public void testFailed(int status, String testname, String trace) { | |||||
| if (testname != null) { | |||||
| testEnded(testname); | |||||
| } | |||||
| String type = status == STATUS_FAILURE ? FAILURE : ERROR; | |||||
| Element nested = doc.createElement(type); | |||||
| Element currentTest = null; | |||||
| if (testname != null) { | |||||
| currentTest = (Element) testElements.get(testname); | |||||
| } else { | |||||
| currentTest = rootElement; | |||||
| } | |||||
| currentTest.appendChild(nested); | |||||
| String[] args = parseFirstLine(trace); | |||||
| if (args[1] != null && args[1].length() > 0) { | |||||
| nested.setAttribute(ATTR_MESSAGE, args[1]); | |||||
| } | |||||
| nested.setAttribute(ATTR_TYPE, args[0]); | |||||
| Text text = doc.createTextNode(trace); | |||||
| nested.appendChild(text); | |||||
| super.testFailed(status, testname, trace); | |||||
| } | |||||
| public void testRunStarted(int testcount) { | |||||
| super.testRunStarted(testcount); | |||||
| } | |||||
| public void testRunEnded(long elapsedtime) { | |||||
| super.testRunEnded(elapsedtime); | |||||
| } | |||||
| public void testRunStopped(long elapsedtime) { | |||||
| super.testRunStopped(elapsedtime); | |||||
| } | |||||
| private static DocumentBuilder getDocumentBuilder() { | |||||
| try { | |||||
| return DocumentBuilderFactory.newInstance().newDocumentBuilder(); | |||||
| } catch(Exception exc) { | |||||
| throw new ExceptionInInitializerError(exc); | |||||
| } | |||||
| } | |||||
| protected static String[] parseFirstLine(String trace){ | |||||
| int pos = trace.indexOf('\n'); | |||||
| if (pos == -1){ | |||||
| return new String[]{ trace, ""}; | |||||
| } | |||||
| String line = trace.substring(0, pos); | |||||
| pos = line.indexOf(':'); | |||||
| if (pos != -1){ | |||||
| String classname = line.substring(0, pos).trim(); | |||||
| String message = line.substring(pos + 1).trim(); | |||||
| return new String[]{ classname, message }; | |||||
| } | |||||
| return new String[]{ trace, ""}; | |||||
| } | |||||
| } | |||||