ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.252
Committed: Thu Jan 10 04:35:16 2019 UTC (5 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.251: +6 -0 lines
Log Message:
add support for java 17

File Contents

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