ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.261
Committed: Thu Sep 5 20:51:26 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.260: +19 -7 lines
Log Message:
Improve error reporting in awaitTermination(Thread); introduce LONGER_DELAY_MS

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.261 /**
661     * A delay significantly longer than LONG_DELAY_MS.
662     * Use this in a thread that is waited for via awaitTermination(Thread).
663     */
664     public static long LONGER_DELAY_MS;
665    
666 jsr166 1.232 private static final long RANDOM_TIMEOUT;
667     private static final long RANDOM_EXPIRED_TIMEOUT;
668     private static final TimeUnit RANDOM_TIMEUNIT;
669     static {
670     ThreadLocalRandom rnd = ThreadLocalRandom.current();
671     long[] timeouts = { Long.MIN_VALUE, -1, 0, 1, Long.MAX_VALUE };
672     RANDOM_TIMEOUT = timeouts[rnd.nextInt(timeouts.length)];
673     RANDOM_EXPIRED_TIMEOUT = timeouts[rnd.nextInt(3)];
674     TimeUnit[] timeUnits = TimeUnit.values();
675     RANDOM_TIMEUNIT = timeUnits[rnd.nextInt(timeUnits.length)];
676     }
677    
678     /**
679     * Returns a timeout for use when any value at all will do.
680     */
681     static long randomTimeout() { return RANDOM_TIMEOUT; }
682    
683     /**
684     * Returns a timeout that means "no waiting", i.e. not positive.
685     */
686     static long randomExpiredTimeout() { return RANDOM_EXPIRED_TIMEOUT; }
687    
688     /**
689     * Returns a random non-null TimeUnit.
690     */
691     static TimeUnit randomTimeUnit() { return RANDOM_TIMEUNIT; }
692    
693 dl 1.2 /**
694 jsr166 1.256 * Returns a random boolean; a "coin flip".
695     */
696     static boolean randomBoolean() {
697     return ThreadLocalRandom.current().nextBoolean();
698     }
699    
700     /**
701 jsr166 1.257 * Returns a random element from given choices.
702     */
703     <T> T chooseRandomly(T... choices) {
704     return choices[ThreadLocalRandom.current().nextInt(choices.length)];
705     }
706    
707     /**
708 jsr166 1.181 * Returns the shortest timed delay. This can be scaled up for
709 jsr166 1.185 * slow machines using the jsr166.delay.factor system property,
710 jsr166 1.187 * or via jtreg's -timeoutFactor: flag.
711 jsr166 1.185 * http://openjdk.java.net/jtreg/command-help.html
712 jsr166 1.27 */
713 dl 1.2 protected long getShortDelay() {
714 jsr166 1.189 return (long) (50 * delayFactor);
715 dl 1.2 }
716    
717     /**
718 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
719 dl 1.2 */
720 jsr166 1.43 protected void setDelays() {
721 dl 1.2 SHORT_DELAY_MS = getShortDelay();
722 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
723 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
724 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
725 jsr166 1.261 LONGER_DELAY_MS = 2 * LONG_DELAY_MS;
726 dl 1.2 }
727    
728 jsr166 1.223 private static final long TIMEOUT_DELAY_MS
729     = (long) (12.0 * Math.cbrt(delayFactor));
730    
731 dl 1.1 /**
732 jsr166 1.223 * Returns a timeout in milliseconds to be used in tests that verify
733     * that operations block or time out. We want this to be longer
734     * than the OS scheduling quantum, but not too long, so don't scale
735     * linearly with delayFactor; we use "crazy" cube root instead.
736 jsr166 1.81 */
737 jsr166 1.223 static long timeoutMillis() {
738     return TIMEOUT_DELAY_MS;
739 jsr166 1.81 }
740    
741     /**
742 jsr166 1.135 * Returns a new Date instance representing a time at least
743     * delayMillis milliseconds in the future.
744 jsr166 1.81 */
745     Date delayedDate(long delayMillis) {
746 jsr166 1.135 // Add 1 because currentTimeMillis is known to round into the past.
747     return new Date(System.currentTimeMillis() + delayMillis + 1);
748 jsr166 1.81 }
749    
750     /**
751 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
752 dl 1.1 */
753 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
754 jsr166 1.216 = new AtomicReference<>(null);
755 dl 1.1
756     /**
757 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
758     * harness thread, triggering a test case failure. Only the first
759     * failure is recorded; subsequent calls to this method from within
760     * the same test have no effect.
761 dl 1.1 */
762 jsr166 1.53 public void threadRecordFailure(Throwable t) {
763 jsr166 1.158 System.err.println(t);
764 jsr166 1.260 if (threadFailure.compareAndSet(null, t))
765     dumpTestThreads();
766 jsr166 1.53 }
767    
768 jsr166 1.27 public void setUp() {
769 dl 1.2 setDelays();
770 dl 1.1 }
771    
772 jsr166 1.146 void tearDownFail(String format, Object... args) {
773     String msg = toString() + ": " + String.format(format, args);
774     System.err.println(msg);
775 jsr166 1.156 dumpTestThreads();
776 jsr166 1.239 throw new AssertionError(msg);
777 jsr166 1.146 }
778    
779 dl 1.1 /**
780 jsr166 1.85 * Extra checks that get done for all test cases.
781     *
782 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
783     * by rethrowing, in the test harness thread, any exception recorded
784     * earlier by threadRecordFailure.
785 jsr166 1.85 *
786     * Triggers test case failure if interrupt status is set in the main thread.
787 jsr166 1.53 */
788     public void tearDown() throws Exception {
789 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
790 jsr166 1.53 if (t != null) {
791     if (t instanceof Error)
792     throw (Error) t;
793     else if (t instanceof RuntimeException)
794     throw (RuntimeException) t;
795     else if (t instanceof Exception)
796     throw (Exception) t;
797 jsr166 1.239 else
798     throw new AssertionError(t.toString(), t);
799 jsr166 1.53 }
800 jsr166 1.85
801     if (Thread.interrupted())
802 jsr166 1.146 tearDownFail("interrupt status set in main thread");
803 jsr166 1.100
804     checkForkJoinPoolThreadLeaks();
805 dl 1.1 }
806    
807 dl 1.5 /**
808 jsr166 1.164 * Finds missing PoolCleaners
809 jsr166 1.100 */
810     void checkForkJoinPoolThreadLeaks() throws InterruptedException {
811 jsr166 1.146 Thread[] survivors = new Thread[7];
812 jsr166 1.100 int count = Thread.enumerate(survivors);
813     for (int i = 0; i < count; i++) {
814     Thread thread = survivors[i];
815     String name = thread.getName();
816     if (name.startsWith("ForkJoinPool-")) {
817     // give thread some time to terminate
818     thread.join(LONG_DELAY_MS);
819 jsr166 1.146 if (thread.isAlive())
820     tearDownFail("Found leaked ForkJoinPool thread thread=%s",
821     thread);
822 jsr166 1.100 }
823     }
824 jsr166 1.146
825     if (!ForkJoinPool.commonPool()
826     .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
827     tearDownFail("ForkJoin common pool thread stuck");
828 jsr166 1.100 }
829 jsr166 1.101
830 jsr166 1.100 /**
831 jsr166 1.53 * Just like fail(reason), but additionally recording (using
832 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
833     * current testcase will fail.
834 jsr166 1.27 */
835 dl 1.1 public void threadFail(String reason) {
836 jsr166 1.53 try {
837     fail(reason);
838 jsr166 1.239 } catch (AssertionError fail) {
839     threadRecordFailure(fail);
840     throw fail;
841 jsr166 1.53 }
842 dl 1.1 }
843    
844 dl 1.5 /**
845 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
846 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
847     * current testcase will fail.
848 jsr166 1.27 */
849 dl 1.1 public void threadAssertTrue(boolean b) {
850 jsr166 1.53 try {
851 dl 1.1 assertTrue(b);
852 jsr166 1.239 } catch (AssertionError fail) {
853     threadRecordFailure(fail);
854     throw fail;
855 dl 1.1 }
856     }
857 dl 1.5
858     /**
859 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
860 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
861     * current testcase will fail.
862 jsr166 1.27 */
863 dl 1.1 public void threadAssertFalse(boolean b) {
864 jsr166 1.53 try {
865 dl 1.1 assertFalse(b);
866 jsr166 1.239 } catch (AssertionError fail) {
867     threadRecordFailure(fail);
868     throw fail;
869 dl 1.1 }
870     }
871 dl 1.5
872     /**
873 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
874 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
875     * current testcase will fail.
876 jsr166 1.27 */
877 dl 1.1 public void threadAssertNull(Object x) {
878 jsr166 1.53 try {
879 dl 1.1 assertNull(x);
880 jsr166 1.239 } catch (AssertionError fail) {
881     threadRecordFailure(fail);
882     throw fail;
883 dl 1.1 }
884     }
885 dl 1.5
886     /**
887 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
888 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
889     * current testcase will fail.
890 jsr166 1.27 */
891 dl 1.1 public void threadAssertEquals(long x, long y) {
892 jsr166 1.53 try {
893 dl 1.1 assertEquals(x, y);
894 jsr166 1.239 } catch (AssertionError fail) {
895     threadRecordFailure(fail);
896     throw fail;
897 dl 1.1 }
898     }
899 dl 1.5
900     /**
901 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
902 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
903     * current testcase will fail.
904 jsr166 1.27 */
905 dl 1.1 public void threadAssertEquals(Object x, Object y) {
906 jsr166 1.53 try {
907 dl 1.1 assertEquals(x, y);
908 jsr166 1.239 } catch (AssertionError fail) {
909 jsr166 1.129 threadRecordFailure(fail);
910     throw fail;
911     } catch (Throwable fail) {
912     threadUnexpectedException(fail);
913 dl 1.1 }
914     }
915    
916 dl 1.5 /**
917 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
918 jsr166 1.239 * threadRecordFailure) any AssertionError thrown, so that the
919     * current testcase will fail.
920 jsr166 1.52 */
921     public void threadAssertSame(Object x, Object y) {
922 jsr166 1.53 try {
923 jsr166 1.52 assertSame(x, y);
924 jsr166 1.239 } catch (AssertionError fail) {
925 jsr166 1.129 threadRecordFailure(fail);
926     throw fail;
927 jsr166 1.52 }
928     }
929    
930     /**
931 jsr166 1.53 * Calls threadFail with message "should throw exception".
932 jsr166 1.33 */
933 dl 1.3 public void threadShouldThrow() {
934 jsr166 1.53 threadFail("should throw exception");
935 dl 1.3 }
936    
937 dl 1.5 /**
938 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
939 jsr166 1.40 */
940     public void threadShouldThrow(String exceptionName) {
941 jsr166 1.53 threadFail("should throw " + exceptionName);
942 dl 1.3 }
943    
944 dl 1.31 /**
945 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
946 jsr166 1.239 * then rethrows the exception, wrapping it in an AssertionError
947     * if necessary.
948 dl 1.31 */
949 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
950     threadRecordFailure(t);
951     t.printStackTrace();
952     if (t instanceof RuntimeException)
953     throw (RuntimeException) t;
954     else if (t instanceof Error)
955     throw (Error) t;
956 jsr166 1.239 else
957     throw new AssertionError("unexpected exception: " + t, t);
958 dl 1.31 }
959 dl 1.3
960 dl 1.1 /**
961 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
962 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
963 jsr166 1.163 * until time elapses. Ensures that the given time, as measured
964     * by System.nanoTime(), has elapsed.
965 dl 1.76 */
966 jsr166 1.81 static void delay(long millis) throws InterruptedException {
967 jsr166 1.163 long nanos = millis * (1000 * 1000);
968     final long wakeupTime = System.nanoTime() + nanos;
969     do {
970 jsr166 1.80 if (millis > 0L)
971     Thread.sleep(millis);
972 dl 1.76 else // too short to sleep
973     Thread.yield();
974 jsr166 1.163 nanos = wakeupTime - System.nanoTime();
975     millis = nanos / (1000 * 1000);
976     } while (nanos >= 0L);
977 dl 1.76 }
978    
979     /**
980 jsr166 1.149 * Allows use of try-with-resources with per-test thread pools.
981     */
982 jsr166 1.160 class PoolCleaner implements AutoCloseable {
983     private final ExecutorService pool;
984     public PoolCleaner(ExecutorService pool) { this.pool = pool; }
985 jsr166 1.149 public void close() { joinPool(pool); }
986     }
987    
988 jsr166 1.166 /**
989     * An extension of PoolCleaner that has an action to release the pool.
990     */
991     class PoolCleanerWithReleaser extends PoolCleaner {
992     private final Runnable releaser;
993     public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
994     super(pool);
995     this.releaser = releaser;
996     }
997     public void close() {
998     try {
999     releaser.run();
1000     } finally {
1001     super.close();
1002     }
1003     }
1004     }
1005    
1006 jsr166 1.160 PoolCleaner cleaner(ExecutorService pool) {
1007     return new PoolCleaner(pool);
1008 jsr166 1.159 }
1009    
1010 jsr166 1.166 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
1011     return new PoolCleanerWithReleaser(pool, releaser);
1012     }
1013    
1014     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
1015     return new PoolCleanerWithReleaser(pool, releaser(latch));
1016     }
1017    
1018     Runnable releaser(final CountDownLatch latch) {
1019     return new Runnable() { public void run() {
1020     do { latch.countDown(); }
1021     while (latch.getCount() > 0);
1022     }};
1023     }
1024    
1025 jsr166 1.185 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
1026     return new PoolCleanerWithReleaser(pool, releaser(flag));
1027     }
1028    
1029     Runnable releaser(final AtomicBoolean flag) {
1030     return new Runnable() { public void run() { flag.set(true); }};
1031     }
1032    
1033 jsr166 1.149 /**
1034 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
1035 dl 1.1 */
1036 jsr166 1.158 void joinPool(ExecutorService pool) {
1037 dl 1.1 try {
1038 jsr166 1.139 pool.shutdown();
1039 jsr166 1.158 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
1040     try {
1041     threadFail("ExecutorService " + pool +
1042     " did not terminate in a timely manner");
1043     } finally {
1044     // last resort, for the benefit of subsequent tests
1045     pool.shutdownNow();
1046 jsr166 1.167 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
1047 jsr166 1.158 }
1048     }
1049 jsr166 1.33 } catch (SecurityException ok) {
1050 dl 1.22 // Allowed in case test doesn't have privs
1051 jsr166 1.128 } catch (InterruptedException fail) {
1052 jsr166 1.158 threadFail("Unexpected InterruptedException");
1053 dl 1.1 }
1054     }
1055    
1056 jsr166 1.197 /**
1057     * Like Runnable, but with the freedom to throw anything.
1058     * junit folks had the same idea:
1059     * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
1060     */
1061 jsr166 1.141 interface Action { public void run() throws Throwable; }
1062 jsr166 1.139
1063     /**
1064 jsr166 1.141 * Runs all the given actions in parallel, failing if any fail.
1065 jsr166 1.139 * Useful for running multiple variants of tests that are
1066     * necessarily individually slow because they must block.
1067     */
1068 jsr166 1.141 void testInParallel(Action ... actions) {
1069 jsr166 1.160 ExecutorService pool = Executors.newCachedThreadPool();
1070     try (PoolCleaner cleaner = cleaner(pool)) {
1071 jsr166 1.141 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
1072     for (final Action action : actions)
1073 jsr166 1.139 futures.add(pool.submit(new CheckedRunnable() {
1074 jsr166 1.141 public void realRun() throws Throwable { action.run();}}));
1075 jsr166 1.139 for (Future<?> future : futures)
1076     try {
1077     assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
1078     } catch (ExecutionException ex) {
1079     threadUnexpectedException(ex.getCause());
1080     } catch (Exception ex) {
1081     threadUnexpectedException(ex);
1082     }
1083     }
1084     }
1085    
1086 jsr166 1.78 /**
1087 jsr166 1.156 * A debugging tool to print stack traces of most threads, as jstack does.
1088 jsr166 1.150 * Uninteresting threads are filtered out.
1089 jsr166 1.95 */
1090 jsr166 1.156 static void dumpTestThreads() {
1091 jsr166 1.195 SecurityManager sm = System.getSecurityManager();
1092     if (sm != null) {
1093     try {
1094     System.setSecurityManager(null);
1095     } catch (SecurityException giveUp) {
1096     return;
1097     }
1098     }
1099    
1100 jsr166 1.150 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1101     System.err.println("------ stacktrace dump start ------");
1102     for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1103 jsr166 1.203 final String name = info.getThreadName();
1104     String lockName;
1105 jsr166 1.150 if ("Signal Dispatcher".equals(name))
1106     continue;
1107     if ("Reference Handler".equals(name)
1108 jsr166 1.203 && (lockName = info.getLockName()) != null
1109     && lockName.startsWith("java.lang.ref.Reference$Lock"))
1110 jsr166 1.150 continue;
1111     if ("Finalizer".equals(name)
1112 jsr166 1.203 && (lockName = info.getLockName()) != null
1113     && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1114 jsr166 1.150 continue;
1115 jsr166 1.156 if ("checkForWedgedTest".equals(name))
1116     continue;
1117 jsr166 1.96 System.err.print(info);
1118 jsr166 1.150 }
1119     System.err.println("------ stacktrace dump end ------");
1120 jsr166 1.195
1121     if (sm != null) System.setSecurityManager(sm);
1122 jsr166 1.95 }
1123    
1124     /**
1125 jsr166 1.224 * Checks that thread eventually enters the expected blocked thread state.
1126     */
1127     void assertThreadBlocks(Thread thread, Thread.State expected) {
1128 jsr166 1.228 // always sleep at least 1 ms, with high probability avoiding
1129     // transitory states
1130 jsr166 1.225 for (long retries = LONG_DELAY_MS * 3 / 4; retries-->0; ) {
1131 jsr166 1.224 try { delay(1); }
1132     catch (InterruptedException fail) {
1133 jsr166 1.240 throw new AssertionError("Unexpected InterruptedException", fail);
1134 jsr166 1.224 }
1135     Thread.State s = thread.getState();
1136     if (s == expected)
1137     return;
1138     else if (s == Thread.State.TERMINATED)
1139     fail("Unexpected thread termination");
1140     }
1141     fail("timed out waiting for thread to enter thread state " + expected);
1142     }
1143    
1144     /**
1145 jsr166 1.83 * Checks that future.get times out, with the default timeout of
1146     * {@code timeoutMillis()}.
1147     */
1148     void assertFutureTimesOut(Future future) {
1149     assertFutureTimesOut(future, timeoutMillis());
1150     }
1151    
1152     /**
1153     * Checks that future.get times out, with the given millisecond timeout.
1154     */
1155     void assertFutureTimesOut(Future future, long timeoutMillis) {
1156     long startTime = System.nanoTime();
1157     try {
1158     future.get(timeoutMillis, MILLISECONDS);
1159     shouldThrow();
1160     } catch (TimeoutException success) {
1161 jsr166 1.128 } catch (Exception fail) {
1162     threadUnexpectedException(fail);
1163 jsr166 1.83 } finally { future.cancel(true); }
1164     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1165     }
1166    
1167     /**
1168 jsr166 1.53 * Fails with message "should throw exception".
1169 jsr166 1.27 */
1170 dl 1.3 public void shouldThrow() {
1171     fail("Should throw exception");
1172     }
1173    
1174 dl 1.5 /**
1175 jsr166 1.53 * Fails with message "should throw " + exceptionName.
1176 jsr166 1.40 */
1177     public void shouldThrow(String exceptionName) {
1178     fail("Should throw " + exceptionName);
1179     }
1180    
1181     /**
1182 jsr166 1.222 * The maximum number of consecutive spurious wakeups we should
1183     * tolerate (from APIs like LockSupport.park) before failing a test.
1184     */
1185     static final int MAX_SPURIOUS_WAKEUPS = 10;
1186    
1187     /**
1188 dl 1.1 * The number of elements to place in collections, arrays, etc.
1189     */
1190 jsr166 1.45 public static final int SIZE = 20;
1191 dl 1.1
1192     // Some convenient Integer constants
1193    
1194 jsr166 1.47 public static final Integer zero = new Integer(0);
1195     public static final Integer one = new Integer(1);
1196     public static final Integer two = new Integer(2);
1197     public static final Integer three = new Integer(3);
1198 jsr166 1.45 public static final Integer four = new Integer(4);
1199     public static final Integer five = new Integer(5);
1200 jsr166 1.47 public static final Integer six = new Integer(6);
1201 jsr166 1.45 public static final Integer seven = new Integer(7);
1202     public static final Integer eight = new Integer(8);
1203 jsr166 1.47 public static final Integer nine = new Integer(9);
1204 jsr166 1.45 public static final Integer m1 = new Integer(-1);
1205     public static final Integer m2 = new Integer(-2);
1206     public static final Integer m3 = new Integer(-3);
1207 jsr166 1.47 public static final Integer m4 = new Integer(-4);
1208     public static final Integer m5 = new Integer(-5);
1209     public static final Integer m6 = new Integer(-6);
1210 jsr166 1.45 public static final Integer m10 = new Integer(-10);
1211 dl 1.7
1212     /**
1213 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
1214     * the specified permissions. If there is no current security
1215     * manager, the runnable is run twice, both with and without a
1216     * security manager. We require that any security manager permit
1217     * getPolicy/setPolicy.
1218     */
1219     public void runWithPermissions(Runnable r, Permission... permissions) {
1220     SecurityManager sm = System.getSecurityManager();
1221     if (sm == null) {
1222     r.run();
1223 jsr166 1.93 }
1224     runWithSecurityManagerWithPermissions(r, permissions);
1225     }
1226    
1227     /**
1228     * Runs Runnable r with a security policy that permits precisely
1229     * the specified permissions. If there is no current security
1230     * manager, a temporary one is set for the duration of the
1231     * Runnable. We require that any security manager permit
1232     * getPolicy/setPolicy.
1233     */
1234     public void runWithSecurityManagerWithPermissions(Runnable r,
1235     Permission... permissions) {
1236     SecurityManager sm = System.getSecurityManager();
1237     if (sm == null) {
1238 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
1239     try {
1240     Policy.setPolicy(permissivePolicy());
1241     System.setSecurityManager(new SecurityManager());
1242 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
1243 jsr166 1.49 } finally {
1244     System.setSecurityManager(null);
1245     Policy.setPolicy(savedPolicy);
1246     }
1247     } else {
1248     Policy savedPolicy = Policy.getPolicy();
1249     AdjustablePolicy policy = new AdjustablePolicy(permissions);
1250     Policy.setPolicy(policy);
1251    
1252     try {
1253     r.run();
1254     } finally {
1255     policy.addPermission(new SecurityPermission("setPolicy"));
1256     Policy.setPolicy(savedPolicy);
1257     }
1258     }
1259     }
1260    
1261     /**
1262     * Runs a runnable without any permissions.
1263     */
1264     public void runWithoutPermissions(Runnable r) {
1265     runWithPermissions(r);
1266     }
1267    
1268     /**
1269 dl 1.7 * A security policy where new permissions can be dynamically added
1270     * or all cleared.
1271     */
1272 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
1273 dl 1.7 Permissions perms = new Permissions();
1274 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
1275     for (Permission permission : permissions)
1276     perms.add(permission);
1277     }
1278 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
1279     void clearPermissions() { perms = new Permissions(); }
1280 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
1281     return perms;
1282     }
1283     public PermissionCollection getPermissions(ProtectionDomain pd) {
1284     return perms;
1285     }
1286     public boolean implies(ProtectionDomain pd, Permission p) {
1287     return perms.implies(p);
1288     }
1289     public void refresh() {}
1290 jsr166 1.93 public String toString() {
1291 jsr166 1.216 List<Permission> ps = new ArrayList<>();
1292 jsr166 1.93 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1293     ps.add(e.nextElement());
1294     return "AdjustablePolicy with permissions " + ps;
1295     }
1296 dl 1.7 }
1297 dl 1.1
1298 jsr166 1.38 /**
1299 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
1300     */
1301     public static Policy permissivePolicy() {
1302     return new AdjustablePolicy
1303     // Permissions j.u.c. needs directly
1304     (new RuntimePermission("modifyThread"),
1305     new RuntimePermission("getClassLoader"),
1306     new RuntimePermission("setContextClassLoader"),
1307     // Permissions needed to change permissions!
1308     new SecurityPermission("getPolicy"),
1309     new SecurityPermission("setPolicy"),
1310     new RuntimePermission("setSecurityManager"),
1311     // Permissions needed by the junit test harness
1312     new RuntimePermission("accessDeclaredMembers"),
1313     new PropertyPermission("*", "read"),
1314     new java.io.FilePermission("<<ALL FILES>>", "read"));
1315     }
1316    
1317     /**
1318 jsr166 1.60 * Sleeps until the given time has elapsed.
1319 jsr166 1.239 * Throws AssertionError if interrupted.
1320 jsr166 1.60 */
1321 jsr166 1.201 static void sleep(long millis) {
1322 jsr166 1.60 try {
1323 dl 1.76 delay(millis);
1324 jsr166 1.128 } catch (InterruptedException fail) {
1325 jsr166 1.239 throw new AssertionError("Unexpected InterruptedException", fail);
1326 jsr166 1.60 }
1327     }
1328    
1329     /**
1330 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
1331 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1332 jsr166 1.248 * @param waitingForGodot if non-null, an additional condition to satisfy
1333 jsr166 1.65 */
1334 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis,
1335     Callable<Boolean> waitingForGodot) {
1336     for (long startTime = 0L;;) {
1337     switch (thread.getState()) {
1338 jsr166 1.250 default: break;
1339 jsr166 1.248 case BLOCKED: case WAITING: case TIMED_WAITING:
1340     try {
1341     if (waitingForGodot == null || waitingForGodot.call())
1342     return;
1343     } catch (Throwable fail) { threadUnexpectedException(fail); }
1344     break;
1345     case TERMINATED:
1346 jsr166 1.67 fail("Unexpected thread termination");
1347 jsr166 1.248 }
1348    
1349     if (startTime == 0L)
1350 jsr166 1.199 startTime = System.nanoTime();
1351 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
1352 jsr166 1.248 assertTrue(thread.isAlive());
1353     if (waitingForGodot == null
1354     || thread.getState() == Thread.State.RUNNABLE)
1355     fail("timed out waiting for thread to enter wait state");
1356     else
1357     fail("timed out waiting for condition, thread state="
1358     + thread.getState());
1359 jsr166 1.67 }
1360 jsr166 1.65 Thread.yield();
1361     }
1362     }
1363    
1364     /**
1365 jsr166 1.219 * Spin-waits up to the specified number of milliseconds for the given
1366 jsr166 1.248 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1367 jsr166 1.219 */
1368 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1369     waitForThreadToEnterWaitState(thread, timeoutMillis, null);
1370 jsr166 1.219 }
1371    
1372     /**
1373     * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1374     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1375 jsr166 1.75 */
1376     void waitForThreadToEnterWaitState(Thread thread) {
1377 jsr166 1.248 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, null);
1378 jsr166 1.75 }
1379    
1380     /**
1381 jsr166 1.219 * Spin-waits up to LONG_DELAY_MS milliseconds for the given thread to
1382     * enter a wait state: BLOCKED, WAITING, or TIMED_WAITING,
1383     * and additionally satisfy the given condition.
1384     */
1385 jsr166 1.248 void waitForThreadToEnterWaitState(Thread thread,
1386     Callable<Boolean> waitingForGodot) {
1387 jsr166 1.219 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS, waitingForGodot);
1388     }
1389    
1390     /**
1391 jsr166 1.257 * Spin-waits up to LONG_DELAY_MS milliseconds for the current thread to
1392     * be interrupted. Clears the interrupt status before returning.
1393     */
1394     void awaitInterrupted() {
1395     for (long startTime = 0L; !Thread.interrupted(); ) {
1396     if (startTime == 0L)
1397     startTime = System.nanoTime();
1398     else if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1399     fail("timed out waiting for thread interrupt");
1400     Thread.yield();
1401     }
1402     }
1403    
1404     /**
1405 jsr166 1.66 * Returns the number of milliseconds since time given by
1406     * startNanoTime, which must have been previously returned from a
1407 jsr166 1.124 * call to {@link System#nanoTime()}.
1408 jsr166 1.66 */
1409 jsr166 1.117 static long millisElapsedSince(long startNanoTime) {
1410 jsr166 1.66 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1411     }
1412 jsr166 1.68
1413 jsr166 1.120 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1414     // long startTime = System.nanoTime();
1415     // try {
1416     // r.run();
1417     // } catch (Throwable fail) { threadUnexpectedException(fail); }
1418     // if (millisElapsedSince(startTime) > timeoutMillis/2)
1419 jsr166 1.239 // throw new AssertionError("did not return promptly");
1420 jsr166 1.120 // }
1421    
1422     // void assertTerminatesPromptly(Runnable r) {
1423     // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1424     // }
1425    
1426     /**
1427     * Checks that timed f.get() returns the expected value, and does not
1428     * wait for the timeout to elapse before returning.
1429     */
1430     <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1431     long startTime = System.nanoTime();
1432 jsr166 1.245 T actual = null;
1433 jsr166 1.120 try {
1434 jsr166 1.245 actual = f.get(timeoutMillis, MILLISECONDS);
1435 jsr166 1.120 } catch (Throwable fail) { threadUnexpectedException(fail); }
1436 jsr166 1.245 assertEquals(expectedValue, actual);
1437 jsr166 1.120 if (millisElapsedSince(startTime) > timeoutMillis/2)
1438 jsr166 1.239 throw new AssertionError("timed get did not return promptly");
1439 jsr166 1.120 }
1440    
1441     <T> void checkTimedGet(Future<T> f, T expectedValue) {
1442     checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1443     }
1444    
1445 jsr166 1.66 /**
1446 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
1447 jsr166 1.38 */
1448     Thread newStartedThread(Runnable runnable) {
1449     Thread t = new Thread(runnable);
1450 jsr166 1.58 t.setDaemon(true);
1451 jsr166 1.38 t.start();
1452     return t;
1453     }
1454 dl 1.1
1455 jsr166 1.59 /**
1456     * Waits for the specified time (in milliseconds) for the thread
1457     * to terminate (using {@link Thread#join(long)}), else interrupts
1458     * the thread (in the hope that it may terminate later) and fails.
1459     */
1460 jsr166 1.261 void awaitTermination(Thread thread, long timeoutMillis) {
1461 jsr166 1.59 try {
1462 jsr166 1.261 thread.join(timeoutMillis);
1463 jsr166 1.128 } catch (InterruptedException fail) {
1464     threadUnexpectedException(fail);
1465 jsr166 1.258 }
1466 jsr166 1.261 if (thread.getState() != Thread.State.TERMINATED) {
1467     String detail = String.format(
1468     "timed out waiting for thread to terminate, thread=%s, state=%s" ,
1469     thread, thread.getState());
1470     try {
1471     threadFail(detail);
1472     } finally {
1473     // Interrupt thread __after__ having reported its stack trace
1474     thread.interrupt();
1475     }
1476 jsr166 1.59 }
1477     }
1478    
1479 jsr166 1.75 /**
1480     * Waits for LONG_DELAY_MS milliseconds for the thread to
1481     * terminate (using {@link Thread#join(long)}), else interrupts
1482     * the thread (in the hope that it may terminate later) and fails.
1483     */
1484     void awaitTermination(Thread t) {
1485     awaitTermination(t, LONG_DELAY_MS);
1486     }
1487    
1488 dl 1.1 // Some convenient Runnable classes
1489    
1490 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
1491     protected abstract void realRun() throws Throwable;
1492 jsr166 1.35
1493     public final void run() {
1494     try {
1495     realRun();
1496 jsr166 1.128 } catch (Throwable fail) {
1497     threadUnexpectedException(fail);
1498 jsr166 1.35 }
1499     }
1500     }
1501    
1502 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
1503     protected abstract void realRun() throws Throwable;
1504 jsr166 1.40
1505     final Class<?> exceptionClass;
1506    
1507     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1508     this.exceptionClass = exceptionClass;
1509     }
1510    
1511     public final void run() {
1512     try {
1513     realRun();
1514     } catch (Throwable t) {
1515     if (! exceptionClass.isInstance(t))
1516     threadUnexpectedException(t);
1517 jsr166 1.248 return;
1518 jsr166 1.40 }
1519 jsr166 1.248 threadShouldThrow(exceptionClass.getSimpleName());
1520 jsr166 1.40 }
1521     }
1522    
1523 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
1524     protected abstract void realRun() throws Throwable;
1525 jsr166 1.35
1526     public final void run() {
1527     try {
1528     realRun();
1529     } catch (InterruptedException success) {
1530 jsr166 1.81 threadAssertFalse(Thread.interrupted());
1531 jsr166 1.248 return;
1532 jsr166 1.128 } catch (Throwable fail) {
1533     threadUnexpectedException(fail);
1534 jsr166 1.35 }
1535 jsr166 1.248 threadShouldThrow("InterruptedException");
1536 jsr166 1.35 }
1537     }
1538    
1539 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
1540     protected abstract T realCall() throws Throwable;
1541 jsr166 1.35
1542     public final T call() {
1543     try {
1544     return realCall();
1545 jsr166 1.128 } catch (Throwable fail) {
1546     threadUnexpectedException(fail);
1547 jsr166 1.40 }
1548 jsr166 1.248 throw new AssertionError("unreached");
1549 jsr166 1.35 }
1550     }
1551    
1552 jsr166 1.45 public static class NoOpRunnable implements Runnable {
1553 dl 1.1 public void run() {}
1554     }
1555    
1556 jsr166 1.45 public static class NoOpCallable implements Callable {
1557 dl 1.1 public Object call() { return Boolean.TRUE; }
1558 dl 1.10 }
1559    
1560 jsr166 1.45 public static final String TEST_STRING = "a test string";
1561 dl 1.10
1562 jsr166 1.45 public static class StringTask implements Callable<String> {
1563 jsr166 1.144 final String value;
1564     public StringTask() { this(TEST_STRING); }
1565     public StringTask(String value) { this.value = value; }
1566     public String call() { return value; }
1567 dl 1.10 }
1568    
1569 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1570     return new CheckedCallable<String>() {
1571 jsr166 1.64 protected String realCall() {
1572 jsr166 1.48 try {
1573     latch.await();
1574     } catch (InterruptedException quittingTime) {}
1575     return TEST_STRING;
1576     }};
1577     }
1578    
1579 jsr166 1.148 public Runnable countDowner(final CountDownLatch latch) {
1580     return new CheckedRunnable() {
1581     public void realRun() throws InterruptedException {
1582     latch.countDown();
1583     }};
1584     }
1585    
1586 jsr166 1.161 class LatchAwaiter extends CheckedRunnable {
1587 jsr166 1.162 static final int NEW = 0;
1588     static final int RUNNING = 1;
1589     static final int DONE = 2;
1590 jsr166 1.161 final CountDownLatch latch;
1591     int state = NEW;
1592     LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1593     public void realRun() throws InterruptedException {
1594     state = 1;
1595     await(latch);
1596     state = 2;
1597     }
1598     }
1599 jsr166 1.162
1600 jsr166 1.161 public LatchAwaiter awaiter(CountDownLatch latch) {
1601     return new LatchAwaiter(latch);
1602 jsr166 1.73 }
1603    
1604 jsr166 1.188 public void await(CountDownLatch latch, long timeoutMillis) {
1605 jsr166 1.246 boolean timedOut = false;
1606 jsr166 1.79 try {
1607 jsr166 1.246 timedOut = !latch.await(timeoutMillis, MILLISECONDS);
1608 jsr166 1.128 } catch (Throwable fail) {
1609     threadUnexpectedException(fail);
1610 jsr166 1.79 }
1611 jsr166 1.246 if (timedOut)
1612     fail("timed out waiting for CountDownLatch for "
1613     + (timeoutMillis/1000) + " sec");
1614 jsr166 1.79 }
1615    
1616 jsr166 1.188 public void await(CountDownLatch latch) {
1617     await(latch, LONG_DELAY_MS);
1618     }
1619    
1620 jsr166 1.89 public void await(Semaphore semaphore) {
1621 jsr166 1.246 boolean timedOut = false;
1622 jsr166 1.89 try {
1623 jsr166 1.246 timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
1624 jsr166 1.128 } catch (Throwable fail) {
1625     threadUnexpectedException(fail);
1626 jsr166 1.89 }
1627 jsr166 1.246 if (timedOut)
1628     fail("timed out waiting for Semaphore for "
1629     + (LONG_DELAY_MS/1000) + " sec");
1630 jsr166 1.89 }
1631    
1632 jsr166 1.226 public void await(CyclicBarrier barrier) {
1633     try {
1634     barrier.await(LONG_DELAY_MS, MILLISECONDS);
1635     } catch (Throwable fail) {
1636     threadUnexpectedException(fail);
1637     }
1638     }
1639    
1640 jsr166 1.81 // /**
1641     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1642     // */
1643     // public void await(AtomicBoolean flag) {
1644     // await(flag, LONG_DELAY_MS);
1645     // }
1646    
1647     // /**
1648     // * Spin-waits up to the specified timeout until flag becomes true.
1649     // */
1650     // public void await(AtomicBoolean flag, long timeoutMillis) {
1651     // long startTime = System.nanoTime();
1652     // while (!flag.get()) {
1653     // if (millisElapsedSince(startTime) > timeoutMillis)
1654 jsr166 1.239 // throw new AssertionError("timed out");
1655 jsr166 1.81 // Thread.yield();
1656     // }
1657     // }
1658    
1659 jsr166 1.45 public static class NPETask implements Callable<String> {
1660 dl 1.10 public String call() { throw new NullPointerException(); }
1661     }
1662    
1663 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1664     return new CheckedRunnable() {
1665     protected void realRun() {
1666     try {
1667 dl 1.76 delay(timeoutMillis);
1668 jsr166 1.63 } catch (InterruptedException ok) {}
1669     }};
1670     }
1671    
1672 dl 1.5 /**
1673     * For use as ThreadFactory in constructors
1674     */
1675 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1676 jsr166 1.33 public Thread newThread(Runnable r) {
1677 dl 1.5 return new Thread(r);
1678 jsr166 1.27 }
1679 dl 1.5 }
1680    
1681 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1682     boolean isDone();
1683     }
1684    
1685 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1686     public volatile boolean done = false;
1687 dl 1.6 public void run() {
1688     done = true;
1689 dl 1.5 }
1690     }
1691    
1692 jsr166 1.53 /**
1693     * Analog of CheckedRunnable for RecursiveAction
1694     */
1695     public abstract class CheckedRecursiveAction extends RecursiveAction {
1696     protected abstract void realCompute() throws Throwable;
1697    
1698 jsr166 1.108 @Override protected final void compute() {
1699 jsr166 1.53 try {
1700     realCompute();
1701 jsr166 1.128 } catch (Throwable fail) {
1702     threadUnexpectedException(fail);
1703 jsr166 1.53 }
1704     }
1705     }
1706    
1707     /**
1708     * Analog of CheckedCallable for RecursiveTask
1709     */
1710     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1711     protected abstract T realCompute() throws Throwable;
1712    
1713 jsr166 1.108 @Override protected final T compute() {
1714 jsr166 1.53 try {
1715     return realCompute();
1716 jsr166 1.128 } catch (Throwable fail) {
1717     threadUnexpectedException(fail);
1718 jsr166 1.53 }
1719 jsr166 1.248 throw new AssertionError("unreached");
1720 jsr166 1.53 }
1721     }
1722 dl 1.5
1723     /**
1724     * For use as RejectedExecutionHandler in constructors
1725     */
1726 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1727 jsr166 1.35 public void rejectedExecution(Runnable r,
1728     ThreadPoolExecutor executor) {}
1729 dl 1.5 }
1730 jsr166 1.27
1731 jsr166 1.60 /**
1732 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1733 jsr166 1.239 * AssertionErrors instead of throwing checked exceptions.
1734 jsr166 1.60 */
1735 jsr166 1.202 public static class CheckedBarrier extends CyclicBarrier {
1736 jsr166 1.60 public CheckedBarrier(int parties) { super(parties); }
1737    
1738     public int await() {
1739     try {
1740 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1741 jsr166 1.128 } catch (TimeoutException timedOut) {
1742 jsr166 1.239 throw new AssertionError("timed out");
1743 jsr166 1.128 } catch (Exception fail) {
1744 jsr166 1.239 throw new AssertionError("Unexpected exception: " + fail, fail);
1745 jsr166 1.60 }
1746     }
1747     }
1748    
1749 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1750 jsr166 1.72 try {
1751     assertTrue(q.isEmpty());
1752     assertEquals(0, q.size());
1753     assertNull(q.peek());
1754     assertNull(q.poll());
1755 jsr166 1.232 assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit()));
1756 jsr166 1.72 assertEquals(q.toString(), "[]");
1757     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1758     assertFalse(q.iterator().hasNext());
1759     try {
1760     q.element();
1761     shouldThrow();
1762     } catch (NoSuchElementException success) {}
1763     try {
1764     q.iterator().next();
1765     shouldThrow();
1766     } catch (NoSuchElementException success) {}
1767     try {
1768     q.remove();
1769     shouldThrow();
1770     } catch (NoSuchElementException success) {}
1771 jsr166 1.128 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1772 jsr166 1.72 }
1773    
1774 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1775     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1776     }
1777    
1778     void assertNotSerialEquals(Object x, Object y) {
1779     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1780     }
1781    
1782     byte[] serialBytes(Object o) {
1783 jsr166 1.79 try {
1784     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1785     ObjectOutputStream oos = new ObjectOutputStream(bos);
1786     oos.writeObject(o);
1787     oos.flush();
1788     oos.close();
1789 jsr166 1.91 return bos.toByteArray();
1790 jsr166 1.128 } catch (Throwable fail) {
1791     threadUnexpectedException(fail);
1792 jsr166 1.91 return new byte[0];
1793     }
1794     }
1795    
1796 jsr166 1.253 void assertImmutable(Object o) {
1797 jsr166 1.208 if (o instanceof Collection) {
1798     assertThrows(
1799     UnsupportedOperationException.class,
1800 jsr166 1.253 () -> ((Collection) o).add(null));
1801 jsr166 1.208 }
1802     }
1803 jsr166 1.209
1804 jsr166 1.91 @SuppressWarnings("unchecked")
1805     <T> T serialClone(T o) {
1806 jsr166 1.247 T clone = null;
1807 jsr166 1.91 try {
1808 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1809 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1810 jsr166 1.247 clone = (T) ois.readObject();
1811 jsr166 1.128 } catch (Throwable fail) {
1812     threadUnexpectedException(fail);
1813 jsr166 1.79 }
1814 jsr166 1.247 if (o == clone) assertImmutable(o);
1815     else assertSame(o.getClass(), clone.getClass());
1816     return clone;
1817 jsr166 1.79 }
1818 jsr166 1.106
1819 jsr166 1.208 /**
1820 jsr166 1.211 * A version of serialClone that leaves error handling (for
1821     * e.g. NotSerializableException) up to the caller.
1822     */
1823     @SuppressWarnings("unchecked")
1824     <T> T serialClonePossiblyFailing(T o)
1825     throws ReflectiveOperationException, java.io.IOException {
1826     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1827     ObjectOutputStream oos = new ObjectOutputStream(bos);
1828     oos.writeObject(o);
1829     oos.flush();
1830     oos.close();
1831     ObjectInputStream ois = new ObjectInputStream
1832     (new ByteArrayInputStream(bos.toByteArray()));
1833     T clone = (T) ois.readObject();
1834     if (o == clone) assertImmutable(o);
1835 jsr166 1.247 else assertSame(o.getClass(), clone.getClass());
1836 jsr166 1.211 return clone;
1837     }
1838    
1839     /**
1840 jsr166 1.208 * If o implements Cloneable and has a public clone method,
1841     * returns a clone of o, else null.
1842     */
1843     @SuppressWarnings("unchecked")
1844     <T> T cloneableClone(T o) {
1845     if (!(o instanceof Cloneable)) return null;
1846     final T clone;
1847     try {
1848     clone = (T) o.getClass().getMethod("clone").invoke(o);
1849     } catch (NoSuchMethodException ok) {
1850     return null;
1851     } catch (ReflectiveOperationException unexpected) {
1852     throw new Error(unexpected);
1853     }
1854     assertNotSame(o, clone); // not 100% guaranteed by spec
1855     assertSame(o.getClass(), clone.getClass());
1856     return clone;
1857     }
1858    
1859 jsr166 1.106 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1860 jsr166 1.253 Action... throwingActions) {
1861     for (Action throwingAction : throwingActions) {
1862 jsr166 1.106 boolean threw = false;
1863     try { throwingAction.run(); }
1864     catch (Throwable t) {
1865     threw = true;
1866 jsr166 1.239 if (!expectedExceptionClass.isInstance(t))
1867     throw new AssertionError(
1868     "Expected " + expectedExceptionClass.getName() +
1869     ", got " + t.getClass().getName(),
1870     t);
1871 jsr166 1.106 }
1872     if (!threw)
1873     shouldThrow(expectedExceptionClass.getName());
1874     }
1875     }
1876 jsr166 1.126
1877     public void assertIteratorExhausted(Iterator<?> it) {
1878     try {
1879     it.next();
1880     shouldThrow();
1881     } catch (NoSuchElementException success) {}
1882     assertFalse(it.hasNext());
1883 jsr166 1.127 }
1884 jsr166 1.191
1885     public <T> Callable<T> callableThrowing(final Exception ex) {
1886     return new Callable<T>() { public T call() throws Exception { throw ex; }};
1887     }
1888    
1889     public Runnable runnableThrowing(final RuntimeException ex) {
1890     return new Runnable() { public void run() { throw ex; }};
1891     }
1892 jsr166 1.193
1893     /** A reusable thread pool to be shared by tests. */
1894     static final ExecutorService cachedThreadPool =
1895     new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1896     1000L, MILLISECONDS,
1897     new SynchronousQueue<Runnable>());
1898    
1899 jsr166 1.234 static <T> void shuffle(T[] array) {
1900     Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1901     }
1902    
1903 jsr166 1.236 /**
1904     * Returns the same String as would be returned by {@link
1905     * Object#toString}, whether or not the given object's class
1906     * overrides toString().
1907     *
1908     * @see System#identityHashCode
1909     */
1910     static String identityString(Object x) {
1911     return x.getClass().getName()
1912     + "@" + Integer.toHexString(System.identityHashCode(x));
1913     }
1914    
1915 jsr166 1.234 // --- Shared assertions for Executor tests ---
1916    
1917 jsr166 1.233 /**
1918     * Returns maximum number of tasks that can be submitted to given
1919     * pool (with bounded queue) before saturation (when submission
1920     * throws RejectedExecutionException).
1921     */
1922     static final int saturatedSize(ThreadPoolExecutor pool) {
1923     BlockingQueue<Runnable> q = pool.getQueue();
1924     return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1925     }
1926    
1927 jsr166 1.234 @SuppressWarnings("FutureReturnValueIgnored")
1928     void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1929     try {
1930     e.execute((Runnable) null);
1931     shouldThrow();
1932     } catch (NullPointerException success) {}
1933    
1934     if (! (e instanceof ExecutorService)) return;
1935     ExecutorService es = (ExecutorService) e;
1936     try {
1937     es.submit((Runnable) null);
1938     shouldThrow();
1939     } catch (NullPointerException success) {}
1940     try {
1941     es.submit((Runnable) null, Boolean.TRUE);
1942     shouldThrow();
1943     } catch (NullPointerException success) {}
1944     try {
1945     es.submit((Callable) null);
1946     shouldThrow();
1947     } catch (NullPointerException success) {}
1948    
1949     if (! (e instanceof ScheduledExecutorService)) return;
1950     ScheduledExecutorService ses = (ScheduledExecutorService) e;
1951     try {
1952     ses.schedule((Runnable) null,
1953     randomTimeout(), randomTimeUnit());
1954     shouldThrow();
1955     } catch (NullPointerException success) {}
1956     try {
1957     ses.schedule((Callable) null,
1958     randomTimeout(), randomTimeUnit());
1959     shouldThrow();
1960     } catch (NullPointerException success) {}
1961     try {
1962     ses.scheduleAtFixedRate((Runnable) null,
1963     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1964     shouldThrow();
1965     } catch (NullPointerException success) {}
1966     try {
1967     ses.scheduleWithFixedDelay((Runnable) null,
1968     randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1969     shouldThrow();
1970     } catch (NullPointerException success) {}
1971     }
1972    
1973     void setRejectedExecutionHandler(
1974     ThreadPoolExecutor p, RejectedExecutionHandler handler) {
1975     p.setRejectedExecutionHandler(handler);
1976     assertSame(handler, p.getRejectedExecutionHandler());
1977     }
1978    
1979     void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
1980     final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
1981     final long savedTaskCount = p.getTaskCount();
1982     final long savedCompletedTaskCount = p.getCompletedTaskCount();
1983     final int savedQueueSize = p.getQueue().size();
1984     final boolean stock = (p.getClass().getClassLoader() == null);
1985    
1986     Runnable r = () -> {};
1987     Callable<Boolean> c = () -> Boolean.TRUE;
1988    
1989     class Recorder implements RejectedExecutionHandler {
1990     public volatile Runnable r = null;
1991     public volatile ThreadPoolExecutor p = null;
1992     public void reset() { r = null; p = null; }
1993     public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
1994     assertNull(this.r);
1995     assertNull(this.p);
1996     this.r = r;
1997     this.p = p;
1998     }
1999     }
2000    
2001     // check custom handler is invoked exactly once per task
2002     Recorder recorder = new Recorder();
2003     setRejectedExecutionHandler(p, recorder);
2004     for (int i = 2; i--> 0; ) {
2005     recorder.reset();
2006     p.execute(r);
2007     if (stock && p.getClass() == ThreadPoolExecutor.class)
2008     assertSame(r, recorder.r);
2009     assertSame(p, recorder.p);
2010    
2011     recorder.reset();
2012     assertFalse(p.submit(r).isDone());
2013     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2014     assertSame(p, recorder.p);
2015    
2016     recorder.reset();
2017     assertFalse(p.submit(r, Boolean.TRUE).isDone());
2018     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2019     assertSame(p, recorder.p);
2020    
2021     recorder.reset();
2022     assertFalse(p.submit(c).isDone());
2023     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2024     assertSame(p, recorder.p);
2025    
2026     if (p instanceof ScheduledExecutorService) {
2027     ScheduledExecutorService s = (ScheduledExecutorService) p;
2028     ScheduledFuture<?> future;
2029    
2030     recorder.reset();
2031     future = s.schedule(r, randomTimeout(), randomTimeUnit());
2032     assertFalse(future.isDone());
2033     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2034     assertSame(p, recorder.p);
2035    
2036     recorder.reset();
2037     future = s.schedule(c, randomTimeout(), randomTimeUnit());
2038     assertFalse(future.isDone());
2039     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2040     assertSame(p, recorder.p);
2041    
2042     recorder.reset();
2043     future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2044     assertFalse(future.isDone());
2045     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2046     assertSame(p, recorder.p);
2047    
2048     recorder.reset();
2049     future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2050     assertFalse(future.isDone());
2051     if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2052     assertSame(p, recorder.p);
2053     }
2054     }
2055    
2056     // Checking our custom handler above should be sufficient, but
2057     // we add some integration tests of standard handlers.
2058     final AtomicReference<Thread> thread = new AtomicReference<>();
2059     final Runnable setThread = () -> thread.set(Thread.currentThread());
2060    
2061     setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2062     try {
2063     p.execute(setThread);
2064     shouldThrow();
2065     } catch (RejectedExecutionException success) {}
2066     assertNull(thread.get());
2067    
2068     setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2069     p.execute(setThread);
2070     assertNull(thread.get());
2071    
2072     setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2073     p.execute(setThread);
2074     if (p.isShutdown())
2075     assertNull(thread.get());
2076     else
2077     assertSame(Thread.currentThread(), thread.get());
2078    
2079     setRejectedExecutionHandler(p, savedHandler);
2080    
2081     // check that pool was not perturbed by handlers
2082     assertEquals(savedTaskCount, p.getTaskCount());
2083     assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2084     assertEquals(savedQueueSize, p.getQueue().size());
2085 jsr166 1.200 }
2086 jsr166 1.243
2087     void assertCollectionsEquals(Collection<?> x, Collection<?> y) {
2088     assertEquals(x, y);
2089     assertEquals(y, x);
2090     assertEquals(x.isEmpty(), y.isEmpty());
2091     assertEquals(x.size(), y.size());
2092     if (x instanceof List) {
2093     assertEquals(x.toString(), y.toString());
2094     }
2095     if (x instanceof List || x instanceof Set) {
2096     assertEquals(x.hashCode(), y.hashCode());
2097     }
2098     if (x instanceof List || x instanceof Deque) {
2099     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2100     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2101     y.toArray(new Object[0])));
2102     }
2103     }
2104    
2105     /**
2106     * A weaker form of assertCollectionsEquals which does not insist
2107     * that the two collections satisfy Object#equals(Object), since
2108     * they may use identity semantics as Deques do.
2109     */
2110     void assertCollectionsEquivalent(Collection<?> x, Collection<?> y) {
2111     if (x instanceof List || x instanceof Set)
2112     assertCollectionsEquals(x, y);
2113     else {
2114     assertEquals(x.isEmpty(), y.isEmpty());
2115     assertEquals(x.size(), y.size());
2116     assertEquals(new HashSet(x), new HashSet(y));
2117     if (x instanceof Deque) {
2118     assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2119     assertTrue(Arrays.equals(x.toArray(new Object[0]),
2120     y.toArray(new Object[0])));
2121     }
2122     }
2123     }
2124 dl 1.1 }