org.junit.internal.runners.statements.FailOnTimeout Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of junit Show documentation
Show all versions of junit Show documentation
JUnit is a regression testing framework written by Erich Gamma and Kent Beck.
It is used by the developer who implements unit tests in Java.
package org.junit.internal.runners.statements;
import org.junit.runners.model.Statement;
public class FailOnTimeout extends Statement {
private final Statement fOriginalStatement;
private final long fTimeout;
public FailOnTimeout(Statement originalStatement, long timeout) {
fOriginalStatement = originalStatement;
fTimeout = timeout;
}
@Override
public void evaluate() throws Throwable {
StatementThread thread = evaluateStatement();
if (!thread.fFinished) {
throwExceptionForUnfinishedThread(thread);
}
}
private StatementThread evaluateStatement() throws InterruptedException {
StatementThread thread = new StatementThread(fOriginalStatement);
thread.start();
thread.join(fTimeout);
if (!thread.fFinished) {
thread.recordStackTrace();
}
thread.interrupt();
return thread;
}
private void throwExceptionForUnfinishedThread(StatementThread thread)
throws Throwable {
if (thread.fExceptionThrownByOriginalStatement != null) {
throw thread.fExceptionThrownByOriginalStatement;
} else {
throwTimeoutException(thread);
}
}
private void throwTimeoutException(StatementThread thread) throws Exception {
Exception exception = new Exception(String.format(
"test timed out after %d milliseconds", fTimeout));
exception.setStackTrace(thread.getRecordedStackTrace());
throw exception;
}
private static class StatementThread extends Thread {
private final Statement fStatement;
private boolean fFinished = false;
private Throwable fExceptionThrownByOriginalStatement = null;
private StackTraceElement[] fRecordedStackTrace = null;
public StatementThread(Statement statement) {
fStatement = statement;
}
public void recordStackTrace() {
fRecordedStackTrace = getStackTrace();
}
public StackTraceElement[] getRecordedStackTrace() {
return fRecordedStackTrace;
}
@Override
public void run() {
try {
fStatement.evaluate();
fFinished = true;
} catch (InterruptedException e) {
// don't log the InterruptedException
} catch (Throwable e) {
fExceptionThrownByOriginalStatement = e;
}
}
}
}