ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.111
Committed: Sun Jul 21 22:24:18 2013 UTC (10 years, 9 months ago) by dl
Branch: MAIN
Changes since 1.110: +1 -0 lines
Log Message:
Adapt/incorporate JDK8 tests including suggestions by Eric Wang

File Contents

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