blob: 6c0e349bd50789737465f891dc558ca4014073f8 [file] [log] [blame]
package org.junit.rules;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TimeoutRuleTest {
private static final ReentrantLock run1Lock = new ReentrantLock();
private static volatile boolean run4done = false;
public abstract static class AbstractTimeoutTest {
public static final StringBuffer logger = new StringBuffer();
@Rule
public final TemporaryFolder tmpFile = new TemporaryFolder();
@Test
public void run1() throws InterruptedException {
logger.append("run1");
TimeoutRuleTest.run1Lock.lockInterruptibly();
TimeoutRuleTest.run1Lock.unlock();
}
@Test
public void run2() throws InterruptedException {
logger.append("run2");
Thread.currentThread().join();
}
@Test
public synchronized void run3() throws InterruptedException {
logger.append("run3");
wait();
}
@Test
public void run4() {
logger.append("run4");
while (!run4done) {
}
}
@Test
public void run5() throws IOException {
logger.append("run5");
Random rnd = new Random();
byte[] data = new byte[1024];
File tmp = tmpFile.newFile();
while (true) {
RandomAccessFile randomAccessFile = new RandomAccessFile(tmp, "rw");
try {
FileChannel channel = randomAccessFile.getChannel();
rnd.nextBytes(data);
ByteBuffer buffer = ByteBuffer.wrap(data);
// Interrupted thread closes channel and throws ClosedByInterruptException.
channel.write(buffer);
} finally {
randomAccessFile.close();
}
tmp.delete();
}
}
@Test
public void run6() throws InterruptedIOException {
logger.append("run6");
// Java IO throws InterruptedIOException only on SUN machines.
throw new InterruptedIOException();
}
}
public static class HasGlobalLongTimeout extends AbstractTimeoutTest {
@Rule
public final TestRule globalTimeout = Timeout.millis(200);
}
public static class HasGlobalTimeUnitTimeout extends AbstractTimeoutTest {
@Rule
public final TestRule globalTimeout = new Timeout(200, TimeUnit.MILLISECONDS);
}
public static class HasNullTimeUnit {
@Rule
public final TestRule globalTimeout = new Timeout(200, null);
@Test
public void wouldPass() {
}
}
@Before
public void before() {
run4done = false;
run1Lock.lock();
}
@After
public void after() {
// set run4done to make sure that the thread won't continue at run4()
run4done = true;
run1Lock.unlock();
}
@Test
public void timeUnitTimeout() {
HasGlobalTimeUnitTimeout.logger.setLength(0);
Result result = JUnitCore.runClasses(HasGlobalTimeUnitTimeout.class);
assertEquals(6, result.getFailureCount());
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run1"));
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run2"));
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run3"));
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run4"));
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run5"));
assertThat(HasGlobalTimeUnitTimeout.logger.toString(), containsString("run6"));
}
@Test
public void longTimeout() {
HasGlobalLongTimeout.logger.setLength(0);
Result result = JUnitCore.runClasses(HasGlobalLongTimeout.class);
assertEquals(6, result.getFailureCount());
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run1"));
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run2"));
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run3"));
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run4"));
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run5"));
assertThat(HasGlobalLongTimeout.logger.toString(), containsString("run6"));
}
@Test
public void nullTimeUnit() {
Result result = JUnitCore.runClasses(HasNullTimeUnit.class);
assertEquals(1, result.getFailureCount());
Failure failure = result.getFailures().get(0);
assertThat(failure.getException().getMessage(),
containsString("Invalid parameters for Timeout"));
Throwable cause = failure.getException().getCause();
assertThat(cause.getMessage(), containsString("TimeUnit cannot be null"));
}
}