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

Comparing jsr166/src/test/tck/ReentrantLockTest.java (file contents):
Revision 1.5 by dl, Sat Sep 20 00:31:57 2003 UTC vs.
Revision 1.15 by dl, Mon Dec 29 19:05:40 2003 UTC

# Line 1 | Line 1
1   /*
2 < * Written by members of JCP JSR-166 Expert Group and released to the
3 < * public domain. Use, modify, and redistribute this code in any way
4 < * without acknowledgement. Other contributors include Andrew Wright,
5 < * Jeffrey Hayes, Pat Fischer, Mike Judd.
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   import junit.framework.*;
# Line 19 | Line 20 | public class ReentrantLockTest extends J
20          return new TestSuite(ReentrantLockTest.class);
21      }
22  
23 <    static int HOLD_COUNT_TEST_LIMIT = 20;
24 <
23 >    /**
24 >     * A runnable calling lockInterruptibly
25 >     */
26      class InterruptibleLockRunnable implements Runnable {
27          final ReentrantLock lock;
28          InterruptibleLockRunnable(ReentrantLock l) { lock = l; }
29 <        public void run(){
30 <            try{
29 >        public void run() {
30 >            try {
31                  lock.lockInterruptibly();
32              } catch(InterruptedException success){}
33          }
34      }
35  
36 <    // Same, except must interrupt
36 >
37 >    /**
38 >     * A runnable calling lockInterruptibly that expects to be
39 >     * interrupted
40 >     */
41      class InterruptedLockRunnable implements Runnable {
42          final ReentrantLock lock;
43          InterruptedLockRunnable(ReentrantLock l) { lock = l; }
44 <        public void run(){
45 <            try{
44 >        public void run() {
45 >            try {
46                  lock.lockInterruptibly();
47 <                threadFail("should throw");
47 >                threadShouldThrow();
48              } catch(InterruptedException success){}
49          }
50      }
51  
52      /**
53 <     * To expose protected methods
53 >     * Subclass to expose protected methods
54       */
55 <    static class MyReentrantLock extends ReentrantLock {
56 <        MyReentrantLock() { super(); }
55 >    static class PublicReentrantLock extends ReentrantLock {
56 >        PublicReentrantLock() { super(); }
57          public Collection<Thread> getQueuedThreads() {
58              return super.getQueuedThreads();
59          }
60 <        public ConditionObject newCondition() {
61 <            return new MyCondition(this);
60 >        public Collection<Thread> getWaitingThreads(Condition c) {
61 >            return super.getWaitingThreads(c);
62          }
63  
58        static class MyCondition extends ReentrantLock.ConditionObject {
59            MyCondition(MyReentrantLock l) { super(l); }
60            public Collection<Thread> getWaitingThreads() {
61                return super.getWaitingThreads();
62            }
63        }
64  
65      }
66  
67 <    /*
67 >    /**
68 >     * Constructor sets given fairness
69 >     */
70 >    public void testConstructor() {
71 >        ReentrantLock rl = new ReentrantLock();
72 >        assertFalse(rl.isFair());
73 >        ReentrantLock r2 = new ReentrantLock(true);
74 >        assertTrue(r2.isFair());
75 >    }
76 >
77 >    /**
78 >     * locking an unlocked lock succeeds
79 >     */
80 >    public void testLock() {
81 >        ReentrantLock rl = new ReentrantLock();
82 >        rl.lock();
83 >        assertTrue(rl.isLocked());
84 >        rl.unlock();
85 >    }
86 >
87 >    /**
88 >     * locking an unlocked fair lock succeeds
89 >     */
90 >    public void testFairLock() {
91 >        ReentrantLock rl = new ReentrantLock(true);
92 >        rl.lock();
93 >        assertTrue(rl.isLocked());
94 >        rl.unlock();
95 >    }
96 >
97 >    /**
98       * Unlocking an unlocked lock throws IllegalMonitorStateException
99       */
100 <    public void testIllegalMonitorStateException(){
100 >    public void testUnlock_IllegalMonitorStateException() {
101          ReentrantLock rl = new ReentrantLock();
102 <        try{
102 >        try {
103              rl.unlock();
104 <            fail("Should of thown Illegal Monitor State Exception");
104 >            shouldThrow();
105  
106          } catch(IllegalMonitorStateException success){}
107      }
108  
109 <    /*
110 <     * lockInterruptibly is interruptible.
109 >    /**
110 >     * tryLock on an unlocked lock succeeds
111       */
112 <    public void testInterruptedException(){
112 >    public void testTryLock() {
113 >        ReentrantLock rl = new ReentrantLock();
114 >        assertTrue(rl.tryLock());
115 >        assertTrue(rl.isLocked());
116 >        rl.unlock();
117 >    }
118 >
119 >
120 >    /**
121 >     * hasQueuedThreads reports whether there are waiting threads
122 >     */
123 >    public void testhasQueuedThreads() {
124          final ReentrantLock lock = new ReentrantLock();
125 <        lock.lock();
126 <        Thread t = new Thread(new InterruptedLockRunnable(lock));
125 >        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
126 >        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
127          try {
128 <            t.start();
129 <            t.interrupt();
128 >            assertFalse(lock.hasQueuedThreads());
129 >            lock.lock();
130 >            t1.start();
131 >            Thread.sleep(SHORT_DELAY_MS);
132 >            assertTrue(lock.hasQueuedThreads());
133 >            t2.start();
134 >            Thread.sleep(SHORT_DELAY_MS);
135 >            assertTrue(lock.hasQueuedThreads());
136 >            t1.interrupt();
137 >            Thread.sleep(SHORT_DELAY_MS);
138 >            assertTrue(lock.hasQueuedThreads());
139              lock.unlock();
140 <            t.join();
140 >            Thread.sleep(SHORT_DELAY_MS);
141 >            assertFalse(lock.hasQueuedThreads());
142 >            t1.join();
143 >            t2.join();
144          } catch(Exception e){
145 <            fail("unexpected exception");
145 >            unexpectedException();
146          }
147      }
148  
149 <    /*
150 <     * getLockQueueLength reports number of waiting threads
149 >    /**
150 >     * getQueueLength reports number of waiting threads
151       */
152 <    public void testgetLockQueueLength(){
152 >    public void testGetQueueLength() {
153          final ReentrantLock lock = new ReentrantLock();
154          Thread t1 = new Thread(new InterruptedLockRunnable(lock));
155          Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
156          try {
157 <            assertEquals(0, lock.getLockQueueLength());
157 >            assertEquals(0, lock.getQueueLength());
158              lock.lock();
159              t1.start();
160              Thread.sleep(SHORT_DELAY_MS);
161 <            assertEquals(1, lock.getLockQueueLength());
161 >            assertEquals(1, lock.getQueueLength());
162              t2.start();
163              Thread.sleep(SHORT_DELAY_MS);
164 <            assertEquals(2, lock.getLockQueueLength());
164 >            assertEquals(2, lock.getQueueLength());
165              t1.interrupt();
166              Thread.sleep(SHORT_DELAY_MS);
167 <            assertEquals(1, lock.getLockQueueLength());
167 >            assertEquals(1, lock.getQueueLength());
168              lock.unlock();
169              Thread.sleep(SHORT_DELAY_MS);
170 <            assertEquals(0, lock.getLockQueueLength());
170 >            assertEquals(0, lock.getQueueLength());
171              t1.join();
172              t2.join();
173          } catch(Exception e){
174 <            fail("unexpected exception");
174 >            unexpectedException();
175          }
176      }
177  
178 <    /*
178 >    /**
179       * getQueuedThreads includes waiting threads
180       */
181 <    public void testGetQueuedThreads(){
182 <        final MyReentrantLock lock = new MyReentrantLock();
181 >    public void testGetQueuedThreads() {
182 >        final PublicReentrantLock lock = new PublicReentrantLock();
183          Thread t1 = new Thread(new InterruptedLockRunnable(lock));
184          Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
185          try {
# Line 150 | Line 203 | public class ReentrantLockTest extends J
203              t1.join();
204              t2.join();
205          } catch(Exception e){
206 <            fail("unexpected exception");
206 >            unexpectedException();
207          }
208      }
209  
210  
211 <    /*
212 <     * timed trylock is interruptible.
211 >    /**
212 >     * timed tryLock is interruptible.
213       */
214 <    public void testInterruptedException2(){
214 >    public void testInterruptedException2() {
215          final ReentrantLock lock = new ReentrantLock();
216          lock.lock();
217          Thread t = new Thread(new Runnable() {
218 <                public void run(){
219 <                    try{
218 >                public void run() {
219 >                    try {
220                          lock.tryLock(MEDIUM_DELAY_MS,TimeUnit.MILLISECONDS);
221 <                        threadFail("should throw");
221 >                        threadShouldThrow();
222                      } catch(InterruptedException success){}
223                  }
224              });
# Line 173 | Line 226 | public class ReentrantLockTest extends J
226              t.start();
227              t.interrupt();
228          } catch(Exception e){
229 <            fail("unexpected exception");
229 >            unexpectedException();
230          }
231      }
232  
233  
234      /**
235 <     * Trylock on a locked lock fails
235 >     * TryLock on a locked lock fails
236       */
237      public void testTryLockWhenLocked() {
238          final ReentrantLock lock = new ReentrantLock();
239          lock.lock();
240          Thread t = new Thread(new Runnable() {
241 <                public void run(){
241 >                public void run() {
242                      threadAssertFalse(lock.tryLock());
243                  }
244              });
# Line 194 | Line 247 | public class ReentrantLockTest extends J
247              t.join();
248              lock.unlock();
249          } catch(Exception e){
250 <            fail("unexpected exception");
250 >            unexpectedException();
251          }
252      }
253  
254      /**
255 <     * Timed Trylock on a locked lock times out
255 >     * Timed tryLock on a locked lock times out
256       */
257 <    public void testTryLock_Timeout(){
257 >    public void testTryLock_Timeout() {
258          final ReentrantLock lock = new ReentrantLock();
259          lock.lock();
260          Thread t = new Thread(new Runnable() {
261 <                public void run(){
261 >                public void run() {
262                      try {
263                          threadAssertFalse(lock.tryLock(1, TimeUnit.MILLISECONDS));
264                      } catch (Exception ex) {
265 <                        threadFail("unexpected exception");
265 >                        threadUnexpectedException();
266                      }
267                  }
268              });
# Line 218 | Line 271 | public class ReentrantLockTest extends J
271              t.join();
272              lock.unlock();
273          } catch(Exception e){
274 <            fail("unexpected exception");
274 >            unexpectedException();
275          }
276      }
277      
# Line 227 | Line 280 | public class ReentrantLockTest extends J
280       */
281      public void testGetHoldCount() {
282          ReentrantLock lock = new ReentrantLock();
283 <        for(int i = 1; i <= ReentrantLockTest.HOLD_COUNT_TEST_LIMIT;i++) {
283 >        for(int i = 1; i <= SIZE; i++) {
284              lock.lock();
285              assertEquals(i,lock.getHoldCount());
286          }
287 <        for(int i = ReentrantLockTest.HOLD_COUNT_TEST_LIMIT; i > 0; i--) {
287 >        for(int i = SIZE; i > 0; i--) {
288              lock.unlock();
289              assertEquals(i-1,lock.getHoldCount());
290          }
# Line 254 | Line 307 | public class ReentrantLockTest extends J
307                          Thread.sleep(SMALL_DELAY_MS);
308                      }
309                      catch(Exception e) {
310 <                        threadFail("unexpected exception");
310 >                        threadUnexpectedException();
311                      }
312                      lock.unlock();
313                  }
314              });
315 <        try{
315 >        try {
316              t.start();
317              Thread.sleep(SHORT_DELAY_MS);
318              assertTrue(lock.isLocked());
319              t.join();
320              assertFalse(lock.isLocked());
321          } catch(Exception e){
322 <            fail("unexpected exception");
322 >            unexpectedException();
323          }
324      }
325  
326  
327      /**
328 +     * lockInterruptibly is interruptible.
329 +     */
330 +    public void testLockInterruptibly1() {
331 +        final ReentrantLock lock = new ReentrantLock();
332 +        lock.lock();
333 +        Thread t = new Thread(new InterruptedLockRunnable(lock));
334 +        try {
335 +            t.start();
336 +            t.interrupt();
337 +            lock.unlock();
338 +            t.join();
339 +        } catch(Exception e){
340 +            unexpectedException();
341 +        }
342 +    }
343 +
344 +    /**
345       * lockInterruptibly succeeds when unlocked, else is interruptible
346       */
347 <    public void testLockInterruptibly() {
347 >    public void testLockInterruptibly2() {
348          final ReentrantLock lock = new ReentrantLock();
349          try {
350              lock.lockInterruptibly();
351          } catch(Exception e) {
352 <            fail("unexpected exception");
352 >            unexpectedException();
353          }
354          Thread t = new Thread(new InterruptedLockRunnable(lock));
355          try {
# Line 289 | Line 359 | public class ReentrantLockTest extends J
359              assertTrue(lock.isHeldByCurrentThread());
360              t.join();
361          } catch(Exception e){
362 <            fail("unexpected exception");
362 >            unexpectedException();
363          }
364      }
365  
366 +    /**
367 +     * Calling await without holding lock throws IllegalMonitorStateException
368 +     */
369      public void testAwait_IllegalMonitor() {
370          final ReentrantLock lock = new ReentrantLock();
371          final Condition c = lock.newCondition();
372          try {
373              c.await();
374 <            fail("should throw");
374 >            shouldThrow();
375          }
376          catch (IllegalMonitorStateException success) {
377          }
378          catch (Exception ex) {
379 <            fail("should throw IMSE");
379 >            unexpectedException();
380          }
381      }
382  
383 +    /**
384 +     * Calling signal without holding lock throws IllegalMonitorStateException
385 +     */
386      public void testSignal_IllegalMonitor() {
387          final ReentrantLock lock = new ReentrantLock();
388          final Condition c = lock.newCondition();
389          try {
390              c.signal();
391 <            fail("should throw");
391 >            shouldThrow();
392          }
393          catch (IllegalMonitorStateException success) {
394          }
395          catch (Exception ex) {
396 <            fail("should throw IMSE");
396 >            unexpectedException();
397          }
398      }
399  
400 +    /**
401 +     * awaitNanos without a signal times out
402 +     */
403      public void testAwaitNanos_Timeout() {
404          final ReentrantLock lock = new ReentrantLock();
405          final Condition c = lock.newCondition();
# Line 331 | Line 410 | public class ReentrantLockTest extends J
410              lock.unlock();
411          }
412          catch (Exception ex) {
413 <            fail("unexpected exception");
413 >            unexpectedException();
414          }
415      }
416  
417 +    /**
418 +     *  timed await without a signal times out
419 +     */
420      public void testAwait_Timeout() {
421          final ReentrantLock lock = new ReentrantLock();
422          final Condition c = lock.newCondition();
# Line 344 | Line 426 | public class ReentrantLockTest extends J
426              lock.unlock();
427          }
428          catch (Exception ex) {
429 <            fail("unexpected exception");
429 >            unexpectedException();
430          }
431      }
432  
433 +    /**
434 +     * awaitUntil without a signal times out
435 +     */
436      public void testAwaitUntil_Timeout() {
437          final ReentrantLock lock = new ReentrantLock();
438          final Condition c = lock.newCondition();
# Line 358 | Line 443 | public class ReentrantLockTest extends J
443              lock.unlock();
444          }
445          catch (Exception ex) {
446 <            fail("unexpected exception");
446 >            unexpectedException();
447          }
448      }
449  
450 +    /**
451 +     * await returns when signalled
452 +     */
453      public void testAwait() {
454          final ReentrantLock lock = new ReentrantLock();
455 <        final ReentrantLock.ConditionObject c = lock.newCondition();
455 >        final Condition c = lock.newCondition();
456          Thread t = new Thread(new Runnable() {
457                  public void run() {
458                      try {
# Line 373 | Line 461 | public class ReentrantLockTest extends J
461                          lock.unlock();
462                      }
463                      catch(InterruptedException e) {
464 <                        threadFail("unexpected exception");
464 >                        threadUnexpectedException();
465                      }
466                  }
467              });
# Line 388 | Line 476 | public class ReentrantLockTest extends J
476              assertFalse(t.isAlive());
477          }
478          catch (Exception ex) {
479 <            fail("unexpected exception");
479 >            unexpectedException();
480          }
481      }
482  
483 +    /**
484 +     * hasWaiters throws NPE if null
485 +     */
486 +    public void testHasWaitersNPE() {
487 +        final ReentrantLock lock = new ReentrantLock();
488 +        try {
489 +            lock.hasWaiters(null);
490 +            shouldThrow();
491 +        } catch (NullPointerException success) {
492 +        } catch (Exception ex) {
493 +            unexpectedException();
494 +        }
495 +    }
496 +
497 +    /**
498 +     * getWaitQueueLength throws NPE if null
499 +     */
500 +    public void testGetWaitQueueLengthNPE() {
501 +        final ReentrantLock lock = new ReentrantLock();
502 +        try {
503 +            lock.getWaitQueueLength(null);
504 +            shouldThrow();
505 +        } catch (NullPointerException success) {
506 +        } catch (Exception ex) {
507 +            unexpectedException();
508 +        }
509 +    }
510 +
511 +
512 +    /**
513 +     * getWaitingThreads throws NPE if null
514 +     */
515 +    public void testGetWaitingThreadsNPE() {
516 +        final PublicReentrantLock lock = new PublicReentrantLock();
517 +        try {
518 +            lock.getWaitingThreads(null);
519 +            shouldThrow();
520 +        } catch (NullPointerException success) {
521 +        } catch (Exception ex) {
522 +            unexpectedException();
523 +        }
524 +    }
525 +
526 +
527 +    /**
528 +     * hasWaiters throws IAE if not owned
529 +     */
530 +    public void testHasWaitersIAE() {
531 +        final ReentrantLock lock = new ReentrantLock();
532 +        final Condition c = (lock.newCondition());
533 +        final ReentrantLock lock2 = new ReentrantLock();
534 +        try {
535 +            lock2.hasWaiters(c);
536 +            shouldThrow();
537 +        } catch (IllegalArgumentException success) {
538 +        } catch (Exception ex) {
539 +            unexpectedException();
540 +        }
541 +    }
542 +
543 +    /**
544 +     * hasWaiters throws IMSE if not locked
545 +     */
546 +    public void testHasWaitersIMSE() {
547 +        final ReentrantLock lock = new ReentrantLock();
548 +        final Condition c = (lock.newCondition());
549 +        try {
550 +            lock.hasWaiters(c);
551 +            shouldThrow();
552 +        } catch (IllegalMonitorStateException success) {
553 +        } catch (Exception ex) {
554 +            unexpectedException();
555 +        }
556 +    }
557 +
558 +
559 +    /**
560 +     * getWaitQueueLength throws IAE if not owned
561 +     */
562 +    public void testGetWaitQueueLengthIAE() {
563 +        final ReentrantLock lock = new ReentrantLock();
564 +        final Condition c = (lock.newCondition());
565 +        final ReentrantLock lock2 = new ReentrantLock();
566 +        try {
567 +            lock2.getWaitQueueLength(c);
568 +            shouldThrow();
569 +        } catch (IllegalArgumentException success) {
570 +        } catch (Exception ex) {
571 +            unexpectedException();
572 +        }
573 +    }
574 +
575 +    /**
576 +     * getWaitQueueLength throws IMSE if not locked
577 +     */
578 +    public void testGetWaitQueueLengthIMSE() {
579 +        final ReentrantLock lock = new ReentrantLock();
580 +        final Condition c = (lock.newCondition());
581 +        try {
582 +            lock.getWaitQueueLength(c);
583 +            shouldThrow();
584 +        } catch (IllegalMonitorStateException success) {
585 +        } catch (Exception ex) {
586 +            unexpectedException();
587 +        }
588 +    }
589 +
590 +
591 +    /**
592 +     * getWaitingThreads throws IAE if not owned
593 +     */
594 +    public void testGetWaitingThreadsIAE() {
595 +        final PublicReentrantLock lock = new PublicReentrantLock();    
596 +        final Condition c = (lock.newCondition());
597 +        final PublicReentrantLock lock2 = new PublicReentrantLock();    
598 +        try {
599 +            lock2.getWaitingThreads(c);
600 +            shouldThrow();
601 +        } catch (IllegalArgumentException success) {
602 +        } catch (Exception ex) {
603 +            unexpectedException();
604 +        }
605 +    }
606 +
607 +    /**
608 +     * getWaitingThreads throws IMSE if not locked
609 +     */
610 +    public void testGetWaitingThreadsIMSE() {
611 +        final PublicReentrantLock lock = new PublicReentrantLock();    
612 +        final Condition c = (lock.newCondition());
613 +        try {
614 +            lock.getWaitingThreads(c);
615 +            shouldThrow();
616 +        } catch (IllegalMonitorStateException success) {
617 +        } catch (Exception ex) {
618 +            unexpectedException();
619 +        }
620 +    }
621 +
622 +
623 +
624 +    /**
625 +     * hasWaiters returns true when a thread is waiting, else false
626 +     */
627      public void testHasWaiters() {
628          final ReentrantLock lock = new ReentrantLock();
629 <        final ReentrantLock.ConditionObject c = lock.newCondition();
629 >        final Condition c = lock.newCondition();
630          Thread t = new Thread(new Runnable() {
631                  public void run() {
632                      try {
633                          lock.lock();
634 <                        threadAssertFalse(c.hasWaiters());
635 <                        threadAssertEquals(0, c.getWaitQueueLength());
634 >                        threadAssertFalse(lock.hasWaiters(c));
635 >                        threadAssertEquals(0, lock.getWaitQueueLength(c));
636                          c.await();
637                          lock.unlock();
638                      }
639                      catch(InterruptedException e) {
640 <                        threadFail("unexpected exception");
640 >                        threadUnexpectedException();
641                      }
642                  }
643              });
# Line 414 | Line 646 | public class ReentrantLockTest extends J
646              t.start();
647              Thread.sleep(SHORT_DELAY_MS);
648              lock.lock();
649 <            assertTrue(c.hasWaiters());
650 <            assertEquals(1, c.getWaitQueueLength());
649 >            assertTrue(lock.hasWaiters(c));
650 >            assertEquals(1, lock.getWaitQueueLength(c));
651              c.signal();
652              lock.unlock();
653              Thread.sleep(SHORT_DELAY_MS);
654              lock.lock();
655 <            assertFalse(c.hasWaiters());
656 <            assertEquals(0, c.getWaitQueueLength());
655 >            assertFalse(lock.hasWaiters(c));
656 >            assertEquals(0, lock.getWaitQueueLength(c));
657              lock.unlock();
658              t.join(SHORT_DELAY_MS);
659              assertFalse(t.isAlive());
660          }
661          catch (Exception ex) {
662 <            fail("unexpected exception");
662 >            unexpectedException();
663          }
664      }
665  
666 +    /**
667 +     * getWaitQueueLength returns number of waiting threads
668 +     */
669      public void testGetWaitQueueLength() {
670          final ReentrantLock lock = new ReentrantLock();
671 <        final ReentrantLock.ConditionObject c = lock.newCondition();
671 >        final Condition c = lock.newCondition();
672          Thread t1 = new Thread(new Runnable() {
673                  public void run() {
674                      try {
675                          lock.lock();
676 <                        threadAssertFalse(c.hasWaiters());
677 <                        threadAssertEquals(0, c.getWaitQueueLength());
676 >                        threadAssertFalse(lock.hasWaiters(c));
677 >                        threadAssertEquals(0, lock.getWaitQueueLength(c));
678                          c.await();
679                          lock.unlock();
680                      }
681                      catch(InterruptedException e) {
682 <                        threadFail("unexpected exception");
682 >                        threadUnexpectedException();
683                      }
684                  }
685              });
# Line 453 | Line 688 | public class ReentrantLockTest extends J
688                  public void run() {
689                      try {
690                          lock.lock();
691 <                        threadAssertTrue(c.hasWaiters());
692 <                        threadAssertEquals(1, c.getWaitQueueLength());
691 >                        threadAssertTrue(lock.hasWaiters(c));
692 >                        threadAssertEquals(1, lock.getWaitQueueLength(c));
693                          c.await();
694                          lock.unlock();
695                      }
696                      catch(InterruptedException e) {
697 <                        threadFail("unexpected exception");
697 >                        threadUnexpectedException();
698                      }
699                  }
700              });
# Line 470 | Line 705 | public class ReentrantLockTest extends J
705              t2.start();
706              Thread.sleep(SHORT_DELAY_MS);
707              lock.lock();
708 <            assertTrue(c.hasWaiters());
709 <            assertEquals(2, c.getWaitQueueLength());
708 >            assertTrue(lock.hasWaiters(c));
709 >            assertEquals(2, lock.getWaitQueueLength(c));
710              c.signalAll();
711              lock.unlock();
712              Thread.sleep(SHORT_DELAY_MS);
713              lock.lock();
714 <            assertFalse(c.hasWaiters());
715 <            assertEquals(0, c.getWaitQueueLength());
714 >            assertFalse(lock.hasWaiters(c));
715 >            assertEquals(0, lock.getWaitQueueLength(c));
716              lock.unlock();
717              t1.join(SHORT_DELAY_MS);
718              t2.join(SHORT_DELAY_MS);
# Line 485 | Line 720 | public class ReentrantLockTest extends J
720              assertFalse(t2.isAlive());
721          }
722          catch (Exception ex) {
723 <            fail("unexpected exception");
723 >            unexpectedException();
724          }
725      }
726  
727 +    /**
728 +     * getWaitingThreads returns only and all waiting threads
729 +     */
730      public void testGetWaitingThreads() {
731 <        final MyReentrantLock lock = new MyReentrantLock();    
732 <        final MyReentrantLock.MyCondition c = (MyReentrantLock.MyCondition)lock.newCondition();
731 >        final PublicReentrantLock lock = new PublicReentrantLock();    
732 >        final Condition c = lock.newCondition();
733          Thread t1 = new Thread(new Runnable() {
734                  public void run() {
735                      try {
736                          lock.lock();
737 <                        threadAssertTrue(c.getWaitingThreads().isEmpty());
737 >                        threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
738                          c.await();
739                          lock.unlock();
740                      }
741                      catch(InterruptedException e) {
742 <                        threadFail("unexpected exception");
742 >                        threadUnexpectedException();
743                      }
744                  }
745              });
# Line 510 | Line 748 | public class ReentrantLockTest extends J
748                  public void run() {
749                      try {
750                          lock.lock();
751 <                        threadAssertFalse(c.getWaitingThreads().isEmpty());
751 >                        threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
752                          c.await();
753                          lock.unlock();
754                      }
755                      catch(InterruptedException e) {
756 <                        threadFail("unexpected exception");
756 >                        threadUnexpectedException();
757                      }
758                  }
759              });
760  
761          try {
762              lock.lock();
763 <            assertTrue(c.getWaitingThreads().isEmpty());
763 >            assertTrue(lock.getWaitingThreads(c).isEmpty());
764              lock.unlock();
765              t1.start();
766              Thread.sleep(SHORT_DELAY_MS);
767              t2.start();
768              Thread.sleep(SHORT_DELAY_MS);
769              lock.lock();
770 <            assertTrue(c.hasWaiters());
771 <            assertTrue(c.getWaitingThreads().contains(t1));
772 <            assertTrue(c.getWaitingThreads().contains(t2));
770 >            assertTrue(lock.hasWaiters(c));
771 >            assertTrue(lock.getWaitingThreads(c).contains(t1));
772 >            assertTrue(lock.getWaitingThreads(c).contains(t2));
773              c.signalAll();
774              lock.unlock();
775              Thread.sleep(SHORT_DELAY_MS);
776              lock.lock();
777 <            assertFalse(c.hasWaiters());
778 <            assertTrue(c.getWaitingThreads().isEmpty());
777 >            assertFalse(lock.hasWaiters(c));
778 >            assertTrue(lock.getWaitingThreads(c).isEmpty());
779              lock.unlock();
780              t1.join(SHORT_DELAY_MS);
781              t2.join(SHORT_DELAY_MS);
# Line 545 | Line 783 | public class ReentrantLockTest extends J
783              assertFalse(t2.isAlive());
784          }
785          catch (Exception ex) {
786 <            fail("unexpected exception");
786 >            unexpectedException();
787          }
788      }
789  
790 +
791 +
792 +    /**
793 +     * awaitUninterruptibly doesn't abort on interrupt
794 +     */
795      public void testAwaitUninterruptibly() {
796          final ReentrantLock lock = new ReentrantLock();
797          final Condition c = lock.newCondition();
# Line 567 | Line 810 | public class ReentrantLockTest extends J
810              lock.lock();
811              c.signal();
812              lock.unlock();
813 +            assert(t.isInterrupted());
814              t.join(SHORT_DELAY_MS);
815              assertFalse(t.isAlive());
816          }
817          catch (Exception ex) {
818 <            fail("unexpected exception");
818 >            unexpectedException();
819          }
820      }
821  
822 +    /**
823 +     * await is interruptible
824 +     */
825      public void testAwait_Interrupt() {
826          final ReentrantLock lock = new ReentrantLock();
827          final Condition c = lock.newCondition();
# Line 584 | Line 831 | public class ReentrantLockTest extends J
831                          lock.lock();
832                          c.await();
833                          lock.unlock();
834 <                        threadFail("should throw");
834 >                        threadShouldThrow();
835                      }
836                      catch(InterruptedException success) {
837                      }
# Line 599 | Line 846 | public class ReentrantLockTest extends J
846              assertFalse(t.isAlive());
847          }
848          catch (Exception ex) {
849 <            fail("unexpected exception");
849 >            unexpectedException();
850          }
851      }
852  
853 +    /**
854 +     * awaitNanos is interruptible
855 +     */
856      public void testAwaitNanos_Interrupt() {
857          final ReentrantLock lock = new ReentrantLock();
858          final Condition c = lock.newCondition();
# Line 612 | Line 862 | public class ReentrantLockTest extends J
862                          lock.lock();
863                          c.awaitNanos(SHORT_DELAY_MS * 2 * 1000000);
864                          lock.unlock();
865 <                        threadFail("should throw");
865 >                        threadShouldThrow();
866                      }
867                      catch(InterruptedException success) {
868                      }
# Line 627 | Line 877 | public class ReentrantLockTest extends J
877              assertFalse(t.isAlive());
878          }
879          catch (Exception ex) {
880 <            fail("unexpected exception");
880 >            unexpectedException();
881          }
882      }
883  
884 +    /**
885 +     * awaitUntil is interruptible
886 +     */
887      public void testAwaitUntil_Interrupt() {
888          final ReentrantLock lock = new ReentrantLock();
889          final Condition c = lock.newCondition();
# Line 641 | Line 894 | public class ReentrantLockTest extends J
894                          java.util.Date d = new java.util.Date();
895                          c.awaitUntil(new java.util.Date(d.getTime() + 10000));
896                          lock.unlock();
897 <                        threadFail("should throw");
897 >                        threadShouldThrow();
898                      }
899                      catch(InterruptedException success) {
900                      }
# Line 656 | Line 909 | public class ReentrantLockTest extends J
909              assertFalse(t.isAlive());
910          }
911          catch (Exception ex) {
912 <            fail("unexpected exception");
912 >            unexpectedException();
913          }
914      }
915  
916 +    /**
917 +     * signalAll wakes up all threads
918 +     */
919      public void testSignalAll() {
920          final ReentrantLock lock = new ReentrantLock();
921          final Condition c = lock.newCondition();
# Line 671 | Line 927 | public class ReentrantLockTest extends J
927                          lock.unlock();
928                      }
929                      catch(InterruptedException e) {
930 <                        threadFail("unexpected exception");
930 >                        threadUnexpectedException();
931                      }
932                  }
933              });
# Line 684 | Line 940 | public class ReentrantLockTest extends J
940                          lock.unlock();
941                      }
942                      catch(InterruptedException e) {
943 <                        threadFail("unexpected exception");
943 >                        threadUnexpectedException();
944                      }
945                  }
946              });
# Line 702 | Line 958 | public class ReentrantLockTest extends J
958              assertFalse(t2.isAlive());
959          }
960          catch (Exception ex) {
961 <            fail("unexpected exception");
961 >            unexpectedException();
962          }
963      }
964  
965 +    /**
966 +     * A serialized lock deserializes as unlocked
967 +     */
968      public void testSerialization() {
969          ReentrantLock l = new ReentrantLock();
970          l.lock();
# Line 724 | Line 983 | public class ReentrantLockTest extends J
983              r.unlock();
984          } catch(Exception e){
985              e.printStackTrace();
986 <            fail("unexpected exception");
986 >            unexpectedException();
987          }
988      }
989  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines