ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.139
Committed: Sun Sep 6 21:14:12 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.138: +34 -4 lines
Log Message:
improve jdk9 CompletableFuture tests

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