ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.62
Committed: Mon Oct 11 05:40:41 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.61: +3 -0 lines
Log Message:
reduce the costs of the most egregiously expensive tck tests, while still alowing for a system property to run them for longer

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