package net.thucydides.junit.runners; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; import org.junit.runner.notification.StoppedByUserException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RetryFilteringRunNotifier extends RunNotifierDecorator { private static final Logger log = LoggerFactory.getLogger(RetryFilteringRunNotifier.class); private RunNotifier target; private RunNotifier retryAwareRunNotifier; private boolean testFailed = false; private Failure lastFailure; private boolean testAssumptionFailed = false; private Failure lastAssumptionFailure; private boolean testStartAlreadyFired = false; private Description lastIgnored; private Description lastDescription; public RetryFilteringRunNotifier(RunNotifier target, RunNotifier retryAwareRunNotifier) { this.target = target; this.retryAwareRunNotifier = retryAwareRunNotifier; } @Override public void fireTestStarted(Description description) throws StoppedByUserException { log.debug("Test started: " + description); if (!testStartAlreadyFired) { super.fireTestStarted(description); } testStartAlreadyFired = true; retryAwareRunNotifier.fireTestStarted(description); } @Override public void fireTestFailure(Failure failure) { log.debug("Test failed: " + failure); testStartAlreadyFired = false; testFailed = true; lastFailure = failure; retryAwareRunNotifier.fireTestFailure(failure); } public void flush() { log.debug("Flushing notifications"); if (testFailed) { super.fireTestFailure(lastFailure); } if (testAssumptionFailed) { super.fireTestAssumptionFailed(lastAssumptionFailure); } if (lastIgnored != null) { super.fireTestIgnored(lastIgnored); } if (lastDescription != null) { super.fireTestFinished(lastDescription); } } public void reset() { testFailed = false; testAssumptionFailed = false; lastIgnored = null; lastDescription = null; } @Override public void fireTestFinished(Description description) { testStartAlreadyFired = false; log.debug("Test finished: " + description); lastDescription = description; retryAwareRunNotifier.fireTestFinished(description); } @Override public void fireTestIgnored(Description description) { log.debug("Test ignored: " + description); lastIgnored = description; if (!testStartAlreadyFired) { super.fireTestStarted(description); } testStartAlreadyFired = false; retryAwareRunNotifier.fireTestIgnored(description); } @Override public void fireTestAssumptionFailed(Failure failure) { log.debug("Test assumption failed: " + failure); lastAssumptionFailure = failure; testAssumptionFailed = true; retryAwareRunNotifier.fireTestAssumptionFailed(failure); } @Override public void fireTestRunStarted(Description description) { super.fireTestRunStarted(description); //To change body of overridden methods use File | Settings | File Templates. } @Override public void fireTestRunFinished(Result result) { super.fireTestRunFinished(result); //To change body of overridden methods use File | Settings | File Templates. retryAwareRunNotifier.fireTestRunFinished(result); } @Override protected RunNotifier underlyingNotifier() { return target; } public boolean lastTestFailed() { return lastFailure != null; } public void clearLastFailure() { testFailed = false; lastFailure = null; testAssumptionFailed = false; lastAssumptionFailure = null; } }