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