ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.103
Committed: Wed Mar 20 20:29:02 2013 UTC (11 years, 1 month ago) by dl
Branch: MAIN
Changes since 1.102: +4 -0 lines
Log Message:
Basic coverage for LongAdder and friends

File Contents

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