/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.tck.junit4.rule;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Defines a {@link Statement} to execute a test with a given timeout. Differently from JUnit's
* {@link org.junit.internal.runners.statements.FailOnTimeout} this statement just prints a warning in the log, so the test will
* pass in case of timeout.
*/
public class WarnOnTimeout extends Statement {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private Statement next;
private final long timeout;
private boolean finished = false;
private Throwable thrown = null;
public WarnOnTimeout(Statement next, long timeout) {
this.next = next;
this.timeout = timeout;
}
@Override
public void evaluate() throws Throwable {
Thread thread = new Thread() {
@Override
public void run() {
try {
next.evaluate();
finished = true;
} catch (Throwable e) {
thrown = e;
}
}
};
thread.start();
thread.join(timeout);
if (finished) {
return;
}
if (thrown != null) {
throw thrown;
}
logger.warn("Timeout of " + timeout + "ms exceeded");
}
}