forked from junit-team/junit4
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TimeoutRuleTest.java
137 lines (116 loc) · 4.7 KB
/
TimeoutRuleTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package org.junit.tests.experimental.rules;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestRule;
import org.junit.rules.Timeout;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
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 static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
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) {
FileChannel channel = new RandomAccessFile(tmp, "rw").getChannel();
rnd.nextBytes(data);
ByteBuffer buffer = ByteBuffer.wrap(data);
channel.write(buffer);//Interrupted thread closes channel and throws ClosedByInterruptException.
channel.close();
tmp.delete();
}
}
@Test
public void run6() throws InterruptedIOException {
logger.append("run6");
//Java IO throws InterruptedIOException on SUN machines.
throw new InterruptedIOException();
}
}
public static class HasGlobalLongTimeout extends AbstractTimeoutTest {
@Rule
public final TestRule globalTimeout = Timeout.millis(50L);
}
public static class HasGlobalTimeUnitTimeout extends AbstractTimeoutTest {
@Rule
public final TestRule globalTimeout = new Timeout(50, TimeUnit.MILLISECONDS);
}
@Before
public void before() {
run4done = false;
run1Lock.lock();
}
@After
public void after() {
run4done = true;//to make sure that the thread won't continue at run4()
run1Lock.unlock();
}
@Test
public void timeUnitTimeout() throws InterruptedException {
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() throws InterruptedException {
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"));
}
}