ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.205
Committed: Mon Oct 17 17:52:30 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.204: +1 -0 lines
Log Message:
add ArrayListTest (because it was easy enough to do so)

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 jsr166 1.205 ArrayListTest.suite(),
451 jsr166 1.60 AtomicBooleanTest.suite(),
452     AtomicIntegerArrayTest.suite(),
453     AtomicIntegerFieldUpdaterTest.suite(),
454     AtomicIntegerTest.suite(),
455     AtomicLongArrayTest.suite(),
456     AtomicLongFieldUpdaterTest.suite(),
457     AtomicLongTest.suite(),
458     AtomicMarkableReferenceTest.suite(),
459     AtomicReferenceArrayTest.suite(),
460     AtomicReferenceFieldUpdaterTest.suite(),
461     AtomicReferenceTest.suite(),
462     AtomicStampedReferenceTest.suite(),
463     ConcurrentHashMapTest.suite(),
464     ConcurrentLinkedDequeTest.suite(),
465     ConcurrentLinkedQueueTest.suite(),
466     ConcurrentSkipListMapTest.suite(),
467     ConcurrentSkipListSubMapTest.suite(),
468     ConcurrentSkipListSetTest.suite(),
469     ConcurrentSkipListSubSetTest.suite(),
470     CopyOnWriteArrayListTest.suite(),
471     CopyOnWriteArraySetTest.suite(),
472     CountDownLatchTest.suite(),
473 jsr166 1.204 CountedCompleterTest.suite(),
474 jsr166 1.60 CyclicBarrierTest.suite(),
475     DelayQueueTest.suite(),
476     EntryTest.suite(),
477     ExchangerTest.suite(),
478     ExecutorsTest.suite(),
479     ExecutorCompletionServiceTest.suite(),
480     FutureTaskTest.suite(),
481     LinkedBlockingDequeTest.suite(),
482     LinkedBlockingQueueTest.suite(),
483     LinkedListTest.suite(),
484     LockSupportTest.suite(),
485     PriorityBlockingQueueTest.suite(),
486     PriorityQueueTest.suite(),
487     ReentrantLockTest.suite(),
488     ReentrantReadWriteLockTest.suite(),
489     ScheduledExecutorTest.suite(),
490     ScheduledExecutorSubclassTest.suite(),
491     SemaphoreTest.suite(),
492     SynchronousQueueTest.suite(),
493     SystemTest.suite(),
494     ThreadLocalTest.suite(),
495     ThreadPoolExecutorTest.suite(),
496     ThreadPoolExecutorSubclassTest.suite(),
497     ThreadTest.suite(),
498     TimeUnitTest.suite(),
499     TreeMapTest.suite(),
500     TreeSetTest.suite(),
501     TreeSubMapTest.suite(),
502     TreeSubSetTest.suite());
503 jsr166 1.98
504     // Java8+ test classes
505     if (atLeastJava8()) {
506     String[] java8TestClassNames = {
507 dl 1.113 "Atomic8Test",
508 dl 1.104 "CompletableFutureTest",
509 dl 1.105 "ConcurrentHashMap8Test",
510 jsr166 1.204 "CountedCompleter8Test",
511 dl 1.104 "DoubleAccumulatorTest",
512 dl 1.103 "DoubleAdderTest",
513 jsr166 1.102 "ForkJoinPool8Test",
514 dl 1.111 "ForkJoinTask8Test",
515 dl 1.104 "LongAccumulatorTest",
516     "LongAdderTest",
517 jsr166 1.110 "SplittableRandomTest",
518 jsr166 1.98 "StampedLockTest",
519 dl 1.140 "SubmissionPublisherTest",
520 jsr166 1.112 "ThreadLocalRandom8Test",
521 jsr166 1.190 "TimeUnit8Test",
522 jsr166 1.98 };
523     addNamedTestClasses(suite, java8TestClassNames);
524 jsr166 1.97 }
525 jsr166 1.98
526 jsr166 1.115 // Java9+ test classes
527     if (atLeastJava9()) {
528     String[] java9TestClassNames = {
529 jsr166 1.196 "AtomicBoolean9Test",
530     "AtomicInteger9Test",
531     "AtomicIntegerArray9Test",
532     "AtomicLong9Test",
533     "AtomicLongArray9Test",
534     "AtomicReference9Test",
535     "AtomicReferenceArray9Test",
536 jsr166 1.192 "ExecutorCompletionService9Test",
537 jsr166 1.115 };
538     addNamedTestClasses(suite, java9TestClassNames);
539     }
540    
541 jsr166 1.97 return suite;
542 dl 1.6 }
543    
544 jsr166 1.134 /** Returns list of junit-style test method names in given class. */
545     public static ArrayList<String> testMethodNames(Class<?> testClass) {
546     Method[] methods = testClass.getDeclaredMethods();
547     ArrayList<String> names = new ArrayList<String>(methods.length);
548     for (Method method : methods) {
549     if (method.getName().startsWith("test")
550     && Modifier.isPublic(method.getModifiers())
551     // method.getParameterCount() requires jdk8+
552     && method.getParameterTypes().length == 0) {
553     names.add(method.getName());
554     }
555     }
556     return names;
557     }
558    
559     /**
560     * Returns junit-style testSuite for the given test class, but
561     * parameterized by passing extra data to each test.
562     */
563     public static <ExtraData> Test parameterizedTestSuite
564     (Class<? extends JSR166TestCase> testClass,
565     Class<ExtraData> dataClass,
566     ExtraData data) {
567     try {
568     TestSuite suite = new TestSuite();
569     Constructor c =
570     testClass.getDeclaredConstructor(dataClass, String.class);
571     for (String methodName : testMethodNames(testClass))
572     suite.addTest((Test) c.newInstance(data, methodName));
573     return suite;
574     } catch (Exception e) {
575     throw new Error(e);
576     }
577     }
578    
579     /**
580     * Returns junit-style testSuite for the jdk8 extension of the
581     * given test class, but parameterized by passing extra data to
582     * each test. Uses reflection to allow compilation in jdk7.
583     */
584     public static <ExtraData> Test jdk8ParameterizedTestSuite
585     (Class<? extends JSR166TestCase> testClass,
586     Class<ExtraData> dataClass,
587     ExtraData data) {
588     if (atLeastJava8()) {
589     String name = testClass.getName();
590     String name8 = name.replaceAll("Test$", "8Test");
591     if (name.equals(name8)) throw new Error(name);
592     try {
593     return (Test)
594     Class.forName(name8)
595     .getMethod("testSuite", new Class[] { dataClass })
596     .invoke(null, data);
597     } catch (Exception e) {
598     throw new Error(e);
599     }
600     } else {
601     return new TestSuite();
602     }
603     }
604    
605 jsr166 1.109 // Delays for timing-dependent tests, in milliseconds.
606 dl 1.1
607 dl 1.2 public static long SHORT_DELAY_MS;
608     public static long SMALL_DELAY_MS;
609     public static long MEDIUM_DELAY_MS;
610     public static long LONG_DELAY_MS;
611    
612     /**
613 jsr166 1.181 * Returns the shortest timed delay. This can be scaled up for
614 jsr166 1.185 * slow machines using the jsr166.delay.factor system property,
615 jsr166 1.187 * or via jtreg's -timeoutFactor: flag.
616 jsr166 1.185 * http://openjdk.java.net/jtreg/command-help.html
617 jsr166 1.27 */
618 dl 1.2 protected long getShortDelay() {
619 jsr166 1.189 return (long) (50 * delayFactor);
620 dl 1.2 }
621    
622     /**
623 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
624 dl 1.2 */
625 jsr166 1.43 protected void setDelays() {
626 dl 1.2 SHORT_DELAY_MS = getShortDelay();
627 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
628 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
629 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
630 dl 1.2 }
631    
632 dl 1.1 /**
633 jsr166 1.81 * Returns a timeout in milliseconds to be used in tests that
634     * verify that operations block or time out.
635     */
636     long timeoutMillis() {
637     return SHORT_DELAY_MS / 4;
638     }
639    
640     /**
641 jsr166 1.135 * Returns a new Date instance representing a time at least
642     * delayMillis milliseconds in the future.
643 jsr166 1.81 */
644     Date delayedDate(long delayMillis) {
645 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
646     return new Date(System.currentTimeMillis() + delayMillis + 1);
647 jsr166 1.81 }
648    
649     /**
650 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
651 dl 1.1 */
652 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
653     = new AtomicReference<Throwable>(null);
654 dl 1.1
655     /**
656 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
657     * harness thread, triggering a test case failure. Only the first
658     * failure is recorded; subsequent calls to this method from within
659     * the same test have no effect.
660 dl 1.1 */
661 jsr166 1.53 public void threadRecordFailure(Throwable t) {
662 jsr166 1.158 System.err.println(t);
663 jsr166 1.156 dumpTestThreads();
664 jsr166 1.53 threadFailure.compareAndSet(null, t);
665     }
666    
667 jsr166 1.27 public void setUp() {
668 dl 1.2 setDelays();
669 dl 1.1 }
670    
671 jsr166 1.146 void tearDownFail(String format, Object... args) {
672     String msg = toString() + ": " + String.format(format, args);
673     System.err.println(msg);
674 jsr166 1.156 dumpTestThreads();
675 jsr166 1.146 throw new AssertionFailedError(msg);
676     }
677    
678 dl 1.1 /**
679 jsr166 1.85 * Extra checks that get done for all test cases.
680     *
681 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
682     * by rethrowing, in the test harness thread, any exception recorded
683     * earlier by threadRecordFailure.
684 jsr166 1.85 *
685     * Triggers test case failure if interrupt status is set in the main thread.
686 jsr166 1.53 */
687     public void tearDown() throws Exception {
688 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
689 jsr166 1.53 if (t != null) {
690     if (t instanceof Error)
691     throw (Error) t;
692     else if (t instanceof RuntimeException)
693     throw (RuntimeException) t;
694     else if (t instanceof Exception)
695     throw (Exception) t;
696 jsr166 1.57 else {
697     AssertionFailedError afe =
698     new AssertionFailedError(t.toString());
699     afe.initCause(t);
700     throw afe;
701     }
702 jsr166 1.53 }
703 jsr166 1.85
704     if (Thread.interrupted())
705 jsr166 1.146 tearDownFail("interrupt status set in main thread");
706 jsr166 1.100
707     checkForkJoinPoolThreadLeaks();
708 dl 1.1 }
709    
710 dl 1.5 /**
711 jsr166 1.164 * Finds missing PoolCleaners
712 jsr166 1.100 */
713     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
714 jsr166 1.146 Thread[] survivors = new Thread[7];
715 jsr166 1.100 int count = Thread.enumerate(survivors);
716     for (int i = 0; i < count; i++) {
717     Thread thread = survivors[i];
718     String name = thread.getName();
719     if (name.startsWith("ForkJoinPool-")) {
720     // give thread some time to terminate
721     thread.join(LONG_DELAY_MS);
722 jsr166 1.146 if (thread.isAlive())
723     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
724     thread);
725 jsr166 1.100 }
726     }
727 jsr166 1.146
728     if (!ForkJoinPool.commonPool()
729     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
730     tearDownFail("ForkJoin common pool thread stuck");
731 jsr166 1.100 }
732 jsr166 1.101
733 jsr166 1.100 /**
734 jsr166 1.53 * Just like fail(reason), but additionally recording (using
735 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
736     * the current testcase will fail.
737 jsr166 1.27 */
738 dl 1.1 public void threadFail(String reason) {
739 jsr166 1.53 try {
740     fail(reason);
741 jsr166 1.57 } catch (AssertionFailedError t) {
742 jsr166 1.53 threadRecordFailure(t);
743 jsr166 1.152 throw t;
744 jsr166 1.53 }
745 dl 1.1 }
746    
747 dl 1.5 /**
748 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
749 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
750     * the current testcase will fail.
751 jsr166 1.27 */
752 dl 1.1 public void threadAssertTrue(boolean b) {
753 jsr166 1.53 try {
754 dl 1.1 assertTrue(b);
755 jsr166 1.57 } catch (AssertionFailedError t) {
756 jsr166 1.53 threadRecordFailure(t);
757     throw t;
758 dl 1.1 }
759     }
760 dl 1.5
761     /**
762 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
763 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
764     * the current testcase will fail.
765 jsr166 1.27 */
766 dl 1.1 public void threadAssertFalse(boolean b) {
767 jsr166 1.53 try {
768 dl 1.1 assertFalse(b);
769 jsr166 1.57 } catch (AssertionFailedError t) {
770 jsr166 1.53 threadRecordFailure(t);
771     throw t;
772 dl 1.1 }
773     }
774 dl 1.5
775     /**
776 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
777 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
778     * the current testcase will fail.
779 jsr166 1.27 */
780 dl 1.1 public void threadAssertNull(Object x) {
781 jsr166 1.53 try {
782 dl 1.1 assertNull(x);
783 jsr166 1.57 } catch (AssertionFailedError t) {
784 jsr166 1.53 threadRecordFailure(t);
785     throw t;
786 dl 1.1 }
787     }
788 dl 1.5
789     /**
790 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
791 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
792     * the current testcase will fail.
793 jsr166 1.27 */
794 dl 1.1 public void threadAssertEquals(long x, long y) {
795 jsr166 1.53 try {
796 dl 1.1 assertEquals(x, y);
797 jsr166 1.57 } catch (AssertionFailedError t) {
798 jsr166 1.53 threadRecordFailure(t);
799     throw t;
800 dl 1.1 }
801     }
802 dl 1.5
803     /**
804 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
805 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
806     * the current testcase will fail.
807 jsr166 1.27 */
808 dl 1.1 public void threadAssertEquals(Object x, Object y) {
809 jsr166 1.53 try {
810 dl 1.1 assertEquals(x, y);
811 jsr166 1.129 } catch (AssertionFailedError fail) {
812     threadRecordFailure(fail);
813     throw fail;
814     } catch (Throwable fail) {
815     threadUnexpectedException(fail);
816 dl 1.1 }
817     }
818    
819 dl 1.5 /**
820 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
821 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
822     * the current testcase will fail.
823 jsr166 1.52 */
824     public void threadAssertSame(Object x, Object y) {
825 jsr166 1.53 try {
826 jsr166 1.52 assertSame(x, y);
827 jsr166 1.129 } catch (AssertionFailedError fail) {
828     threadRecordFailure(fail);
829     throw fail;
830 jsr166 1.52 }
831     }
832    
833     /**
834 jsr166 1.53 * Calls threadFail with message "should throw exception".
835 jsr166 1.33 */
836 dl 1.3 public void threadShouldThrow() {
837 jsr166 1.53 threadFail("should throw exception");
838 dl 1.3 }
839    
840 dl 1.5 /**
841 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
842 jsr166 1.40 */
843     public void threadShouldThrow(String exceptionName) {
844 jsr166 1.53 threadFail("should throw " + exceptionName);
845 dl 1.3 }
846    
847 dl 1.31 /**
848 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
849     * then rethrows the exception, wrapping it in an
850     * AssertionFailedError if necessary.
851 dl 1.31 */
852 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
853     threadRecordFailure(t);
854     t.printStackTrace();
855     if (t instanceof RuntimeException)
856     throw (RuntimeException) t;
857     else if (t instanceof Error)
858     throw (Error) t;
859     else {
860 jsr166 1.57 AssertionFailedError afe =
861     new AssertionFailedError("unexpected exception: " + t);
862 jsr166 1.82 afe.initCause(t);
863 jsr166 1.57 throw afe;
864 jsr166 1.55 }
865 dl 1.31 }
866 dl 1.3
867 dl 1.1 /**
868 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
869 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
870 jsr166 1.163 * until time elapses. Ensures that the given time, as measured
871     * by System.nanoTime(), has elapsed.
872 dl 1.76 */
873 jsr166 1.81 static void delay(long millis) throws InterruptedException {
874 jsr166 1.163 long nanos = millis * (1000 * 1000);
875     final long wakeupTime = System.nanoTime() + nanos;
876     do {
877 jsr166 1.80 if (millis > 0L)
878     Thread.sleep(millis);
879 dl 1.76 else // too short to sleep
880     Thread.yield();
881 jsr166 1.163 nanos = wakeupTime - System.nanoTime();
882     millis = nanos / (1000 * 1000);
883     } while (nanos >= 0L);
884 dl 1.76 }
885    
886     /**
887 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
888     */
889 jsr166 1.160 class PoolCleaner implements AutoCloseable {
890     private final ExecutorService pool;
891     public PoolCleaner(ExecutorService pool) { this.pool = pool; }
892 jsr166 1.149 public void close() { joinPool(pool); }
893     }
894    
895 jsr166 1.166 /**
896     * An extension of PoolCleaner that has an action to release the pool.
897     */
898     class PoolCleanerWithReleaser extends PoolCleaner {
899     private final Runnable releaser;
900     public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
901     super(pool);
902     this.releaser = releaser;
903     }
904     public void close() {
905     try {
906     releaser.run();
907     } finally {
908     super.close();
909     }
910     }
911     }
912    
913 jsr166 1.160 PoolCleaner cleaner(ExecutorService pool) {
914     return new PoolCleaner(pool);
915 jsr166 1.159 }
916    
917 jsr166 1.166 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
918     return new PoolCleanerWithReleaser(pool, releaser);
919     }
920    
921     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
922     return new PoolCleanerWithReleaser(pool, releaser(latch));
923     }
924    
925     Runnable releaser(final CountDownLatch latch) {
926     return new Runnable() { public void run() {
927     do { latch.countDown(); }
928     while (latch.getCount() > 0);
929     }};
930     }
931    
932 jsr166 1.185 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
933     return new PoolCleanerWithReleaser(pool, releaser(flag));
934     }
935    
936     Runnable releaser(final AtomicBoolean flag) {
937     return new Runnable() { public void run() { flag.set(true); }};
938     }
939    
940 jsr166 1.149 /**
941 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
942 dl 1.1 */
943 jsr166 1.158 void joinPool(ExecutorService pool) {
944 dl 1.1 try {
945 jsr166 1.139 pool.shutdown();
946 jsr166 1.158 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
947     try {
948     threadFail("ExecutorService " + pool +
949     " did not terminate in a timely manner");
950     } finally {
951     // last resort, for the benefit of subsequent tests
952     pool.shutdownNow();
953 jsr166 1.167 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
954 jsr166 1.158 }
955     }
956 jsr166 1.33 } catch (SecurityException ok) {
957 dl 1.22 // Allowed in case test doesn't have privs
958 jsr166 1.128 } catch (InterruptedException fail) {
959 jsr166 1.158 threadFail("Unexpected InterruptedException");
960 dl 1.1 }
961     }
962    
963 jsr166 1.197 /**
964     * Like Runnable, but with the freedom to throw anything.
965     * junit folks had the same idea:
966     * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
967     */
968 jsr166 1.141 interface Action { public void run() throws Throwable; }
969 jsr166 1.139
970     /**
971 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
972 jsr166 1.139 * Useful for running multiple variants of tests that are
973     * necessarily individually slow because they must block.
974     */
975 jsr166 1.141 void testInParallel(Action ... actions) {
976 jsr166 1.160 ExecutorService pool = Executors.newCachedThreadPool();
977     try (PoolCleaner cleaner = cleaner(pool)) {
978 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
979     for (final Action action : actions)
980 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
981 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
982 jsr166 1.139 for (Future<?> future : futures)
983     try {
984     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
985     } catch (ExecutionException ex) {
986     threadUnexpectedException(ex.getCause());
987     } catch (Exception ex) {
988     threadUnexpectedException(ex);
989     }
990     }
991     }
992    
993 jsr166 1.78 /**
994 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
995 jsr166 1.150 * Uninteresting threads are filtered out.
996 jsr166 1.95 */
997 jsr166 1.156 static void dumpTestThreads() {
998 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
999     if (sm != null) {
1000     try {
1001     System.setSecurityManager(null);
1002     } catch (SecurityException giveUp) {
1003     return;
1004     }
1005     }
1006    
1007 jsr166 1.150 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1008     System.err.println("------ stacktrace dump start ------");
1009     for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1010 jsr166 1.203 final String name = info.getThreadName();
1011     String lockName;
1012 jsr166 1.150 if ("Signal Dispatcher".equals(name))
1013     continue;
1014     if ("Reference Handler".equals(name)
1015 jsr166 1.203 && (lockName = info.getLockName()) != null
1016     && lockName.startsWith("java.lang.ref.Reference$Lock"))
1017 jsr166 1.150 continue;
1018     if ("Finalizer".equals(name)
1019 jsr166 1.203 && (lockName = info.getLockName()) != null
1020     && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1021 jsr166 1.150 continue;
1022 jsr166 1.156 if ("checkForWedgedTest".equals(name))
1023     continue;
1024 jsr166 1.96 System.err.print(info);
1025 jsr166 1.150 }
1026     System.err.println("------ stacktrace dump end ------");
1027 jsr166 1.195
1028     if (sm != null) System.setSecurityManager(sm);
1029 jsr166 1.95 }
1030    
1031     /**
1032 jsr166 1.81 * Checks that thread does not terminate within the default
1033     * millisecond delay of {@code timeoutMillis()}.
1034     */
1035     void assertThreadStaysAlive(Thread thread) {
1036     assertThreadStaysAlive(thread, timeoutMillis());
1037     }
1038    
1039     /**
1040 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
1041 jsr166 1.78 */
1042 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
1043 jsr166 1.78 try {
1044 jsr166 1.80 // No need to optimize the failing case via Thread.join.
1045     delay(millis);
1046 jsr166 1.78 assertTrue(thread.isAlive());
1047 jsr166 1.128 } catch (InterruptedException fail) {
1048 jsr166 1.158 threadFail("Unexpected InterruptedException");
1049 jsr166 1.78 }
1050     }
1051 dl 1.5
1052     /**
1053 jsr166 1.90 * Checks that the threads do not terminate within the default
1054     * millisecond delay of {@code timeoutMillis()}.
1055     */
1056     void assertThreadsStayAlive(Thread... threads) {
1057     assertThreadsStayAlive(timeoutMillis(), threads);
1058     }
1059    
1060     /**
1061     * Checks that the threads do not terminate within the given millisecond delay.
1062     */
1063     void assertThreadsStayAlive(long millis, Thread... threads) {
1064     try {
1065     // No need to optimize the failing case via Thread.join.
1066     delay(millis);
1067     for (Thread thread : threads)
1068     assertTrue(thread.isAlive());
1069 jsr166 1.128 } catch (InterruptedException fail) {
1070 jsr166 1.158 threadFail("Unexpected InterruptedException");
1071 jsr166 1.90 }
1072     }
1073    
1074     /**
1075 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1076     * {@code timeoutMillis()}.
1077     */
1078     void assertFutureTimesOut(Future future) {
1079     assertFutureTimesOut(future, timeoutMillis());
1080     }
1081    
1082     /**
1083     * Checks that future.get times out, with the given millisecond timeout.
1084     */
1085     void assertFutureTimesOut(Future future, long timeoutMillis) {
1086     long startTime = System.nanoTime();
1087     try {
1088     future.get(timeoutMillis, MILLISECONDS);
1089     shouldThrow();
1090     } catch (TimeoutException success) {
1091 jsr166 1.128 } catch (Exception fail) {
1092     threadUnexpectedException(fail);
1093 jsr166 1.83 } finally { future.cancel(true); }
1094     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1095     }
1096    
1097     /**
1098 jsr166 1.53 * Fails with message "should throw exception".
1099 jsr166 1.27 */
1100 dl 1.3 public void shouldThrow() {
1101     fail("Should throw exception");
1102     }
1103    
1104 dl 1.5 /**
1105 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1106 jsr166 1.40 */
1107     public void shouldThrow(String exceptionName) {
1108     fail("Should throw " + exceptionName);
1109     }
1110    
1111     /**
1112 dl 1.1 * The number of elements to place in collections, arrays, etc.
1113     */
1114 jsr166 1.45 public static final int SIZE = 20;
1115 dl 1.1
1116     // Some convenient Integer constants
1117    
1118 jsr166 1.47 public static final Integer zero = new Integer(0);
1119     public static final Integer one = new Integer(1);
1120     public static final Integer two = new Integer(2);
1121     public static final Integer three = new Integer(3);
1122 jsr166 1.45 public static final Integer four = new Integer(4);
1123     public static final Integer five = new Integer(5);
1124 jsr166 1.47 public static final Integer six = new Integer(6);
1125 jsr166 1.45 public static final Integer seven = new Integer(7);
1126     public static final Integer eight = new Integer(8);
1127 jsr166 1.47 public static final Integer nine = new Integer(9);
1128 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1129     public static final Integer m2 = new Integer(-2);
1130     public static final Integer m3 = new Integer(-3);
1131 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1132     public static final Integer m5 = new Integer(-5);
1133     public static final Integer m6 = new Integer(-6);
1134 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1135 dl 1.7
1136     /**
1137 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1138     * the specified permissions. If there is no current security
1139     * manager, the runnable is run twice, both with and without a
1140     * security manager. We require that any security manager permit
1141     * getPolicy/setPolicy.
1142     */
1143     public void runWithPermissions(Runnable r, Permission... permissions) {
1144     SecurityManager sm = System.getSecurityManager();
1145     if (sm == null) {
1146     r.run();
1147 jsr166 1.93 }
1148     runWithSecurityManagerWithPermissions(r, permissions);
1149     }
1150    
1151     /**
1152     * Runs Runnable r with a security policy that permits precisely
1153     * the specified permissions. If there is no current security
1154     * manager, a temporary one is set for the duration of the
1155     * Runnable. We require that any security manager permit
1156     * getPolicy/setPolicy.
1157     */
1158     public void runWithSecurityManagerWithPermissions(Runnable r,
1159     Permission... permissions) {
1160     SecurityManager sm = System.getSecurityManager();
1161     if (sm == null) {
1162 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1163     try {
1164     Policy.setPolicy(permissivePolicy());
1165     System.setSecurityManager(new SecurityManager());
1166 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1167 jsr166 1.49 } finally {
1168     System.setSecurityManager(null);
1169     Policy.setPolicy(savedPolicy);
1170     }
1171     } else {
1172     Policy savedPolicy = Policy.getPolicy();
1173     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1174     Policy.setPolicy(policy);
1175    
1176     try {
1177     r.run();
1178     } finally {
1179     policy.addPermission(new SecurityPermission("setPolicy"));
1180     Policy.setPolicy(savedPolicy);
1181     }
1182     }
1183     }
1184    
1185     /**
1186     * Runs a runnable without any permissions.
1187     */
1188     public void runWithoutPermissions(Runnable r) {
1189     runWithPermissions(r);
1190     }
1191    
1192     /**
1193 dl 1.7 * A security policy where new permissions can be dynamically added
1194     * or all cleared.
1195     */
1196 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1197 dl 1.7 Permissions perms = new Permissions();
1198 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1199     for (Permission permission : permissions)
1200     perms.add(permission);
1201     }
1202 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1203     void clearPermissions() { perms = new Permissions(); }
1204 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1205     return perms;
1206     }
1207     public PermissionCollection getPermissions(ProtectionDomain pd) {
1208     return perms;
1209     }
1210     public boolean implies(ProtectionDomain pd, Permission p) {
1211     return perms.implies(p);
1212     }
1213     public void refresh() {}
1214 jsr166 1.93 public String toString() {
1215     List<Permission> ps = new ArrayList<Permission>();
1216     for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1217     ps.add(e.nextElement());
1218     return "AdjustablePolicy with permissions " + ps;
1219     }
1220 dl 1.7 }
1221 dl 1.1
1222 jsr166 1.38 /**
1223 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1224     */
1225     public static Policy permissivePolicy() {
1226     return new AdjustablePolicy
1227     // Permissions j.u.c. needs directly
1228     (new RuntimePermission("modifyThread"),
1229     new RuntimePermission("getClassLoader"),
1230     new RuntimePermission("setContextClassLoader"),
1231     // Permissions needed to change permissions!
1232     new SecurityPermission("getPolicy"),
1233     new SecurityPermission("setPolicy"),
1234     new RuntimePermission("setSecurityManager"),
1235     // Permissions needed by the junit test harness
1236     new RuntimePermission("accessDeclaredMembers"),
1237     new PropertyPermission("*", "read"),
1238     new java.io.FilePermission("<<ALL FILES>>", "read"));
1239     }
1240    
1241     /**
1242 jsr166 1.60 * Sleeps until the given time has elapsed.
1243     * Throws AssertionFailedError if interrupted.
1244     */
1245 jsr166 1.201 static void sleep(long millis) {
1246 jsr166 1.60 try {
1247 dl 1.76 delay(millis);
1248 jsr166 1.128 } catch (InterruptedException fail) {
1249 jsr166 1.60 AssertionFailedError afe =
1250     new AssertionFailedError("Unexpected InterruptedException");
1251 jsr166 1.128 afe.initCause(fail);
1252 jsr166 1.60 throw afe;
1253     }
1254     }
1255    
1256     /**
1257 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1258 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1259     */
1260     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1261 jsr166 1.199 long startTime = 0L;
1262 jsr166 1.65 for (;;) {
1263     Thread.State s = thread.getState();
1264     if (s == Thread.State.BLOCKED ||
1265     s == Thread.State.WAITING ||
1266 jsr166 1.67 s == Thread.State.TIMED_WAITING)
1267 jsr166 1.65 return;
1268 jsr166 1.67 else if (s == Thread.State.TERMINATED)
1269     fail("Unexpected thread termination");
1270 jsr166 1.199 else if (startTime == 0L)
1271     startTime = System.nanoTime();
1272 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1273 jsr166 1.67 threadAssertTrue(thread.isAlive());
1274     return;
1275     }
1276 jsr166 1.65 Thread.yield();
1277     }
1278     }
1279    
1280     /**
1281 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1282     * state: BLOCKED, WAITING, or TIMED_WAITING.
1283     */
1284     void waitForThreadToEnterWaitState(Thread thread) {
1285     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1286     }
1287    
1288     /**
1289 jsr166 1.66 * Returns the number of milliseconds since time given by
1290     * startNanoTime, which must have been previously returned from a
1291 jsr166 1.124 * call to {@link System#nanoTime()}.
1292 jsr166 1.66 */
1293 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1294 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1295     }
1296 jsr166 1.68
1297 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1298     // long startTime = System.nanoTime();
1299     // try {
1300     // r.run();
1301     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1302     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1303     // throw new AssertionFailedError("did not return promptly");
1304     // }
1305    
1306     // void assertTerminatesPromptly(Runnable r) {
1307     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1308     // }
1309    
1310     /**
1311     * Checks that timed f.get() returns the expected value, and does not
1312     * wait for the timeout to elapse before returning.
1313     */
1314     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1315     long startTime = System.nanoTime();
1316     try {
1317     assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1318     } catch (Throwable fail) { threadUnexpectedException(fail); }
1319     if (millisElapsedSince(startTime) > timeoutMillis/2)
1320     throw new AssertionFailedError("timed get did not return promptly");
1321     }
1322    
1323     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1324     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1325     }
1326    
1327 jsr166 1.66 /**
1328 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1329 jsr166 1.38 */
1330     Thread newStartedThread(Runnable runnable) {
1331     Thread t = new Thread(runnable);
1332 jsr166 1.58 t.setDaemon(true);
1333 jsr166 1.38 t.start();
1334     return t;
1335     }
1336 dl 1.1
1337 jsr166 1.59 /**
1338     * Waits for the specified time (in milliseconds) for the thread
1339     * to terminate (using {@link Thread#join(long)}), else interrupts
1340     * the thread (in the hope that it may terminate later) and fails.
1341     */
1342     void awaitTermination(Thread t, long timeoutMillis) {
1343     try {
1344     t.join(timeoutMillis);
1345 jsr166 1.128 } catch (InterruptedException fail) {
1346     threadUnexpectedException(fail);
1347 jsr166 1.59 } finally {
1348 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
1349 jsr166 1.59 t.interrupt();
1350 jsr166 1.177 threadFail("timed out waiting for thread to terminate");
1351 jsr166 1.59 }
1352     }
1353     }
1354    
1355 jsr166 1.75 /**
1356     * Waits for LONG_DELAY_MS milliseconds for the thread to
1357     * terminate (using {@link Thread#join(long)}), else interrupts
1358     * the thread (in the hope that it may terminate later) and fails.
1359     */
1360     void awaitTermination(Thread t) {
1361     awaitTermination(t, LONG_DELAY_MS);
1362     }
1363    
1364 dl 1.1 // Some convenient Runnable classes
1365    
1366 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1367     protected abstract void realRun() throws Throwable;
1368 jsr166 1.35
1369     public final void run() {
1370     try {
1371     realRun();
1372 jsr166 1.128 } catch (Throwable fail) {
1373     threadUnexpectedException(fail);
1374 jsr166 1.35 }
1375     }
1376     }
1377    
1378 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
1379     protected abstract void realRun() throws Throwable;
1380 jsr166 1.40
1381     final Class<?> exceptionClass;
1382    
1383     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1384     this.exceptionClass = exceptionClass;
1385     }
1386    
1387     public final void run() {
1388     try {
1389     realRun();
1390     threadShouldThrow(exceptionClass.getSimpleName());
1391     } catch (Throwable t) {
1392     if (! exceptionClass.isInstance(t))
1393     threadUnexpectedException(t);
1394     }
1395     }
1396     }
1397    
1398 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1399     protected abstract void realRun() throws Throwable;
1400 jsr166 1.40
1401     final Class<?> exceptionClass;
1402    
1403     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1404     this.exceptionClass = exceptionClass;
1405     }
1406    
1407     public final void run() {
1408     try {
1409     realRun();
1410     threadShouldThrow(exceptionClass.getSimpleName());
1411     } catch (Throwable t) {
1412     if (! exceptionClass.isInstance(t))
1413     threadUnexpectedException(t);
1414     }
1415     }
1416     }
1417    
1418 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1419     protected abstract void realRun() throws Throwable;
1420 jsr166 1.35
1421     public final void run() {
1422     try {
1423     realRun();
1424 jsr166 1.40 threadShouldThrow("InterruptedException");
1425 jsr166 1.35 } catch (InterruptedException success) {
1426 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1427 jsr166 1.128 } catch (Throwable fail) {
1428     threadUnexpectedException(fail);
1429 jsr166 1.35 }
1430     }
1431     }
1432    
1433 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1434     protected abstract T realCall() throws Throwable;
1435 jsr166 1.35
1436     public final T call() {
1437     try {
1438     return realCall();
1439 jsr166 1.128 } catch (Throwable fail) {
1440     threadUnexpectedException(fail);
1441 jsr166 1.53 return null;
1442 jsr166 1.35 }
1443 jsr166 1.40 }
1444     }
1445    
1446 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
1447     implements Callable<T> {
1448 jsr166 1.45 protected abstract T realCall() throws Throwable;
1449 jsr166 1.40
1450     public final T call() {
1451     try {
1452     T result = realCall();
1453     threadShouldThrow("InterruptedException");
1454     return result;
1455     } catch (InterruptedException success) {
1456 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1457 jsr166 1.128 } catch (Throwable fail) {
1458     threadUnexpectedException(fail);
1459 jsr166 1.40 }
1460     return null;
1461 jsr166 1.35 }
1462     }
1463    
1464 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1465 dl 1.1 public void run() {}
1466     }
1467    
1468 jsr166 1.45 public static class NoOpCallable implements Callable {
1469 dl 1.1 public Object call() { return Boolean.TRUE; }
1470 dl 1.10 }
1471    
1472 jsr166 1.45 public static final String TEST_STRING = "a test string";
1473 dl 1.10
1474 jsr166 1.45 public static class StringTask implements Callable<String> {
1475 jsr166 1.144 final String value;
1476     public StringTask() { this(TEST_STRING); }
1477     public StringTask(String value) { this.value = value; }
1478     public String call() { return value; }
1479 dl 1.10 }
1480    
1481 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1482     return new CheckedCallable<String>() {
1483 jsr166 1.64 protected String realCall() {
1484 jsr166 1.48 try {
1485     latch.await();
1486     } catch (InterruptedException quittingTime) {}
1487     return TEST_STRING;
1488     }};
1489     }
1490    
1491 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1492     return new CheckedRunnable() {
1493     public void realRun() throws InterruptedException {
1494     latch.countDown();
1495     }};
1496     }
1497    
1498 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1499 jsr166 1.162 static final int NEW = 0;
1500     static final int RUNNING = 1;
1501     static final int DONE = 2;
1502 jsr166 1.161 final CountDownLatch latch;
1503     int state = NEW;
1504     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1505     public void realRun() throws InterruptedException {
1506     state = 1;
1507     await(latch);
1508     state = 2;
1509     }
1510     }
1511 jsr166 1.162
1512 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1513     return new LatchAwaiter(latch);
1514 jsr166 1.73 }
1515    
1516 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1517 jsr166 1.79 try {
1518 jsr166 1.188 if (!latch.await(timeoutMillis, MILLISECONDS))
1519 jsr166 1.176 fail("timed out waiting for CountDownLatch for "
1520 jsr166 1.188 + (timeoutMillis/1000) + " sec");
1521 jsr166 1.128 } catch (Throwable fail) {
1522     threadUnexpectedException(fail);
1523 jsr166 1.79 }
1524     }
1525    
1526 jsr166 1.188 public void await(CountDownLatch latch) {
1527     await(latch, LONG_DELAY_MS);
1528     }
1529    
1530 jsr166 1.89 public void await(Semaphore semaphore) {
1531     try {
1532 jsr166 1.176 if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
1533     fail("timed out waiting for Semaphore for "
1534     + (LONG_DELAY_MS/1000) + " sec");
1535 jsr166 1.128 } catch (Throwable fail) {
1536     threadUnexpectedException(fail);
1537 jsr166 1.89 }
1538     }
1539    
1540 jsr166 1.81 // /**
1541     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1542     // */
1543     // public void await(AtomicBoolean flag) {
1544     // await(flag, LONG_DELAY_MS);
1545     // }
1546    
1547     // /**
1548     // * Spin-waits up to the specified timeout until flag becomes true.
1549     // */
1550     // public void await(AtomicBoolean flag, long timeoutMillis) {
1551     // long startTime = System.nanoTime();
1552     // while (!flag.get()) {
1553     // if (millisElapsedSince(startTime) > timeoutMillis)
1554     // throw new AssertionFailedError("timed out");
1555     // Thread.yield();
1556     // }
1557     // }
1558    
1559 jsr166 1.45 public static class NPETask implements Callable<String> {
1560 dl 1.10 public String call() { throw new NullPointerException(); }
1561     }
1562    
1563 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
1564 dl 1.10 public Integer call() { return one; }
1565 dl 1.1 }
1566    
1567 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1568     protected void realRun() throws Throwable {
1569 dl 1.76 delay(SHORT_DELAY_MS);
1570 dl 1.1 }
1571     }
1572    
1573 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1574     protected void realRun() throws InterruptedException {
1575 dl 1.76 delay(SHORT_DELAY_MS);
1576 dl 1.1 }
1577     }
1578    
1579 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1580     protected void realRun() throws Throwable {
1581 dl 1.76 delay(SMALL_DELAY_MS);
1582 dl 1.1 }
1583     }
1584    
1585 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1586     protected void realRun() {
1587 dl 1.6 try {
1588 dl 1.76 delay(SMALL_DELAY_MS);
1589 jsr166 1.44 } catch (InterruptedException ok) {}
1590 dl 1.6 }
1591     }
1592    
1593 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1594     protected Object realCall() throws InterruptedException {
1595 dl 1.76 delay(SMALL_DELAY_MS);
1596 dl 1.1 return Boolean.TRUE;
1597     }
1598     }
1599    
1600 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1601     protected void realRun() throws Throwable {
1602 dl 1.76 delay(MEDIUM_DELAY_MS);
1603 dl 1.1 }
1604     }
1605    
1606 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1607     protected void realRun() throws InterruptedException {
1608 dl 1.76 delay(MEDIUM_DELAY_MS);
1609 dl 1.1 }
1610     }
1611    
1612 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1613     return new CheckedRunnable() {
1614     protected void realRun() {
1615     try {
1616 dl 1.76 delay(timeoutMillis);
1617 jsr166 1.63 } catch (InterruptedException ok) {}
1618     }};
1619     }
1620    
1621 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1622     protected void realRun() {
1623 dl 1.1 try {
1624 dl 1.76 delay(MEDIUM_DELAY_MS);
1625 jsr166 1.44 } catch (InterruptedException ok) {}
1626 dl 1.1 }
1627     }
1628 dl 1.5
1629 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1630     protected void realRun() {
1631 dl 1.12 try {
1632 dl 1.76 delay(LONG_DELAY_MS);
1633 jsr166 1.44 } catch (InterruptedException ok) {}
1634 dl 1.12 }
1635     }
1636    
1637 dl 1.5 /**
1638     * For use as ThreadFactory in constructors
1639     */
1640 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1641 jsr166 1.33 public Thread newThread(Runnable r) {
1642 dl 1.5 return new Thread(r);
1643 jsr166 1.27 }
1644 dl 1.5 }
1645    
1646 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1647     boolean isDone();
1648     }
1649    
1650     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1651     return new TrackedRunnable() {
1652     private volatile boolean done = false;
1653     public boolean isDone() { return done; }
1654     public void run() {
1655     try {
1656 dl 1.76 delay(timeoutMillis);
1657 jsr166 1.61 done = true;
1658     } catch (InterruptedException ok) {}
1659     }
1660     };
1661     }
1662    
1663 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1664     public volatile boolean done = false;
1665 dl 1.5 public void run() {
1666     try {
1667 dl 1.76 delay(SHORT_DELAY_MS);
1668 jsr166 1.61 done = true;
1669     } catch (InterruptedException ok) {}
1670     }
1671     }
1672    
1673     public static class TrackedSmallRunnable implements Runnable {
1674     public volatile boolean done = false;
1675     public void run() {
1676     try {
1677 dl 1.76 delay(SMALL_DELAY_MS);
1678 dl 1.5 done = true;
1679 jsr166 1.44 } catch (InterruptedException ok) {}
1680 dl 1.6 }
1681     }
1682    
1683 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1684     public volatile boolean done = false;
1685 dl 1.6 public void run() {
1686     try {
1687 dl 1.76 delay(MEDIUM_DELAY_MS);
1688 dl 1.6 done = true;
1689 jsr166 1.44 } catch (InterruptedException ok) {}
1690 dl 1.6 }
1691     }
1692    
1693 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1694     public volatile boolean done = false;
1695 dl 1.6 public void run() {
1696     try {
1697 dl 1.76 delay(LONG_DELAY_MS);
1698 dl 1.6 done = true;
1699 jsr166 1.44 } catch (InterruptedException ok) {}
1700 dl 1.6 }
1701     }
1702    
1703 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1704     public volatile boolean done = false;
1705 dl 1.6 public void run() {
1706     done = true;
1707 dl 1.5 }
1708     }
1709    
1710 jsr166 1.45 public static class TrackedCallable implements Callable {
1711     public volatile boolean done = false;
1712 dl 1.5 public Object call() {
1713     try {
1714 dl 1.76 delay(SMALL_DELAY_MS);
1715 dl 1.5 done = true;
1716 jsr166 1.44 } catch (InterruptedException ok) {}
1717 dl 1.5 return Boolean.TRUE;
1718     }
1719     }
1720 dl 1.14
1721 jsr166 1.53 /**
1722     * Analog of CheckedRunnable for RecursiveAction
1723     */
1724     public abstract class CheckedRecursiveAction extends RecursiveAction {
1725     protected abstract void realCompute() throws Throwable;
1726    
1727 jsr166 1.108 @Override protected final void compute() {
1728 jsr166 1.53 try {
1729     realCompute();
1730 jsr166 1.128 } catch (Throwable fail) {
1731     threadUnexpectedException(fail);
1732 jsr166 1.53 }
1733     }
1734     }
1735    
1736     /**
1737     * Analog of CheckedCallable for RecursiveTask
1738     */
1739     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1740     protected abstract T realCompute() throws Throwable;
1741    
1742 jsr166 1.108 @Override protected final T compute() {
1743 jsr166 1.53 try {
1744     return realCompute();
1745 jsr166 1.128 } catch (Throwable fail) {
1746     threadUnexpectedException(fail);
1747 jsr166 1.53 return null;
1748     }
1749     }
1750     }
1751 dl 1.5
1752     /**
1753     * For use as RejectedExecutionHandler in constructors
1754     */
1755 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1756 jsr166 1.35 public void rejectedExecution(Runnable r,
1757     ThreadPoolExecutor executor) {}
1758 dl 1.5 }
1759 jsr166 1.27
1760 jsr166 1.60 /**
1761 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1762     * AssertionFailedErrors instead of throwing checked exceptions.
1763 jsr166 1.60 */
1764 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1765 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1766    
1767     public int await() {
1768     try {
1769 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1770 jsr166 1.128 } catch (TimeoutException timedOut) {
1771 jsr166 1.86 throw new AssertionFailedError("timed out");
1772 jsr166 1.128 } catch (Exception fail) {
1773 jsr166 1.60 AssertionFailedError afe =
1774 jsr166 1.128 new AssertionFailedError("Unexpected exception: " + fail);
1775     afe.initCause(fail);
1776 jsr166 1.60 throw afe;
1777     }
1778     }
1779     }
1780    
1781 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1782 jsr166 1.72 try {
1783     assertTrue(q.isEmpty());
1784     assertEquals(0, q.size());
1785     assertNull(q.peek());
1786     assertNull(q.poll());
1787     assertNull(q.poll(0, MILLISECONDS));
1788     assertEquals(q.toString(), "[]");
1789     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1790     assertFalse(q.iterator().hasNext());
1791     try {
1792     q.element();
1793     shouldThrow();
1794     } catch (NoSuchElementException success) {}
1795     try {
1796     q.iterator().next();
1797     shouldThrow();
1798     } catch (NoSuchElementException success) {}
1799     try {
1800     q.remove();
1801     shouldThrow();
1802     } catch (NoSuchElementException success) {}
1803 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1804 jsr166 1.72 }
1805    
1806 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1807     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1808     }
1809    
1810     void assertNotSerialEquals(Object x, Object y) {
1811     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1812     }
1813    
1814     byte[] serialBytes(Object o) {
1815 jsr166 1.79 try {
1816     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1817     ObjectOutputStream oos = new ObjectOutputStream(bos);
1818     oos.writeObject(o);
1819     oos.flush();
1820     oos.close();
1821 jsr166 1.91 return bos.toByteArray();
1822 jsr166 1.128 } catch (Throwable fail) {
1823     threadUnexpectedException(fail);
1824 jsr166 1.91 return new byte[0];
1825     }
1826     }
1827    
1828     @SuppressWarnings("unchecked")
1829     <T> T serialClone(T o) {
1830     try {
1831 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1832 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1833 jsr166 1.87 T clone = (T) ois.readObject();
1834     assertSame(o.getClass(), clone.getClass());
1835     return clone;
1836 jsr166 1.128 } catch (Throwable fail) {
1837     threadUnexpectedException(fail);
1838 jsr166 1.79 return null;
1839     }
1840     }
1841 jsr166 1.106
1842     public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1843     Runnable... throwingActions) {
1844     for (Runnable throwingAction : throwingActions) {
1845     boolean threw = false;
1846     try { throwingAction.run(); }
1847     catch (Throwable t) {
1848     threw = true;
1849     if (!expectedExceptionClass.isInstance(t)) {
1850     AssertionFailedError afe =
1851     new AssertionFailedError
1852     ("Expected " + expectedExceptionClass.getName() +
1853     ", got " + t.getClass().getName());
1854     afe.initCause(t);
1855     threadUnexpectedException(afe);
1856     }
1857     }
1858     if (!threw)
1859     shouldThrow(expectedExceptionClass.getName());
1860     }
1861     }
1862 jsr166 1.126
1863     public void assertIteratorExhausted(Iterator<?> it) {
1864     try {
1865     it.next();
1866     shouldThrow();
1867     } catch (NoSuchElementException success) {}
1868     assertFalse(it.hasNext());
1869 jsr166 1.127 }
1870 jsr166 1.191
1871     public <T> Callable<T> callableThrowing(final Exception ex) {
1872     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1873     }
1874    
1875     public Runnable runnableThrowing(final RuntimeException ex) {
1876     return new Runnable() { public void run() { throw ex; }};
1877     }
1878 jsr166 1.193
1879     /** A reusable thread pool to be shared by tests. */
1880     static final ExecutorService cachedThreadPool =
1881     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1882     1000L, MILLISECONDS,
1883     new SynchronousQueue<Runnable>());
1884    
1885 jsr166 1.200 static <T> void shuffle(T[] array) {
1886     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1887     }
1888 dl 1.1 }