/*******************************************************************************
* Copyright (c) 2009, eXXcellent solutions gmbh and others
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
*
* Contributors:
* Achim Demelt - initial API and implementation
* Matthias Kappeller - Bug 321064 - No JUnit TestReport created for huge report files
*******************************************************************************/
package org.eclipse.buckminster.junit.internal;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.buckminster.core.CorePlugin;
import org.eclipse.buckminster.runtime.Logger;
import org.eclipse.jdt.junit.TestRunListener;
import org.eclipse.jdt.junit.model.ITestCaseElement;
import org.eclipse.jdt.junit.model.ITestElement.FailureTrace;
import org.eclipse.jdt.junit.model.ITestElement.Result;
import org.eclipse.jdt.junit.model.ITestRunSession;
import org.eclipse.osgi.util.NLS;
import com.ibm.icu.text.MessageFormat;
public class TestListener extends TestRunListener {
private static final Logger logger = CorePlugin.getLogger();
private final boolean quiet;
private int successCount;
private int failCount;
private int errorCount;
private int ignoreCount;
private int overallCount;
private final CountDownLatch latch = new CountDownLatch(1);
private ITestRunSession session;
public TestListener(boolean quiet) {
this.quiet = quiet;
}
public int getErrorCount() {
return errorCount;
}
public int getFailureCount() {
return failCount;
}
public int getIgnoreCount() {
return ignoreCount;
}
public int getOverallCount() {
return overallCount;
}
/**
* @return the {@link ITestRunSession} after it has completed. Otherwise
* <code>null</code> will be returned.
* @see #waitForFinish(int, TimeUnit)
*/
public ITestRunSession getTestRunSession() {
return session;
}
@Override
public void sessionFinished(ITestRunSession testSession) {
this.session = testSession;
latch.countDown();
if (!quiet) {
logger.info(Messages.TestListener_Tests_finished);
logger.info(MessageFormat.format(Messages.TestListener_Elapsed_time, new Object[] { Double.valueOf(session.getElapsedTimeInSeconds()) }));
logger.info(NLS.bind(Messages.TestListener_Total_number_of_tests, Integer.valueOf(overallCount)));
logger.info(NLS.bind(Messages.TestListener_Successful_tests, Integer.valueOf(successCount)));
logger.info(NLS.bind(Messages.TestListener_Failed_tests, Integer.valueOf(failCount)));
logger.info(NLS.bind(Messages.TestListener_Errors, Integer.valueOf(errorCount)));
logger.info(NLS.bind(Messages.TestListener_Ignored_tests, Integer.valueOf(ignoreCount)));
logger.info(NLS.bind(Messages.TestListener_Overall_status, session.getTestResult(true)));
logFailureTrace(session.getFailureTrace());
}
}
@Override
public void sessionStarted(ITestRunSession testSession) {
if (!quiet)
logger.info(NLS.bind(Messages.TestListener_Starting_test_session, testSession.getTestRunName()));
}
@Override
public void testCaseFinished(ITestCaseElement testCaseElement) {
overallCount++;
Result result = testCaseElement.getTestResult(false);
if (result == Result.ERROR)
errorCount++;
if (result == Result.FAILURE)
failCount++;
if (result == Result.IGNORED)
ignoreCount++;
if (result == Result.OK)
successCount++;
if (!quiet) {
logger.info(" ..." + testCaseElement.getTestResult(false) //$NON-NLS-1$
+ MessageFormat.format(" [{0,number,###.###}s]", new Object[] { Double.valueOf(testCaseElement.getElapsedTimeInSeconds()) })); //$NON-NLS-1$
logFailureTrace(testCaseElement.getFailureTrace());
}
}
@Override
public void testCaseStarted(ITestCaseElement testCaseElement) {
if (!quiet)
logger.info(Messages.TestListener_Running_test + testCaseElement.getTestClassName() + "." + testCaseElement.getTestMethodName() + "..."); //$NON-NLS-1$//$NON-NLS-2$
}
public void waitForFinish(int duration, TimeUnit timeUnit) throws InterruptedException {
latch.await(duration, timeUnit);
}
private void logFailureTrace(FailureTrace failure) {
if (failure == null)
return;
if (failure.getActual() != null)
logger.warning(NLS.bind(Messages.TestListener_Actual, failure.getActual()));
if (failure.getExpected() != null)
logger.warning(NLS.bind(Messages.TestListener_Expected, failure.getExpected()));
if (failure.getTrace() != null)
logger.warning(failure.getTrace());
}
}