ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.121
Committed: Wed Jul 9 16:51:40 2014 UTC (9 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.120: +3 -2 lines
Log Message:
more debugging info on joinPool timeout

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