ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.122
Committed: Wed Dec 31 16:44:02 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.121: +0 -1 lines
Log Message:
remove unused imports

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