ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.200
Committed: Wed Aug 10 01:28:14 2016 UTC (7 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.199: +5 -0 lines
Log Message:
introduce shuffle(T[]) utility method

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     String name = info.getThreadName();
1009     if ("Signal Dispatcher".equals(name))
1010     continue;
1011     if ("Reference Handler".equals(name)
1012     && info.getLockName().startsWith("java.lang.ref.Reference$Lock"))
1013     continue;
1014     if ("Finalizer".equals(name)
1015     && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock"))
1016     continue;
1017 jsr166 1.156 if ("checkForWedgedTest".equals(name))
1018     continue;
1019 jsr166 1.96 System.err.print(info);
1020 jsr166 1.150 }
1021     System.err.println("------ stacktrace dump end ------");
1022 jsr166 1.195
1023     if (sm != null) System.setSecurityManager(sm);
1024 jsr166 1.95 }
1025    
1026     /**
1027 jsr166 1.81 * Checks that thread does not terminate within the default
1028     * millisecond delay of {@code timeoutMillis()}.
1029     */
1030     void assertThreadStaysAlive(Thread thread) {
1031     assertThreadStaysAlive(thread, timeoutMillis());
1032     }
1033    
1034     /**
1035 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
1036 jsr166 1.78 */
1037 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
1038 jsr166 1.78 try {
1039 jsr166 1.80 // No need to optimize the failing case via Thread.join.
1040     delay(millis);
1041 jsr166 1.78 assertTrue(thread.isAlive());
1042 jsr166 1.128 } catch (InterruptedException fail) {
1043 jsr166 1.158 threadFail("Unexpected InterruptedException");
1044 jsr166 1.78 }
1045     }
1046 dl 1.5
1047     /**
1048 jsr166 1.90 * Checks that the threads do not terminate within the default
1049     * millisecond delay of {@code timeoutMillis()}.
1050     */
1051     void assertThreadsStayAlive(Thread... threads) {
1052     assertThreadsStayAlive(timeoutMillis(), threads);
1053     }
1054    
1055     /**
1056     * Checks that the threads do not terminate within the given millisecond delay.
1057     */
1058     void assertThreadsStayAlive(long millis, Thread... threads) {
1059     try {
1060     // No need to optimize the failing case via Thread.join.
1061     delay(millis);
1062     for (Thread thread : threads)
1063     assertTrue(thread.isAlive());
1064 jsr166 1.128 } catch (InterruptedException fail) {
1065 jsr166 1.158 threadFail("Unexpected InterruptedException");
1066 jsr166 1.90 }
1067     }
1068    
1069     /**
1070 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1071     * {@code timeoutMillis()}.
1072     */
1073     void assertFutureTimesOut(Future future) {
1074     assertFutureTimesOut(future, timeoutMillis());
1075     }
1076    
1077     /**
1078     * Checks that future.get times out, with the given millisecond timeout.
1079     */
1080     void assertFutureTimesOut(Future future, long timeoutMillis) {
1081     long startTime = System.nanoTime();
1082     try {
1083     future.get(timeoutMillis, MILLISECONDS);
1084     shouldThrow();
1085     } catch (TimeoutException success) {
1086 jsr166 1.128 } catch (Exception fail) {
1087     threadUnexpectedException(fail);
1088 jsr166 1.83 } finally { future.cancel(true); }
1089     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1090     }
1091    
1092     /**
1093 jsr166 1.53 * Fails with message "should throw exception".
1094 jsr166 1.27 */
1095 dl 1.3 public void shouldThrow() {
1096     fail("Should throw exception");
1097     }
1098    
1099 dl 1.5 /**
1100 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1101 jsr166 1.40 */
1102     public void shouldThrow(String exceptionName) {
1103     fail("Should throw " + exceptionName);
1104     }
1105    
1106     /**
1107 dl 1.1 * The number of elements to place in collections, arrays, etc.
1108     */
1109 jsr166 1.45 public static final int SIZE = 20;
1110 dl 1.1
1111     // Some convenient Integer constants
1112    
1113 jsr166 1.47 public static final Integer zero = new Integer(0);
1114     public static final Integer one = new Integer(1);
1115     public static final Integer two = new Integer(2);
1116     public static final Integer three = new Integer(3);
1117 jsr166 1.45 public static final Integer four = new Integer(4);
1118     public static final Integer five = new Integer(5);
1119 jsr166 1.47 public static final Integer six = new Integer(6);
1120 jsr166 1.45 public static final Integer seven = new Integer(7);
1121     public static final Integer eight = new Integer(8);
1122 jsr166 1.47 public static final Integer nine = new Integer(9);
1123 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1124     public static final Integer m2 = new Integer(-2);
1125     public static final Integer m3 = new Integer(-3);
1126 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1127     public static final Integer m5 = new Integer(-5);
1128     public static final Integer m6 = new Integer(-6);
1129 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1130 dl 1.7
1131     /**
1132 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1133     * the specified permissions. If there is no current security
1134     * manager, the runnable is run twice, both with and without a
1135     * security manager. We require that any security manager permit
1136     * getPolicy/setPolicy.
1137     */
1138     public void runWithPermissions(Runnable r, Permission... permissions) {
1139     SecurityManager sm = System.getSecurityManager();
1140     if (sm == null) {
1141     r.run();
1142 jsr166 1.93 }
1143     runWithSecurityManagerWithPermissions(r, permissions);
1144     }
1145    
1146     /**
1147     * Runs Runnable r with a security policy that permits precisely
1148     * the specified permissions. If there is no current security
1149     * manager, a temporary one is set for the duration of the
1150     * Runnable. We require that any security manager permit
1151     * getPolicy/setPolicy.
1152     */
1153     public void runWithSecurityManagerWithPermissions(Runnable r,
1154     Permission... permissions) {
1155     SecurityManager sm = System.getSecurityManager();
1156     if (sm == null) {
1157 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1158     try {
1159     Policy.setPolicy(permissivePolicy());
1160     System.setSecurityManager(new SecurityManager());
1161 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1162 jsr166 1.49 } finally {
1163     System.setSecurityManager(null);
1164     Policy.setPolicy(savedPolicy);
1165     }
1166     } else {
1167     Policy savedPolicy = Policy.getPolicy();
1168     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1169     Policy.setPolicy(policy);
1170    
1171     try {
1172     r.run();
1173     } finally {
1174     policy.addPermission(new SecurityPermission("setPolicy"));
1175     Policy.setPolicy(savedPolicy);
1176     }
1177     }
1178     }
1179    
1180     /**
1181     * Runs a runnable without any permissions.
1182     */
1183     public void runWithoutPermissions(Runnable r) {
1184     runWithPermissions(r);
1185     }
1186    
1187     /**
1188 dl 1.7 * A security policy where new permissions can be dynamically added
1189     * or all cleared.
1190     */
1191 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1192 dl 1.7 Permissions perms = new Permissions();
1193 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1194     for (Permission permission : permissions)
1195     perms.add(permission);
1196     }
1197 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1198     void clearPermissions() { perms = new Permissions(); }
1199 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1200     return perms;
1201     }
1202     public PermissionCollection getPermissions(ProtectionDomain pd) {
1203     return perms;
1204     }
1205     public boolean implies(ProtectionDomain pd, Permission p) {
1206     return perms.implies(p);
1207     }
1208     public void refresh() {}
1209 jsr166 1.93 public String toString() {
1210     List<Permission> ps = new ArrayList<Permission>();
1211     for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1212     ps.add(e.nextElement());
1213     return "AdjustablePolicy with permissions " + ps;
1214     }
1215 dl 1.7 }
1216 dl 1.1
1217 jsr166 1.38 /**
1218 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1219     */
1220     public static Policy permissivePolicy() {
1221     return new AdjustablePolicy
1222     // Permissions j.u.c. needs directly
1223     (new RuntimePermission("modifyThread"),
1224     new RuntimePermission("getClassLoader"),
1225     new RuntimePermission("setContextClassLoader"),
1226     // Permissions needed to change permissions!
1227     new SecurityPermission("getPolicy"),
1228     new SecurityPermission("setPolicy"),
1229     new RuntimePermission("setSecurityManager"),
1230     // Permissions needed by the junit test harness
1231     new RuntimePermission("accessDeclaredMembers"),
1232     new PropertyPermission("*", "read"),
1233     new java.io.FilePermission("<<ALL FILES>>", "read"));
1234     }
1235    
1236     /**
1237 jsr166 1.60 * Sleeps until the given time has elapsed.
1238     * Throws AssertionFailedError if interrupted.
1239     */
1240     void sleep(long millis) {
1241     try {
1242 dl 1.76 delay(millis);
1243 jsr166 1.128 } catch (InterruptedException fail) {
1244 jsr166 1.60 AssertionFailedError afe =
1245     new AssertionFailedError("Unexpected InterruptedException");
1246 jsr166 1.128 afe.initCause(fail);
1247 jsr166 1.60 throw afe;
1248     }
1249     }
1250    
1251     /**
1252 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1253 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1254     */
1255     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1256 jsr166 1.199 long startTime = 0L;
1257 jsr166 1.65 for (;;) {
1258     Thread.State s = thread.getState();
1259     if (s == Thread.State.BLOCKED ||
1260     s == Thread.State.WAITING ||
1261 jsr166 1.67 s == Thread.State.TIMED_WAITING)
1262 jsr166 1.65 return;
1263 jsr166 1.67 else if (s == Thread.State.TERMINATED)
1264     fail("Unexpected thread termination");
1265 jsr166 1.199 else if (startTime == 0L)
1266     startTime = System.nanoTime();
1267 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1268 jsr166 1.67 threadAssertTrue(thread.isAlive());
1269     return;
1270     }
1271 jsr166 1.65 Thread.yield();
1272     }
1273     }
1274    
1275     /**
1276 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1277     * state: BLOCKED, WAITING, or TIMED_WAITING.
1278     */
1279     void waitForThreadToEnterWaitState(Thread thread) {
1280     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1281     }
1282    
1283     /**
1284 jsr166 1.66 * Returns the number of milliseconds since time given by
1285     * startNanoTime, which must have been previously returned from a
1286 jsr166 1.124 * call to {@link System#nanoTime()}.
1287 jsr166 1.66 */
1288 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1289 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1290     }
1291 jsr166 1.68
1292 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1293     // long startTime = System.nanoTime();
1294     // try {
1295     // r.run();
1296     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1297     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1298     // throw new AssertionFailedError("did not return promptly");
1299     // }
1300    
1301     // void assertTerminatesPromptly(Runnable r) {
1302     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1303     // }
1304    
1305     /**
1306     * Checks that timed f.get() returns the expected value, and does not
1307     * wait for the timeout to elapse before returning.
1308     */
1309     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1310     long startTime = System.nanoTime();
1311     try {
1312     assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1313     } catch (Throwable fail) { threadUnexpectedException(fail); }
1314     if (millisElapsedSince(startTime) > timeoutMillis/2)
1315     throw new AssertionFailedError("timed get did not return promptly");
1316     }
1317    
1318     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1319     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1320     }
1321    
1322 jsr166 1.66 /**
1323 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1324 jsr166 1.38 */
1325     Thread newStartedThread(Runnable runnable) {
1326     Thread t = new Thread(runnable);
1327 jsr166 1.58 t.setDaemon(true);
1328 jsr166 1.38 t.start();
1329     return t;
1330     }
1331 dl 1.1
1332 jsr166 1.59 /**
1333     * Waits for the specified time (in milliseconds) for the thread
1334     * to terminate (using {@link Thread#join(long)}), else interrupts
1335     * the thread (in the hope that it may terminate later) and fails.
1336     */
1337     void awaitTermination(Thread t, long timeoutMillis) {
1338     try {
1339     t.join(timeoutMillis);
1340 jsr166 1.128 } catch (InterruptedException fail) {
1341     threadUnexpectedException(fail);
1342 jsr166 1.59 } finally {
1343 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
1344 jsr166 1.59 t.interrupt();
1345 jsr166 1.177 threadFail("timed out waiting for thread to terminate");
1346 jsr166 1.59 }
1347     }
1348     }
1349    
1350 jsr166 1.75 /**
1351     * Waits for LONG_DELAY_MS milliseconds for the thread to
1352     * terminate (using {@link Thread#join(long)}), else interrupts
1353     * the thread (in the hope that it may terminate later) and fails.
1354     */
1355     void awaitTermination(Thread t) {
1356     awaitTermination(t, LONG_DELAY_MS);
1357     }
1358    
1359 dl 1.1 // Some convenient Runnable classes
1360    
1361 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1362     protected abstract void realRun() throws Throwable;
1363 jsr166 1.35
1364     public final void run() {
1365     try {
1366     realRun();
1367 jsr166 1.128 } catch (Throwable fail) {
1368     threadUnexpectedException(fail);
1369 jsr166 1.35 }
1370     }
1371     }
1372    
1373 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
1374     protected abstract void realRun() throws Throwable;
1375 jsr166 1.40
1376     final Class<?> exceptionClass;
1377    
1378     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1379     this.exceptionClass = exceptionClass;
1380     }
1381    
1382     public final void run() {
1383     try {
1384     realRun();
1385     threadShouldThrow(exceptionClass.getSimpleName());
1386     } catch (Throwable t) {
1387     if (! exceptionClass.isInstance(t))
1388     threadUnexpectedException(t);
1389     }
1390     }
1391     }
1392    
1393 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1394     protected abstract void realRun() throws Throwable;
1395 jsr166 1.40
1396     final Class<?> exceptionClass;
1397    
1398     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1399     this.exceptionClass = exceptionClass;
1400     }
1401    
1402     public final void run() {
1403     try {
1404     realRun();
1405     threadShouldThrow(exceptionClass.getSimpleName());
1406     } catch (Throwable t) {
1407     if (! exceptionClass.isInstance(t))
1408     threadUnexpectedException(t);
1409     }
1410     }
1411     }
1412    
1413 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1414     protected abstract void realRun() throws Throwable;
1415 jsr166 1.35
1416     public final void run() {
1417     try {
1418     realRun();
1419 jsr166 1.40 threadShouldThrow("InterruptedException");
1420 jsr166 1.35 } catch (InterruptedException success) {
1421 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1422 jsr166 1.128 } catch (Throwable fail) {
1423     threadUnexpectedException(fail);
1424 jsr166 1.35 }
1425     }
1426     }
1427    
1428 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1429     protected abstract T realCall() throws Throwable;
1430 jsr166 1.35
1431     public final T call() {
1432     try {
1433     return realCall();
1434 jsr166 1.128 } catch (Throwable fail) {
1435     threadUnexpectedException(fail);
1436 jsr166 1.53 return null;
1437 jsr166 1.35 }
1438 jsr166 1.40 }
1439     }
1440    
1441 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
1442     implements Callable<T> {
1443 jsr166 1.45 protected abstract T realCall() throws Throwable;
1444 jsr166 1.40
1445     public final T call() {
1446     try {
1447     T result = realCall();
1448     threadShouldThrow("InterruptedException");
1449     return result;
1450     } catch (InterruptedException success) {
1451 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1452 jsr166 1.128 } catch (Throwable fail) {
1453     threadUnexpectedException(fail);
1454 jsr166 1.40 }
1455     return null;
1456 jsr166 1.35 }
1457     }
1458    
1459 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1460 dl 1.1 public void run() {}
1461     }
1462    
1463 jsr166 1.45 public static class NoOpCallable implements Callable {
1464 dl 1.1 public Object call() { return Boolean.TRUE; }
1465 dl 1.10 }
1466    
1467 jsr166 1.45 public static final String TEST_STRING = "a test string";
1468 dl 1.10
1469 jsr166 1.45 public static class StringTask implements Callable<String> {
1470 jsr166 1.144 final String value;
1471     public StringTask() { this(TEST_STRING); }
1472     public StringTask(String value) { this.value = value; }
1473     public String call() { return value; }
1474 dl 1.10 }
1475    
1476 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1477     return new CheckedCallable<String>() {
1478 jsr166 1.64 protected String realCall() {
1479 jsr166 1.48 try {
1480     latch.await();
1481     } catch (InterruptedException quittingTime) {}
1482     return TEST_STRING;
1483     }};
1484     }
1485    
1486 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1487     return new CheckedRunnable() {
1488     public void realRun() throws InterruptedException {
1489     latch.countDown();
1490     }};
1491     }
1492    
1493 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1494 jsr166 1.162 static final int NEW = 0;
1495     static final int RUNNING = 1;
1496     static final int DONE = 2;
1497 jsr166 1.161 final CountDownLatch latch;
1498     int state = NEW;
1499     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1500     public void realRun() throws InterruptedException {
1501     state = 1;
1502     await(latch);
1503     state = 2;
1504     }
1505     }
1506 jsr166 1.162
1507 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1508     return new LatchAwaiter(latch);
1509 jsr166 1.73 }
1510    
1511 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1512 jsr166 1.79 try {
1513 jsr166 1.188 if (!latch.await(timeoutMillis, MILLISECONDS))
1514 jsr166 1.176 fail("timed out waiting for CountDownLatch for "
1515 jsr166 1.188 + (timeoutMillis/1000) + " sec");
1516 jsr166 1.128 } catch (Throwable fail) {
1517     threadUnexpectedException(fail);
1518 jsr166 1.79 }
1519     }
1520    
1521 jsr166 1.188 public void await(CountDownLatch latch) {
1522     await(latch, LONG_DELAY_MS);
1523     }
1524    
1525 jsr166 1.89 public void await(Semaphore semaphore) {
1526     try {
1527 jsr166 1.176 if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
1528     fail("timed out waiting for Semaphore for "
1529     + (LONG_DELAY_MS/1000) + " sec");
1530 jsr166 1.128 } catch (Throwable fail) {
1531     threadUnexpectedException(fail);
1532 jsr166 1.89 }
1533     }
1534    
1535 jsr166 1.81 // /**
1536     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1537     // */
1538     // public void await(AtomicBoolean flag) {
1539     // await(flag, LONG_DELAY_MS);
1540     // }
1541    
1542     // /**
1543     // * Spin-waits up to the specified timeout until flag becomes true.
1544     // */
1545     // public void await(AtomicBoolean flag, long timeoutMillis) {
1546     // long startTime = System.nanoTime();
1547     // while (!flag.get()) {
1548     // if (millisElapsedSince(startTime) > timeoutMillis)
1549     // throw new AssertionFailedError("timed out");
1550     // Thread.yield();
1551     // }
1552     // }
1553    
1554 jsr166 1.45 public static class NPETask implements Callable<String> {
1555 dl 1.10 public String call() { throw new NullPointerException(); }
1556     }
1557    
1558 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
1559 dl 1.10 public Integer call() { return one; }
1560 dl 1.1 }
1561    
1562 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1563     protected void realRun() throws Throwable {
1564 dl 1.76 delay(SHORT_DELAY_MS);
1565 dl 1.1 }
1566     }
1567    
1568 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1569     protected void realRun() throws InterruptedException {
1570 dl 1.76 delay(SHORT_DELAY_MS);
1571 dl 1.1 }
1572     }
1573    
1574 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1575     protected void realRun() throws Throwable {
1576 dl 1.76 delay(SMALL_DELAY_MS);
1577 dl 1.1 }
1578     }
1579    
1580 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1581     protected void realRun() {
1582 dl 1.6 try {
1583 dl 1.76 delay(SMALL_DELAY_MS);
1584 jsr166 1.44 } catch (InterruptedException ok) {}
1585 dl 1.6 }
1586     }
1587    
1588 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1589     protected Object realCall() throws InterruptedException {
1590 dl 1.76 delay(SMALL_DELAY_MS);
1591 dl 1.1 return Boolean.TRUE;
1592     }
1593     }
1594    
1595 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1596     protected void realRun() throws Throwable {
1597 dl 1.76 delay(MEDIUM_DELAY_MS);
1598 dl 1.1 }
1599     }
1600    
1601 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1602     protected void realRun() throws InterruptedException {
1603 dl 1.76 delay(MEDIUM_DELAY_MS);
1604 dl 1.1 }
1605     }
1606    
1607 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1608     return new CheckedRunnable() {
1609     protected void realRun() {
1610     try {
1611 dl 1.76 delay(timeoutMillis);
1612 jsr166 1.63 } catch (InterruptedException ok) {}
1613     }};
1614     }
1615    
1616 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1617     protected void realRun() {
1618 dl 1.1 try {
1619 dl 1.76 delay(MEDIUM_DELAY_MS);
1620 jsr166 1.44 } catch (InterruptedException ok) {}
1621 dl 1.1 }
1622     }
1623 dl 1.5
1624 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1625     protected void realRun() {
1626 dl 1.12 try {
1627 dl 1.76 delay(LONG_DELAY_MS);
1628 jsr166 1.44 } catch (InterruptedException ok) {}
1629 dl 1.12 }
1630     }
1631    
1632 dl 1.5 /**
1633     * For use as ThreadFactory in constructors
1634     */
1635 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1636 jsr166 1.33 public Thread newThread(Runnable r) {
1637 dl 1.5 return new Thread(r);
1638 jsr166 1.27 }
1639 dl 1.5 }
1640    
1641 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1642     boolean isDone();
1643     }
1644    
1645     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1646     return new TrackedRunnable() {
1647     private volatile boolean done = false;
1648     public boolean isDone() { return done; }
1649     public void run() {
1650     try {
1651 dl 1.76 delay(timeoutMillis);
1652 jsr166 1.61 done = true;
1653     } catch (InterruptedException ok) {}
1654     }
1655     };
1656     }
1657    
1658 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1659     public volatile boolean done = false;
1660 dl 1.5 public void run() {
1661     try {
1662 dl 1.76 delay(SHORT_DELAY_MS);
1663 jsr166 1.61 done = true;
1664     } catch (InterruptedException ok) {}
1665     }
1666     }
1667    
1668     public static class TrackedSmallRunnable implements Runnable {
1669     public volatile boolean done = false;
1670     public void run() {
1671     try {
1672 dl 1.76 delay(SMALL_DELAY_MS);
1673 dl 1.5 done = true;
1674 jsr166 1.44 } catch (InterruptedException ok) {}
1675 dl 1.6 }
1676     }
1677    
1678 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1679     public volatile boolean done = false;
1680 dl 1.6 public void run() {
1681     try {
1682 dl 1.76 delay(MEDIUM_DELAY_MS);
1683 dl 1.6 done = true;
1684 jsr166 1.44 } catch (InterruptedException ok) {}
1685 dl 1.6 }
1686     }
1687    
1688 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1689     public volatile boolean done = false;
1690 dl 1.6 public void run() {
1691     try {
1692 dl 1.76 delay(LONG_DELAY_MS);
1693 dl 1.6 done = true;
1694 jsr166 1.44 } catch (InterruptedException ok) {}
1695 dl 1.6 }
1696     }
1697    
1698 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1699     public volatile boolean done = false;
1700 dl 1.6 public void run() {
1701     done = true;
1702 dl 1.5 }
1703     }
1704    
1705 jsr166 1.45 public static class TrackedCallable implements Callable {
1706     public volatile boolean done = false;
1707 dl 1.5 public Object call() {
1708     try {
1709 dl 1.76 delay(SMALL_DELAY_MS);
1710 dl 1.5 done = true;
1711 jsr166 1.44 } catch (InterruptedException ok) {}
1712 dl 1.5 return Boolean.TRUE;
1713     }
1714     }
1715 dl 1.14
1716 jsr166 1.53 /**
1717     * Analog of CheckedRunnable for RecursiveAction
1718     */
1719     public abstract class CheckedRecursiveAction extends RecursiveAction {
1720     protected abstract void realCompute() throws Throwable;
1721    
1722 jsr166 1.108 @Override protected final void compute() {
1723 jsr166 1.53 try {
1724     realCompute();
1725 jsr166 1.128 } catch (Throwable fail) {
1726     threadUnexpectedException(fail);
1727 jsr166 1.53 }
1728     }
1729     }
1730    
1731     /**
1732     * Analog of CheckedCallable for RecursiveTask
1733     */
1734     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1735     protected abstract T realCompute() throws Throwable;
1736    
1737 jsr166 1.108 @Override protected final T compute() {
1738 jsr166 1.53 try {
1739     return realCompute();
1740 jsr166 1.128 } catch (Throwable fail) {
1741     threadUnexpectedException(fail);
1742 jsr166 1.53 return null;
1743     }
1744     }
1745     }
1746 dl 1.5
1747     /**
1748     * For use as RejectedExecutionHandler in constructors
1749     */
1750 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1751 jsr166 1.35 public void rejectedExecution(Runnable r,
1752     ThreadPoolExecutor executor) {}
1753 dl 1.5 }
1754 jsr166 1.27
1755 jsr166 1.60 /**
1756 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1757     * AssertionFailedErrors instead of throwing checked exceptions.
1758 jsr166 1.60 */
1759     public class CheckedBarrier extends CyclicBarrier {
1760     public CheckedBarrier(int parties) { super(parties); }
1761    
1762     public int await() {
1763     try {
1764 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1765 jsr166 1.128 } catch (TimeoutException timedOut) {
1766 jsr166 1.86 throw new AssertionFailedError("timed out");
1767 jsr166 1.128 } catch (Exception fail) {
1768 jsr166 1.60 AssertionFailedError afe =
1769 jsr166 1.128 new AssertionFailedError("Unexpected exception: " + fail);
1770     afe.initCause(fail);
1771 jsr166 1.60 throw afe;
1772     }
1773     }
1774     }
1775    
1776 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1777 jsr166 1.72 try {
1778     assertTrue(q.isEmpty());
1779     assertEquals(0, q.size());
1780     assertNull(q.peek());
1781     assertNull(q.poll());
1782     assertNull(q.poll(0, MILLISECONDS));
1783     assertEquals(q.toString(), "[]");
1784     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1785     assertFalse(q.iterator().hasNext());
1786     try {
1787     q.element();
1788     shouldThrow();
1789     } catch (NoSuchElementException success) {}
1790     try {
1791     q.iterator().next();
1792     shouldThrow();
1793     } catch (NoSuchElementException success) {}
1794     try {
1795     q.remove();
1796     shouldThrow();
1797     } catch (NoSuchElementException success) {}
1798 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1799 jsr166 1.72 }
1800    
1801 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1802     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1803     }
1804    
1805     void assertNotSerialEquals(Object x, Object y) {
1806     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1807     }
1808    
1809     byte[] serialBytes(Object o) {
1810 jsr166 1.79 try {
1811     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1812     ObjectOutputStream oos = new ObjectOutputStream(bos);
1813     oos.writeObject(o);
1814     oos.flush();
1815     oos.close();
1816 jsr166 1.91 return bos.toByteArray();
1817 jsr166 1.128 } catch (Throwable fail) {
1818     threadUnexpectedException(fail);
1819 jsr166 1.91 return new byte[0];
1820     }
1821     }
1822    
1823     @SuppressWarnings("unchecked")
1824     <T> T serialClone(T o) {
1825     try {
1826 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1827 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1828 jsr166 1.87 T clone = (T) ois.readObject();
1829     assertSame(o.getClass(), clone.getClass());
1830     return clone;
1831 jsr166 1.128 } catch (Throwable fail) {
1832     threadUnexpectedException(fail);
1833 jsr166 1.79 return null;
1834     }
1835     }
1836 jsr166 1.106
1837     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1838     Runnable... throwingActions) {
1839     for (Runnable throwingAction : throwingActions) {
1840     boolean threw = false;
1841     try { throwingAction.run(); }
1842     catch (Throwable t) {
1843     threw = true;
1844     if (!expectedExceptionClass.isInstance(t)) {
1845     AssertionFailedError afe =
1846     new AssertionFailedError
1847     ("Expected " + expectedExceptionClass.getName() +
1848     ", got " + t.getClass().getName());
1849     afe.initCause(t);
1850     threadUnexpectedException(afe);
1851     }
1852     }
1853     if (!threw)
1854     shouldThrow(expectedExceptionClass.getName());
1855     }
1856     }
1857 jsr166 1.126
1858     public void assertIteratorExhausted(Iterator<?> it) {
1859     try {
1860     it.next();
1861     shouldThrow();
1862     } catch (NoSuchElementException success) {}
1863     assertFalse(it.hasNext());
1864 jsr166 1.127 }
1865 jsr166 1.191
1866     public <T> Callable<T> callableThrowing(final Exception ex) {
1867     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1868     }
1869    
1870     public Runnable runnableThrowing(final RuntimeException ex) {
1871     return new Runnable() { public void run() { throw ex; }};
1872     }
1873 jsr166 1.193
1874     /** A reusable thread pool to be shared by tests. */
1875     static final ExecutorService cachedThreadPool =
1876     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1877     1000L, MILLISECONDS,
1878     new SynchronousQueue<Runnable>());
1879    
1880 jsr166 1.200 static <T> void shuffle(T[] array) {
1881     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1882     }
1883 dl 1.1 }