ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.114
Committed: Tue Sep 17 06:38:36 2013 UTC (10 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.113: +21 -5 lines
Log Message:
add jsr166.methodFilter system property

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