ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java
Revision: 1.31
Committed: Sat Nov 21 17:54:04 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +0 -3 lines
Log Message:
remove dead test code

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/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9
10 import junit.framework.*;
11 import java.util.*;
12 import java.util.concurrent.*;
13 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 import java.util.concurrent.locks.*;
15 import java.io.*;
16
17 public class AbstractQueuedSynchronizerTest extends JSR166TestCase {
18 public static void main(String[] args) {
19 junit.textui.TestRunner.run (suite());
20 }
21 public static Test suite() {
22 return new TestSuite(AbstractQueuedSynchronizerTest.class);
23 }
24
25 /**
26 * A simple mutex class, adapted from the
27 * AbstractQueuedSynchronizer javadoc. Exclusive acquire tests
28 * exercise this as a sample user extension. Other
29 * methods/features of AbstractQueuedSynchronizerTest are tested
30 * via other test classes, including those for ReentrantLock,
31 * ReentrantReadWriteLock, and Semaphore
32 */
33 static class Mutex extends AbstractQueuedSynchronizer {
34 public boolean isHeldExclusively() { return getState() == 1; }
35
36 public boolean tryAcquire(int acquires) {
37 assertTrue(acquires == 1);
38 return compareAndSetState(0, 1);
39 }
40
41 public boolean tryRelease(int releases) {
42 if (getState() == 0) throw new IllegalMonitorStateException();
43 setState(0);
44 return true;
45 }
46
47 public AbstractQueuedSynchronizer.ConditionObject newCondition() { return new AbstractQueuedSynchronizer.ConditionObject(); }
48
49 }
50
51
52 /**
53 * A simple latch class, to test shared mode.
54 */
55 static class BooleanLatch extends AbstractQueuedSynchronizer {
56 public boolean isSignalled() { return getState() != 0; }
57
58 public int tryAcquireShared(int ignore) {
59 return isSignalled()? 1 : -1;
60 }
61
62 public boolean tryReleaseShared(int ignore) {
63 setState(1);
64 return true;
65 }
66 }
67
68 /**
69 * A runnable calling acquireInterruptibly that does not expect to
70 * be interrupted.
71 */
72 class InterruptibleSyncRunnable extends CheckedRunnable {
73 final Mutex sync;
74 InterruptibleSyncRunnable(Mutex l) { sync = l; }
75 public void realRun() throws InterruptedException {
76 sync.acquireInterruptibly(1);
77 }
78 }
79
80
81 /**
82 * A runnable calling acquireInterruptibly that expects to be
83 * interrupted.
84 */
85 class InterruptedSyncRunnable extends CheckedInterruptedRunnable {
86 final Mutex sync;
87 InterruptedSyncRunnable(Mutex l) { sync = l; }
88 public void realRun() throws InterruptedException {
89 sync.acquireInterruptibly(1);
90 }
91 }
92
93 /**
94 * isHeldExclusively is false upon construction
95 */
96 public void testIsHeldExclusively() {
97 Mutex rl = new Mutex();
98 assertFalse(rl.isHeldExclusively());
99 }
100
101 /**
102 * acquiring released sync succeeds
103 */
104 public void testAcquire() {
105 Mutex rl = new Mutex();
106 rl.acquire(1);
107 assertTrue(rl.isHeldExclusively());
108 rl.release(1);
109 assertFalse(rl.isHeldExclusively());
110 }
111
112 /**
113 * tryAcquire on an released sync succeeds
114 */
115 public void testTryAcquire() {
116 Mutex rl = new Mutex();
117 assertTrue(rl.tryAcquire(1));
118 assertTrue(rl.isHeldExclusively());
119 rl.release(1);
120 }
121
122 /**
123 * hasQueuedThreads reports whether there are waiting threads
124 */
125 public void testhasQueuedThreads() throws InterruptedException {
126 final Mutex sync = new Mutex();
127 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
128 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
129 assertFalse(sync.hasQueuedThreads());
130 sync.acquire(1);
131 t1.start();
132 Thread.sleep(SHORT_DELAY_MS);
133 assertTrue(sync.hasQueuedThreads());
134 t2.start();
135 Thread.sleep(SHORT_DELAY_MS);
136 assertTrue(sync.hasQueuedThreads());
137 t1.interrupt();
138 Thread.sleep(SHORT_DELAY_MS);
139 assertTrue(sync.hasQueuedThreads());
140 sync.release(1);
141 Thread.sleep(SHORT_DELAY_MS);
142 assertFalse(sync.hasQueuedThreads());
143 t1.join();
144 t2.join();
145 }
146
147 /**
148 * isQueued(null) throws NPE
149 */
150 public void testIsQueuedNPE() {
151 final Mutex sync = new Mutex();
152 try {
153 sync.isQueued(null);
154 shouldThrow();
155 } catch (NullPointerException success) {}
156 }
157
158 /**
159 * isQueued reports whether a thread is queued.
160 */
161 public void testIsQueued() throws InterruptedException {
162 final Mutex sync = new Mutex();
163 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
164 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
165 assertFalse(sync.isQueued(t1));
166 assertFalse(sync.isQueued(t2));
167 sync.acquire(1);
168 t1.start();
169 Thread.sleep(SHORT_DELAY_MS);
170 assertTrue(sync.isQueued(t1));
171 t2.start();
172 Thread.sleep(SHORT_DELAY_MS);
173 assertTrue(sync.isQueued(t1));
174 assertTrue(sync.isQueued(t2));
175 t1.interrupt();
176 Thread.sleep(SHORT_DELAY_MS);
177 assertFalse(sync.isQueued(t1));
178 assertTrue(sync.isQueued(t2));
179 sync.release(1);
180 Thread.sleep(SHORT_DELAY_MS);
181 assertFalse(sync.isQueued(t1));
182 Thread.sleep(SHORT_DELAY_MS);
183 assertFalse(sync.isQueued(t2));
184 t1.join();
185 t2.join();
186 }
187
188 /**
189 * getFirstQueuedThread returns first waiting thread or null if none
190 */
191 public void testGetFirstQueuedThread() throws InterruptedException {
192 final Mutex sync = new Mutex();
193 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
194 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
195 assertNull(sync.getFirstQueuedThread());
196 sync.acquire(1);
197 t1.start();
198 Thread.sleep(SHORT_DELAY_MS);
199 assertEquals(t1, sync.getFirstQueuedThread());
200 t2.start();
201 Thread.sleep(SHORT_DELAY_MS);
202 assertEquals(t1, sync.getFirstQueuedThread());
203 t1.interrupt();
204 Thread.sleep(SHORT_DELAY_MS);
205 Thread.sleep(SHORT_DELAY_MS);
206 assertEquals(t2, sync.getFirstQueuedThread());
207 sync.release(1);
208 Thread.sleep(SHORT_DELAY_MS);
209 assertNull(sync.getFirstQueuedThread());
210 t1.join();
211 t2.join();
212 }
213
214
215 /**
216 * hasContended reports false if no thread has ever blocked, else true
217 */
218 public void testHasContended() throws InterruptedException {
219 final Mutex sync = new Mutex();
220 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
221 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
222 assertFalse(sync.hasContended());
223 sync.acquire(1);
224 t1.start();
225 Thread.sleep(SHORT_DELAY_MS);
226 assertTrue(sync.hasContended());
227 t2.start();
228 Thread.sleep(SHORT_DELAY_MS);
229 assertTrue(sync.hasContended());
230 t1.interrupt();
231 Thread.sleep(SHORT_DELAY_MS);
232 assertTrue(sync.hasContended());
233 sync.release(1);
234 Thread.sleep(SHORT_DELAY_MS);
235 assertTrue(sync.hasContended());
236 t1.join();
237 t2.join();
238 }
239
240 /**
241 * getQueuedThreads includes waiting threads
242 */
243 public void testGetQueuedThreads() throws InterruptedException {
244 final Mutex sync = new Mutex();
245 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
246 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
247 assertTrue(sync.getQueuedThreads().isEmpty());
248 sync.acquire(1);
249 assertTrue(sync.getQueuedThreads().isEmpty());
250 t1.start();
251 Thread.sleep(SHORT_DELAY_MS);
252 assertTrue(sync.getQueuedThreads().contains(t1));
253 t2.start();
254 Thread.sleep(SHORT_DELAY_MS);
255 assertTrue(sync.getQueuedThreads().contains(t1));
256 assertTrue(sync.getQueuedThreads().contains(t2));
257 t1.interrupt();
258 Thread.sleep(SHORT_DELAY_MS);
259 assertFalse(sync.getQueuedThreads().contains(t1));
260 assertTrue(sync.getQueuedThreads().contains(t2));
261 sync.release(1);
262 Thread.sleep(SHORT_DELAY_MS);
263 assertTrue(sync.getQueuedThreads().isEmpty());
264 t1.join();
265 t2.join();
266 }
267
268 /**
269 * getExclusiveQueuedThreads includes waiting threads
270 */
271 public void testGetExclusiveQueuedThreads() throws InterruptedException {
272 final Mutex sync = new Mutex();
273 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
274 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
275 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
276 sync.acquire(1);
277 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
278 t1.start();
279 Thread.sleep(SHORT_DELAY_MS);
280 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
281 t2.start();
282 Thread.sleep(SHORT_DELAY_MS);
283 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
284 assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
285 t1.interrupt();
286 Thread.sleep(SHORT_DELAY_MS);
287 assertFalse(sync.getExclusiveQueuedThreads().contains(t1));
288 assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
289 sync.release(1);
290 Thread.sleep(SHORT_DELAY_MS);
291 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
292 t1.join();
293 t2.join();
294 }
295
296 /**
297 * getSharedQueuedThreads does not include exclusively waiting threads
298 */
299 public void testGetSharedQueuedThreads() throws InterruptedException {
300 final Mutex sync = new Mutex();
301 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
302 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
303 assertTrue(sync.getSharedQueuedThreads().isEmpty());
304 sync.acquire(1);
305 assertTrue(sync.getSharedQueuedThreads().isEmpty());
306 t1.start();
307 Thread.sleep(SHORT_DELAY_MS);
308 assertTrue(sync.getSharedQueuedThreads().isEmpty());
309 t2.start();
310 Thread.sleep(SHORT_DELAY_MS);
311 assertTrue(sync.getSharedQueuedThreads().isEmpty());
312 t1.interrupt();
313 Thread.sleep(SHORT_DELAY_MS);
314 assertTrue(sync.getSharedQueuedThreads().isEmpty());
315 sync.release(1);
316 Thread.sleep(SHORT_DELAY_MS);
317 assertTrue(sync.getSharedQueuedThreads().isEmpty());
318 t1.join();
319 t2.join();
320 }
321
322 /**
323 * tryAcquireNanos is interruptible.
324 */
325 public void testInterruptedException2() throws InterruptedException {
326 final Mutex sync = new Mutex();
327 sync.acquire(1);
328 Thread t = new Thread(new CheckedInterruptedRunnable() {
329 public void realRun() throws InterruptedException {
330 sync.tryAcquireNanos(1, MEDIUM_DELAY_MS * 1000 * 1000);
331 }});
332
333 t.start();
334 t.interrupt();
335 t.join();
336 }
337
338
339 /**
340 * TryAcquire on exclusively held sync fails
341 */
342 public void testTryAcquireWhenSynced() throws InterruptedException {
343 final Mutex sync = new Mutex();
344 sync.acquire(1);
345 Thread t = new Thread(new CheckedRunnable() {
346 public void realRun() {
347 threadAssertFalse(sync.tryAcquire(1));
348 }});
349
350 t.start();
351 t.join();
352 sync.release(1);
353 }
354
355 /**
356 * tryAcquireNanos on an exclusively held sync times out
357 */
358 public void testAcquireNanos_Timeout() throws InterruptedException {
359 final Mutex sync = new Mutex();
360 sync.acquire(1);
361 Thread t = new Thread(new CheckedRunnable() {
362 public void realRun() throws InterruptedException {
363 threadAssertFalse(sync.tryAcquireNanos(1, 1000 * 1000));
364 }});
365
366 t.start();
367 t.join();
368 sync.release(1);
369 }
370
371
372 /**
373 * getState is true when acquired and false when not
374 */
375 public void testGetState() throws InterruptedException {
376 final Mutex sync = new Mutex();
377 sync.acquire(1);
378 assertTrue(sync.isHeldExclusively());
379 sync.release(1);
380 assertFalse(sync.isHeldExclusively());
381 Thread t = new Thread(new CheckedRunnable() {
382 public void realRun() throws InterruptedException {
383 sync.acquire(1);
384 Thread.sleep(SMALL_DELAY_MS);
385 sync.release(1);
386 }});
387
388 t.start();
389 Thread.sleep(SHORT_DELAY_MS);
390 assertTrue(sync.isHeldExclusively());
391 t.join();
392 assertFalse(sync.isHeldExclusively());
393 }
394
395
396 /**
397 * acquireInterruptibly is interruptible.
398 */
399 public void testAcquireInterruptibly1() throws InterruptedException {
400 final Mutex sync = new Mutex();
401 sync.acquire(1);
402 Thread t = new Thread(new InterruptedSyncRunnable(sync));
403
404 t.start();
405 Thread.sleep(SHORT_DELAY_MS);
406 t.interrupt();
407 Thread.sleep(SHORT_DELAY_MS);
408 sync.release(1);
409 t.join();
410 }
411
412 /**
413 * acquireInterruptibly succeeds when released, else is interruptible
414 */
415 public void testAcquireInterruptibly2() throws InterruptedException {
416 final Mutex sync = new Mutex();
417 sync.acquireInterruptibly(1);
418 Thread t = new Thread(new InterruptedSyncRunnable(sync));
419 t.start();
420 t.interrupt();
421 assertTrue(sync.isHeldExclusively());
422 t.join();
423 }
424
425 /**
426 * owns is true for a condition created by sync else false
427 */
428 public void testOwns() {
429 final Mutex sync = new Mutex();
430 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
431 final Mutex sync2 = new Mutex();
432 assertTrue(sync.owns(c));
433 assertFalse(sync2.owns(c));
434 }
435
436 /**
437 * Calling await without holding sync throws IllegalMonitorStateException
438 */
439 public void testAwait_IllegalMonitor() throws InterruptedException {
440 final Mutex sync = new Mutex();
441 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
442 try {
443 c.await();
444 shouldThrow();
445 } catch (IllegalMonitorStateException success) {}
446 }
447
448 /**
449 * Calling signal without holding sync throws IllegalMonitorStateException
450 */
451 public void testSignal_IllegalMonitor() {
452 final Mutex sync = new Mutex();
453 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
454 try {
455 c.signal();
456 shouldThrow();
457 } catch (IllegalMonitorStateException success) {}
458 }
459
460 /**
461 * awaitNanos without a signal times out
462 */
463 public void testAwaitNanos_Timeout() throws InterruptedException {
464 final Mutex sync = new Mutex();
465 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
466 sync.acquire(1);
467 long t = c.awaitNanos(100);
468 assertTrue(t <= 0);
469 sync.release(1);
470 }
471
472 /**
473 * Timed await without a signal times out
474 */
475 public void testAwait_Timeout() throws InterruptedException {
476 final Mutex sync = new Mutex();
477 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
478 sync.acquire(1);
479 assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
480 sync.release(1);
481 }
482
483 /**
484 * awaitUntil without a signal times out
485 */
486 public void testAwaitUntil_Timeout() throws InterruptedException {
487 final Mutex sync = new Mutex();
488 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
489 sync.acquire(1);
490 java.util.Date d = new java.util.Date();
491 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
492 sync.release(1);
493 }
494
495 /**
496 * await returns when signalled
497 */
498 public void testAwait() throws InterruptedException {
499 final Mutex sync = new Mutex();
500 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
501 Thread t = new Thread(new CheckedRunnable() {
502 public void realRun() throws InterruptedException {
503 sync.acquire(1);
504 c.await();
505 sync.release(1);
506 }});
507
508 t.start();
509 Thread.sleep(SHORT_DELAY_MS);
510 sync.acquire(1);
511 c.signal();
512 sync.release(1);
513 t.join(SHORT_DELAY_MS);
514 assertFalse(t.isAlive());
515 }
516
517
518
519 /**
520 * hasWaiters throws NPE if null
521 */
522 public void testHasWaitersNPE() {
523 final Mutex sync = new Mutex();
524 try {
525 sync.hasWaiters(null);
526 shouldThrow();
527 } catch (NullPointerException success) {}
528 }
529
530 /**
531 * getWaitQueueLength throws NPE if null
532 */
533 public void testGetWaitQueueLengthNPE() {
534 final Mutex sync = new Mutex();
535 try {
536 sync.getWaitQueueLength(null);
537 shouldThrow();
538 } catch (NullPointerException success) {}
539 }
540
541
542 /**
543 * getWaitingThreads throws NPE if null
544 */
545 public void testGetWaitingThreadsNPE() {
546 final Mutex sync = new Mutex();
547 try {
548 sync.getWaitingThreads(null);
549 shouldThrow();
550 } catch (NullPointerException success) {}
551 }
552
553
554 /**
555 * hasWaiters throws IAE if not owned
556 */
557 public void testHasWaitersIAE() {
558 final Mutex sync = new Mutex();
559 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
560 final Mutex sync2 = new Mutex();
561 try {
562 sync2.hasWaiters(c);
563 shouldThrow();
564 } catch (IllegalArgumentException success) {}
565 }
566
567 /**
568 * hasWaiters throws IMSE if not synced
569 */
570 public void testHasWaitersIMSE() {
571 final Mutex sync = new Mutex();
572 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
573 try {
574 sync.hasWaiters(c);
575 shouldThrow();
576 } catch (IllegalMonitorStateException success) {}
577 }
578
579
580 /**
581 * getWaitQueueLength throws IAE if not owned
582 */
583 public void testGetWaitQueueLengthIAE() {
584 final Mutex sync = new Mutex();
585 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
586 final Mutex sync2 = new Mutex();
587 try {
588 sync2.getWaitQueueLength(c);
589 shouldThrow();
590 } catch (IllegalArgumentException success) {}
591 }
592
593 /**
594 * getWaitQueueLength throws IMSE if not synced
595 */
596 public void testGetWaitQueueLengthIMSE() {
597 final Mutex sync = new Mutex();
598 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
599 try {
600 sync.getWaitQueueLength(c);
601 shouldThrow();
602 } catch (IllegalMonitorStateException success) {}
603 }
604
605
606 /**
607 * getWaitingThreads throws IAE if not owned
608 */
609 public void testGetWaitingThreadsIAE() {
610 final Mutex sync = new Mutex();
611 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
612 final Mutex sync2 = new Mutex();
613 try {
614 sync2.getWaitingThreads(c);
615 shouldThrow();
616 } catch (IllegalArgumentException success) {}
617 }
618
619 /**
620 * getWaitingThreads throws IMSE if not synced
621 */
622 public void testGetWaitingThreadsIMSE() {
623 final Mutex sync = new Mutex();
624 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
625 try {
626 sync.getWaitingThreads(c);
627 shouldThrow();
628 } catch (IllegalMonitorStateException success) {}
629 }
630
631
632
633 /**
634 * hasWaiters returns true when a thread is waiting, else false
635 */
636 public void testHasWaiters() throws InterruptedException {
637 final Mutex sync = new Mutex();
638 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
639 Thread t = new Thread(new CheckedRunnable() {
640 public void realRun() throws InterruptedException {
641 sync.acquire(1);
642 threadAssertFalse(sync.hasWaiters(c));
643 threadAssertEquals(0, sync.getWaitQueueLength(c));
644 c.await();
645 sync.release(1);
646 }});
647
648 t.start();
649 Thread.sleep(SHORT_DELAY_MS);
650 sync.acquire(1);
651 assertTrue(sync.hasWaiters(c));
652 assertEquals(1, sync.getWaitQueueLength(c));
653 c.signal();
654 sync.release(1);
655 Thread.sleep(SHORT_DELAY_MS);
656 sync.acquire(1);
657 assertFalse(sync.hasWaiters(c));
658 assertEquals(0, sync.getWaitQueueLength(c));
659 sync.release(1);
660 t.join(SHORT_DELAY_MS);
661 assertFalse(t.isAlive());
662 }
663
664 /**
665 * getWaitQueueLength returns number of waiting threads
666 */
667 public void testGetWaitQueueLength() throws InterruptedException {
668 final Mutex sync = new Mutex();
669 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
670 Thread t1 = new Thread(new CheckedRunnable() {
671 public void realRun() throws InterruptedException {
672 sync.acquire(1);
673 threadAssertFalse(sync.hasWaiters(c));
674 threadAssertEquals(0, sync.getWaitQueueLength(c));
675 c.await();
676 sync.release(1);
677 }});
678
679 Thread t2 = new Thread(new CheckedRunnable() {
680 public void realRun() throws InterruptedException {
681 sync.acquire(1);
682 threadAssertTrue(sync.hasWaiters(c));
683 threadAssertEquals(1, sync.getWaitQueueLength(c));
684 c.await();
685 sync.release(1);
686 }});
687
688 t1.start();
689 Thread.sleep(SHORT_DELAY_MS);
690 t2.start();
691 Thread.sleep(SHORT_DELAY_MS);
692 sync.acquire(1);
693 assertTrue(sync.hasWaiters(c));
694 assertEquals(2, sync.getWaitQueueLength(c));
695 c.signalAll();
696 sync.release(1);
697 Thread.sleep(SHORT_DELAY_MS);
698 sync.acquire(1);
699 assertFalse(sync.hasWaiters(c));
700 assertEquals(0, sync.getWaitQueueLength(c));
701 sync.release(1);
702 t1.join(SHORT_DELAY_MS);
703 t2.join(SHORT_DELAY_MS);
704 assertFalse(t1.isAlive());
705 assertFalse(t2.isAlive());
706 }
707
708 /**
709 * getWaitingThreads returns only and all waiting threads
710 */
711 public void testGetWaitingThreads() throws InterruptedException {
712 final Mutex sync = new Mutex();
713 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
714 Thread t1 = new Thread(new CheckedRunnable() {
715 public void realRun() throws InterruptedException {
716 sync.acquire(1);
717 threadAssertTrue(sync.getWaitingThreads(c).isEmpty());
718 c.await();
719 sync.release(1);
720 }});
721
722 Thread t2 = new Thread(new CheckedRunnable() {
723 public void realRun() throws InterruptedException {
724 sync.acquire(1);
725 threadAssertFalse(sync.getWaitingThreads(c).isEmpty());
726 c.await();
727 sync.release(1);
728 }});
729
730 sync.acquire(1);
731 assertTrue(sync.getWaitingThreads(c).isEmpty());
732 sync.release(1);
733 t1.start();
734 Thread.sleep(SHORT_DELAY_MS);
735 t2.start();
736 Thread.sleep(SHORT_DELAY_MS);
737 sync.acquire(1);
738 assertTrue(sync.hasWaiters(c));
739 assertTrue(sync.getWaitingThreads(c).contains(t1));
740 assertTrue(sync.getWaitingThreads(c).contains(t2));
741 c.signalAll();
742 sync.release(1);
743 Thread.sleep(SHORT_DELAY_MS);
744 sync.acquire(1);
745 assertFalse(sync.hasWaiters(c));
746 assertTrue(sync.getWaitingThreads(c).isEmpty());
747 sync.release(1);
748 t1.join(SHORT_DELAY_MS);
749 t2.join(SHORT_DELAY_MS);
750 assertFalse(t1.isAlive());
751 assertFalse(t2.isAlive());
752 }
753
754
755
756 /**
757 * awaitUninterruptibly doesn't abort on interrupt
758 */
759 public void testAwaitUninterruptibly() throws InterruptedException {
760 final Mutex sync = new Mutex();
761 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
762 Thread t = new Thread(new CheckedRunnable() {
763 public void realRun() {
764 sync.acquire(1);
765 c.awaitUninterruptibly();
766 sync.release(1);
767 }});
768
769 t.start();
770 Thread.sleep(SHORT_DELAY_MS);
771 t.interrupt();
772 sync.acquire(1);
773 c.signal();
774 sync.release(1);
775 t.join(SHORT_DELAY_MS);
776 assertFalse(t.isAlive());
777 }
778
779 /**
780 * await is interruptible
781 */
782 public void testAwait_Interrupt() throws InterruptedException {
783 final Mutex sync = new Mutex();
784 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
785 Thread t = new Thread(new CheckedInterruptedRunnable() {
786 public void realRun() throws InterruptedException {
787 sync.acquire(1);
788 c.await();
789 }});
790
791 t.start();
792 Thread.sleep(SHORT_DELAY_MS);
793 t.interrupt();
794 t.join(SHORT_DELAY_MS);
795 assertFalse(t.isAlive());
796 }
797
798 /**
799 * awaitNanos is interruptible
800 */
801 public void testAwaitNanos_Interrupt() throws InterruptedException {
802 final Mutex sync = new Mutex();
803 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
804 Thread t = new Thread(new CheckedInterruptedRunnable() {
805 public void realRun() throws InterruptedException {
806 sync.acquire(1);
807 c.awaitNanos(1000 * 1000 * 1000); // 1 sec
808 }});
809
810 t.start();
811 Thread.sleep(SHORT_DELAY_MS);
812 t.interrupt();
813 t.join(SHORT_DELAY_MS);
814 assertFalse(t.isAlive());
815 }
816
817 /**
818 * awaitUntil is interruptible
819 */
820 public void testAwaitUntil_Interrupt() throws InterruptedException {
821 final Mutex sync = new Mutex();
822 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
823 Thread t = new Thread(new CheckedInterruptedRunnable() {
824 public void realRun() throws InterruptedException {
825 sync.acquire(1);
826 java.util.Date d = new java.util.Date();
827 c.awaitUntil(new java.util.Date(d.getTime() + 10000));
828 }});
829
830 t.start();
831 Thread.sleep(SHORT_DELAY_MS);
832 t.interrupt();
833 t.join(SHORT_DELAY_MS);
834 assertFalse(t.isAlive());
835 }
836
837 /**
838 * signalAll wakes up all threads
839 */
840 public void testSignalAll() throws InterruptedException {
841 final Mutex sync = new Mutex();
842 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
843 Thread t1 = new Thread(new CheckedRunnable() {
844 public void realRun() throws InterruptedException {
845 sync.acquire(1);
846 c.await();
847 sync.release(1);
848 }});
849
850 Thread t2 = new Thread(new CheckedRunnable() {
851 public void realRun() throws InterruptedException {
852 sync.acquire(1);
853 c.await();
854 sync.release(1);
855 }});
856
857 t1.start();
858 t2.start();
859 Thread.sleep(SHORT_DELAY_MS);
860 sync.acquire(1);
861 c.signalAll();
862 sync.release(1);
863 t1.join(SHORT_DELAY_MS);
864 t2.join(SHORT_DELAY_MS);
865 assertFalse(t1.isAlive());
866 assertFalse(t2.isAlive());
867 }
868
869
870 /**
871 * toString indicates current state
872 */
873 public void testToString() {
874 Mutex sync = new Mutex();
875 String us = sync.toString();
876 assertTrue(us.indexOf("State = 0") >= 0);
877 sync.acquire(1);
878 String ls = sync.toString();
879 assertTrue(ls.indexOf("State = 1") >= 0);
880 }
881
882 /**
883 * A serialized AQS deserializes with current state
884 */
885 public void testSerialization() throws Exception {
886 Mutex l = new Mutex();
887 l.acquire(1);
888 assertTrue(l.isHeldExclusively());
889
890 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
891 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
892 out.writeObject(l);
893 out.close();
894
895 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
896 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
897 Mutex r = (Mutex) in.readObject();
898 assertTrue(r.isHeldExclusively());
899 }
900
901
902 /**
903 * tryReleaseShared setting state changes getState
904 */
905 public void testGetStateWithReleaseShared() {
906 final BooleanLatch l = new BooleanLatch();
907 assertFalse(l.isSignalled());
908 l.releaseShared(0);
909 assertTrue(l.isSignalled());
910 }
911
912 /**
913 * releaseShared has no effect when already signalled
914 */
915 public void testReleaseShared() {
916 final BooleanLatch l = new BooleanLatch();
917 assertFalse(l.isSignalled());
918 l.releaseShared(0);
919 assertTrue(l.isSignalled());
920 l.releaseShared(0);
921 assertTrue(l.isSignalled());
922 }
923
924 /**
925 * acquireSharedInterruptibly returns after release, but not before
926 */
927 public void testAcquireSharedInterruptibly() throws InterruptedException {
928 final BooleanLatch l = new BooleanLatch();
929
930 Thread t = new Thread(new CheckedRunnable() {
931 public void realRun() throws InterruptedException {
932 threadAssertFalse(l.isSignalled());
933 l.acquireSharedInterruptibly(0);
934 threadAssertTrue(l.isSignalled());
935 }});
936
937 t.start();
938 assertFalse(l.isSignalled());
939 Thread.sleep(SHORT_DELAY_MS);
940 l.releaseShared(0);
941 assertTrue(l.isSignalled());
942 t.join();
943 }
944
945
946 /**
947 * acquireSharedTimed returns after release
948 */
949 public void testAsquireSharedTimed() throws InterruptedException {
950 final BooleanLatch l = new BooleanLatch();
951
952 Thread t = new Thread(new CheckedRunnable() {
953 public void realRun() throws InterruptedException {
954 threadAssertFalse(l.isSignalled());
955 threadAssertTrue(l.tryAcquireSharedNanos(0, MEDIUM_DELAY_MS* 1000 * 1000));
956 threadAssertTrue(l.isSignalled());
957 }});
958
959 t.start();
960 assertFalse(l.isSignalled());
961 Thread.sleep(SHORT_DELAY_MS);
962 l.releaseShared(0);
963 assertTrue(l.isSignalled());
964 t.join();
965 }
966
967 /**
968 * acquireSharedInterruptibly throws IE if interrupted before released
969 */
970 public void testAcquireSharedInterruptibly_InterruptedException() throws InterruptedException {
971 final BooleanLatch l = new BooleanLatch();
972 Thread t = new Thread(new CheckedInterruptedRunnable() {
973 public void realRun() throws InterruptedException {
974 threadAssertFalse(l.isSignalled());
975 l.acquireSharedInterruptibly(0);
976 }});
977
978 t.start();
979 assertFalse(l.isSignalled());
980 t.interrupt();
981 t.join();
982 }
983
984 /**
985 * acquireSharedTimed throws IE if interrupted before released
986 */
987 public void testAcquireSharedNanos_InterruptedException() throws InterruptedException {
988 final BooleanLatch l = new BooleanLatch();
989 Thread t = new Thread(new CheckedInterruptedRunnable() {
990 public void realRun() throws InterruptedException {
991 threadAssertFalse(l.isSignalled());
992 l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000);
993 }});
994
995 t.start();
996 Thread.sleep(SHORT_DELAY_MS);
997 assertFalse(l.isSignalled());
998 t.interrupt();
999 t.join();
1000 }
1001
1002 /**
1003 * acquireSharedTimed times out if not released before timeout
1004 */
1005 public void testAcquireSharedNanos_Timeout() throws InterruptedException {
1006 final BooleanLatch l = new BooleanLatch();
1007 Thread t = new Thread(new CheckedRunnable() {
1008 public void realRun() throws InterruptedException {
1009 threadAssertFalse(l.isSignalled());
1010 threadAssertFalse(l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000));
1011 }});
1012
1013 t.start();
1014 Thread.sleep(SHORT_DELAY_MS);
1015 assertFalse(l.isSignalled());
1016 t.join();
1017 }
1018
1019 }