ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.204
Committed: Sat Oct 15 18:51:12 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.203: +2 -1 lines
Log Message:
fix 4jdk7-tck target by segregating jdk8+ tests

File Contents

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