ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.80
Committed: Fri May 13 21:48:58 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.79: +9 -11 lines
Log Message:
More cross-pollination of RL and RRWL tests; don't rely on thread.join not returning early

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