ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.216
Committed: Wed Jan 4 06:09:58 2017 UTC (7 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.215: +3 -3 lines
Log Message:
convert to Diamond

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 jsr166 1.213 * @summary JSR-166 tck tests (conformance testing mode)
12     * @build *
13     * @modules java.management
14     * @run junit/othervm/timeout=1000 JSR166TestCase
15     */
16    
17     /*
18     * @test
19     * @summary JSR-166 tck tests (whitebox tests allowed)
20     * @build *
21 jsr166 1.212 * @modules java.base/java.util.concurrent:open
22     * java.management
23 jsr166 1.214 * @run junit/othervm/timeout=1000
24     * -Djsr166.testImplementationDetails=true
25     * JSR166TestCase
26     * @run junit/othervm/timeout=1000
27     * -Djsr166.testImplementationDetails=true
28     * -Djava.util.concurrent.ForkJoinPool.common.parallelism=0
29     * JSR166TestCase
30     * @run junit/othervm/timeout=1000
31     * -Djsr166.testImplementationDetails=true
32     * -Djava.util.concurrent.ForkJoinPool.common.parallelism=1
33     * -Djava.util.secureRandomSeed=true
34     * JSR166TestCase
35 jsr166 1.182 */
36    
37 jsr166 1.123 import static java.util.concurrent.TimeUnit.MILLISECONDS;
38 jsr166 1.156 import static java.util.concurrent.TimeUnit.MINUTES;
39 jsr166 1.123 import static java.util.concurrent.TimeUnit.NANOSECONDS;
40    
41 jsr166 1.79 import java.io.ByteArrayInputStream;
42     import java.io.ByteArrayOutputStream;
43     import java.io.ObjectInputStream;
44     import java.io.ObjectOutputStream;
45 jsr166 1.96 import java.lang.management.ManagementFactory;
46     import java.lang.management.ThreadInfo;
47 jsr166 1.150 import java.lang.management.ThreadMXBean;
48 jsr166 1.134 import java.lang.reflect.Constructor;
49 jsr166 1.97 import java.lang.reflect.Method;
50 jsr166 1.134 import java.lang.reflect.Modifier;
51 jsr166 1.171 import java.nio.file.Files;
52     import java.nio.file.Paths;
53 jsr166 1.123 import java.security.CodeSource;
54     import java.security.Permission;
55     import java.security.PermissionCollection;
56     import java.security.Permissions;
57     import java.security.Policy;
58     import java.security.ProtectionDomain;
59     import java.security.SecurityPermission;
60 jsr166 1.93 import java.util.ArrayList;
61 jsr166 1.72 import java.util.Arrays;
62 jsr166 1.208 import java.util.Collection;
63 jsr166 1.200 import java.util.Collections;
64 jsr166 1.81 import java.util.Date;
65 jsr166 1.93 import java.util.Enumeration;
66 jsr166 1.126 import java.util.Iterator;
67 jsr166 1.93 import java.util.List;
68 jsr166 1.72 import java.util.NoSuchElementException;
69 jsr166 1.53 import java.util.PropertyPermission;
70 jsr166 1.123 import java.util.concurrent.BlockingQueue;
71     import java.util.concurrent.Callable;
72     import java.util.concurrent.CountDownLatch;
73     import java.util.concurrent.CyclicBarrier;
74 jsr166 1.139 import java.util.concurrent.ExecutionException;
75     import java.util.concurrent.Executors;
76 jsr166 1.123 import java.util.concurrent.ExecutorService;
77 jsr166 1.146 import java.util.concurrent.ForkJoinPool;
78 jsr166 1.123 import java.util.concurrent.Future;
79     import java.util.concurrent.RecursiveAction;
80     import java.util.concurrent.RecursiveTask;
81     import java.util.concurrent.RejectedExecutionHandler;
82     import java.util.concurrent.Semaphore;
83 jsr166 1.193 import java.util.concurrent.SynchronousQueue;
84 jsr166 1.123 import java.util.concurrent.ThreadFactory;
85 jsr166 1.200 import java.util.concurrent.ThreadLocalRandom;
86 jsr166 1.123 import java.util.concurrent.ThreadPoolExecutor;
87     import java.util.concurrent.TimeoutException;
88 jsr166 1.185 import java.util.concurrent.atomic.AtomicBoolean;
89 jsr166 1.53 import java.util.concurrent.atomic.AtomicReference;
90 jsr166 1.171 import java.util.regex.Matcher;
91 jsr166 1.114 import java.util.regex.Pattern;
92 jsr166 1.123
93     import junit.framework.AssertionFailedError;
94     import junit.framework.Test;
95     import junit.framework.TestCase;
96 jsr166 1.131 import junit.framework.TestResult;
97 jsr166 1.123 import junit.framework.TestSuite;
98 dl 1.1
99     /**
100 dl 1.5 * Base class for JSR166 Junit TCK tests. Defines some constants,
101     * utility methods and classes, as well as a simple framework for
102     * helping to make sure that assertions failing in generated threads
103     * cause the associated test that generated them to itself fail (which
104 jsr166 1.27 * JUnit does not otherwise arrange). The rules for creating such
105 dl 1.5 * tests are:
106 dl 1.1 *
107     * <ol>
108     *
109 jsr166 1.143 * <li>All assertions in code running in generated threads must use
110 jsr166 1.27 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
111 dl 1.18 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
112 jsr166 1.50 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
113 dl 1.1 * particularly recommended) for other code to use these forms too.
114     * Only the most typically used JUnit assertion methods are defined
115 jsr166 1.143 * this way, but enough to live with.
116 dl 1.1 *
117 jsr166 1.143 * <li>If you override {@link #setUp} or {@link #tearDown}, make sure
118 jsr166 1.50 * to invoke {@code super.setUp} and {@code super.tearDown} within
119 dl 1.1 * them. These methods are used to clear and check for thread
120 jsr166 1.143 * assertion failures.
121 dl 1.1 *
122 jsr166 1.51 * <li>All delays and timeouts must use one of the constants {@code
123 jsr166 1.50 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
124     * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
125 dl 1.5 * discriminable from zero time, and always allows enough time for the
126     * small amounts of computation (creating a thread, calling a few
127 dl 1.1 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
128     * is always discriminable as larger than SHORT and smaller than
129     * MEDIUM. And so on. These constants are set to conservative values,
130 dl 1.2 * but even so, if there is ever any doubt, they can all be increased
131 jsr166 1.143 * in one spot to rerun tests on slower platforms.
132 dl 1.1 *
133 jsr166 1.143 * <li>All threads generated must be joined inside each test case
134 jsr166 1.50 * method (or {@code fail} to do so) before returning from the
135     * method. The {@code joinPool} method can be used to do this when
136 jsr166 1.143 * using Executors.
137 dl 1.1 *
138     * </ol>
139 dl 1.6 *
140 jsr166 1.92 * <p><b>Other notes</b>
141 dl 1.6 * <ul>
142     *
143 jsr166 1.143 * <li>Usually, there is one testcase method per JSR166 method
144 dl 1.6 * covering "normal" operation, and then as many exception-testing
145     * methods as there are exceptions the method can throw. Sometimes
146     * there are multiple tests per JSR166 method when the different
147     * "normal" behaviors differ significantly. And sometimes testcases
148 jsr166 1.180 * cover multiple methods when they cannot be tested in isolation.
149 jsr166 1.27 *
150 jsr166 1.143 * <li>The documentation style for testcases is to provide as javadoc
151 dl 1.6 * a simple sentence or two describing the property that the testcase
152     * method purports to test. The javadocs do not say anything about how
153 jsr166 1.143 * the property is tested. To find out, read the code.
154 dl 1.6 *
155 jsr166 1.143 * <li>These tests are "conformance tests", and do not attempt to
156 dl 1.6 * test throughput, latency, scalability or other performance factors
157     * (see the separate "jtreg" tests for a set intended to check these
158     * for the most central aspects of functionality.) So, most tests use
159     * the smallest sensible numbers of threads, collection sizes, etc
160 jsr166 1.143 * needed to check basic conformance.
161 dl 1.6 *
162     * <li>The test classes currently do not declare inclusion in
163     * any particular package to simplify things for people integrating
164 jsr166 1.143 * them in TCK test suites.
165 dl 1.6 *
166 jsr166 1.143 * <li>As a convenience, the {@code main} of this class (JSR166TestCase)
167     * runs all JSR166 unit tests.
168 dl 1.6 *
169     * </ul>
170 dl 1.1 */
171     public class JSR166TestCase extends TestCase {
172 jsr166 1.49 private static final boolean useSecurityManager =
173     Boolean.getBoolean("jsr166.useSecurityManager");
174    
175 jsr166 1.62 protected static final boolean expensiveTests =
176     Boolean.getBoolean("jsr166.expensiveTests");
177    
178 jsr166 1.119 /**
179     * If true, also run tests that are not part of the official tck
180     * because they test unspecified implementation details.
181     */
182 jsr166 1.118 protected static final boolean testImplementationDetails =
183     Boolean.getBoolean("jsr166.testImplementationDetails");
184    
185 dl 1.6 /**
186 jsr166 1.61 * If true, report on stdout all "slow" tests, that is, ones that
187     * take more than profileThreshold milliseconds to execute.
188     */
189     private static final boolean profileTests =
190     Boolean.getBoolean("jsr166.profileTests");
191    
192     /**
193     * The number of milliseconds that tests are permitted for
194     * execution without being reported, when profileTests is set.
195     */
196     private static final long profileThreshold =
197     Long.getLong("jsr166.profileThreshold", 100);
198    
199 jsr166 1.107 /**
200     * The number of repetitions per test (for tickling rare bugs).
201     */
202     private static final int runsPerTest =
203     Integer.getInteger("jsr166.runsPerTest", 1);
204    
205 jsr166 1.114 /**
206 jsr166 1.131 * The number of repetitions of the test suite (for finding leaks?).
207     */
208     private static final int suiteRuns =
209     Integer.getInteger("jsr166.suiteRuns", 1);
210    
211 jsr166 1.189 /**
212     * Returns the value of the system property, or NaN if not defined.
213     */
214     private static float systemPropertyValue(String name) {
215 jsr166 1.185 String floatString = System.getProperty(name);
216     if (floatString == null)
217 jsr166 1.189 return Float.NaN;
218 jsr166 1.185 try {
219     return Float.parseFloat(floatString);
220     } catch (NumberFormatException ex) {
221     throw new IllegalArgumentException(
222     String.format("Bad float value in system property %s=%s",
223     name, floatString));
224     }
225     }
226    
227 jsr166 1.181 /**
228     * The scaling factor to apply to standard delays used in tests.
229 jsr166 1.189 * May be initialized from any of:
230     * - the "jsr166.delay.factor" system property
231     * - the "test.timeout.factor" system property (as used by jtreg)
232     * See: http://openjdk.java.net/jtreg/tag-spec.html
233     * - hard-coded fuzz factor when using a known slowpoke VM
234     */
235     private static final float delayFactor = delayFactor();
236    
237     private static float delayFactor() {
238     float x;
239     if (!Float.isNaN(x = systemPropertyValue("jsr166.delay.factor")))
240     return x;
241     if (!Float.isNaN(x = systemPropertyValue("test.timeout.factor")))
242     return x;
243     String prop = System.getProperty("java.vm.version");
244     if (prop != null && prop.matches(".*debug.*"))
245     return 4.0f; // How much slower is fastdebug than product?!
246     return 1.0f;
247     }
248 jsr166 1.181
249 jsr166 1.134 public JSR166TestCase() { super(); }
250     public JSR166TestCase(String name) { super(name); }
251    
252 jsr166 1.131 /**
253 jsr166 1.114 * A filter for tests to run, matching strings of the form
254     * methodName(className), e.g. "testInvokeAll5(ForkJoinPoolTest)"
255     * Usefully combined with jsr166.runsPerTest.
256     */
257     private static final Pattern methodFilter = methodFilter();
258    
259     private static Pattern methodFilter() {
260     String regex = System.getProperty("jsr166.methodFilter");
261     return (regex == null) ? null : Pattern.compile(regex);
262     }
263    
264 jsr166 1.170 // Instrumentation to debug very rare, but very annoying hung test runs.
265 jsr166 1.156 static volatile TestCase currentTestCase;
266 jsr166 1.173 // static volatile int currentRun = 0;
267 jsr166 1.156 static {
268     Runnable checkForWedgedTest = new Runnable() { public void run() {
269 jsr166 1.174 // Avoid spurious reports with enormous runsPerTest.
270     // A single test case run should never take more than 1 second.
271     // But let's cap it at the high end too ...
272     final int timeoutMinutes =
273     Math.min(15, Math.max(runsPerTest / 60, 1));
274 jsr166 1.156 for (TestCase lastTestCase = currentTestCase;;) {
275 jsr166 1.157 try { MINUTES.sleep(timeoutMinutes); }
276 jsr166 1.156 catch (InterruptedException unexpected) { break; }
277     if (lastTestCase == currentTestCase) {
278 jsr166 1.170 System.err.printf(
279 jsr166 1.173 "Looks like we're stuck running test: %s%n",
280     lastTestCase);
281     // System.err.printf(
282     // "Looks like we're stuck running test: %s (%d/%d)%n",
283     // lastTestCase, currentRun, runsPerTest);
284 jsr166 1.175 // System.err.println("availableProcessors=" +
285     // Runtime.getRuntime().availableProcessors());
286     // System.err.printf("cpu model = %s%n", cpuModel());
287 jsr166 1.156 dumpTestThreads();
288 jsr166 1.165 // one stack dump is probably enough; more would be spam
289     break;
290 jsr166 1.156 }
291     lastTestCase = currentTestCase;
292     }}};
293     Thread thread = new Thread(checkForWedgedTest, "checkForWedgedTest");
294     thread.setDaemon(true);
295     thread.start();
296     }
297    
298 jsr166 1.175 // public static String cpuModel() {
299     // try {
300     // Matcher matcher = Pattern.compile("model name\\s*: (.*)")
301     // .matcher(new String(
302     // Files.readAllBytes(Paths.get("/proc/cpuinfo")), "UTF-8"));
303     // matcher.find();
304     // return matcher.group(1);
305     // } catch (Exception ex) { return null; }
306     // }
307 jsr166 1.171
308 jsr166 1.147 public void runBare() throws Throwable {
309 jsr166 1.156 currentTestCase = this;
310 jsr166 1.147 if (methodFilter == null
311     || methodFilter.matcher(toString()).find())
312     super.runBare();
313     }
314    
315 jsr166 1.61 protected void runTest() throws Throwable {
316 jsr166 1.147 for (int i = 0; i < runsPerTest; i++) {
317 jsr166 1.173 // currentRun = i;
318 jsr166 1.147 if (profileTests)
319     runTestProfiled();
320     else
321     super.runTest();
322 jsr166 1.107 }
323 jsr166 1.61 }
324    
325     protected void runTestProfiled() throws Throwable {
326 jsr166 1.145 for (int i = 0; i < 2; i++) {
327     long startTime = System.nanoTime();
328 jsr166 1.61 super.runTest();
329 jsr166 1.145 long elapsedMillis = millisElapsedSince(startTime);
330     if (elapsedMillis < profileThreshold)
331     break;
332     // Never report first run of any test; treat it as a
333     // warmup run, notably to trigger all needed classloading,
334     if (i > 0)
335 jsr166 1.61 System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
336     }
337     }
338 jsr166 1.63
339 jsr166 1.61 /**
340 jsr166 1.94 * Runs all JSR166 unit tests using junit.textui.TestRunner.
341 jsr166 1.27 */
342 jsr166 1.41 public static void main(String[] args) {
343 jsr166 1.131 main(suite(), args);
344     }
345    
346 jsr166 1.178 static class PithyResultPrinter extends junit.textui.ResultPrinter {
347     PithyResultPrinter(java.io.PrintStream writer) { super(writer); }
348     long runTime;
349     public void startTest(Test test) {}
350 jsr166 1.179 protected void printHeader(long runTime) {
351 jsr166 1.178 this.runTime = runTime; // defer printing for later
352 jsr166 1.179 }
353     protected void printFooter(TestResult result) {
354 jsr166 1.178 if (result.wasSuccessful()) {
355     getWriter().println("OK (" + result.runCount() + " tests)"
356     + " Time: " + elapsedTimeAsString(runTime));
357     } else {
358     getWriter().println("Time: " + elapsedTimeAsString(runTime));
359     super.printFooter(result);
360     }
361     }
362     }
363    
364     /**
365     * Returns a TestRunner that doesn't bother with unnecessary
366     * fluff, like printing a "." for each test case.
367     */
368     static junit.textui.TestRunner newPithyTestRunner() {
369     junit.textui.TestRunner runner = new junit.textui.TestRunner();
370     runner.setPrinter(new PithyResultPrinter(System.out));
371     return runner;
372     }
373    
374 jsr166 1.131 /**
375     * Runs all unit tests in the given test suite.
376 jsr166 1.132 * Actual behavior influenced by jsr166.* system properties.
377 jsr166 1.131 */
378     static void main(Test suite, String[] args) {
379 jsr166 1.49 if (useSecurityManager) {
380     System.err.println("Setting a permissive security manager");
381     Policy.setPolicy(permissivePolicy());
382     System.setSecurityManager(new SecurityManager());
383     }
384 jsr166 1.131 for (int i = 0; i < suiteRuns; i++) {
385 jsr166 1.178 TestResult result = newPithyTestRunner().doRun(suite);
386 jsr166 1.131 if (!result.wasSuccessful())
387     System.exit(1);
388 dl 1.22 System.gc();
389     System.runFinalization();
390     }
391 dl 1.6 }
392    
393 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
394     TestSuite suite = new TestSuite();
395     for (Object suiteOrClass : suiteOrClasses) {
396     if (suiteOrClass instanceof TestSuite)
397     suite.addTest((TestSuite) suiteOrClass);
398     else if (suiteOrClass instanceof Class)
399     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
400     else
401     throw new ClassCastException("not a test suite or class");
402     }
403     return suite;
404     }
405    
406 jsr166 1.98 public static void addNamedTestClasses(TestSuite suite,
407     String... testClassNames) {
408     for (String testClassName : testClassNames) {
409     try {
410     Class<?> testClass = Class.forName(testClassName);
411     Method m = testClass.getDeclaredMethod("suite",
412     new Class<?>[0]);
413     suite.addTest(newTestSuite((Test)m.invoke(null)));
414     } catch (Exception e) {
415     throw new Error("Missing test class", e);
416     }
417 jsr166 1.97 }
418     }
419    
420     public static final double JAVA_CLASS_VERSION;
421 jsr166 1.115 public static final String JAVA_SPECIFICATION_VERSION;
422 jsr166 1.97 static {
423     try {
424     JAVA_CLASS_VERSION = java.security.AccessController.doPrivileged(
425     new java.security.PrivilegedAction<Double>() {
426     public Double run() {
427     return Double.valueOf(System.getProperty("java.class.version"));}});
428 jsr166 1.115 JAVA_SPECIFICATION_VERSION = java.security.AccessController.doPrivileged(
429     new java.security.PrivilegedAction<String>() {
430     public String run() {
431     return System.getProperty("java.specification.version");}});
432 jsr166 1.97 } catch (Throwable t) {
433     throw new Error(t);
434     }
435     }
436    
437 jsr166 1.98 public static boolean atLeastJava6() { return JAVA_CLASS_VERSION >= 50.0; }
438     public static boolean atLeastJava7() { return JAVA_CLASS_VERSION >= 51.0; }
439     public static boolean atLeastJava8() { return JAVA_CLASS_VERSION >= 52.0; }
440 jsr166 1.136 public static boolean atLeastJava9() {
441 jsr166 1.137 return JAVA_CLASS_VERSION >= 53.0
442     // As of 2015-09, java9 still uses 52.0 class file version
443     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?(9|[0-9][0-9])$");
444 jsr166 1.136 }
445     public static boolean atLeastJava10() {
446 jsr166 1.137 return JAVA_CLASS_VERSION >= 54.0
447     || JAVA_SPECIFICATION_VERSION.matches("^(1\\.)?[0-9][0-9]$");
448 jsr166 1.136 }
449 jsr166 1.97
450 dl 1.6 /**
451 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
452 jsr166 1.27 */
453 jsr166 1.41 public static Test suite() {
454 jsr166 1.98 // Java7+ test classes
455 jsr166 1.97 TestSuite suite = newTestSuite(
456 jsr166 1.60 ForkJoinPoolTest.suite(),
457     ForkJoinTaskTest.suite(),
458     RecursiveActionTest.suite(),
459     RecursiveTaskTest.suite(),
460     LinkedTransferQueueTest.suite(),
461     PhaserTest.suite(),
462     ThreadLocalRandomTest.suite(),
463     AbstractExecutorServiceTest.suite(),
464     AbstractQueueTest.suite(),
465     AbstractQueuedSynchronizerTest.suite(),
466     AbstractQueuedLongSynchronizerTest.suite(),
467     ArrayBlockingQueueTest.suite(),
468     ArrayDequeTest.suite(),
469 jsr166 1.205 ArrayListTest.suite(),
470 jsr166 1.60 AtomicBooleanTest.suite(),
471     AtomicIntegerArrayTest.suite(),
472     AtomicIntegerFieldUpdaterTest.suite(),
473     AtomicIntegerTest.suite(),
474     AtomicLongArrayTest.suite(),
475     AtomicLongFieldUpdaterTest.suite(),
476     AtomicLongTest.suite(),
477     AtomicMarkableReferenceTest.suite(),
478     AtomicReferenceArrayTest.suite(),
479     AtomicReferenceFieldUpdaterTest.suite(),
480     AtomicReferenceTest.suite(),
481     AtomicStampedReferenceTest.suite(),
482     ConcurrentHashMapTest.suite(),
483     ConcurrentLinkedDequeTest.suite(),
484     ConcurrentLinkedQueueTest.suite(),
485     ConcurrentSkipListMapTest.suite(),
486     ConcurrentSkipListSubMapTest.suite(),
487     ConcurrentSkipListSetTest.suite(),
488     ConcurrentSkipListSubSetTest.suite(),
489     CopyOnWriteArrayListTest.suite(),
490     CopyOnWriteArraySetTest.suite(),
491     CountDownLatchTest.suite(),
492 jsr166 1.204 CountedCompleterTest.suite(),
493 jsr166 1.60 CyclicBarrierTest.suite(),
494     DelayQueueTest.suite(),
495     EntryTest.suite(),
496     ExchangerTest.suite(),
497     ExecutorsTest.suite(),
498     ExecutorCompletionServiceTest.suite(),
499     FutureTaskTest.suite(),
500     LinkedBlockingDequeTest.suite(),
501     LinkedBlockingQueueTest.suite(),
502     LinkedListTest.suite(),
503     LockSupportTest.suite(),
504     PriorityBlockingQueueTest.suite(),
505     PriorityQueueTest.suite(),
506     ReentrantLockTest.suite(),
507     ReentrantReadWriteLockTest.suite(),
508     ScheduledExecutorTest.suite(),
509     ScheduledExecutorSubclassTest.suite(),
510     SemaphoreTest.suite(),
511     SynchronousQueueTest.suite(),
512     SystemTest.suite(),
513     ThreadLocalTest.suite(),
514     ThreadPoolExecutorTest.suite(),
515     ThreadPoolExecutorSubclassTest.suite(),
516     ThreadTest.suite(),
517     TimeUnitTest.suite(),
518     TreeMapTest.suite(),
519     TreeSetTest.suite(),
520     TreeSubMapTest.suite(),
521 jsr166 1.207 TreeSubSetTest.suite(),
522     VectorTest.suite());
523 jsr166 1.98
524     // Java8+ test classes
525     if (atLeastJava8()) {
526     String[] java8TestClassNames = {
527 jsr166 1.206 "ArrayDeque8Test",
528 dl 1.113 "Atomic8Test",
529 dl 1.104 "CompletableFutureTest",
530 dl 1.105 "ConcurrentHashMap8Test",
531 jsr166 1.204 "CountedCompleter8Test",
532 dl 1.104 "DoubleAccumulatorTest",
533 dl 1.103 "DoubleAdderTest",
534 jsr166 1.102 "ForkJoinPool8Test",
535 dl 1.111 "ForkJoinTask8Test",
536 jsr166 1.215 "LinkedBlockingDeque8Test",
537     "LinkedBlockingQueue8Test",
538 dl 1.104 "LongAccumulatorTest",
539     "LongAdderTest",
540 jsr166 1.110 "SplittableRandomTest",
541 jsr166 1.98 "StampedLockTest",
542 dl 1.140 "SubmissionPublisherTest",
543 jsr166 1.112 "ThreadLocalRandom8Test",
544 jsr166 1.190 "TimeUnit8Test",
545 jsr166 1.98 };
546     addNamedTestClasses(suite, java8TestClassNames);
547 jsr166 1.97 }
548 jsr166 1.98
549 jsr166 1.115 // Java9+ test classes
550     if (atLeastJava9()) {
551     String[] java9TestClassNames = {
552 jsr166 1.196 "AtomicBoolean9Test",
553     "AtomicInteger9Test",
554     "AtomicIntegerArray9Test",
555     "AtomicLong9Test",
556     "AtomicLongArray9Test",
557     "AtomicReference9Test",
558     "AtomicReferenceArray9Test",
559 jsr166 1.192 "ExecutorCompletionService9Test",
560 jsr166 1.115 };
561     addNamedTestClasses(suite, java9TestClassNames);
562     }
563    
564 jsr166 1.97 return suite;
565 dl 1.6 }
566    
567 jsr166 1.134 /** Returns list of junit-style test method names in given class. */
568     public static ArrayList<String> testMethodNames(Class<?> testClass) {
569     Method[] methods = testClass.getDeclaredMethods();
570 jsr166 1.216 ArrayList<String> names = new ArrayList<>(methods.length);
571 jsr166 1.134 for (Method method : methods) {
572     if (method.getName().startsWith("test")
573     && Modifier.isPublic(method.getModifiers())
574     // method.getParameterCount() requires jdk8+
575     && method.getParameterTypes().length == 0) {
576     names.add(method.getName());
577     }
578     }
579     return names;
580     }
581    
582     /**
583     * Returns junit-style testSuite for the given test class, but
584     * parameterized by passing extra data to each test.
585     */
586     public static <ExtraData> Test parameterizedTestSuite
587     (Class<? extends JSR166TestCase> testClass,
588     Class<ExtraData> dataClass,
589     ExtraData data) {
590     try {
591     TestSuite suite = new TestSuite();
592     Constructor c =
593     testClass.getDeclaredConstructor(dataClass, String.class);
594     for (String methodName : testMethodNames(testClass))
595     suite.addTest((Test) c.newInstance(data, methodName));
596     return suite;
597     } catch (Exception e) {
598     throw new Error(e);
599     }
600     }
601    
602     /**
603     * Returns junit-style testSuite for the jdk8 extension of the
604     * given test class, but parameterized by passing extra data to
605     * each test. Uses reflection to allow compilation in jdk7.
606     */
607     public static <ExtraData> Test jdk8ParameterizedTestSuite
608     (Class<? extends JSR166TestCase> testClass,
609     Class<ExtraData> dataClass,
610     ExtraData data) {
611     if (atLeastJava8()) {
612     String name = testClass.getName();
613     String name8 = name.replaceAll("Test$", "8Test");
614     if (name.equals(name8)) throw new Error(name);
615     try {
616     return (Test)
617     Class.forName(name8)
618     .getMethod("testSuite", new Class[] { dataClass })
619     .invoke(null, data);
620     } catch (Exception e) {
621     throw new Error(e);
622     }
623     } else {
624     return new TestSuite();
625     }
626     }
627    
628 jsr166 1.109 // Delays for timing-dependent tests, in milliseconds.
629 dl 1.1
630 dl 1.2 public static long SHORT_DELAY_MS;
631     public static long SMALL_DELAY_MS;
632     public static long MEDIUM_DELAY_MS;
633     public static long LONG_DELAY_MS;
634    
635     /**
636 jsr166 1.181 * Returns the shortest timed delay. This can be scaled up for
637 jsr166 1.185 * slow machines using the jsr166.delay.factor system property,
638 jsr166 1.187 * or via jtreg's -timeoutFactor: flag.
639 jsr166 1.185 * http://openjdk.java.net/jtreg/command-help.html
640 jsr166 1.27 */
641 dl 1.2 protected long getShortDelay() {
642 jsr166 1.189 return (long) (50 * delayFactor);
643 dl 1.2 }
644    
645     /**
646 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
647 dl 1.2 */
648 jsr166 1.43 protected void setDelays() {
649 dl 1.2 SHORT_DELAY_MS = getShortDelay();
650 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
651 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
652 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
653 dl 1.2 }
654    
655 dl 1.1 /**
656 jsr166 1.81 * Returns a timeout in milliseconds to be used in tests that
657     * verify that operations block or time out.
658     */
659     long timeoutMillis() {
660     return SHORT_DELAY_MS / 4;
661     }
662    
663     /**
664 jsr166 1.135 * Returns a new Date instance representing a time at least
665     * delayMillis milliseconds in the future.
666 jsr166 1.81 */
667     Date delayedDate(long delayMillis) {
668 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
669     return new Date(System.currentTimeMillis() + delayMillis + 1);
670 jsr166 1.81 }
671    
672     /**
673 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
674 dl 1.1 */
675 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
676 jsr166 1.216 = new AtomicReference<>(null);
677 dl 1.1
678     /**
679 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
680     * harness thread, triggering a test case failure. Only the first
681     * failure is recorded; subsequent calls to this method from within
682     * the same test have no effect.
683 dl 1.1 */
684 jsr166 1.53 public void threadRecordFailure(Throwable t) {
685 jsr166 1.158 System.err.println(t);
686 jsr166 1.156 dumpTestThreads();
687 jsr166 1.53 threadFailure.compareAndSet(null, t);
688     }
689    
690 jsr166 1.27 public void setUp() {
691 dl 1.2 setDelays();
692 dl 1.1 }
693    
694 jsr166 1.146 void tearDownFail(String format, Object... args) {
695     String msg = toString() + ": " + String.format(format, args);
696     System.err.println(msg);
697 jsr166 1.156 dumpTestThreads();
698 jsr166 1.146 throw new AssertionFailedError(msg);
699     }
700    
701 dl 1.1 /**
702 jsr166 1.85 * Extra checks that get done for all test cases.
703     *
704 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
705     * by rethrowing, in the test harness thread, any exception recorded
706     * earlier by threadRecordFailure.
707 jsr166 1.85 *
708     * Triggers test case failure if interrupt status is set in the main thread.
709 jsr166 1.53 */
710     public void tearDown() throws Exception {
711 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
712 jsr166 1.53 if (t != null) {
713     if (t instanceof Error)
714     throw (Error) t;
715     else if (t instanceof RuntimeException)
716     throw (RuntimeException) t;
717     else if (t instanceof Exception)
718     throw (Exception) t;
719 jsr166 1.57 else {
720     AssertionFailedError afe =
721     new AssertionFailedError(t.toString());
722     afe.initCause(t);
723     throw afe;
724     }
725 jsr166 1.53 }
726 jsr166 1.85
727     if (Thread.interrupted())
728 jsr166 1.146 tearDownFail("interrupt status set in main thread");
729 jsr166 1.100
730     checkForkJoinPoolThreadLeaks();
731 dl 1.1 }
732    
733 dl 1.5 /**
734 jsr166 1.164 * Finds missing PoolCleaners
735 jsr166 1.100 */
736     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
737 jsr166 1.146 Thread[] survivors = new Thread[7];
738 jsr166 1.100 int count = Thread.enumerate(survivors);
739     for (int i = 0; i < count; i++) {
740     Thread thread = survivors[i];
741     String name = thread.getName();
742     if (name.startsWith("ForkJoinPool-")) {
743     // give thread some time to terminate
744     thread.join(LONG_DELAY_MS);
745 jsr166 1.146 if (thread.isAlive())
746     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
747     thread);
748 jsr166 1.100 }
749     }
750 jsr166 1.146
751     if (!ForkJoinPool.commonPool()
752     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
753     tearDownFail("ForkJoin common pool thread stuck");
754 jsr166 1.100 }
755 jsr166 1.101
756 jsr166 1.100 /**
757 jsr166 1.53 * Just like fail(reason), but additionally recording (using
758 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
759     * the current testcase will fail.
760 jsr166 1.27 */
761 dl 1.1 public void threadFail(String reason) {
762 jsr166 1.53 try {
763     fail(reason);
764 jsr166 1.57 } catch (AssertionFailedError t) {
765 jsr166 1.53 threadRecordFailure(t);
766 jsr166 1.152 throw t;
767 jsr166 1.53 }
768 dl 1.1 }
769    
770 dl 1.5 /**
771 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
772 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
773     * the current testcase will fail.
774 jsr166 1.27 */
775 dl 1.1 public void threadAssertTrue(boolean b) {
776 jsr166 1.53 try {
777 dl 1.1 assertTrue(b);
778 jsr166 1.57 } catch (AssertionFailedError t) {
779 jsr166 1.53 threadRecordFailure(t);
780     throw t;
781 dl 1.1 }
782     }
783 dl 1.5
784     /**
785 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
786 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
787     * the current testcase will fail.
788 jsr166 1.27 */
789 dl 1.1 public void threadAssertFalse(boolean b) {
790 jsr166 1.53 try {
791 dl 1.1 assertFalse(b);
792 jsr166 1.57 } catch (AssertionFailedError t) {
793 jsr166 1.53 threadRecordFailure(t);
794     throw t;
795 dl 1.1 }
796     }
797 dl 1.5
798     /**
799 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
800 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
801     * the current testcase will fail.
802 jsr166 1.27 */
803 dl 1.1 public void threadAssertNull(Object x) {
804 jsr166 1.53 try {
805 dl 1.1 assertNull(x);
806 jsr166 1.57 } catch (AssertionFailedError t) {
807 jsr166 1.53 threadRecordFailure(t);
808     throw t;
809 dl 1.1 }
810     }
811 dl 1.5
812     /**
813 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
814 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
815     * the current testcase will fail.
816 jsr166 1.27 */
817 dl 1.1 public void threadAssertEquals(long x, long y) {
818 jsr166 1.53 try {
819 dl 1.1 assertEquals(x, y);
820 jsr166 1.57 } catch (AssertionFailedError t) {
821 jsr166 1.53 threadRecordFailure(t);
822     throw t;
823 dl 1.1 }
824     }
825 dl 1.5
826     /**
827 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
828 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
829     * the current testcase will fail.
830 jsr166 1.27 */
831 dl 1.1 public void threadAssertEquals(Object x, Object y) {
832 jsr166 1.53 try {
833 dl 1.1 assertEquals(x, y);
834 jsr166 1.129 } catch (AssertionFailedError fail) {
835     threadRecordFailure(fail);
836     throw fail;
837     } catch (Throwable fail) {
838     threadUnexpectedException(fail);
839 dl 1.1 }
840     }
841    
842 dl 1.5 /**
843 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
844 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
845     * the current testcase will fail.
846 jsr166 1.52 */
847     public void threadAssertSame(Object x, Object y) {
848 jsr166 1.53 try {
849 jsr166 1.52 assertSame(x, y);
850 jsr166 1.129 } catch (AssertionFailedError fail) {
851     threadRecordFailure(fail);
852     throw fail;
853 jsr166 1.52 }
854     }
855    
856     /**
857 jsr166 1.53 * Calls threadFail with message "should throw exception".
858 jsr166 1.33 */
859 dl 1.3 public void threadShouldThrow() {
860 jsr166 1.53 threadFail("should throw exception");
861 dl 1.3 }
862    
863 dl 1.5 /**
864 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
865 jsr166 1.40 */
866     public void threadShouldThrow(String exceptionName) {
867 jsr166 1.53 threadFail("should throw " + exceptionName);
868 dl 1.3 }
869    
870 dl 1.31 /**
871 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
872     * then rethrows the exception, wrapping it in an
873     * AssertionFailedError if necessary.
874 dl 1.31 */
875 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
876     threadRecordFailure(t);
877     t.printStackTrace();
878     if (t instanceof RuntimeException)
879     throw (RuntimeException) t;
880     else if (t instanceof Error)
881     throw (Error) t;
882     else {
883 jsr166 1.57 AssertionFailedError afe =
884     new AssertionFailedError("unexpected exception: " + t);
885 jsr166 1.82 afe.initCause(t);
886 jsr166 1.57 throw afe;
887 jsr166 1.55 }
888 dl 1.31 }
889 dl 1.3
890 dl 1.1 /**
891 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
892 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
893 jsr166 1.163 * until time elapses. Ensures that the given time, as measured
894     * by System.nanoTime(), has elapsed.
895 dl 1.76 */
896 jsr166 1.81 static void delay(long millis) throws InterruptedException {
897 jsr166 1.163 long nanos = millis * (1000 * 1000);
898     final long wakeupTime = System.nanoTime() + nanos;
899     do {
900 jsr166 1.80 if (millis > 0L)
901     Thread.sleep(millis);
902 dl 1.76 else // too short to sleep
903     Thread.yield();
904 jsr166 1.163 nanos = wakeupTime - System.nanoTime();
905     millis = nanos / (1000 * 1000);
906     } while (nanos >= 0L);
907 dl 1.76 }
908    
909     /**
910 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
911     */
912 jsr166 1.160 class PoolCleaner implements AutoCloseable {
913     private final ExecutorService pool;
914     public PoolCleaner(ExecutorService pool) { this.pool = pool; }
915 jsr166 1.149 public void close() { joinPool(pool); }
916     }
917    
918 jsr166 1.166 /**
919     * An extension of PoolCleaner that has an action to release the pool.
920     */
921     class PoolCleanerWithReleaser extends PoolCleaner {
922     private final Runnable releaser;
923     public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
924     super(pool);
925     this.releaser = releaser;
926     }
927     public void close() {
928     try {
929     releaser.run();
930     } finally {
931     super.close();
932     }
933     }
934     }
935    
936 jsr166 1.160 PoolCleaner cleaner(ExecutorService pool) {
937     return new PoolCleaner(pool);
938 jsr166 1.159 }
939    
940 jsr166 1.166 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
941     return new PoolCleanerWithReleaser(pool, releaser);
942     }
943    
944     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
945     return new PoolCleanerWithReleaser(pool, releaser(latch));
946     }
947    
948     Runnable releaser(final CountDownLatch latch) {
949     return new Runnable() { public void run() {
950     do { latch.countDown(); }
951     while (latch.getCount() > 0);
952     }};
953     }
954    
955 jsr166 1.185 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
956     return new PoolCleanerWithReleaser(pool, releaser(flag));
957     }
958    
959     Runnable releaser(final AtomicBoolean flag) {
960     return new Runnable() { public void run() { flag.set(true); }};
961     }
962    
963 jsr166 1.149 /**
964 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
965 dl 1.1 */
966 jsr166 1.158 void joinPool(ExecutorService pool) {
967 dl 1.1 try {
968 jsr166 1.139 pool.shutdown();
969 jsr166 1.158 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
970     try {
971     threadFail("ExecutorService " + pool +
972     " did not terminate in a timely manner");
973     } finally {
974     // last resort, for the benefit of subsequent tests
975     pool.shutdownNow();
976 jsr166 1.167 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
977 jsr166 1.158 }
978     }
979 jsr166 1.33 } catch (SecurityException ok) {
980 dl 1.22 // Allowed in case test doesn't have privs
981 jsr166 1.128 } catch (InterruptedException fail) {
982 jsr166 1.158 threadFail("Unexpected InterruptedException");
983 dl 1.1 }
984     }
985    
986 jsr166 1.197 /**
987     * Like Runnable, but with the freedom to throw anything.
988     * junit folks had the same idea:
989     * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
990     */
991 jsr166 1.141 interface Action { public void run() throws Throwable; }
992 jsr166 1.139
993     /**
994 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
995 jsr166 1.139 * Useful for running multiple variants of tests that are
996     * necessarily individually slow because they must block.
997     */
998 jsr166 1.141 void testInParallel(Action ... actions) {
999 jsr166 1.160 ExecutorService pool = Executors.newCachedThreadPool();
1000     try (PoolCleaner cleaner = cleaner(pool)) {
1001 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
1002     for (final Action action : actions)
1003 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
1004 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
1005 jsr166 1.139 for (Future<?> future : futures)
1006     try {
1007     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
1008     } catch (ExecutionException ex) {
1009     threadUnexpectedException(ex.getCause());
1010     } catch (Exception ex) {
1011     threadUnexpectedException(ex);
1012     }
1013     }
1014     }
1015    
1016 jsr166 1.78 /**
1017 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
1018 jsr166 1.150 * Uninteresting threads are filtered out.
1019 jsr166 1.95 */
1020 jsr166 1.156 static void dumpTestThreads() {
1021 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
1022     if (sm != null) {
1023     try {
1024     System.setSecurityManager(null);
1025     } catch (SecurityException giveUp) {
1026     return;
1027     }
1028     }
1029    
1030 jsr166 1.150 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1031     System.err.println("------ stacktrace dump start ------");
1032     for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1033 jsr166 1.203 final String name = info.getThreadName();
1034     String lockName;
1035 jsr166 1.150 if ("Signal Dispatcher".equals(name))
1036     continue;
1037     if ("Reference Handler".equals(name)
1038 jsr166 1.203 && (lockName = info.getLockName()) != null
1039     && lockName.startsWith("java.lang.ref.Reference$Lock"))
1040 jsr166 1.150 continue;
1041     if ("Finalizer".equals(name)
1042 jsr166 1.203 && (lockName = info.getLockName()) != null
1043     && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1044 jsr166 1.150 continue;
1045 jsr166 1.156 if ("checkForWedgedTest".equals(name))
1046     continue;
1047 jsr166 1.96 System.err.print(info);
1048 jsr166 1.150 }
1049     System.err.println("------ stacktrace dump end ------");
1050 jsr166 1.195
1051     if (sm != null) System.setSecurityManager(sm);
1052 jsr166 1.95 }
1053    
1054     /**
1055 jsr166 1.81 * Checks that thread does not terminate within the default
1056     * millisecond delay of {@code timeoutMillis()}.
1057     */
1058     void assertThreadStaysAlive(Thread thread) {
1059     assertThreadStaysAlive(thread, timeoutMillis());
1060     }
1061    
1062     /**
1063 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
1064 jsr166 1.78 */
1065 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
1066 jsr166 1.78 try {
1067 jsr166 1.80 // No need to optimize the failing case via Thread.join.
1068     delay(millis);
1069 jsr166 1.78 assertTrue(thread.isAlive());
1070 jsr166 1.128 } catch (InterruptedException fail) {
1071 jsr166 1.158 threadFail("Unexpected InterruptedException");
1072 jsr166 1.78 }
1073     }
1074 dl 1.5
1075     /**
1076 jsr166 1.90 * Checks that the threads do not terminate within the default
1077     * millisecond delay of {@code timeoutMillis()}.
1078     */
1079     void assertThreadsStayAlive(Thread... threads) {
1080     assertThreadsStayAlive(timeoutMillis(), threads);
1081     }
1082    
1083     /**
1084     * Checks that the threads do not terminate within the given millisecond delay.
1085     */
1086     void assertThreadsStayAlive(long millis, Thread... threads) {
1087     try {
1088     // No need to optimize the failing case via Thread.join.
1089     delay(millis);
1090     for (Thread thread : threads)
1091     assertTrue(thread.isAlive());
1092 jsr166 1.128 } catch (InterruptedException fail) {
1093 jsr166 1.158 threadFail("Unexpected InterruptedException");
1094 jsr166 1.90 }
1095     }
1096    
1097     /**
1098 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1099     * {@code timeoutMillis()}.
1100     */
1101     void assertFutureTimesOut(Future future) {
1102     assertFutureTimesOut(future, timeoutMillis());
1103     }
1104    
1105     /**
1106     * Checks that future.get times out, with the given millisecond timeout.
1107     */
1108     void assertFutureTimesOut(Future future, long timeoutMillis) {
1109     long startTime = System.nanoTime();
1110     try {
1111     future.get(timeoutMillis, MILLISECONDS);
1112     shouldThrow();
1113     } catch (TimeoutException success) {
1114 jsr166 1.128 } catch (Exception fail) {
1115     threadUnexpectedException(fail);
1116 jsr166 1.83 } finally { future.cancel(true); }
1117     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1118     }
1119    
1120     /**
1121 jsr166 1.53 * Fails with message "should throw exception".
1122 jsr166 1.27 */
1123 dl 1.3 public void shouldThrow() {
1124     fail("Should throw exception");
1125     }
1126    
1127 dl 1.5 /**
1128 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1129 jsr166 1.40 */
1130     public void shouldThrow(String exceptionName) {
1131     fail("Should throw " + exceptionName);
1132     }
1133    
1134     /**
1135 dl 1.1 * The number of elements to place in collections, arrays, etc.
1136     */
1137 jsr166 1.45 public static final int SIZE = 20;
1138 dl 1.1
1139     // Some convenient Integer constants
1140    
1141 jsr166 1.47 public static final Integer zero = new Integer(0);
1142     public static final Integer one = new Integer(1);
1143     public static final Integer two = new Integer(2);
1144     public static final Integer three = new Integer(3);
1145 jsr166 1.45 public static final Integer four = new Integer(4);
1146     public static final Integer five = new Integer(5);
1147 jsr166 1.47 public static final Integer six = new Integer(6);
1148 jsr166 1.45 public static final Integer seven = new Integer(7);
1149     public static final Integer eight = new Integer(8);
1150 jsr166 1.47 public static final Integer nine = new Integer(9);
1151 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1152     public static final Integer m2 = new Integer(-2);
1153     public static final Integer m3 = new Integer(-3);
1154 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1155     public static final Integer m5 = new Integer(-5);
1156     public static final Integer m6 = new Integer(-6);
1157 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1158 dl 1.7
1159     /**
1160 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1161     * the specified permissions. If there is no current security
1162     * manager, the runnable is run twice, both with and without a
1163     * security manager. We require that any security manager permit
1164     * getPolicy/setPolicy.
1165     */
1166     public void runWithPermissions(Runnable r, Permission... permissions) {
1167     SecurityManager sm = System.getSecurityManager();
1168     if (sm == null) {
1169     r.run();
1170 jsr166 1.93 }
1171     runWithSecurityManagerWithPermissions(r, permissions);
1172     }
1173    
1174     /**
1175     * Runs Runnable r with a security policy that permits precisely
1176     * the specified permissions. If there is no current security
1177     * manager, a temporary one is set for the duration of the
1178     * Runnable. We require that any security manager permit
1179     * getPolicy/setPolicy.
1180     */
1181     public void runWithSecurityManagerWithPermissions(Runnable r,
1182     Permission... permissions) {
1183     SecurityManager sm = System.getSecurityManager();
1184     if (sm == null) {
1185 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1186     try {
1187     Policy.setPolicy(permissivePolicy());
1188     System.setSecurityManager(new SecurityManager());
1189 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1190 jsr166 1.49 } finally {
1191     System.setSecurityManager(null);
1192     Policy.setPolicy(savedPolicy);
1193     }
1194     } else {
1195     Policy savedPolicy = Policy.getPolicy();
1196     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1197     Policy.setPolicy(policy);
1198    
1199     try {
1200     r.run();
1201     } finally {
1202     policy.addPermission(new SecurityPermission("setPolicy"));
1203     Policy.setPolicy(savedPolicy);
1204     }
1205     }
1206     }
1207    
1208     /**
1209     * Runs a runnable without any permissions.
1210     */
1211     public void runWithoutPermissions(Runnable r) {
1212     runWithPermissions(r);
1213     }
1214    
1215     /**
1216 dl 1.7 * A security policy where new permissions can be dynamically added
1217     * or all cleared.
1218     */
1219 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1220 dl 1.7 Permissions perms = new Permissions();
1221 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1222     for (Permission permission : permissions)
1223     perms.add(permission);
1224     }
1225 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1226     void clearPermissions() { perms = new Permissions(); }
1227 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1228     return perms;
1229     }
1230     public PermissionCollection getPermissions(ProtectionDomain pd) {
1231     return perms;
1232     }
1233     public boolean implies(ProtectionDomain pd, Permission p) {
1234     return perms.implies(p);
1235     }
1236     public void refresh() {}
1237 jsr166 1.93 public String toString() {
1238 jsr166 1.216 List<Permission> ps = new ArrayList<>();
1239 jsr166 1.93 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1240     ps.add(e.nextElement());
1241     return "AdjustablePolicy with permissions " + ps;
1242     }
1243 dl 1.7 }
1244 dl 1.1
1245 jsr166 1.38 /**
1246 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1247     */
1248     public static Policy permissivePolicy() {
1249     return new AdjustablePolicy
1250     // Permissions j.u.c. needs directly
1251     (new RuntimePermission("modifyThread"),
1252     new RuntimePermission("getClassLoader"),
1253     new RuntimePermission("setContextClassLoader"),
1254     // Permissions needed to change permissions!
1255     new SecurityPermission("getPolicy"),
1256     new SecurityPermission("setPolicy"),
1257     new RuntimePermission("setSecurityManager"),
1258     // Permissions needed by the junit test harness
1259     new RuntimePermission("accessDeclaredMembers"),
1260     new PropertyPermission("*", "read"),
1261     new java.io.FilePermission("<<ALL FILES>>", "read"));
1262     }
1263    
1264     /**
1265 jsr166 1.60 * Sleeps until the given time has elapsed.
1266     * Throws AssertionFailedError if interrupted.
1267     */
1268 jsr166 1.201 static void sleep(long millis) {
1269 jsr166 1.60 try {
1270 dl 1.76 delay(millis);
1271 jsr166 1.128 } catch (InterruptedException fail) {
1272 jsr166 1.60 AssertionFailedError afe =
1273     new AssertionFailedError("Unexpected InterruptedException");
1274 jsr166 1.128 afe.initCause(fail);
1275 jsr166 1.60 throw afe;
1276     }
1277     }
1278    
1279     /**
1280 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1281 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1282     */
1283     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1284 jsr166 1.199 long startTime = 0L;
1285 jsr166 1.65 for (;;) {
1286     Thread.State s = thread.getState();
1287     if (s == Thread.State.BLOCKED ||
1288     s == Thread.State.WAITING ||
1289 jsr166 1.67 s == Thread.State.TIMED_WAITING)
1290 jsr166 1.65 return;
1291 jsr166 1.67 else if (s == Thread.State.TERMINATED)
1292     fail("Unexpected thread termination");
1293 jsr166 1.199 else if (startTime == 0L)
1294     startTime = System.nanoTime();
1295 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1296 jsr166 1.67 threadAssertTrue(thread.isAlive());
1297     return;
1298     }
1299 jsr166 1.65 Thread.yield();
1300     }
1301     }
1302    
1303     /**
1304 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1305     * state: BLOCKED, WAITING, or TIMED_WAITING.
1306     */
1307     void waitForThreadToEnterWaitState(Thread thread) {
1308     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1309     }
1310    
1311     /**
1312 jsr166 1.66 * Returns the number of milliseconds since time given by
1313     * startNanoTime, which must have been previously returned from a
1314 jsr166 1.124 * call to {@link System#nanoTime()}.
1315 jsr166 1.66 */
1316 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1317 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1318     }
1319 jsr166 1.68
1320 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1321     // long startTime = System.nanoTime();
1322     // try {
1323     // r.run();
1324     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1325     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1326     // throw new AssertionFailedError("did not return promptly");
1327     // }
1328    
1329     // void assertTerminatesPromptly(Runnable r) {
1330     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1331     // }
1332    
1333     /**
1334     * Checks that timed f.get() returns the expected value, and does not
1335     * wait for the timeout to elapse before returning.
1336     */
1337     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1338     long startTime = System.nanoTime();
1339     try {
1340     assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1341     } catch (Throwable fail) { threadUnexpectedException(fail); }
1342     if (millisElapsedSince(startTime) > timeoutMillis/2)
1343     throw new AssertionFailedError("timed get did not return promptly");
1344     }
1345    
1346     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1347     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1348     }
1349    
1350 jsr166 1.66 /**
1351 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1352 jsr166 1.38 */
1353     Thread newStartedThread(Runnable runnable) {
1354     Thread t = new Thread(runnable);
1355 jsr166 1.58 t.setDaemon(true);
1356 jsr166 1.38 t.start();
1357     return t;
1358     }
1359 dl 1.1
1360 jsr166 1.59 /**
1361     * Waits for the specified time (in milliseconds) for the thread
1362     * to terminate (using {@link Thread#join(long)}), else interrupts
1363     * the thread (in the hope that it may terminate later) and fails.
1364     */
1365     void awaitTermination(Thread t, long timeoutMillis) {
1366     try {
1367     t.join(timeoutMillis);
1368 jsr166 1.128 } catch (InterruptedException fail) {
1369     threadUnexpectedException(fail);
1370 jsr166 1.59 } finally {
1371 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
1372 jsr166 1.59 t.interrupt();
1373 jsr166 1.177 threadFail("timed out waiting for thread to terminate");
1374 jsr166 1.59 }
1375     }
1376     }
1377    
1378 jsr166 1.75 /**
1379     * Waits for LONG_DELAY_MS milliseconds for the thread to
1380     * terminate (using {@link Thread#join(long)}), else interrupts
1381     * the thread (in the hope that it may terminate later) and fails.
1382     */
1383     void awaitTermination(Thread t) {
1384     awaitTermination(t, LONG_DELAY_MS);
1385     }
1386    
1387 dl 1.1 // Some convenient Runnable classes
1388    
1389 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1390     protected abstract void realRun() throws Throwable;
1391 jsr166 1.35
1392     public final void run() {
1393     try {
1394     realRun();
1395 jsr166 1.128 } catch (Throwable fail) {
1396     threadUnexpectedException(fail);
1397 jsr166 1.35 }
1398     }
1399     }
1400    
1401 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
1402     protected abstract void realRun() throws Throwable;
1403 jsr166 1.40
1404     final Class<?> exceptionClass;
1405    
1406     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1407     this.exceptionClass = exceptionClass;
1408     }
1409    
1410     public final void run() {
1411     try {
1412     realRun();
1413     threadShouldThrow(exceptionClass.getSimpleName());
1414     } catch (Throwable t) {
1415     if (! exceptionClass.isInstance(t))
1416     threadUnexpectedException(t);
1417     }
1418     }
1419     }
1420    
1421 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1422     protected abstract void realRun() throws Throwable;
1423 jsr166 1.40
1424     final Class<?> exceptionClass;
1425    
1426     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1427     this.exceptionClass = exceptionClass;
1428     }
1429    
1430     public final void run() {
1431     try {
1432     realRun();
1433     threadShouldThrow(exceptionClass.getSimpleName());
1434     } catch (Throwable t) {
1435     if (! exceptionClass.isInstance(t))
1436     threadUnexpectedException(t);
1437     }
1438     }
1439     }
1440    
1441 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1442     protected abstract void realRun() throws Throwable;
1443 jsr166 1.35
1444     public final void run() {
1445     try {
1446     realRun();
1447 jsr166 1.40 threadShouldThrow("InterruptedException");
1448 jsr166 1.35 } catch (InterruptedException success) {
1449 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1450 jsr166 1.128 } catch (Throwable fail) {
1451     threadUnexpectedException(fail);
1452 jsr166 1.35 }
1453     }
1454     }
1455    
1456 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1457     protected abstract T realCall() throws Throwable;
1458 jsr166 1.35
1459     public final T call() {
1460     try {
1461     return realCall();
1462 jsr166 1.128 } catch (Throwable fail) {
1463     threadUnexpectedException(fail);
1464 jsr166 1.53 return null;
1465 jsr166 1.35 }
1466 jsr166 1.40 }
1467     }
1468    
1469 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
1470     implements Callable<T> {
1471 jsr166 1.45 protected abstract T realCall() throws Throwable;
1472 jsr166 1.40
1473     public final T call() {
1474     try {
1475     T result = realCall();
1476     threadShouldThrow("InterruptedException");
1477     return result;
1478     } catch (InterruptedException success) {
1479 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1480 jsr166 1.128 } catch (Throwable fail) {
1481     threadUnexpectedException(fail);
1482 jsr166 1.40 }
1483     return null;
1484 jsr166 1.35 }
1485     }
1486    
1487 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1488 dl 1.1 public void run() {}
1489     }
1490    
1491 jsr166 1.45 public static class NoOpCallable implements Callable {
1492 dl 1.1 public Object call() { return Boolean.TRUE; }
1493 dl 1.10 }
1494    
1495 jsr166 1.45 public static final String TEST_STRING = "a test string";
1496 dl 1.10
1497 jsr166 1.45 public static class StringTask implements Callable<String> {
1498 jsr166 1.144 final String value;
1499     public StringTask() { this(TEST_STRING); }
1500     public StringTask(String value) { this.value = value; }
1501     public String call() { return value; }
1502 dl 1.10 }
1503    
1504 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1505     return new CheckedCallable<String>() {
1506 jsr166 1.64 protected String realCall() {
1507 jsr166 1.48 try {
1508     latch.await();
1509     } catch (InterruptedException quittingTime) {}
1510     return TEST_STRING;
1511     }};
1512     }
1513    
1514 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1515     return new CheckedRunnable() {
1516     public void realRun() throws InterruptedException {
1517     latch.countDown();
1518     }};
1519     }
1520    
1521 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1522 jsr166 1.162 static final int NEW = 0;
1523     static final int RUNNING = 1;
1524     static final int DONE = 2;
1525 jsr166 1.161 final CountDownLatch latch;
1526     int state = NEW;
1527     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1528     public void realRun() throws InterruptedException {
1529     state = 1;
1530     await(latch);
1531     state = 2;
1532     }
1533     }
1534 jsr166 1.162
1535 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1536     return new LatchAwaiter(latch);
1537 jsr166 1.73 }
1538    
1539 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1540 jsr166 1.79 try {
1541 jsr166 1.188 if (!latch.await(timeoutMillis, MILLISECONDS))
1542 jsr166 1.176 fail("timed out waiting for CountDownLatch for "
1543 jsr166 1.188 + (timeoutMillis/1000) + " sec");
1544 jsr166 1.128 } catch (Throwable fail) {
1545     threadUnexpectedException(fail);
1546 jsr166 1.79 }
1547     }
1548    
1549 jsr166 1.188 public void await(CountDownLatch latch) {
1550     await(latch, LONG_DELAY_MS);
1551     }
1552    
1553 jsr166 1.89 public void await(Semaphore semaphore) {
1554     try {
1555 jsr166 1.176 if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
1556     fail("timed out waiting for Semaphore for "
1557     + (LONG_DELAY_MS/1000) + " sec");
1558 jsr166 1.128 } catch (Throwable fail) {
1559     threadUnexpectedException(fail);
1560 jsr166 1.89 }
1561     }
1562    
1563 jsr166 1.81 // /**
1564     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1565     // */
1566     // public void await(AtomicBoolean flag) {
1567     // await(flag, LONG_DELAY_MS);
1568     // }
1569    
1570     // /**
1571     // * Spin-waits up to the specified timeout until flag becomes true.
1572     // */
1573     // public void await(AtomicBoolean flag, long timeoutMillis) {
1574     // long startTime = System.nanoTime();
1575     // while (!flag.get()) {
1576     // if (millisElapsedSince(startTime) > timeoutMillis)
1577     // throw new AssertionFailedError("timed out");
1578     // Thread.yield();
1579     // }
1580     // }
1581    
1582 jsr166 1.45 public static class NPETask implements Callable<String> {
1583 dl 1.10 public String call() { throw new NullPointerException(); }
1584     }
1585    
1586 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
1587 dl 1.10 public Integer call() { return one; }
1588 dl 1.1 }
1589    
1590 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1591     protected void realRun() throws Throwable {
1592 dl 1.76 delay(SHORT_DELAY_MS);
1593 dl 1.1 }
1594     }
1595    
1596 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1597     protected void realRun() throws InterruptedException {
1598 dl 1.76 delay(SHORT_DELAY_MS);
1599 dl 1.1 }
1600     }
1601    
1602 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1603     protected void realRun() throws Throwable {
1604 dl 1.76 delay(SMALL_DELAY_MS);
1605 dl 1.1 }
1606     }
1607    
1608 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1609     protected void realRun() {
1610 dl 1.6 try {
1611 dl 1.76 delay(SMALL_DELAY_MS);
1612 jsr166 1.44 } catch (InterruptedException ok) {}
1613 dl 1.6 }
1614     }
1615    
1616 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1617     protected Object realCall() throws InterruptedException {
1618 dl 1.76 delay(SMALL_DELAY_MS);
1619 dl 1.1 return Boolean.TRUE;
1620     }
1621     }
1622    
1623 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1624     protected void realRun() throws Throwable {
1625 dl 1.76 delay(MEDIUM_DELAY_MS);
1626 dl 1.1 }
1627     }
1628    
1629 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1630     protected void realRun() throws InterruptedException {
1631 dl 1.76 delay(MEDIUM_DELAY_MS);
1632 dl 1.1 }
1633     }
1634    
1635 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1636     return new CheckedRunnable() {
1637     protected void realRun() {
1638     try {
1639 dl 1.76 delay(timeoutMillis);
1640 jsr166 1.63 } catch (InterruptedException ok) {}
1641     }};
1642     }
1643    
1644 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1645     protected void realRun() {
1646 dl 1.1 try {
1647 dl 1.76 delay(MEDIUM_DELAY_MS);
1648 jsr166 1.44 } catch (InterruptedException ok) {}
1649 dl 1.1 }
1650     }
1651 dl 1.5
1652 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1653     protected void realRun() {
1654 dl 1.12 try {
1655 dl 1.76 delay(LONG_DELAY_MS);
1656 jsr166 1.44 } catch (InterruptedException ok) {}
1657 dl 1.12 }
1658     }
1659    
1660 dl 1.5 /**
1661     * For use as ThreadFactory in constructors
1662     */
1663 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1664 jsr166 1.33 public Thread newThread(Runnable r) {
1665 dl 1.5 return new Thread(r);
1666 jsr166 1.27 }
1667 dl 1.5 }
1668    
1669 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1670     boolean isDone();
1671     }
1672    
1673     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1674     return new TrackedRunnable() {
1675     private volatile boolean done = false;
1676     public boolean isDone() { return done; }
1677     public void run() {
1678     try {
1679 dl 1.76 delay(timeoutMillis);
1680 jsr166 1.61 done = true;
1681     } catch (InterruptedException ok) {}
1682     }
1683     };
1684     }
1685    
1686 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1687     public volatile boolean done = false;
1688 dl 1.5 public void run() {
1689     try {
1690 dl 1.76 delay(SHORT_DELAY_MS);
1691 jsr166 1.61 done = true;
1692     } catch (InterruptedException ok) {}
1693     }
1694     }
1695    
1696     public static class TrackedSmallRunnable implements Runnable {
1697     public volatile boolean done = false;
1698     public void run() {
1699     try {
1700 dl 1.76 delay(SMALL_DELAY_MS);
1701 dl 1.5 done = true;
1702 jsr166 1.44 } catch (InterruptedException ok) {}
1703 dl 1.6 }
1704     }
1705    
1706 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1707     public volatile boolean done = false;
1708 dl 1.6 public void run() {
1709     try {
1710 dl 1.76 delay(MEDIUM_DELAY_MS);
1711 dl 1.6 done = true;
1712 jsr166 1.44 } catch (InterruptedException ok) {}
1713 dl 1.6 }
1714     }
1715    
1716 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1717     public volatile boolean done = false;
1718 dl 1.6 public void run() {
1719     try {
1720 dl 1.76 delay(LONG_DELAY_MS);
1721 dl 1.6 done = true;
1722 jsr166 1.44 } catch (InterruptedException ok) {}
1723 dl 1.6 }
1724     }
1725    
1726 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1727     public volatile boolean done = false;
1728 dl 1.6 public void run() {
1729     done = true;
1730 dl 1.5 }
1731     }
1732    
1733 jsr166 1.45 public static class TrackedCallable implements Callable {
1734     public volatile boolean done = false;
1735 dl 1.5 public Object call() {
1736     try {
1737 dl 1.76 delay(SMALL_DELAY_MS);
1738 dl 1.5 done = true;
1739 jsr166 1.44 } catch (InterruptedException ok) {}
1740 dl 1.5 return Boolean.TRUE;
1741     }
1742     }
1743 dl 1.14
1744 jsr166 1.53 /**
1745     * Analog of CheckedRunnable for RecursiveAction
1746     */
1747     public abstract class CheckedRecursiveAction extends RecursiveAction {
1748     protected abstract void realCompute() throws Throwable;
1749    
1750 jsr166 1.108 @Override protected final void compute() {
1751 jsr166 1.53 try {
1752     realCompute();
1753 jsr166 1.128 } catch (Throwable fail) {
1754     threadUnexpectedException(fail);
1755 jsr166 1.53 }
1756     }
1757     }
1758    
1759     /**
1760     * Analog of CheckedCallable for RecursiveTask
1761     */
1762     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1763     protected abstract T realCompute() throws Throwable;
1764    
1765 jsr166 1.108 @Override protected final T compute() {
1766 jsr166 1.53 try {
1767     return realCompute();
1768 jsr166 1.128 } catch (Throwable fail) {
1769     threadUnexpectedException(fail);
1770 jsr166 1.53 return null;
1771     }
1772     }
1773     }
1774 dl 1.5
1775     /**
1776     * For use as RejectedExecutionHandler in constructors
1777     */
1778 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1779 jsr166 1.35 public void rejectedExecution(Runnable r,
1780     ThreadPoolExecutor executor) {}
1781 dl 1.5 }
1782 jsr166 1.27
1783 jsr166 1.60 /**
1784 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1785     * AssertionFailedErrors instead of throwing checked exceptions.
1786 jsr166 1.60 */
1787 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1788 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1789    
1790     public int await() {
1791     try {
1792 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1793 jsr166 1.128 } catch (TimeoutException timedOut) {
1794 jsr166 1.86 throw new AssertionFailedError("timed out");
1795 jsr166 1.128 } catch (Exception fail) {
1796 jsr166 1.60 AssertionFailedError afe =
1797 jsr166 1.128 new AssertionFailedError("Unexpected exception: " + fail);
1798     afe.initCause(fail);
1799 jsr166 1.60 throw afe;
1800     }
1801     }
1802     }
1803    
1804 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1805 jsr166 1.72 try {
1806     assertTrue(q.isEmpty());
1807     assertEquals(0, q.size());
1808     assertNull(q.peek());
1809     assertNull(q.poll());
1810     assertNull(q.poll(0, MILLISECONDS));
1811     assertEquals(q.toString(), "[]");
1812     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1813     assertFalse(q.iterator().hasNext());
1814     try {
1815     q.element();
1816     shouldThrow();
1817     } catch (NoSuchElementException success) {}
1818     try {
1819     q.iterator().next();
1820     shouldThrow();
1821     } catch (NoSuchElementException success) {}
1822     try {
1823     q.remove();
1824     shouldThrow();
1825     } catch (NoSuchElementException success) {}
1826 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1827 jsr166 1.72 }
1828    
1829 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1830     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1831     }
1832    
1833     void assertNotSerialEquals(Object x, Object y) {
1834     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1835     }
1836    
1837     byte[] serialBytes(Object o) {
1838 jsr166 1.79 try {
1839     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1840     ObjectOutputStream oos = new ObjectOutputStream(bos);
1841     oos.writeObject(o);
1842     oos.flush();
1843     oos.close();
1844 jsr166 1.91 return bos.toByteArray();
1845 jsr166 1.128 } catch (Throwable fail) {
1846     threadUnexpectedException(fail);
1847 jsr166 1.91 return new byte[0];
1848     }
1849     }
1850    
1851 jsr166 1.210 void assertImmutable(final Object o) {
1852 jsr166 1.208 if (o instanceof Collection) {
1853     assertThrows(
1854     UnsupportedOperationException.class,
1855     new Runnable() { public void run() {
1856     ((Collection) o).add(null);}});
1857     }
1858     }
1859 jsr166 1.209
1860 jsr166 1.91 @SuppressWarnings("unchecked")
1861     <T> T serialClone(T o) {
1862     try {
1863 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1864 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1865 jsr166 1.87 T clone = (T) ois.readObject();
1866 jsr166 1.208 if (o == clone) assertImmutable(o);
1867 jsr166 1.87 assertSame(o.getClass(), clone.getClass());
1868     return clone;
1869 jsr166 1.128 } catch (Throwable fail) {
1870     threadUnexpectedException(fail);
1871 jsr166 1.79 return null;
1872     }
1873     }
1874 jsr166 1.106
1875 jsr166 1.208 /**
1876 jsr166 1.211 * A version of serialClone that leaves error handling (for
1877     * e.g. NotSerializableException) up to the caller.
1878     */
1879     @SuppressWarnings("unchecked")
1880     <T> T serialClonePossiblyFailing(T o)
1881     throws ReflectiveOperationException, java.io.IOException {
1882     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1883     ObjectOutputStream oos = new ObjectOutputStream(bos);
1884     oos.writeObject(o);
1885     oos.flush();
1886     oos.close();
1887     ObjectInputStream ois = new ObjectInputStream
1888     (new ByteArrayInputStream(bos.toByteArray()));
1889     T clone = (T) ois.readObject();
1890     if (o == clone) assertImmutable(o);
1891     assertSame(o.getClass(), clone.getClass());
1892     return clone;
1893     }
1894    
1895     /**
1896 jsr166 1.208 * If o implements Cloneable and has a public clone method,
1897     * returns a clone of o, else null.
1898     */
1899     @SuppressWarnings("unchecked")
1900     <T> T cloneableClone(T o) {
1901     if (!(o instanceof Cloneable)) return null;
1902     final T clone;
1903     try {
1904     clone = (T) o.getClass().getMethod("clone").invoke(o);
1905     } catch (NoSuchMethodException ok) {
1906     return null;
1907     } catch (ReflectiveOperationException unexpected) {
1908     throw new Error(unexpected);
1909     }
1910     assertNotSame(o, clone); // not 100% guaranteed by spec
1911     assertSame(o.getClass(), clone.getClass());
1912     return clone;
1913     }
1914    
1915 jsr166 1.106 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1916     Runnable... throwingActions) {
1917     for (Runnable throwingAction : throwingActions) {
1918     boolean threw = false;
1919     try { throwingAction.run(); }
1920     catch (Throwable t) {
1921     threw = true;
1922     if (!expectedExceptionClass.isInstance(t)) {
1923     AssertionFailedError afe =
1924     new AssertionFailedError
1925     ("Expected " + expectedExceptionClass.getName() +
1926     ", got " + t.getClass().getName());
1927     afe.initCause(t);
1928     threadUnexpectedException(afe);
1929     }
1930     }
1931     if (!threw)
1932     shouldThrow(expectedExceptionClass.getName());
1933     }
1934     }
1935 jsr166 1.126
1936     public void assertIteratorExhausted(Iterator<?> it) {
1937     try {
1938     it.next();
1939     shouldThrow();
1940     } catch (NoSuchElementException success) {}
1941     assertFalse(it.hasNext());
1942 jsr166 1.127 }
1943 jsr166 1.191
1944     public <T> Callable<T> callableThrowing(final Exception ex) {
1945     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1946     }
1947    
1948     public Runnable runnableThrowing(final RuntimeException ex) {
1949     return new Runnable() { public void run() { throw ex; }};
1950     }
1951 jsr166 1.193
1952     /** A reusable thread pool to be shared by tests. */
1953     static final ExecutorService cachedThreadPool =
1954     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1955     1000L, MILLISECONDS,
1956     new SynchronousQueue<Runnable>());
1957    
1958 jsr166 1.200 static <T> void shuffle(T[] array) {
1959     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1960     }
1961 dl 1.1 }