ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.251
Committed: Wed Dec 12 16:59:55 2018 UTC (5 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.250: +1 -0 lines
Log Message:
Add LinkedHashMapTest

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