ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.152
Committed: Sat Oct 3 19:29:11 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.151: +1 -1 lines
Log Message:
threadFail: simply rethrow the AssertionFailedError

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