ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CyclicBarrierTest.java
Revision: 1.30
Committed: Sun Jan 7 23:11:07 2018 UTC (6 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.29: +1 -2 lines
Log Message:
use multi-catch

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10
11 import java.util.concurrent.BrokenBarrierException;
12 import java.util.concurrent.CountDownLatch;
13 import java.util.concurrent.CyclicBarrier;
14 import java.util.concurrent.TimeoutException;
15 import java.util.concurrent.atomic.AtomicBoolean;
16 import java.util.concurrent.atomic.AtomicInteger;
17
18 import junit.framework.Test;
19 import junit.framework.TestSuite;
20
21 public class CyclicBarrierTest extends JSR166TestCase {
22 public static void main(String[] args) {
23 main(suite(), args);
24 }
25 public static Test suite() {
26 return new TestSuite(CyclicBarrierTest.class);
27 }
28
29 /**
30 * Spin-waits till the number of waiters == numberOfWaiters.
31 */
32 void awaitNumberWaiting(CyclicBarrier barrier, int numberOfWaiters) {
33 long startTime = System.nanoTime();
34 while (barrier.getNumberWaiting() != numberOfWaiters) {
35 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
36 fail("timed out");
37 Thread.yield();
38 }
39 }
40
41 /**
42 * Creating with negative parties throws IllegalArgumentException
43 */
44 public void testConstructor1() {
45 try {
46 new CyclicBarrier(-1, (Runnable)null);
47 shouldThrow();
48 } catch (IllegalArgumentException success) {}
49 }
50
51 /**
52 * Creating with negative parties and no action throws
53 * IllegalArgumentException
54 */
55 public void testConstructor2() {
56 try {
57 new CyclicBarrier(-1);
58 shouldThrow();
59 } catch (IllegalArgumentException success) {}
60 }
61
62 /**
63 * getParties returns the number of parties given in constructor
64 */
65 public void testGetParties() {
66 CyclicBarrier b = new CyclicBarrier(2);
67 assertEquals(2, b.getParties());
68 assertEquals(0, b.getNumberWaiting());
69 }
70
71 /**
72 * A 1-party barrier triggers after single await
73 */
74 public void testSingleParty() throws Exception {
75 CyclicBarrier b = new CyclicBarrier(1);
76 assertEquals(1, b.getParties());
77 assertEquals(0, b.getNumberWaiting());
78 b.await();
79 b.await();
80 assertEquals(0, b.getNumberWaiting());
81 }
82
83 /**
84 * The supplied barrier action is run at barrier
85 */
86 public void testBarrierAction() throws Exception {
87 final AtomicInteger count = new AtomicInteger(0);
88 final Runnable incCount = new Runnable() { public void run() {
89 count.getAndIncrement(); }};
90 CyclicBarrier b = new CyclicBarrier(1, incCount);
91 assertEquals(1, b.getParties());
92 assertEquals(0, b.getNumberWaiting());
93 b.await();
94 b.await();
95 assertEquals(0, b.getNumberWaiting());
96 assertEquals(2, count.get());
97 }
98
99 /**
100 * A 2-party/thread barrier triggers after both threads invoke await
101 */
102 public void testTwoParties() throws Exception {
103 final CyclicBarrier b = new CyclicBarrier(2);
104 Thread t = newStartedThread(new CheckedRunnable() {
105 public void realRun() throws Exception {
106 b.await();
107 b.await();
108 b.await();
109 b.await();
110 }});
111
112 b.await();
113 b.await();
114 b.await();
115 b.await();
116 awaitTermination(t);
117 }
118
119 /**
120 * An interruption in one party causes others waiting in await to
121 * throw BrokenBarrierException
122 */
123 public void testAwait1_Interrupted_BrokenBarrier() {
124 final CyclicBarrier c = new CyclicBarrier(3);
125 final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
126 Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
127 public void realRun() throws Exception {
128 pleaseInterrupt.countDown();
129 c.await();
130 }};
131 Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
132 public void realRun() throws Exception {
133 pleaseInterrupt.countDown();
134 c.await();
135 }};
136
137 t1.start();
138 t2.start();
139 await(pleaseInterrupt);
140 t1.interrupt();
141 awaitTermination(t1);
142 awaitTermination(t2);
143 }
144
145 /**
146 * An interruption in one party causes others waiting in timed await to
147 * throw BrokenBarrierException
148 */
149 public void testAwait2_Interrupted_BrokenBarrier() throws Exception {
150 final CyclicBarrier c = new CyclicBarrier(3);
151 final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
152 Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
153 public void realRun() throws Exception {
154 pleaseInterrupt.countDown();
155 c.await(LONG_DELAY_MS, MILLISECONDS);
156 }};
157 Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
158 public void realRun() throws Exception {
159 pleaseInterrupt.countDown();
160 c.await(LONG_DELAY_MS, MILLISECONDS);
161 }};
162
163 t1.start();
164 t2.start();
165 await(pleaseInterrupt);
166 t1.interrupt();
167 awaitTermination(t1);
168 awaitTermination(t2);
169 }
170
171 /**
172 * A timeout in timed await throws TimeoutException
173 */
174 public void testAwait3_TimeoutException() throws InterruptedException {
175 final CyclicBarrier c = new CyclicBarrier(2);
176 Thread t = newStartedThread(new CheckedRunnable() {
177 public void realRun() throws Exception {
178 long startTime = System.nanoTime();
179 try {
180 c.await(timeoutMillis(), MILLISECONDS);
181 shouldThrow();
182 } catch (TimeoutException success) {}
183 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
184 }});
185
186 awaitTermination(t);
187 }
188
189 /**
190 * A timeout in one party causes others waiting in timed await to
191 * throw BrokenBarrierException
192 */
193 public void testAwait4_Timeout_BrokenBarrier() throws InterruptedException {
194 final CyclicBarrier c = new CyclicBarrier(3);
195 Thread t1 = newStartedThread(new CheckedRunnable() {
196 public void realRun() throws Exception {
197 try {
198 c.await(LONG_DELAY_MS, MILLISECONDS);
199 shouldThrow();
200 } catch (BrokenBarrierException success) {}
201 }});
202 Thread t2 = newStartedThread(new CheckedRunnable() {
203 public void realRun() throws Exception {
204 awaitNumberWaiting(c, 1);
205 long startTime = System.nanoTime();
206 try {
207 c.await(timeoutMillis(), MILLISECONDS);
208 shouldThrow();
209 } catch (TimeoutException success) {}
210 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
211 }});
212
213 awaitTermination(t1);
214 awaitTermination(t2);
215 }
216
217 /**
218 * A timeout in one party causes others waiting in await to
219 * throw BrokenBarrierException
220 */
221 public void testAwait5_Timeout_BrokenBarrier() throws InterruptedException {
222 final CyclicBarrier c = new CyclicBarrier(3);
223 Thread t1 = newStartedThread(new CheckedRunnable() {
224 public void realRun() throws Exception {
225 try {
226 c.await();
227 shouldThrow();
228 } catch (BrokenBarrierException success) {}
229 }});
230 Thread t2 = newStartedThread(new CheckedRunnable() {
231 public void realRun() throws Exception {
232 awaitNumberWaiting(c, 1);
233 long startTime = System.nanoTime();
234 try {
235 c.await(timeoutMillis(), MILLISECONDS);
236 shouldThrow();
237 } catch (TimeoutException success) {}
238 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
239 }});
240
241 awaitTermination(t1);
242 awaitTermination(t2);
243 }
244
245 /**
246 * A reset of an active barrier causes waiting threads to throw
247 * BrokenBarrierException
248 */
249 public void testReset_BrokenBarrier() throws InterruptedException {
250 final CyclicBarrier c = new CyclicBarrier(3);
251 final CountDownLatch pleaseReset = new CountDownLatch(2);
252 Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
253 public void realRun() throws Exception {
254 pleaseReset.countDown();
255 c.await();
256 }};
257 Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
258 public void realRun() throws Exception {
259 pleaseReset.countDown();
260 c.await();
261 }};
262
263 t1.start();
264 t2.start();
265 await(pleaseReset);
266
267 awaitNumberWaiting(c, 2);
268 c.reset();
269 awaitTermination(t1);
270 awaitTermination(t2);
271 }
272
273 /**
274 * A reset before threads enter barrier does not throw
275 * BrokenBarrierException
276 */
277 public void testReset_NoBrokenBarrier() throws Exception {
278 final CyclicBarrier c = new CyclicBarrier(3);
279 c.reset();
280
281 Thread t1 = newStartedThread(new CheckedRunnable() {
282 public void realRun() throws Exception {
283 c.await();
284 }});
285 Thread t2 = newStartedThread(new CheckedRunnable() {
286 public void realRun() throws Exception {
287 c.await();
288 }});
289
290 c.await();
291 awaitTermination(t1);
292 awaitTermination(t2);
293 }
294
295 /**
296 * All threads block while a barrier is broken.
297 */
298 public void testReset_Leakage() throws InterruptedException {
299 final CyclicBarrier c = new CyclicBarrier(2);
300 final AtomicBoolean done = new AtomicBoolean();
301 Thread t = newStartedThread(new CheckedRunnable() {
302 public void realRun() {
303 while (!done.get()) {
304 try {
305 while (c.isBroken())
306 c.reset();
307
308 c.await();
309 shouldThrow();
310 }
311 catch (BrokenBarrierException | InterruptedException ok) {}
312 }}});
313
314 for (int i = 0; i < 4; i++) {
315 delay(timeoutMillis());
316 t.interrupt();
317 }
318 done.set(true);
319 t.interrupt();
320 awaitTermination(t);
321 }
322
323 /**
324 * Reset of a non-broken barrier does not break barrier
325 */
326 public void testResetWithoutBreakage() throws Exception {
327 final CyclicBarrier barrier = new CyclicBarrier(3);
328 for (int i = 0; i < 3; i++) {
329 final CyclicBarrier start = new CyclicBarrier(3);
330 Thread t1 = newStartedThread(new CheckedRunnable() {
331 public void realRun() throws Exception {
332 start.await();
333 barrier.await();
334 }});
335
336 Thread t2 = newStartedThread(new CheckedRunnable() {
337 public void realRun() throws Exception {
338 start.await();
339 barrier.await();
340 }});
341
342 start.await();
343 barrier.await();
344 awaitTermination(t1);
345 awaitTermination(t2);
346 assertFalse(barrier.isBroken());
347 assertEquals(0, barrier.getNumberWaiting());
348 if (i == 1) barrier.reset();
349 assertFalse(barrier.isBroken());
350 assertEquals(0, barrier.getNumberWaiting());
351 }
352 }
353
354 /**
355 * Reset of a barrier after interruption reinitializes it.
356 */
357 public void testResetAfterInterrupt() throws Exception {
358 final CyclicBarrier barrier = new CyclicBarrier(3);
359 for (int i = 0; i < 2; i++) {
360 final CyclicBarrier start = new CyclicBarrier(3);
361 Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
362 public void realRun() throws Exception {
363 start.await();
364 barrier.await();
365 }};
366
367 Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
368 public void realRun() throws Exception {
369 start.await();
370 barrier.await();
371 }};
372
373 t1.start();
374 t2.start();
375 start.await();
376 t1.interrupt();
377 awaitTermination(t1);
378 awaitTermination(t2);
379 assertTrue(barrier.isBroken());
380 assertEquals(0, barrier.getNumberWaiting());
381 barrier.reset();
382 assertFalse(barrier.isBroken());
383 assertEquals(0, barrier.getNumberWaiting());
384 }
385 }
386
387 /**
388 * Reset of a barrier after timeout reinitializes it.
389 */
390 public void testResetAfterTimeout() throws Exception {
391 final CyclicBarrier barrier = new CyclicBarrier(3);
392 for (int i = 0; i < 2; i++) {
393 assertEquals(0, barrier.getNumberWaiting());
394 Thread t1 = newStartedThread(new CheckedRunnable() {
395 public void realRun() throws Exception {
396 try {
397 barrier.await();
398 shouldThrow();
399 } catch (BrokenBarrierException success) {}
400 }});
401 Thread t2 = newStartedThread(new CheckedRunnable() {
402 public void realRun() throws Exception {
403 awaitNumberWaiting(barrier, 1);
404 long startTime = System.nanoTime();
405 try {
406 barrier.await(timeoutMillis(), MILLISECONDS);
407 shouldThrow();
408 } catch (TimeoutException success) {}
409 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
410 }});
411
412 awaitTermination(t1);
413 awaitTermination(t2);
414 assertEquals(0, barrier.getNumberWaiting());
415 assertTrue(barrier.isBroken());
416 assertEquals(0, barrier.getNumberWaiting());
417 barrier.reset();
418 assertFalse(barrier.isBroken());
419 assertEquals(0, barrier.getNumberWaiting());
420 }
421 }
422
423 /**
424 * Reset of a barrier after a failed command reinitializes it.
425 */
426 public void testResetAfterCommandException() throws Exception {
427 final CyclicBarrier barrier =
428 new CyclicBarrier(3, new Runnable() {
429 public void run() {
430 throw new NullPointerException(); }});
431 for (int i = 0; i < 2; i++) {
432 final CyclicBarrier start = new CyclicBarrier(3);
433 Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
434 public void realRun() throws Exception {
435 start.await();
436 barrier.await();
437 }};
438
439 Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
440 public void realRun() throws Exception {
441 start.await();
442 barrier.await();
443 }};
444
445 t1.start();
446 t2.start();
447 start.await();
448 awaitNumberWaiting(barrier, 2);
449 try {
450 barrier.await();
451 shouldThrow();
452 } catch (NullPointerException success) {}
453 awaitTermination(t1);
454 awaitTermination(t2);
455 assertTrue(barrier.isBroken());
456 assertEquals(0, barrier.getNumberWaiting());
457 barrier.reset();
458 assertFalse(barrier.isBroken());
459 assertEquals(0, barrier.getNumberWaiting());
460 }
461 }
462 }