ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.75
Committed: Tue May 3 06:08:49 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.74: +17 -0 lines
Log Message:
rewrite ReentrantReadWriteLockTest

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import junit.framework.*;
10 import java.util.Arrays;
11 import java.util.NoSuchElementException;
12 import java.util.PropertyPermission;
13 import java.util.concurrent.*;
14 import java.util.concurrent.atomic.AtomicReference;
15 import static java.util.concurrent.TimeUnit.MILLISECONDS;
16 import static java.util.concurrent.TimeUnit.NANOSECONDS;
17 import java.security.CodeSource;
18 import java.security.Permission;
19 import java.security.PermissionCollection;
20 import java.security.Permissions;
21 import java.security.Policy;
22 import java.security.ProtectionDomain;
23 import java.security.SecurityPermission;
24
25 /**
26 * Base class for JSR166 Junit TCK tests. Defines some constants,
27 * utility methods and classes, as well as a simple framework for
28 * helping to make sure that assertions failing in generated threads
29 * cause the associated test that generated them to itself fail (which
30 * JUnit does not otherwise arrange). The rules for creating such
31 * tests are:
32 *
33 * <ol>
34 *
35 * <li> All assertions in code running in generated threads must use
36 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
37 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
38 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
39 * particularly recommended) for other code to use these forms too.
40 * Only the most typically used JUnit assertion methods are defined
41 * this way, but enough to live with.</li>
42 *
43 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
44 * to invoke {@code super.setUp} and {@code super.tearDown} within
45 * them. These methods are used to clear and check for thread
46 * assertion failures.</li>
47 *
48 * <li>All delays and timeouts must use one of the constants {@code
49 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
50 * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
51 * discriminable from zero time, and always allows enough time for the
52 * small amounts of computation (creating a thread, calling a few
53 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
54 * is always discriminable as larger than SHORT and smaller than
55 * MEDIUM. And so on. These constants are set to conservative values,
56 * but even so, if there is ever any doubt, they can all be increased
57 * in one spot to rerun tests on slower platforms.</li>
58 *
59 * <li> All threads generated must be joined inside each test case
60 * method (or {@code fail} to do so) before returning from the
61 * method. The {@code joinPool} method can be used to do this when
62 * using Executors.</li>
63 *
64 * </ol>
65 *
66 * <p> <b>Other notes</b>
67 * <ul>
68 *
69 * <li> Usually, there is one testcase method per JSR166 method
70 * covering "normal" operation, and then as many exception-testing
71 * methods as there are exceptions the method can throw. Sometimes
72 * there are multiple tests per JSR166 method when the different
73 * "normal" behaviors differ significantly. And sometimes testcases
74 * cover multiple methods when they cannot be tested in
75 * isolation.</li>
76 *
77 * <li> The documentation style for testcases is to provide as javadoc
78 * a simple sentence or two describing the property that the testcase
79 * method purports to test. The javadocs do not say anything about how
80 * the property is tested. To find out, read the code.</li>
81 *
82 * <li> These tests are "conformance tests", and do not attempt to
83 * test throughput, latency, scalability or other performance factors
84 * (see the separate "jtreg" tests for a set intended to check these
85 * for the most central aspects of functionality.) So, most tests use
86 * the smallest sensible numbers of threads, collection sizes, etc
87 * needed to check basic conformance.</li>
88 *
89 * <li>The test classes currently do not declare inclusion in
90 * any particular package to simplify things for people integrating
91 * them in TCK test suites.</li>
92 *
93 * <li> As a convenience, the {@code main} of this class (JSR166TestCase)
94 * runs all JSR166 unit tests.</li>
95 *
96 * </ul>
97 */
98 public class JSR166TestCase extends TestCase {
99 private static final boolean useSecurityManager =
100 Boolean.getBoolean("jsr166.useSecurityManager");
101
102 protected static final boolean expensiveTests =
103 Boolean.getBoolean("jsr166.expensiveTests");
104
105 /**
106 * If true, report on stdout all "slow" tests, that is, ones that
107 * take more than profileThreshold milliseconds to execute.
108 */
109 private static final boolean profileTests =
110 Boolean.getBoolean("jsr166.profileTests");
111
112 /**
113 * The number of milliseconds that tests are permitted for
114 * execution without being reported, when profileTests is set.
115 */
116 private static final long profileThreshold =
117 Long.getLong("jsr166.profileThreshold", 100);
118
119 protected void runTest() throws Throwable {
120 if (profileTests)
121 runTestProfiled();
122 else
123 super.runTest();
124 }
125
126 protected void runTestProfiled() throws Throwable {
127 long t0 = System.nanoTime();
128 try {
129 super.runTest();
130 } finally {
131 long elapsedMillis =
132 (System.nanoTime() - t0) / (1000L * 1000L);
133 if (elapsedMillis >= profileThreshold)
134 System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
135 }
136 }
137
138 /**
139 * Runs all JSR166 unit tests using junit.textui.TestRunner
140 */
141 public static void main(String[] args) {
142 if (useSecurityManager) {
143 System.err.println("Setting a permissive security manager");
144 Policy.setPolicy(permissivePolicy());
145 System.setSecurityManager(new SecurityManager());
146 }
147 int iters = (args.length == 0) ? 1 : Integer.parseInt(args[0]);
148
149 Test s = suite();
150 for (int i = 0; i < iters; ++i) {
151 junit.textui.TestRunner.run(s);
152 System.gc();
153 System.runFinalization();
154 }
155 System.exit(0);
156 }
157
158 public static TestSuite newTestSuite(Object... suiteOrClasses) {
159 TestSuite suite = new TestSuite();
160 for (Object suiteOrClass : suiteOrClasses) {
161 if (suiteOrClass instanceof TestSuite)
162 suite.addTest((TestSuite) suiteOrClass);
163 else if (suiteOrClass instanceof Class)
164 suite.addTest(new TestSuite((Class<?>) suiteOrClass));
165 else
166 throw new ClassCastException("not a test suite or class");
167 }
168 return suite;
169 }
170
171 /**
172 * Collects all JSR166 unit tests as one suite.
173 */
174 public static Test suite() {
175 return newTestSuite(
176 ForkJoinPoolTest.suite(),
177 ForkJoinTaskTest.suite(),
178 RecursiveActionTest.suite(),
179 RecursiveTaskTest.suite(),
180 LinkedTransferQueueTest.suite(),
181 PhaserTest.suite(),
182 ThreadLocalRandomTest.suite(),
183 AbstractExecutorServiceTest.suite(),
184 AbstractQueueTest.suite(),
185 AbstractQueuedSynchronizerTest.suite(),
186 AbstractQueuedLongSynchronizerTest.suite(),
187 ArrayBlockingQueueTest.suite(),
188 ArrayDequeTest.suite(),
189 AtomicBooleanTest.suite(),
190 AtomicIntegerArrayTest.suite(),
191 AtomicIntegerFieldUpdaterTest.suite(),
192 AtomicIntegerTest.suite(),
193 AtomicLongArrayTest.suite(),
194 AtomicLongFieldUpdaterTest.suite(),
195 AtomicLongTest.suite(),
196 AtomicMarkableReferenceTest.suite(),
197 AtomicReferenceArrayTest.suite(),
198 AtomicReferenceFieldUpdaterTest.suite(),
199 AtomicReferenceTest.suite(),
200 AtomicStampedReferenceTest.suite(),
201 ConcurrentHashMapTest.suite(),
202 ConcurrentLinkedDequeTest.suite(),
203 ConcurrentLinkedQueueTest.suite(),
204 ConcurrentSkipListMapTest.suite(),
205 ConcurrentSkipListSubMapTest.suite(),
206 ConcurrentSkipListSetTest.suite(),
207 ConcurrentSkipListSubSetTest.suite(),
208 CopyOnWriteArrayListTest.suite(),
209 CopyOnWriteArraySetTest.suite(),
210 CountDownLatchTest.suite(),
211 CyclicBarrierTest.suite(),
212 DelayQueueTest.suite(),
213 EntryTest.suite(),
214 ExchangerTest.suite(),
215 ExecutorsTest.suite(),
216 ExecutorCompletionServiceTest.suite(),
217 FutureTaskTest.suite(),
218 LinkedBlockingDequeTest.suite(),
219 LinkedBlockingQueueTest.suite(),
220 LinkedListTest.suite(),
221 LockSupportTest.suite(),
222 PriorityBlockingQueueTest.suite(),
223 PriorityQueueTest.suite(),
224 ReentrantLockTest.suite(),
225 ReentrantReadWriteLockTest.suite(),
226 ScheduledExecutorTest.suite(),
227 ScheduledExecutorSubclassTest.suite(),
228 SemaphoreTest.suite(),
229 SynchronousQueueTest.suite(),
230 SystemTest.suite(),
231 ThreadLocalTest.suite(),
232 ThreadPoolExecutorTest.suite(),
233 ThreadPoolExecutorSubclassTest.suite(),
234 ThreadTest.suite(),
235 TimeUnitTest.suite(),
236 TreeMapTest.suite(),
237 TreeSetTest.suite(),
238 TreeSubMapTest.suite(),
239 TreeSubSetTest.suite());
240 }
241
242
243 public static long SHORT_DELAY_MS;
244 public static long SMALL_DELAY_MS;
245 public static long MEDIUM_DELAY_MS;
246 public static long LONG_DELAY_MS;
247
248
249 /**
250 * Returns the shortest timed delay. This could
251 * be reimplemented to use for example a Property.
252 */
253 protected long getShortDelay() {
254 return 50;
255 }
256
257
258 /**
259 * Sets delays as multiples of SHORT_DELAY.
260 */
261 protected void setDelays() {
262 SHORT_DELAY_MS = getShortDelay();
263 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
264 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
265 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
266 }
267
268 /**
269 * The first exception encountered if any threadAssertXXX method fails.
270 */
271 private final AtomicReference<Throwable> threadFailure
272 = new AtomicReference<Throwable>(null);
273
274 /**
275 * Records an exception so that it can be rethrown later in the test
276 * harness thread, triggering a test case failure. Only the first
277 * failure is recorded; subsequent calls to this method from within
278 * the same test have no effect.
279 */
280 public void threadRecordFailure(Throwable t) {
281 threadFailure.compareAndSet(null, t);
282 }
283
284 public void setUp() {
285 setDelays();
286 }
287
288 /**
289 * Triggers test case failure if any thread assertions have failed,
290 * by rethrowing, in the test harness thread, any exception recorded
291 * earlier by threadRecordFailure.
292 */
293 public void tearDown() throws Exception {
294 Throwable t = threadFailure.getAndSet(null);
295 if (t != null) {
296 if (t instanceof Error)
297 throw (Error) t;
298 else if (t instanceof RuntimeException)
299 throw (RuntimeException) t;
300 else if (t instanceof Exception)
301 throw (Exception) t;
302 else {
303 AssertionFailedError afe =
304 new AssertionFailedError(t.toString());
305 afe.initCause(t);
306 throw afe;
307 }
308 }
309 }
310
311 /**
312 * Just like fail(reason), but additionally recording (using
313 * threadRecordFailure) any AssertionFailedError thrown, so that
314 * the current testcase will fail.
315 */
316 public void threadFail(String reason) {
317 try {
318 fail(reason);
319 } catch (AssertionFailedError t) {
320 threadRecordFailure(t);
321 fail(reason);
322 }
323 }
324
325 /**
326 * Just like assertTrue(b), but additionally recording (using
327 * threadRecordFailure) any AssertionFailedError thrown, so that
328 * the current testcase will fail.
329 */
330 public void threadAssertTrue(boolean b) {
331 try {
332 assertTrue(b);
333 } catch (AssertionFailedError t) {
334 threadRecordFailure(t);
335 throw t;
336 }
337 }
338
339 /**
340 * Just like assertFalse(b), but additionally recording (using
341 * threadRecordFailure) any AssertionFailedError thrown, so that
342 * the current testcase will fail.
343 */
344 public void threadAssertFalse(boolean b) {
345 try {
346 assertFalse(b);
347 } catch (AssertionFailedError t) {
348 threadRecordFailure(t);
349 throw t;
350 }
351 }
352
353 /**
354 * Just like assertNull(x), but additionally recording (using
355 * threadRecordFailure) any AssertionFailedError thrown, so that
356 * the current testcase will fail.
357 */
358 public void threadAssertNull(Object x) {
359 try {
360 assertNull(x);
361 } catch (AssertionFailedError t) {
362 threadRecordFailure(t);
363 throw t;
364 }
365 }
366
367 /**
368 * Just like assertEquals(x, y), but additionally recording (using
369 * threadRecordFailure) any AssertionFailedError thrown, so that
370 * the current testcase will fail.
371 */
372 public void threadAssertEquals(long x, long y) {
373 try {
374 assertEquals(x, y);
375 } catch (AssertionFailedError t) {
376 threadRecordFailure(t);
377 throw t;
378 }
379 }
380
381 /**
382 * Just like assertEquals(x, y), but additionally recording (using
383 * threadRecordFailure) any AssertionFailedError thrown, so that
384 * the current testcase will fail.
385 */
386 public void threadAssertEquals(Object x, Object y) {
387 try {
388 assertEquals(x, y);
389 } catch (AssertionFailedError t) {
390 threadRecordFailure(t);
391 throw t;
392 } catch (Throwable t) {
393 threadUnexpectedException(t);
394 }
395 }
396
397 /**
398 * Just like assertSame(x, y), but additionally recording (using
399 * threadRecordFailure) any AssertionFailedError thrown, so that
400 * the current testcase will fail.
401 */
402 public void threadAssertSame(Object x, Object y) {
403 try {
404 assertSame(x, y);
405 } catch (AssertionFailedError t) {
406 threadRecordFailure(t);
407 throw t;
408 }
409 }
410
411 /**
412 * Calls threadFail with message "should throw exception".
413 */
414 public void threadShouldThrow() {
415 threadFail("should throw exception");
416 }
417
418 /**
419 * Calls threadFail with message "should throw" + exceptionName.
420 */
421 public void threadShouldThrow(String exceptionName) {
422 threadFail("should throw " + exceptionName);
423 }
424
425 /**
426 * Records the given exception using {@link #threadRecordFailure},
427 * then rethrows the exception, wrapping it in an
428 * AssertionFailedError if necessary.
429 */
430 public void threadUnexpectedException(Throwable t) {
431 threadRecordFailure(t);
432 t.printStackTrace();
433 if (t instanceof RuntimeException)
434 throw (RuntimeException) t;
435 else if (t instanceof Error)
436 throw (Error) t;
437 else {
438 AssertionFailedError afe =
439 new AssertionFailedError("unexpected exception: " + t);
440 t.initCause(t);
441 throw afe;
442 }
443 }
444
445 /**
446 * Waits out termination of a thread pool or fails doing so.
447 */
448 public void joinPool(ExecutorService exec) {
449 try {
450 exec.shutdown();
451 assertTrue("ExecutorService did not terminate in a timely manner",
452 exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS));
453 } catch (SecurityException ok) {
454 // Allowed in case test doesn't have privs
455 } catch (InterruptedException ie) {
456 fail("Unexpected InterruptedException");
457 }
458 }
459
460
461 /**
462 * Fails with message "should throw exception".
463 */
464 public void shouldThrow() {
465 fail("Should throw exception");
466 }
467
468 /**
469 * Fails with message "should throw " + exceptionName.
470 */
471 public void shouldThrow(String exceptionName) {
472 fail("Should throw " + exceptionName);
473 }
474
475 /**
476 * The number of elements to place in collections, arrays, etc.
477 */
478 public static final int SIZE = 20;
479
480 // Some convenient Integer constants
481
482 public static final Integer zero = new Integer(0);
483 public static final Integer one = new Integer(1);
484 public static final Integer two = new Integer(2);
485 public static final Integer three = new Integer(3);
486 public static final Integer four = new Integer(4);
487 public static final Integer five = new Integer(5);
488 public static final Integer six = new Integer(6);
489 public static final Integer seven = new Integer(7);
490 public static final Integer eight = new Integer(8);
491 public static final Integer nine = new Integer(9);
492 public static final Integer m1 = new Integer(-1);
493 public static final Integer m2 = new Integer(-2);
494 public static final Integer m3 = new Integer(-3);
495 public static final Integer m4 = new Integer(-4);
496 public static final Integer m5 = new Integer(-5);
497 public static final Integer m6 = new Integer(-6);
498 public static final Integer m10 = new Integer(-10);
499
500
501 /**
502 * Runs Runnable r with a security policy that permits precisely
503 * the specified permissions. If there is no current security
504 * manager, the runnable is run twice, both with and without a
505 * security manager. We require that any security manager permit
506 * getPolicy/setPolicy.
507 */
508 public void runWithPermissions(Runnable r, Permission... permissions) {
509 SecurityManager sm = System.getSecurityManager();
510 if (sm == null) {
511 r.run();
512 Policy savedPolicy = Policy.getPolicy();
513 try {
514 Policy.setPolicy(permissivePolicy());
515 System.setSecurityManager(new SecurityManager());
516 runWithPermissions(r, permissions);
517 } finally {
518 System.setSecurityManager(null);
519 Policy.setPolicy(savedPolicy);
520 }
521 } else {
522 Policy savedPolicy = Policy.getPolicy();
523 AdjustablePolicy policy = new AdjustablePolicy(permissions);
524 Policy.setPolicy(policy);
525
526 try {
527 r.run();
528 } finally {
529 policy.addPermission(new SecurityPermission("setPolicy"));
530 Policy.setPolicy(savedPolicy);
531 }
532 }
533 }
534
535 /**
536 * Runs a runnable without any permissions.
537 */
538 public void runWithoutPermissions(Runnable r) {
539 runWithPermissions(r);
540 }
541
542 /**
543 * A security policy where new permissions can be dynamically added
544 * or all cleared.
545 */
546 public static class AdjustablePolicy extends java.security.Policy {
547 Permissions perms = new Permissions();
548 AdjustablePolicy(Permission... permissions) {
549 for (Permission permission : permissions)
550 perms.add(permission);
551 }
552 void addPermission(Permission perm) { perms.add(perm); }
553 void clearPermissions() { perms = new Permissions(); }
554 public PermissionCollection getPermissions(CodeSource cs) {
555 return perms;
556 }
557 public PermissionCollection getPermissions(ProtectionDomain pd) {
558 return perms;
559 }
560 public boolean implies(ProtectionDomain pd, Permission p) {
561 return perms.implies(p);
562 }
563 public void refresh() {}
564 }
565
566 /**
567 * Returns a policy containing all the permissions we ever need.
568 */
569 public static Policy permissivePolicy() {
570 return new AdjustablePolicy
571 // Permissions j.u.c. needs directly
572 (new RuntimePermission("modifyThread"),
573 new RuntimePermission("getClassLoader"),
574 new RuntimePermission("setContextClassLoader"),
575 // Permissions needed to change permissions!
576 new SecurityPermission("getPolicy"),
577 new SecurityPermission("setPolicy"),
578 new RuntimePermission("setSecurityManager"),
579 // Permissions needed by the junit test harness
580 new RuntimePermission("accessDeclaredMembers"),
581 new PropertyPermission("*", "read"),
582 new java.io.FilePermission("<<ALL FILES>>", "read"));
583 }
584
585 /**
586 * Sleeps until the given time has elapsed.
587 * Throws AssertionFailedError if interrupted.
588 */
589 void sleep(long millis) {
590 try {
591 Thread.sleep(millis);
592 } catch (InterruptedException ie) {
593 AssertionFailedError afe =
594 new AssertionFailedError("Unexpected InterruptedException");
595 afe.initCause(ie);
596 throw afe;
597 }
598 }
599
600 /**
601 * Sleeps until the timeout has elapsed, or interrupted.
602 * Does <em>NOT</em> throw InterruptedException.
603 */
604 void sleepTillInterrupted(long timeoutMillis) {
605 try {
606 Thread.sleep(timeoutMillis);
607 } catch (InterruptedException wakeup) {}
608 }
609
610 /**
611 * Waits up to the specified number of milliseconds for the given
612 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
613 */
614 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
615 long timeoutNanos = timeoutMillis * 1000L * 1000L;
616 long t0 = System.nanoTime();
617 for (;;) {
618 Thread.State s = thread.getState();
619 if (s == Thread.State.BLOCKED ||
620 s == Thread.State.WAITING ||
621 s == Thread.State.TIMED_WAITING)
622 return;
623 else if (s == Thread.State.TERMINATED)
624 fail("Unexpected thread termination");
625 else if (System.nanoTime() - t0 > timeoutNanos) {
626 threadAssertTrue(thread.isAlive());
627 return;
628 }
629 Thread.yield();
630 }
631 }
632
633 /**
634 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
635 * state: BLOCKED, WAITING, or TIMED_WAITING.
636 */
637 void waitForThreadToEnterWaitState(Thread thread) {
638 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
639 }
640
641 /**
642 * Returns the number of milliseconds since time given by
643 * startNanoTime, which must have been previously returned from a
644 * call to {@link System.nanoTime()}.
645 */
646 long millisElapsedSince(long startNanoTime) {
647 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
648 }
649
650 /**
651 * Returns a new started daemon Thread running the given runnable.
652 */
653 Thread newStartedThread(Runnable runnable) {
654 Thread t = new Thread(runnable);
655 t.setDaemon(true);
656 t.start();
657 return t;
658 }
659
660 /**
661 * Waits for the specified time (in milliseconds) for the thread
662 * to terminate (using {@link Thread#join(long)}), else interrupts
663 * the thread (in the hope that it may terminate later) and fails.
664 */
665 void awaitTermination(Thread t, long timeoutMillis) {
666 try {
667 t.join(timeoutMillis);
668 } catch (InterruptedException ie) {
669 threadUnexpectedException(ie);
670 } finally {
671 if (t.isAlive()) {
672 t.interrupt();
673 fail("Test timed out");
674 }
675 }
676 }
677
678 /**
679 * Waits for LONG_DELAY_MS milliseconds for the thread to
680 * terminate (using {@link Thread#join(long)}), else interrupts
681 * the thread (in the hope that it may terminate later) and fails.
682 */
683 void awaitTermination(Thread t) {
684 awaitTermination(t, LONG_DELAY_MS);
685 }
686
687 // Some convenient Runnable classes
688
689 public abstract class CheckedRunnable implements Runnable {
690 protected abstract void realRun() throws Throwable;
691
692 public final void run() {
693 try {
694 realRun();
695 } catch (Throwable t) {
696 threadUnexpectedException(t);
697 }
698 }
699 }
700
701 public abstract class RunnableShouldThrow implements Runnable {
702 protected abstract void realRun() throws Throwable;
703
704 final Class<?> exceptionClass;
705
706 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
707 this.exceptionClass = exceptionClass;
708 }
709
710 public final void run() {
711 try {
712 realRun();
713 threadShouldThrow(exceptionClass.getSimpleName());
714 } catch (Throwable t) {
715 if (! exceptionClass.isInstance(t))
716 threadUnexpectedException(t);
717 }
718 }
719 }
720
721 public abstract class ThreadShouldThrow extends Thread {
722 protected abstract void realRun() throws Throwable;
723
724 final Class<?> exceptionClass;
725
726 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
727 this.exceptionClass = exceptionClass;
728 }
729
730 public final void run() {
731 try {
732 realRun();
733 threadShouldThrow(exceptionClass.getSimpleName());
734 } catch (Throwable t) {
735 if (! exceptionClass.isInstance(t))
736 threadUnexpectedException(t);
737 }
738 }
739 }
740
741 public abstract class CheckedInterruptedRunnable implements Runnable {
742 protected abstract void realRun() throws Throwable;
743
744 public final void run() {
745 try {
746 realRun();
747 threadShouldThrow("InterruptedException");
748 } catch (InterruptedException success) {
749 } catch (Throwable t) {
750 threadUnexpectedException(t);
751 }
752 }
753 }
754
755 public abstract class CheckedCallable<T> implements Callable<T> {
756 protected abstract T realCall() throws Throwable;
757
758 public final T call() {
759 try {
760 return realCall();
761 } catch (Throwable t) {
762 threadUnexpectedException(t);
763 return null;
764 }
765 }
766 }
767
768 public abstract class CheckedInterruptedCallable<T>
769 implements Callable<T> {
770 protected abstract T realCall() throws Throwable;
771
772 public final T call() {
773 try {
774 T result = realCall();
775 threadShouldThrow("InterruptedException");
776 return result;
777 } catch (InterruptedException success) {
778 } catch (Throwable t) {
779 threadUnexpectedException(t);
780 }
781 return null;
782 }
783 }
784
785 public static class NoOpRunnable implements Runnable {
786 public void run() {}
787 }
788
789 public static class NoOpCallable implements Callable {
790 public Object call() { return Boolean.TRUE; }
791 }
792
793 public static final String TEST_STRING = "a test string";
794
795 public static class StringTask implements Callable<String> {
796 public String call() { return TEST_STRING; }
797 }
798
799 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
800 return new CheckedCallable<String>() {
801 protected String realCall() {
802 try {
803 latch.await();
804 } catch (InterruptedException quittingTime) {}
805 return TEST_STRING;
806 }};
807 }
808
809 public Runnable awaiter(final CountDownLatch latch) {
810 return new CheckedRunnable() {
811 public void realRun() throws InterruptedException {
812 latch.await();
813 }};
814 }
815
816 public static class NPETask implements Callable<String> {
817 public String call() { throw new NullPointerException(); }
818 }
819
820 public static class CallableOne implements Callable<Integer> {
821 public Integer call() { return one; }
822 }
823
824 public class ShortRunnable extends CheckedRunnable {
825 protected void realRun() throws Throwable {
826 Thread.sleep(SHORT_DELAY_MS);
827 }
828 }
829
830 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
831 protected void realRun() throws InterruptedException {
832 Thread.sleep(SHORT_DELAY_MS);
833 }
834 }
835
836 public class SmallRunnable extends CheckedRunnable {
837 protected void realRun() throws Throwable {
838 Thread.sleep(SMALL_DELAY_MS);
839 }
840 }
841
842 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
843 protected void realRun() {
844 try {
845 Thread.sleep(SMALL_DELAY_MS);
846 } catch (InterruptedException ok) {}
847 }
848 }
849
850 public class SmallCallable extends CheckedCallable {
851 protected Object realCall() throws InterruptedException {
852 Thread.sleep(SMALL_DELAY_MS);
853 return Boolean.TRUE;
854 }
855 }
856
857 public class MediumRunnable extends CheckedRunnable {
858 protected void realRun() throws Throwable {
859 Thread.sleep(MEDIUM_DELAY_MS);
860 }
861 }
862
863 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
864 protected void realRun() throws InterruptedException {
865 Thread.sleep(MEDIUM_DELAY_MS);
866 }
867 }
868
869 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
870 return new CheckedRunnable() {
871 protected void realRun() {
872 try {
873 Thread.sleep(timeoutMillis);
874 } catch (InterruptedException ok) {}
875 }};
876 }
877
878 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
879 protected void realRun() {
880 try {
881 Thread.sleep(MEDIUM_DELAY_MS);
882 } catch (InterruptedException ok) {}
883 }
884 }
885
886 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
887 protected void realRun() {
888 try {
889 Thread.sleep(LONG_DELAY_MS);
890 } catch (InterruptedException ok) {}
891 }
892 }
893
894 /**
895 * For use as ThreadFactory in constructors
896 */
897 public static class SimpleThreadFactory implements ThreadFactory {
898 public Thread newThread(Runnable r) {
899 return new Thread(r);
900 }
901 }
902
903 public interface TrackedRunnable extends Runnable {
904 boolean isDone();
905 }
906
907 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
908 return new TrackedRunnable() {
909 private volatile boolean done = false;
910 public boolean isDone() { return done; }
911 public void run() {
912 try {
913 Thread.sleep(timeoutMillis);
914 done = true;
915 } catch (InterruptedException ok) {}
916 }
917 };
918 }
919
920 public static class TrackedShortRunnable implements Runnable {
921 public volatile boolean done = false;
922 public void run() {
923 try {
924 Thread.sleep(SHORT_DELAY_MS);
925 done = true;
926 } catch (InterruptedException ok) {}
927 }
928 }
929
930 public static class TrackedSmallRunnable implements Runnable {
931 public volatile boolean done = false;
932 public void run() {
933 try {
934 Thread.sleep(SMALL_DELAY_MS);
935 done = true;
936 } catch (InterruptedException ok) {}
937 }
938 }
939
940 public static class TrackedMediumRunnable implements Runnable {
941 public volatile boolean done = false;
942 public void run() {
943 try {
944 Thread.sleep(MEDIUM_DELAY_MS);
945 done = true;
946 } catch (InterruptedException ok) {}
947 }
948 }
949
950 public static class TrackedLongRunnable implements Runnable {
951 public volatile boolean done = false;
952 public void run() {
953 try {
954 Thread.sleep(LONG_DELAY_MS);
955 done = true;
956 } catch (InterruptedException ok) {}
957 }
958 }
959
960 public static class TrackedNoOpRunnable implements Runnable {
961 public volatile boolean done = false;
962 public void run() {
963 done = true;
964 }
965 }
966
967 public static class TrackedCallable implements Callable {
968 public volatile boolean done = false;
969 public Object call() {
970 try {
971 Thread.sleep(SMALL_DELAY_MS);
972 done = true;
973 } catch (InterruptedException ok) {}
974 return Boolean.TRUE;
975 }
976 }
977
978 /**
979 * Analog of CheckedRunnable for RecursiveAction
980 */
981 public abstract class CheckedRecursiveAction extends RecursiveAction {
982 protected abstract void realCompute() throws Throwable;
983
984 public final void compute() {
985 try {
986 realCompute();
987 } catch (Throwable t) {
988 threadUnexpectedException(t);
989 }
990 }
991 }
992
993 /**
994 * Analog of CheckedCallable for RecursiveTask
995 */
996 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
997 protected abstract T realCompute() throws Throwable;
998
999 public final T compute() {
1000 try {
1001 return realCompute();
1002 } catch (Throwable t) {
1003 threadUnexpectedException(t);
1004 return null;
1005 }
1006 }
1007 }
1008
1009 /**
1010 * For use as RejectedExecutionHandler in constructors
1011 */
1012 public static class NoOpREHandler implements RejectedExecutionHandler {
1013 public void rejectedExecution(Runnable r,
1014 ThreadPoolExecutor executor) {}
1015 }
1016
1017 /**
1018 * A CyclicBarrier that fails with AssertionFailedErrors instead
1019 * of throwing checked exceptions.
1020 */
1021 public class CheckedBarrier extends CyclicBarrier {
1022 public CheckedBarrier(int parties) { super(parties); }
1023
1024 public int await() {
1025 try {
1026 return super.await();
1027 } catch (Exception e) {
1028 AssertionFailedError afe =
1029 new AssertionFailedError("Unexpected exception: " + e);
1030 afe.initCause(e);
1031 throw afe;
1032 }
1033 }
1034 }
1035
1036 public void checkEmpty(BlockingQueue q) {
1037 try {
1038 assertTrue(q.isEmpty());
1039 assertEquals(0, q.size());
1040 assertNull(q.peek());
1041 assertNull(q.poll());
1042 assertNull(q.poll(0, MILLISECONDS));
1043 assertEquals(q.toString(), "[]");
1044 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1045 assertFalse(q.iterator().hasNext());
1046 try {
1047 q.element();
1048 shouldThrow();
1049 } catch (NoSuchElementException success) {}
1050 try {
1051 q.iterator().next();
1052 shouldThrow();
1053 } catch (NoSuchElementException success) {}
1054 try {
1055 q.remove();
1056 shouldThrow();
1057 } catch (NoSuchElementException success) {}
1058 } catch (InterruptedException ie) {
1059 threadUnexpectedException(ie);
1060 }
1061 }
1062
1063 }