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

Comparing jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java (file contents):
Revision 1.7 by dl, Fri Jan 2 21:06:38 2004 UTC vs.
Revision 1.34 by jsr166, Wed Aug 25 00:07:02 2010 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines