ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.207
Committed: Thu Nov 3 20:41:32 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.206: +2 -1 lines
Log Message:
add VectorTest

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