ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.250
Committed: Sat Nov 24 21:48:19 2018 UTC (5 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.249: +1 -0 lines
Log Message:
appease errorprone [MissingCasesInEnumSwitch]

File Contents

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