ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.206
Committed: Tue Oct 25 01:32:55 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.205: +1 -0 lines
Log Message:
fix 4jdk7-test ant target

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