blob: d102fc63c8ca2abb2f7ebda9436d903cea73285d [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9package jsr166;
10
Calin Juravle8f0d92b2013-08-01 17:26:00 +010011import static java.util.concurrent.TimeUnit.MILLISECONDS;
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010012import static java.util.concurrent.TimeUnit.NANOSECONDS;
13
14import java.util.Arrays;
15import java.util.Collection;
16import java.util.HashSet;
Calin Juravle8f0d92b2013-08-01 17:26:00 +010017import java.util.concurrent.locks.AbstractQueuedSynchronizer;
18import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject;
19
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010020import junit.framework.AssertionFailedError;
21import junit.framework.Test;
22import junit.framework.TestSuite;
23
Calin Juravle8f0d92b2013-08-01 17:26:00 +010024public class AbstractQueuedSynchronizerTest extends JSR166TestCase {
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010025 // android-note: Removed because the CTS runner does a bad job of
26 // retrying tests that have suite() declarations.
27 //
28 // public static void main(String[] args) {
29 // main(suite(), args);
30 // }
31 // public static Test suite() {
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +000032 // return new TestSuite(AbstractQueuedSynchronizerTest.class);
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010033 // }
Calin Juravle8f0d92b2013-08-01 17:26:00 +010034
35 /**
36 * A simple mutex class, adapted from the class javadoc. Exclusive
37 * acquire tests exercise this as a sample user extension. Other
38 * methods/features of AbstractQueuedSynchronizer are tested via
39 * other test classes, including those for ReentrantLock,
40 * ReentrantReadWriteLock, and Semaphore.
41 */
42 static class Mutex extends AbstractQueuedSynchronizer {
43 /** An eccentric value for locked synchronizer state. */
44 static final int LOCKED = (1 << 31) | (1 << 15);
45
46 static final int UNLOCKED = 0;
47
48 @Override public boolean isHeldExclusively() {
49 int state = getState();
50 assertTrue(state == UNLOCKED || state == LOCKED);
51 return state == LOCKED;
52 }
53
54 @Override public boolean tryAcquire(int acquires) {
55 assertEquals(LOCKED, acquires);
56 return compareAndSetState(UNLOCKED, LOCKED);
57 }
58
59 @Override public boolean tryRelease(int releases) {
60 if (getState() != LOCKED) throw new IllegalMonitorStateException();
61 assertEquals(LOCKED, releases);
62 setState(UNLOCKED);
63 return true;
64 }
65
66 public boolean tryAcquireNanos(long nanos) throws InterruptedException {
67 return tryAcquireNanos(LOCKED, nanos);
68 }
69
70 public boolean tryAcquire() {
71 return tryAcquire(LOCKED);
72 }
73
74 public boolean tryRelease() {
75 return tryRelease(LOCKED);
76 }
77
78 public void acquire() {
79 acquire(LOCKED);
80 }
81
82 public void acquireInterruptibly() throws InterruptedException {
83 acquireInterruptibly(LOCKED);
84 }
85
86 public void release() {
87 release(LOCKED);
88 }
89
90 public ConditionObject newCondition() {
91 return new ConditionObject();
92 }
93 }
94
95 /**
96 * A simple latch class, to test shared mode.
97 */
98 static class BooleanLatch extends AbstractQueuedSynchronizer {
99 public boolean isSignalled() { return getState() != 0; }
100
101 public int tryAcquireShared(int ignore) {
102 return isSignalled() ? 1 : -1;
103 }
104
105 public boolean tryReleaseShared(int ignore) {
106 setState(1);
107 return true;
108 }
109 }
110
111 /**
112 * A runnable calling acquireInterruptibly that does not expect to
113 * be interrupted.
114 */
115 class InterruptibleSyncRunnable extends CheckedRunnable {
116 final Mutex sync;
117 InterruptibleSyncRunnable(Mutex sync) { this.sync = sync; }
118 public void realRun() throws InterruptedException {
119 sync.acquireInterruptibly();
120 }
121 }
122
123 /**
124 * A runnable calling acquireInterruptibly that expects to be
125 * interrupted.
126 */
127 class InterruptedSyncRunnable extends CheckedInterruptedRunnable {
128 final Mutex sync;
129 InterruptedSyncRunnable(Mutex sync) { this.sync = sync; }
130 public void realRun() throws InterruptedException {
131 sync.acquireInterruptibly();
132 }
133 }
134
135 /** A constant to clarify calls to checking methods below. */
136 static final Thread[] NO_THREADS = new Thread[0];
137
138 /**
139 * Spin-waits until sync.isQueued(t) becomes true.
140 */
141 void waitForQueuedThread(AbstractQueuedSynchronizer sync, Thread t) {
142 long startTime = System.nanoTime();
143 while (!sync.isQueued(t)) {
144 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
145 throw new AssertionFailedError("timed out");
146 Thread.yield();
147 }
148 assertTrue(t.isAlive());
149 }
150
151 /**
152 * Checks that sync has exactly the given queued threads.
153 */
154 void assertHasQueuedThreads(AbstractQueuedSynchronizer sync,
155 Thread... expected) {
156 Collection<Thread> actual = sync.getQueuedThreads();
157 assertEquals(expected.length > 0, sync.hasQueuedThreads());
158 assertEquals(expected.length, sync.getQueueLength());
159 assertEquals(expected.length, actual.size());
160 assertEquals(expected.length == 0, actual.isEmpty());
161 assertEquals(new HashSet<Thread>(actual),
162 new HashSet<Thread>(Arrays.asList(expected)));
163 }
164
165 /**
166 * Checks that sync has exactly the given (exclusive) queued threads.
167 */
168 void assertHasExclusiveQueuedThreads(AbstractQueuedSynchronizer sync,
169 Thread... expected) {
170 assertHasQueuedThreads(sync, expected);
171 assertEquals(new HashSet<Thread>(sync.getExclusiveQueuedThreads()),
172 new HashSet<Thread>(sync.getQueuedThreads()));
173 assertEquals(0, sync.getSharedQueuedThreads().size());
174 assertTrue(sync.getSharedQueuedThreads().isEmpty());
175 }
176
177 /**
178 * Checks that sync has exactly the given (shared) queued threads.
179 */
180 void assertHasSharedQueuedThreads(AbstractQueuedSynchronizer sync,
181 Thread... expected) {
182 assertHasQueuedThreads(sync, expected);
183 assertEquals(new HashSet<Thread>(sync.getSharedQueuedThreads()),
184 new HashSet<Thread>(sync.getQueuedThreads()));
185 assertEquals(0, sync.getExclusiveQueuedThreads().size());
186 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
187 }
188
189 /**
190 * Checks that condition c has exactly the given waiter threads,
191 * after acquiring mutex.
192 */
193 void assertHasWaitersUnlocked(Mutex sync, ConditionObject c,
194 Thread... threads) {
195 sync.acquire();
196 assertHasWaitersLocked(sync, c, threads);
197 sync.release();
198 }
199
200 /**
201 * Checks that condition c has exactly the given waiter threads.
202 */
203 void assertHasWaitersLocked(Mutex sync, ConditionObject c,
204 Thread... threads) {
205 assertEquals(threads.length > 0, sync.hasWaiters(c));
206 assertEquals(threads.length, sync.getWaitQueueLength(c));
207 assertEquals(threads.length == 0, sync.getWaitingThreads(c).isEmpty());
208 assertEquals(threads.length, sync.getWaitingThreads(c).size());
209 assertEquals(new HashSet<Thread>(sync.getWaitingThreads(c)),
210 new HashSet<Thread>(Arrays.asList(threads)));
211 }
212
Narayan Kamath8e9a0e92015-04-28 11:40:00 +0100213 enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil }
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100214
215 /**
216 * Awaits condition using the specified AwaitMethod.
217 */
218 void await(ConditionObject c, AwaitMethod awaitMethod)
219 throws InterruptedException {
220 long timeoutMillis = 2 * LONG_DELAY_MS;
221 switch (awaitMethod) {
222 case await:
223 c.await();
224 break;
225 case awaitTimed:
226 assertTrue(c.await(timeoutMillis, MILLISECONDS));
227 break;
228 case awaitNanos:
229 long nanosTimeout = MILLISECONDS.toNanos(timeoutMillis);
230 long nanosRemaining = c.awaitNanos(nanosTimeout);
231 assertTrue(nanosRemaining > 0);
232 break;
233 case awaitUntil:
234 assertTrue(c.awaitUntil(delayedDate(timeoutMillis)));
235 break;
Narayan Kamath8e9a0e92015-04-28 11:40:00 +0100236 default:
237 throw new AssertionError();
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100238 }
239 }
240
241 /**
242 * Checks that awaiting the given condition times out (using the
243 * default timeout duration).
244 */
245 void assertAwaitTimesOut(ConditionObject c, AwaitMethod awaitMethod) {
246 long timeoutMillis = timeoutMillis();
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000247 long startTime;
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100248 try {
249 switch (awaitMethod) {
250 case awaitTimed:
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000251 startTime = System.nanoTime();
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100252 assertFalse(c.await(timeoutMillis, MILLISECONDS));
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000253 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100254 break;
255 case awaitNanos:
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000256 startTime = System.nanoTime();
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100257 long nanosTimeout = MILLISECONDS.toNanos(timeoutMillis);
258 long nanosRemaining = c.awaitNanos(nanosTimeout);
259 assertTrue(nanosRemaining <= 0);
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000260 assertTrue(nanosRemaining > -MILLISECONDS.toNanos(LONG_DELAY_MS));
261 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100262 break;
263 case awaitUntil:
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000264 // We shouldn't assume that nanoTime and currentTimeMillis
265 // use the same time source, so don't use nanoTime here.
266 java.util.Date delayedDate = delayedDate(timeoutMillis());
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100267 assertFalse(c.awaitUntil(delayedDate(timeoutMillis)));
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +0000268 assertTrue(new java.util.Date().getTime() >= delayedDate.getTime());
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100269 break;
270 default:
271 throw new UnsupportedOperationException();
272 }
273 } catch (InterruptedException ie) { threadUnexpectedException(ie); }
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100274 }
275
276 /**
277 * isHeldExclusively is false upon construction
278 */
279 public void testIsHeldExclusively() {
280 Mutex sync = new Mutex();
281 assertFalse(sync.isHeldExclusively());
282 }
283
284 /**
285 * acquiring released sync succeeds
286 */
287 public void testAcquire() {
288 Mutex sync = new Mutex();
289 sync.acquire();
290 assertTrue(sync.isHeldExclusively());
291 sync.release();
292 assertFalse(sync.isHeldExclusively());
293 }
294
295 /**
296 * tryAcquire on a released sync succeeds
297 */
298 public void testTryAcquire() {
299 Mutex sync = new Mutex();
300 assertTrue(sync.tryAcquire());
301 assertTrue(sync.isHeldExclusively());
302 sync.release();
303 assertFalse(sync.isHeldExclusively());
304 }
305
306 /**
307 * hasQueuedThreads reports whether there are waiting threads
308 */
309 public void testHasQueuedThreads() {
310 final Mutex sync = new Mutex();
311 assertFalse(sync.hasQueuedThreads());
312 sync.acquire();
313 Thread t1 = newStartedThread(new InterruptedSyncRunnable(sync));
314 waitForQueuedThread(sync, t1);
315 assertTrue(sync.hasQueuedThreads());
316 Thread t2 = newStartedThread(new InterruptibleSyncRunnable(sync));
317 waitForQueuedThread(sync, t2);
318 assertTrue(sync.hasQueuedThreads());
319 t1.interrupt();
320 awaitTermination(t1);
321 assertTrue(sync.hasQueuedThreads());
322 sync.release();
323 awaitTermination(t2);
324 assertFalse(sync.hasQueuedThreads());
325 }
326
327 /**
328 * isQueued(null) throws NullPointerException
329 */
330 public void testIsQueuedNPE() {
331 final Mutex sync = new Mutex();
332 try {
333 sync.isQueued(null);
334 shouldThrow();
335 } catch (NullPointerException success) {}
336 }
337
338 /**
339 * isQueued reports whether a thread is queued
340 */
341 public void testIsQueued() {
342 final Mutex sync = new Mutex();
343 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
344 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
345 assertFalse(sync.isQueued(t1));
346 assertFalse(sync.isQueued(t2));
347 sync.acquire();
348 t1.start();
349 waitForQueuedThread(sync, t1);
350 assertTrue(sync.isQueued(t1));
351 assertFalse(sync.isQueued(t2));
352 t2.start();
353 waitForQueuedThread(sync, t2);
354 assertTrue(sync.isQueued(t1));
355 assertTrue(sync.isQueued(t2));
356 t1.interrupt();
357 awaitTermination(t1);
358 assertFalse(sync.isQueued(t1));
359 assertTrue(sync.isQueued(t2));
360 sync.release();
361 awaitTermination(t2);
362 assertFalse(sync.isQueued(t1));
363 assertFalse(sync.isQueued(t2));
364 }
365
366 /**
367 * getFirstQueuedThread returns first waiting thread or null if none
368 */
369 public void testGetFirstQueuedThread() {
370 final Mutex sync = new Mutex();
371 assertNull(sync.getFirstQueuedThread());
372 sync.acquire();
373 Thread t1 = newStartedThread(new InterruptedSyncRunnable(sync));
374 waitForQueuedThread(sync, t1);
375 assertEquals(t1, sync.getFirstQueuedThread());
376 Thread t2 = newStartedThread(new InterruptibleSyncRunnable(sync));
377 waitForQueuedThread(sync, t2);
378 assertEquals(t1, sync.getFirstQueuedThread());
379 t1.interrupt();
380 awaitTermination(t1);
381 assertEquals(t2, sync.getFirstQueuedThread());
382 sync.release();
383 awaitTermination(t2);
384 assertNull(sync.getFirstQueuedThread());
385 }
386
387 /**
388 * hasContended reports false if no thread has ever blocked, else true
389 */
390 public void testHasContended() {
391 final Mutex sync = new Mutex();
392 assertFalse(sync.hasContended());
393 sync.acquire();
394 assertFalse(sync.hasContended());
395 Thread t1 = newStartedThread(new InterruptedSyncRunnable(sync));
396 waitForQueuedThread(sync, t1);
397 assertTrue(sync.hasContended());
398 Thread t2 = newStartedThread(new InterruptibleSyncRunnable(sync));
399 waitForQueuedThread(sync, t2);
400 assertTrue(sync.hasContended());
401 t1.interrupt();
402 awaitTermination(t1);
403 assertTrue(sync.hasContended());
404 sync.release();
405 awaitTermination(t2);
406 assertTrue(sync.hasContended());
407 }
408
409 /**
410 * getQueuedThreads returns all waiting threads
411 */
412 public void testGetQueuedThreads() {
413 final Mutex sync = new Mutex();
414 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
415 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
416 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
417 sync.acquire();
418 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
419 t1.start();
420 waitForQueuedThread(sync, t1);
421 assertHasExclusiveQueuedThreads(sync, t1);
422 assertTrue(sync.getQueuedThreads().contains(t1));
423 assertFalse(sync.getQueuedThreads().contains(t2));
424 t2.start();
425 waitForQueuedThread(sync, t2);
426 assertHasExclusiveQueuedThreads(sync, t1, t2);
427 assertTrue(sync.getQueuedThreads().contains(t1));
428 assertTrue(sync.getQueuedThreads().contains(t2));
429 t1.interrupt();
430 awaitTermination(t1);
431 assertHasExclusiveQueuedThreads(sync, t2);
432 sync.release();
433 awaitTermination(t2);
434 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
435 }
436
437 /**
438 * getExclusiveQueuedThreads returns all exclusive waiting threads
439 */
440 public void testGetExclusiveQueuedThreads() {
441 final Mutex sync = new Mutex();
442 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
443 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
444 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
445 sync.acquire();
446 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
447 t1.start();
448 waitForQueuedThread(sync, t1);
449 assertHasExclusiveQueuedThreads(sync, t1);
450 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
451 assertFalse(sync.getExclusiveQueuedThreads().contains(t2));
452 t2.start();
453 waitForQueuedThread(sync, t2);
454 assertHasExclusiveQueuedThreads(sync, t1, t2);
455 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
456 assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
457 t1.interrupt();
458 awaitTermination(t1);
459 assertHasExclusiveQueuedThreads(sync, t2);
460 sync.release();
461 awaitTermination(t2);
462 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
463 }
464
465 /**
466 * getSharedQueuedThreads does not include exclusively waiting threads
467 */
468 public void testGetSharedQueuedThreads_Exclusive() {
469 final Mutex sync = new Mutex();
470 assertTrue(sync.getSharedQueuedThreads().isEmpty());
471 sync.acquire();
472 assertTrue(sync.getSharedQueuedThreads().isEmpty());
473 Thread t1 = newStartedThread(new InterruptedSyncRunnable(sync));
474 waitForQueuedThread(sync, t1);
475 assertTrue(sync.getSharedQueuedThreads().isEmpty());
476 Thread t2 = newStartedThread(new InterruptibleSyncRunnable(sync));
477 waitForQueuedThread(sync, t2);
478 assertTrue(sync.getSharedQueuedThreads().isEmpty());
479 t1.interrupt();
480 awaitTermination(t1);
481 assertTrue(sync.getSharedQueuedThreads().isEmpty());
482 sync.release();
483 awaitTermination(t2);
484 assertTrue(sync.getSharedQueuedThreads().isEmpty());
485 }
486
487 /**
488 * getSharedQueuedThreads returns all shared waiting threads
489 */
490 public void testGetSharedQueuedThreads_Shared() {
491 final BooleanLatch l = new BooleanLatch();
492 assertHasSharedQueuedThreads(l, NO_THREADS);
493 Thread t1 = newStartedThread(new CheckedInterruptedRunnable() {
494 public void realRun() throws InterruptedException {
495 l.acquireSharedInterruptibly(0);
496 }});
497 waitForQueuedThread(l, t1);
498 assertHasSharedQueuedThreads(l, t1);
499 Thread t2 = newStartedThread(new CheckedRunnable() {
500 public void realRun() throws InterruptedException {
501 l.acquireSharedInterruptibly(0);
502 }});
503 waitForQueuedThread(l, t2);
504 assertHasSharedQueuedThreads(l, t1, t2);
505 t1.interrupt();
506 awaitTermination(t1);
507 assertHasSharedQueuedThreads(l, t2);
508 assertTrue(l.releaseShared(0));
509 awaitTermination(t2);
510 assertHasSharedQueuedThreads(l, NO_THREADS);
511 }
512
513 /**
514 * tryAcquireNanos is interruptible
515 */
516 public void testTryAcquireNanos_Interruptible() {
517 final Mutex sync = new Mutex();
518 sync.acquire();
519 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
520 public void realRun() throws InterruptedException {
521 sync.tryAcquireNanos(MILLISECONDS.toNanos(2 * LONG_DELAY_MS));
522 }});
523
524 waitForQueuedThread(sync, t);
525 t.interrupt();
526 awaitTermination(t);
527 }
528
529 /**
530 * tryAcquire on exclusively held sync fails
531 */
532 public void testTryAcquireWhenSynced() {
533 final Mutex sync = new Mutex();
534 sync.acquire();
535 Thread t = newStartedThread(new CheckedRunnable() {
536 public void realRun() {
537 assertFalse(sync.tryAcquire());
538 }});
539
540 awaitTermination(t);
541 sync.release();
542 }
543
544 /**
545 * tryAcquireNanos on an exclusively held sync times out
546 */
547 public void testAcquireNanos_Timeout() {
548 final Mutex sync = new Mutex();
549 sync.acquire();
550 Thread t = newStartedThread(new CheckedRunnable() {
551 public void realRun() throws InterruptedException {
552 long startTime = System.nanoTime();
553 long nanos = MILLISECONDS.toNanos(timeoutMillis());
554 assertFalse(sync.tryAcquireNanos(nanos));
555 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
556 }});
557
558 awaitTermination(t);
559 sync.release();
560 }
561
562 /**
563 * getState is true when acquired and false when not
564 */
565 public void testGetState() {
566 final Mutex sync = new Mutex();
567 sync.acquire();
568 assertTrue(sync.isHeldExclusively());
569 sync.release();
570 assertFalse(sync.isHeldExclusively());
571
572 final BooleanLatch acquired = new BooleanLatch();
573 final BooleanLatch done = new BooleanLatch();
574 Thread t = newStartedThread(new CheckedRunnable() {
575 public void realRun() throws InterruptedException {
576 sync.acquire();
577 assertTrue(acquired.releaseShared(0));
578 done.acquireShared(0);
579 sync.release();
580 }});
581
582 acquired.acquireShared(0);
583 assertTrue(sync.isHeldExclusively());
584 assertTrue(done.releaseShared(0));
585 awaitTermination(t);
586 assertFalse(sync.isHeldExclusively());
587 }
588
589 /**
590 * acquireInterruptibly succeeds when released, else is interruptible
591 */
592 public void testAcquireInterruptibly() throws InterruptedException {
593 final Mutex sync = new Mutex();
594 final BooleanLatch threadStarted = new BooleanLatch();
595 sync.acquireInterruptibly();
596 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
597 public void realRun() throws InterruptedException {
598 assertTrue(threadStarted.releaseShared(0));
599 sync.acquireInterruptibly();
600 }});
601
602 threadStarted.acquireShared(0);
603 waitForQueuedThread(sync, t);
604 t.interrupt();
605 awaitTermination(t);
606 assertTrue(sync.isHeldExclusively());
607 }
608
609 /**
610 * owns is true for a condition created by sync else false
611 */
612 public void testOwns() {
613 final Mutex sync = new Mutex();
614 final ConditionObject c = sync.newCondition();
615 final Mutex sync2 = new Mutex();
616 assertTrue(sync.owns(c));
617 assertFalse(sync2.owns(c));
618 }
619
620 /**
621 * Calling await without holding sync throws IllegalMonitorStateException
622 */
623 public void testAwait_IMSE() {
624 final Mutex sync = new Mutex();
625 final ConditionObject c = sync.newCondition();
626 for (AwaitMethod awaitMethod : AwaitMethod.values()) {
627 long startTime = System.nanoTime();
628 try {
629 await(c, awaitMethod);
630 shouldThrow();
631 } catch (IllegalMonitorStateException success) {
632 } catch (InterruptedException e) { threadUnexpectedException(e); }
633 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
634 }
635 }
636
637 /**
638 * Calling signal without holding sync throws IllegalMonitorStateException
639 */
640 public void testSignal_IMSE() {
641 final Mutex sync = new Mutex();
642 final ConditionObject c = sync.newCondition();
643 try {
644 c.signal();
645 shouldThrow();
646 } catch (IllegalMonitorStateException success) {}
647 assertHasWaitersUnlocked(sync, c, NO_THREADS);
648 }
649
650 /**
651 * Calling signalAll without holding sync throws IllegalMonitorStateException
652 */
653 public void testSignalAll_IMSE() {
654 final Mutex sync = new Mutex();
655 final ConditionObject c = sync.newCondition();
656 try {
657 c.signalAll();
658 shouldThrow();
659 } catch (IllegalMonitorStateException success) {}
660 }
661
662 /**
663 * await/awaitNanos/awaitUntil without a signal times out
664 */
665 public void testAwaitTimed_Timeout() { testAwait_Timeout(AwaitMethod.awaitTimed); }
666 public void testAwaitNanos_Timeout() { testAwait_Timeout(AwaitMethod.awaitNanos); }
667 public void testAwaitUntil_Timeout() { testAwait_Timeout(AwaitMethod.awaitUntil); }
668 public void testAwait_Timeout(AwaitMethod awaitMethod) {
669 final Mutex sync = new Mutex();
670 final ConditionObject c = sync.newCondition();
671 sync.acquire();
672 assertAwaitTimesOut(c, awaitMethod);
673 sync.release();
674 }
675
676 /**
677 * await/awaitNanos/awaitUntil returns when signalled
678 */
679 public void testSignal_await() { testSignal(AwaitMethod.await); }
680 public void testSignal_awaitTimed() { testSignal(AwaitMethod.awaitTimed); }
681 public void testSignal_awaitNanos() { testSignal(AwaitMethod.awaitNanos); }
682 public void testSignal_awaitUntil() { testSignal(AwaitMethod.awaitUntil); }
683 public void testSignal(final AwaitMethod awaitMethod) {
684 final Mutex sync = new Mutex();
685 final ConditionObject c = sync.newCondition();
686 final BooleanLatch acquired = new BooleanLatch();
687 Thread t = newStartedThread(new CheckedRunnable() {
688 public void realRun() throws InterruptedException {
689 sync.acquire();
690 assertTrue(acquired.releaseShared(0));
691 await(c, awaitMethod);
692 sync.release();
693 }});
694
695 acquired.acquireShared(0);
696 sync.acquire();
697 assertHasWaitersLocked(sync, c, t);
698 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
699 c.signal();
700 assertHasWaitersLocked(sync, c, NO_THREADS);
701 assertHasExclusiveQueuedThreads(sync, t);
702 sync.release();
703 awaitTermination(t);
704 }
705
706 /**
707 * hasWaiters(null) throws NullPointerException
708 */
709 public void testHasWaitersNPE() {
710 final Mutex sync = new Mutex();
711 try {
712 sync.hasWaiters(null);
713 shouldThrow();
714 } catch (NullPointerException success) {}
715 }
716
717 /**
718 * getWaitQueueLength(null) throws NullPointerException
719 */
720 public void testGetWaitQueueLengthNPE() {
721 final Mutex sync = new Mutex();
722 try {
723 sync.getWaitQueueLength(null);
724 shouldThrow();
725 } catch (NullPointerException success) {}
726 }
727
728 /**
729 * getWaitingThreads(null) throws NullPointerException
730 */
731 public void testGetWaitingThreadsNPE() {
732 final Mutex sync = new Mutex();
733 try {
734 sync.getWaitingThreads(null);
735 shouldThrow();
736 } catch (NullPointerException success) {}
737 }
738
739 /**
740 * hasWaiters throws IllegalArgumentException if not owned
741 */
742 public void testHasWaitersIAE() {
743 final Mutex sync = new Mutex();
744 final ConditionObject c = sync.newCondition();
745 final Mutex sync2 = new Mutex();
746 try {
747 sync2.hasWaiters(c);
748 shouldThrow();
749 } catch (IllegalArgumentException success) {}
750 assertHasWaitersUnlocked(sync, c, NO_THREADS);
751 }
752
753 /**
754 * hasWaiters throws IllegalMonitorStateException if not synced
755 */
756 public void testHasWaitersIMSE() {
757 final Mutex sync = new Mutex();
758 final ConditionObject c = sync.newCondition();
759 try {
760 sync.hasWaiters(c);
761 shouldThrow();
762 } catch (IllegalMonitorStateException success) {}
763 assertHasWaitersUnlocked(sync, c, NO_THREADS);
764 }
765
766 /**
767 * getWaitQueueLength throws IllegalArgumentException if not owned
768 */
769 public void testGetWaitQueueLengthIAE() {
770 final Mutex sync = new Mutex();
771 final ConditionObject c = sync.newCondition();
772 final Mutex sync2 = new Mutex();
773 try {
774 sync2.getWaitQueueLength(c);
775 shouldThrow();
776 } catch (IllegalArgumentException success) {}
777 assertHasWaitersUnlocked(sync, c, NO_THREADS);
778 }
779
780 /**
781 * getWaitQueueLength throws IllegalMonitorStateException if not synced
782 */
783 public void testGetWaitQueueLengthIMSE() {
784 final Mutex sync = new Mutex();
785 final ConditionObject c = sync.newCondition();
786 try {
787 sync.getWaitQueueLength(c);
788 shouldThrow();
789 } catch (IllegalMonitorStateException success) {}
790 assertHasWaitersUnlocked(sync, c, NO_THREADS);
791 }
792
793 /**
794 * getWaitingThreads throws IllegalArgumentException if not owned
795 */
796 public void testGetWaitingThreadsIAE() {
797 final Mutex sync = new Mutex();
798 final ConditionObject c = sync.newCondition();
799 final Mutex sync2 = new Mutex();
800 try {
801 sync2.getWaitingThreads(c);
802 shouldThrow();
803 } catch (IllegalArgumentException success) {}
804 assertHasWaitersUnlocked(sync, c, NO_THREADS);
805 }
806
807 /**
808 * getWaitingThreads throws IllegalMonitorStateException if not synced
809 */
810 public void testGetWaitingThreadsIMSE() {
811 final Mutex sync = new Mutex();
812 final ConditionObject c = sync.newCondition();
813 try {
814 sync.getWaitingThreads(c);
815 shouldThrow();
816 } catch (IllegalMonitorStateException success) {}
817 assertHasWaitersUnlocked(sync, c, NO_THREADS);
818 }
819
820 /**
821 * hasWaiters returns true when a thread is waiting, else false
822 */
823 public void testHasWaiters() {
824 final Mutex sync = new Mutex();
825 final ConditionObject c = sync.newCondition();
826 final BooleanLatch acquired = new BooleanLatch();
827 Thread t = newStartedThread(new CheckedRunnable() {
828 public void realRun() throws InterruptedException {
829 sync.acquire();
830 assertHasWaitersLocked(sync, c, NO_THREADS);
831 assertFalse(sync.hasWaiters(c));
832 assertTrue(acquired.releaseShared(0));
833 c.await();
834 sync.release();
835 }});
836
837 acquired.acquireShared(0);
838 sync.acquire();
839 assertHasWaitersLocked(sync, c, t);
840 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
841 assertTrue(sync.hasWaiters(c));
842 c.signal();
843 assertHasWaitersLocked(sync, c, NO_THREADS);
844 assertHasExclusiveQueuedThreads(sync, t);
845 assertFalse(sync.hasWaiters(c));
846 sync.release();
847
848 awaitTermination(t);
849 assertHasWaitersUnlocked(sync, c, NO_THREADS);
850 }
851
852 /**
853 * getWaitQueueLength returns number of waiting threads
854 */
855 public void testGetWaitQueueLength() {
856 final Mutex sync = new Mutex();
857 final ConditionObject c = sync.newCondition();
858 final BooleanLatch acquired1 = new BooleanLatch();
859 final BooleanLatch acquired2 = new BooleanLatch();
860 final Thread t1 = newStartedThread(new CheckedRunnable() {
861 public void realRun() throws InterruptedException {
862 sync.acquire();
863 assertHasWaitersLocked(sync, c, NO_THREADS);
864 assertEquals(0, sync.getWaitQueueLength(c));
865 assertTrue(acquired1.releaseShared(0));
866 c.await();
867 sync.release();
868 }});
869 acquired1.acquireShared(0);
870 sync.acquire();
871 assertHasWaitersLocked(sync, c, t1);
872 assertEquals(1, sync.getWaitQueueLength(c));
873 sync.release();
874
875 final Thread t2 = newStartedThread(new CheckedRunnable() {
876 public void realRun() throws InterruptedException {
877 sync.acquire();
878 assertHasWaitersLocked(sync, c, t1);
879 assertEquals(1, sync.getWaitQueueLength(c));
880 assertTrue(acquired2.releaseShared(0));
881 c.await();
882 sync.release();
883 }});
884 acquired2.acquireShared(0);
885 sync.acquire();
886 assertHasWaitersLocked(sync, c, t1, t2);
887 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
888 assertEquals(2, sync.getWaitQueueLength(c));
889 c.signalAll();
890 assertHasWaitersLocked(sync, c, NO_THREADS);
891 assertHasExclusiveQueuedThreads(sync, t1, t2);
892 assertEquals(0, sync.getWaitQueueLength(c));
893 sync.release();
894
895 awaitTermination(t1);
896 awaitTermination(t2);
897 assertHasWaitersUnlocked(sync, c, NO_THREADS);
898 }
899
900 /**
901 * getWaitingThreads returns only and all waiting threads
902 */
903 public void testGetWaitingThreads() {
904 final Mutex sync = new Mutex();
905 final ConditionObject c = sync.newCondition();
906 final BooleanLatch acquired1 = new BooleanLatch();
907 final BooleanLatch acquired2 = new BooleanLatch();
908 final Thread t1 = new Thread(new CheckedRunnable() {
909 public void realRun() throws InterruptedException {
910 sync.acquire();
911 assertHasWaitersLocked(sync, c, NO_THREADS);
912 assertTrue(sync.getWaitingThreads(c).isEmpty());
913 assertTrue(acquired1.releaseShared(0));
914 c.await();
915 sync.release();
916 }});
917
918 final Thread t2 = new Thread(new CheckedRunnable() {
919 public void realRun() throws InterruptedException {
920 sync.acquire();
921 assertHasWaitersLocked(sync, c, t1);
922 assertTrue(sync.getWaitingThreads(c).contains(t1));
923 assertFalse(sync.getWaitingThreads(c).isEmpty());
924 assertEquals(1, sync.getWaitingThreads(c).size());
925 assertTrue(acquired2.releaseShared(0));
926 c.await();
927 sync.release();
928 }});
929
930 sync.acquire();
931 assertHasWaitersLocked(sync, c, NO_THREADS);
932 assertFalse(sync.getWaitingThreads(c).contains(t1));
933 assertFalse(sync.getWaitingThreads(c).contains(t2));
934 assertTrue(sync.getWaitingThreads(c).isEmpty());
935 assertEquals(0, sync.getWaitingThreads(c).size());
936 sync.release();
937
938 t1.start();
939 acquired1.acquireShared(0);
940 sync.acquire();
941 assertHasWaitersLocked(sync, c, t1);
942 assertTrue(sync.getWaitingThreads(c).contains(t1));
943 assertFalse(sync.getWaitingThreads(c).contains(t2));
944 assertFalse(sync.getWaitingThreads(c).isEmpty());
945 assertEquals(1, sync.getWaitingThreads(c).size());
946 sync.release();
947
948 t2.start();
949 acquired2.acquireShared(0);
950 sync.acquire();
951 assertHasWaitersLocked(sync, c, t1, t2);
952 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
953 assertTrue(sync.getWaitingThreads(c).contains(t1));
954 assertTrue(sync.getWaitingThreads(c).contains(t2));
955 assertFalse(sync.getWaitingThreads(c).isEmpty());
956 assertEquals(2, sync.getWaitingThreads(c).size());
957 c.signalAll();
958 assertHasWaitersLocked(sync, c, NO_THREADS);
959 assertHasExclusiveQueuedThreads(sync, t1, t2);
960 assertFalse(sync.getWaitingThreads(c).contains(t1));
961 assertFalse(sync.getWaitingThreads(c).contains(t2));
962 assertTrue(sync.getWaitingThreads(c).isEmpty());
963 assertEquals(0, sync.getWaitingThreads(c).size());
964 sync.release();
965
966 awaitTermination(t1);
967 awaitTermination(t2);
968 assertHasWaitersUnlocked(sync, c, NO_THREADS);
969 }
970
971 /**
972 * awaitUninterruptibly is uninterruptible
973 */
974 public void testAwaitUninterruptibly() {
975 final Mutex sync = new Mutex();
976 final ConditionObject c = sync.newCondition();
977 final BooleanLatch pleaseInterrupt = new BooleanLatch();
978 Thread t = newStartedThread(new CheckedRunnable() {
979 public void realRun() {
980 sync.acquire();
981 assertTrue(pleaseInterrupt.releaseShared(0));
982 c.awaitUninterruptibly();
983 assertTrue(Thread.interrupted());
984 assertHasWaitersLocked(sync, c, NO_THREADS);
985 sync.release();
986 }});
987
988 pleaseInterrupt.acquireShared(0);
989 sync.acquire();
990 assertHasWaitersLocked(sync, c, t);
991 sync.release();
992 t.interrupt();
993 assertHasWaitersUnlocked(sync, c, t);
994 assertThreadStaysAlive(t);
995 sync.acquire();
996 assertHasWaitersLocked(sync, c, t);
997 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
998 c.signal();
999 assertHasWaitersLocked(sync, c, NO_THREADS);
1000 assertHasExclusiveQueuedThreads(sync, t);
1001 sync.release();
1002 awaitTermination(t);
1003 }
1004
1005 /**
1006 * await/awaitNanos/awaitUntil is interruptible
1007 */
1008 public void testInterruptible_await() { testInterruptible(AwaitMethod.await); }
1009 public void testInterruptible_awaitTimed() { testInterruptible(AwaitMethod.awaitTimed); }
1010 public void testInterruptible_awaitNanos() { testInterruptible(AwaitMethod.awaitNanos); }
1011 public void testInterruptible_awaitUntil() { testInterruptible(AwaitMethod.awaitUntil); }
1012 public void testInterruptible(final AwaitMethod awaitMethod) {
1013 final Mutex sync = new Mutex();
1014 final ConditionObject c = sync.newCondition();
1015 final BooleanLatch pleaseInterrupt = new BooleanLatch();
1016 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1017 public void realRun() throws InterruptedException {
1018 sync.acquire();
1019 assertTrue(pleaseInterrupt.releaseShared(0));
1020 await(c, awaitMethod);
1021 }});
1022
1023 pleaseInterrupt.acquireShared(0);
1024 t.interrupt();
1025 awaitTermination(t);
1026 }
1027
1028 /**
1029 * signalAll wakes up all threads
1030 */
1031 public void testSignalAll_await() { testSignalAll(AwaitMethod.await); }
1032 public void testSignalAll_awaitTimed() { testSignalAll(AwaitMethod.awaitTimed); }
1033 public void testSignalAll_awaitNanos() { testSignalAll(AwaitMethod.awaitNanos); }
1034 public void testSignalAll_awaitUntil() { testSignalAll(AwaitMethod.awaitUntil); }
1035 public void testSignalAll(final AwaitMethod awaitMethod) {
1036 final Mutex sync = new Mutex();
1037 final ConditionObject c = sync.newCondition();
1038 final BooleanLatch acquired1 = new BooleanLatch();
1039 final BooleanLatch acquired2 = new BooleanLatch();
1040 Thread t1 = newStartedThread(new CheckedRunnable() {
1041 public void realRun() throws InterruptedException {
1042 sync.acquire();
1043 acquired1.releaseShared(0);
1044 await(c, awaitMethod);
1045 sync.release();
1046 }});
1047
1048 Thread t2 = newStartedThread(new CheckedRunnable() {
1049 public void realRun() throws InterruptedException {
1050 sync.acquire();
1051 acquired2.releaseShared(0);
1052 await(c, awaitMethod);
1053 sync.release();
1054 }});
1055
1056 acquired1.acquireShared(0);
1057 acquired2.acquireShared(0);
1058 sync.acquire();
1059 assertHasWaitersLocked(sync, c, t1, t2);
1060 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
1061 c.signalAll();
1062 assertHasWaitersLocked(sync, c, NO_THREADS);
1063 assertHasExclusiveQueuedThreads(sync, t1, t2);
1064 sync.release();
1065 awaitTermination(t1);
1066 awaitTermination(t2);
1067 }
1068
1069 /**
1070 * toString indicates current state
1071 */
1072 public void testToString() {
1073 Mutex sync = new Mutex();
1074 assertTrue(sync.toString().contains("State = " + Mutex.UNLOCKED));
1075 sync.acquire();
1076 assertTrue(sync.toString().contains("State = " + Mutex.LOCKED));
1077 }
1078
1079 /**
1080 * A serialized AQS deserializes with current state, but no queued threads
1081 */
1082 public void testSerialization() {
1083 Mutex sync = new Mutex();
1084 assertFalse(serialClone(sync).isHeldExclusively());
1085 sync.acquire();
1086 Thread t = newStartedThread(new InterruptedSyncRunnable(sync));
1087 waitForQueuedThread(sync, t);
1088 assertTrue(sync.isHeldExclusively());
1089
1090 Mutex clone = serialClone(sync);
1091 assertTrue(clone.isHeldExclusively());
1092 assertHasExclusiveQueuedThreads(sync, t);
1093 assertHasExclusiveQueuedThreads(clone, NO_THREADS);
1094 t.interrupt();
1095 awaitTermination(t);
1096 sync.release();
1097 assertFalse(sync.isHeldExclusively());
1098 assertTrue(clone.isHeldExclusively());
1099 assertHasExclusiveQueuedThreads(sync, NO_THREADS);
1100 assertHasExclusiveQueuedThreads(clone, NO_THREADS);
1101 }
1102
1103 /**
1104 * tryReleaseShared setting state changes getState
1105 */
1106 public void testGetStateWithReleaseShared() {
1107 final BooleanLatch l = new BooleanLatch();
1108 assertFalse(l.isSignalled());
1109 assertTrue(l.releaseShared(0));
1110 assertTrue(l.isSignalled());
1111 }
1112
1113 /**
1114 * releaseShared has no effect when already signalled
1115 */
1116 public void testReleaseShared() {
1117 final BooleanLatch l = new BooleanLatch();
1118 assertFalse(l.isSignalled());
1119 assertTrue(l.releaseShared(0));
1120 assertTrue(l.isSignalled());
1121 assertTrue(l.releaseShared(0));
1122 assertTrue(l.isSignalled());
1123 }
1124
1125 /**
1126 * acquireSharedInterruptibly returns after release, but not before
1127 */
1128 public void testAcquireSharedInterruptibly() {
1129 final BooleanLatch l = new BooleanLatch();
1130
1131 Thread t = newStartedThread(new CheckedRunnable() {
1132 public void realRun() throws InterruptedException {
1133 assertFalse(l.isSignalled());
1134 l.acquireSharedInterruptibly(0);
1135 assertTrue(l.isSignalled());
1136 l.acquireSharedInterruptibly(0);
1137 assertTrue(l.isSignalled());
1138 }});
1139
1140 waitForQueuedThread(l, t);
1141 assertFalse(l.isSignalled());
1142 assertThreadStaysAlive(t);
1143 assertHasSharedQueuedThreads(l, t);
1144 assertTrue(l.releaseShared(0));
1145 assertTrue(l.isSignalled());
1146 awaitTermination(t);
1147 }
1148
1149 /**
1150 * tryAcquireSharedNanos returns after release, but not before
1151 */
1152 public void testTryAcquireSharedNanos() {
1153 final BooleanLatch l = new BooleanLatch();
1154
1155 Thread t = newStartedThread(new CheckedRunnable() {
1156 public void realRun() throws InterruptedException {
1157 assertFalse(l.isSignalled());
1158 long nanos = MILLISECONDS.toNanos(2 * LONG_DELAY_MS);
1159 assertTrue(l.tryAcquireSharedNanos(0, nanos));
1160 assertTrue(l.isSignalled());
1161 assertTrue(l.tryAcquireSharedNanos(0, nanos));
1162 assertTrue(l.isSignalled());
1163 }});
1164
1165 waitForQueuedThread(l, t);
1166 assertFalse(l.isSignalled());
1167 assertThreadStaysAlive(t);
1168 assertTrue(l.releaseShared(0));
1169 assertTrue(l.isSignalled());
1170 awaitTermination(t);
1171 }
1172
1173 /**
1174 * acquireSharedInterruptibly is interruptible
1175 */
1176 public void testAcquireSharedInterruptibly_Interruptible() {
1177 final BooleanLatch l = new BooleanLatch();
1178 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1179 public void realRun() throws InterruptedException {
1180 assertFalse(l.isSignalled());
1181 l.acquireSharedInterruptibly(0);
1182 }});
1183
1184 waitForQueuedThread(l, t);
1185 assertFalse(l.isSignalled());
1186 t.interrupt();
1187 awaitTermination(t);
1188 assertFalse(l.isSignalled());
1189 }
1190
1191 /**
1192 * tryAcquireSharedNanos is interruptible
1193 */
1194 public void testTryAcquireSharedNanos_Interruptible() {
1195 final BooleanLatch l = new BooleanLatch();
1196 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1197 public void realRun() throws InterruptedException {
1198 assertFalse(l.isSignalled());
1199 long nanos = MILLISECONDS.toNanos(2 * LONG_DELAY_MS);
1200 l.tryAcquireSharedNanos(0, nanos);
1201 }});
1202
1203 waitForQueuedThread(l, t);
1204 assertFalse(l.isSignalled());
1205 t.interrupt();
1206 awaitTermination(t);
1207 assertFalse(l.isSignalled());
1208 }
1209
1210 /**
1211 * tryAcquireSharedNanos times out if not released before timeout
1212 */
1213 public void testTryAcquireSharedNanos_Timeout() {
1214 final BooleanLatch l = new BooleanLatch();
1215 final BooleanLatch observedQueued = new BooleanLatch();
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001216 Thread t = newStartedThread(new CheckedRunnable() {
1217 public void realRun() throws InterruptedException {
1218 assertFalse(l.isSignalled());
1219 for (long millis = timeoutMillis();
1220 !observedQueued.isSignalled();
1221 millis *= 2) {
1222 long nanos = MILLISECONDS.toNanos(millis);
1223 long startTime = System.nanoTime();
1224 assertFalse(l.tryAcquireSharedNanos(0, nanos));
1225 assertTrue(millisElapsedSince(startTime) >= millis);
1226 }
1227 assertFalse(l.isSignalled());
1228 }});
1229
1230 waitForQueuedThread(l, t);
1231 observedQueued.releaseShared(0);
1232 assertFalse(l.isSignalled());
1233 awaitTermination(t);
1234 assertFalse(l.isSignalled());
1235 }
1236
Narayan Kamath8e9a0e92015-04-28 11:40:00 +01001237 /**
1238 * awaitNanos/timed await with 0 wait times out immediately
1239 */
1240 public void testAwait_Zero() throws InterruptedException {
1241 final Mutex sync = new Mutex();
1242 final ConditionObject c = sync.newCondition();
1243 sync.acquire();
1244 assertTrue(c.awaitNanos(0L) <= 0);
1245 assertFalse(c.await(0L, NANOSECONDS));
1246 sync.release();
1247 }
1248
1249 /**
1250 * awaitNanos/timed await with maximum negative wait times does not underflow
1251 */
1252 public void testAwait_NegativeInfinity() throws InterruptedException {
1253 final Mutex sync = new Mutex();
1254 final ConditionObject c = sync.newCondition();
1255 sync.acquire();
1256 assertTrue(c.awaitNanos(Long.MIN_VALUE) <= 0);
1257 assertFalse(c.await(Long.MIN_VALUE, NANOSECONDS));
1258 sync.release();
1259 }
1260
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001261}