ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.259
Committed: Thu Aug 22 22:27:57 2019 UTC (4 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.258: +5 -5 lines
Log Message:
whitespace

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