ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.203
Committed: Thu Sep 15 03:46:19 2016 UTC (7 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.202: +6 -3 lines
Log Message:
dumpTestThreads: prevent NPE while dumping threads

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