ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CyclicBarrierTest.java
(Generate patch)

Comparing jsr166/src/test/tck/CyclicBarrierTest.java (file contents):
Revision 1.14 by jsr166, Sat Nov 21 06:26:00 2009 UTC vs.
Revision 1.23 by jsr166, Sun May 29 15:31:36 2011 UTC

# Line 1 | Line 1
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/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
# Line 15 | Line 15 | import static java.util.concurrent.TimeU
15  
16   public class CyclicBarrierTest extends JSR166TestCase {
17      public static void main(String[] args) {
18 <        junit.textui.TestRunner.run (suite());
18 >        junit.textui.TestRunner.run(suite());
19      }
20      public static Test suite() {
21          return new TestSuite(CyclicBarrierTest.class);
# Line 27 | Line 27 | public class CyclicBarrierTest extends J
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 IAE
43       */
44      public void testConstructor1() {
# Line 86 | Line 98 | public class CyclicBarrierTest extends J
98       */
99      public void testTwoParties() throws Exception {
100          final CyclicBarrier b = new CyclicBarrier(2);
101 <        Thread t = new Thread(new CheckedRunnable() {
101 >        Thread t = newStartedThread(new CheckedRunnable() {
102              public void realRun() throws Exception {
103                  b.await();
104                  b.await();
# Line 94 | Line 106 | public class CyclicBarrierTest extends J
106                  b.await();
107              }});
108  
97        t.start();
109          b.await();
110          b.await();
111          b.await();
112          b.await();
113 <        t.join();
113 >        awaitTermination(t);
114      }
115  
105
116      /**
117       * An interruption in one party causes others waiting in await to
118       * throw BrokenBarrierException
119       */
120 <    public void testAwait1_Interrupted_BrokenBarrier() throws Exception {
120 >    public void testAwait1_Interrupted_BrokenBarrier() {
121          final CyclicBarrier c = new CyclicBarrier(3);
122 +        final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
123          Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
124              public void realRun() throws Exception {
125 +                pleaseInterrupt.countDown();
126                  c.await();
127              }};
128          Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
129              public void realRun() throws Exception {
130 +                pleaseInterrupt.countDown();
131                  c.await();
132              }};
133  
134          t1.start();
135          t2.start();
136 <        Thread.sleep(SHORT_DELAY_MS);
136 >        await(pleaseInterrupt);
137          t1.interrupt();
138 <        t1.join();
139 <        t2.join();
138 >        awaitTermination(t1);
139 >        awaitTermination(t2);
140      }
141  
142      /**
# Line 132 | Line 145 | public class CyclicBarrierTest extends J
145       */
146      public void testAwait2_Interrupted_BrokenBarrier() throws Exception {
147          final CyclicBarrier c = new CyclicBarrier(3);
148 +        final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
149          Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
150              public void realRun() throws Exception {
151 +                pleaseInterrupt.countDown();
152                  c.await(LONG_DELAY_MS, MILLISECONDS);
153              }};
154          Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
155              public void realRun() throws Exception {
156 +                pleaseInterrupt.countDown();
157                  c.await(LONG_DELAY_MS, MILLISECONDS);
158              }};
159  
160          t1.start();
161          t2.start();
162 <        Thread.sleep(SHORT_DELAY_MS);
162 >        await(pleaseInterrupt);
163          t1.interrupt();
164 <        t1.join();
165 <        t2.join();
164 >        awaitTermination(t1);
165 >        awaitTermination(t2);
166      }
167  
168      /**
169       * A timeout in timed await throws TimeoutException
170       */
171 <    public void testAwait3_TimeOutException() throws InterruptedException {
171 >    public void testAwait3_TimeoutException() throws InterruptedException {
172          final CyclicBarrier c = new CyclicBarrier(2);
173 <        Thread t = new ThreadShouldThrow(TimeoutException.class) {
173 >        Thread t = newStartedThread(new CheckedRunnable() {
174              public void realRun() throws Exception {
175 <                c.await(SHORT_DELAY_MS, MILLISECONDS);
176 <            }};
175 >                long startTime = System.nanoTime();
176 >                try {
177 >                    c.await(timeoutMillis(), MILLISECONDS);
178 >                    shouldThrow();
179 >                } catch (TimeoutException success) {}
180 >                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
181 >            }});
182  
183 <        t.start();
163 <        t.join();
183 >        awaitTermination(t);
184      }
185  
186      /**
# Line 169 | Line 189 | public class CyclicBarrierTest extends J
189       */
190      public void testAwait4_Timeout_BrokenBarrier() throws InterruptedException {
191          final CyclicBarrier c = new CyclicBarrier(3);
192 <        Thread t1 = new ThreadShouldThrow(TimeoutException.class) {
192 >        Thread t1 = newStartedThread(new CheckedRunnable() {
193              public void realRun() throws Exception {
194 <                c.await(SHORT_DELAY_MS, MILLISECONDS);
195 <            }};
196 <        Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
194 >                try {
195 >                    c.await(LONG_DELAY_MS, MILLISECONDS);
196 >                    shouldThrow();
197 >                } catch (BrokenBarrierException success) {}
198 >            }});
199 >        Thread t2 = newStartedThread(new CheckedRunnable() {
200              public void realRun() throws Exception {
201 <                c.await(MEDIUM_DELAY_MS, MILLISECONDS);
202 <            }};
201 >                awaitNumberWaiting(c, 1);
202 >                long startTime = System.nanoTime();
203 >                try {
204 >                    c.await(timeoutMillis(), MILLISECONDS);
205 >                    shouldThrow();
206 >                } catch (TimeoutException success) {}
207 >                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
208 >            }});
209  
210 <        t1.start();
211 <        t2.start();
183 <        t1.join();
184 <        t2.join();
210 >        awaitTermination(t1);
211 >        awaitTermination(t2);
212      }
213  
214      /**
# Line 190 | Line 217 | public class CyclicBarrierTest extends J
217       */
218      public void testAwait5_Timeout_BrokenBarrier() throws InterruptedException {
219          final CyclicBarrier c = new CyclicBarrier(3);
220 <        Thread t1 = new ThreadShouldThrow(TimeoutException.class) {
220 >        Thread t1 = newStartedThread(new CheckedRunnable() {
221              public void realRun() throws Exception {
222 <                c.await(SHORT_DELAY_MS, MILLISECONDS);
223 <            }};
224 <        Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
222 >                try {
223 >                    c.await();
224 >                    shouldThrow();
225 >                } catch (BrokenBarrierException success) {}
226 >            }});
227 >        Thread t2 = newStartedThread(new CheckedRunnable() {
228              public void realRun() throws Exception {
229 <                c.await();
230 <            }};
229 >                awaitNumberWaiting(c, 1);
230 >                long startTime = System.nanoTime();
231 >                try {
232 >                    c.await(timeoutMillis(), MILLISECONDS);
233 >                    shouldThrow();
234 >                } catch (TimeoutException success) {}
235 >                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
236 >            }});
237  
238 <        t1.start();
239 <        t2.start();
204 <        t1.join();
205 <        t2.join();
238 >        awaitTermination(t1);
239 >        awaitTermination(t2);
240      }
241  
242      /**
# Line 211 | Line 245 | public class CyclicBarrierTest extends J
245       */
246      public void testReset_BrokenBarrier() throws InterruptedException {
247          final CyclicBarrier c = new CyclicBarrier(3);
248 +        final CountDownLatch pleaseReset = new CountDownLatch(2);
249          Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
250              public void realRun() throws Exception {
251 +                pleaseReset.countDown();
252                  c.await();
253              }};
254          Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
255              public void realRun() throws Exception {
256 +                pleaseReset.countDown();
257                  c.await();
258              }};
259  
260          t1.start();
261          t2.start();
262 <        Thread.sleep(SHORT_DELAY_MS);
262 >        await(pleaseReset);
263 >
264 >        awaitNumberWaiting(c, 2);
265          c.reset();
266 <        t1.join();
267 <        t2.join();
266 >        awaitTermination(t1);
267 >        awaitTermination(t2);
268      }
269  
270      /**
# Line 234 | Line 273 | public class CyclicBarrierTest extends J
273       */
274      public void testReset_NoBrokenBarrier() throws Exception {
275          final CyclicBarrier c = new CyclicBarrier(3);
276 <        Thread t1 = new Thread(new CheckedRunnable() {
276 >        c.reset();
277 >
278 >        Thread t1 = newStartedThread(new CheckedRunnable() {
279              public void realRun() throws Exception {
280                  c.await();
281              }});
282 <        Thread t2 = new Thread(new CheckedRunnable() {
282 >        Thread t2 = newStartedThread(new CheckedRunnable() {
283              public void realRun() throws Exception {
284                  c.await();
285              }});
286  
246        c.reset();
247        t1.start();
248        t2.start();
287          c.await();
288 <        t1.join();
289 <        t2.join();
288 >        awaitTermination(t1);
289 >        awaitTermination(t2);
290      }
291  
292      /**
# Line 257 | Line 295 | public class CyclicBarrierTest extends J
295      public void testReset_Leakage() throws InterruptedException {
296          final CyclicBarrier c = new CyclicBarrier(2);
297          final AtomicBoolean done = new AtomicBoolean();
298 <        Thread t = new Thread() {
299 <                public void run() {
300 <                    while (!done.get()) {
301 <                        try {
302 <                            while (c.isBroken())
303 <                                c.reset();
304 <
305 <                            c.await();
306 <                            threadFail("await should not return");
269 <                        }
270 <                        catch (BrokenBarrierException e) {
271 <                        }
272 <                        catch (InterruptedException ie) {
273 <                        }
298 >        Thread t = newStartedThread(new CheckedRunnable() {
299 >            public void realRun() {
300 >                while (!done.get()) {
301 >                    try {
302 >                        while (c.isBroken())
303 >                            c.reset();
304 >
305 >                        c.await();
306 >                        shouldThrow();
307                      }
308 <                }
309 <            };
308 >                    catch (BrokenBarrierException ok) {}
309 >                    catch (InterruptedException ok) {}
310 >                }}});
311  
278        t.start();
312          for (int i = 0; i < 4; i++) {
313 <            Thread.sleep(SHORT_DELAY_MS);
313 >            delay(timeoutMillis());
314              t.interrupt();
315          }
316          done.set(true);
317          t.interrupt();
318 <        t.join();
318 >        awaitTermination(t);
319      }
320  
321      /**
322       * Reset of a non-broken barrier does not break barrier
323       */
324      public void testResetWithoutBreakage() throws Exception {
292        final CyclicBarrier start = new CyclicBarrier(3);
325          final CyclicBarrier barrier = new CyclicBarrier(3);
326          for (int i = 0; i < 3; i++) {
327 <            Thread t1 = new Thread(new CheckedRunnable() {
327 >            final CyclicBarrier start = new CyclicBarrier(3);
328 >            Thread t1 = newStartedThread(new CheckedRunnable() {
329                  public void realRun() throws Exception {
330                      start.await();
331                      barrier.await();
332                  }});
333  
334 <            Thread t2 = new Thread(new CheckedRunnable() {
334 >            Thread t2 = newStartedThread(new CheckedRunnable() {
335                  public void realRun() throws Exception {
336                      start.await();
337                      barrier.await();
338                  }});
339  
307            t1.start();
308            t2.start();
340              start.await();
341              barrier.await();
342 <            t1.join();
343 <            t2.join();
342 >            awaitTermination(t1);
343 >            awaitTermination(t2);
344              assertFalse(barrier.isBroken());
345              assertEquals(0, barrier.getNumberWaiting());
346              if (i == 1) barrier.reset();
# Line 322 | Line 353 | public class CyclicBarrierTest extends J
353       * Reset of a barrier after interruption reinitializes it.
354       */
355      public void testResetAfterInterrupt() throws Exception {
325        final CyclicBarrier start = new CyclicBarrier(3);
356          final CyclicBarrier barrier = new CyclicBarrier(3);
357          for (int i = 0; i < 2; i++) {
358 +            final CyclicBarrier start = new CyclicBarrier(3);
359              Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
360                  public void realRun() throws Exception {
361                      start.await();
# Line 341 | Line 372 | public class CyclicBarrierTest extends J
372              t2.start();
373              start.await();
374              t1.interrupt();
375 <            t1.join();
376 <            t2.join();
375 >            awaitTermination(t1);
376 >            awaitTermination(t2);
377              assertTrue(barrier.isBroken());
378              assertEquals(0, barrier.getNumberWaiting());
379              barrier.reset();
# Line 355 | Line 386 | public class CyclicBarrierTest extends J
386       * Reset of a barrier after timeout reinitializes it.
387       */
388      public void testResetAfterTimeout() throws Exception {
358        final CyclicBarrier start = new CyclicBarrier(3);
389          final CyclicBarrier barrier = new CyclicBarrier(3);
390          for (int i = 0; i < 2; i++) {
391 <            Thread t1 = new ThreadShouldThrow(TimeoutException.class) {
392 <                    public void realRun() throws Exception {
363 <                        start.await();
364 <                        barrier.await(MEDIUM_DELAY_MS, MILLISECONDS);
365 <                    }};
366 <
367 <            Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
391 >            assertEquals(0, barrier.getNumberWaiting());
392 >            Thread t1 = newStartedThread(new CheckedRunnable() {
393                  public void realRun() throws Exception {
394 <                    start.await();
395 <                    barrier.await();
396 <                }};
394 >                    try {
395 >                        barrier.await();
396 >                        shouldThrow();
397 >                    } catch (BrokenBarrierException success) {}
398 >                }});
399 >            Thread t2 = newStartedThread(new CheckedRunnable() {
400 >                public void realRun() throws Exception {
401 >                    awaitNumberWaiting(barrier, 1);
402 >                    long startTime = System.nanoTime();
403 >                    try {
404 >                        barrier.await(timeoutMillis(), MILLISECONDS);
405 >                        shouldThrow();
406 >                    } catch (TimeoutException success) {}
407 >                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
408 >                }});
409  
410 <            t1.start();
411 <            t2.start();
412 <            start.await();
376 <            t1.join();
377 <            t2.join();
410 >            awaitTermination(t1);
411 >            awaitTermination(t2);
412 >            assertEquals(0, barrier.getNumberWaiting());
413              assertTrue(barrier.isBroken());
414              assertEquals(0, barrier.getNumberWaiting());
415              barrier.reset();
# Line 383 | Line 418 | public class CyclicBarrierTest extends J
418          }
419      }
420  
386
421      /**
422       * Reset of a barrier after a failed command reinitializes it.
423       */
424      public void testResetAfterCommandException() throws Exception {
391        final CyclicBarrier start = new CyclicBarrier(3);
425          final CyclicBarrier barrier =
426              new CyclicBarrier(3, new Runnable() {
427                      public void run() {
428                          throw new NullPointerException(); }});
429          for (int i = 0; i < 2; i++) {
430 +            final CyclicBarrier start = new CyclicBarrier(3);
431              Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
432                  public void realRun() throws Exception {
433                      start.await();
# Line 409 | Line 443 | public class CyclicBarrierTest extends J
443              t1.start();
444              t2.start();
445              start.await();
446 <            while (barrier.getNumberWaiting() < 2) { Thread.yield(); }
446 >            awaitNumberWaiting(barrier, 2);
447              try {
448                  barrier.await();
449                  shouldThrow();
450              } catch (NullPointerException success) {}
451 <            t1.join();
452 <            t2.join();
451 >            awaitTermination(t1);
452 >            awaitTermination(t2);
453              assertTrue(barrier.isBroken());
454              assertEquals(0, barrier.getNumberWaiting());
455              barrier.reset();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines