ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.264
Committed: Sat Sep 7 14:28:47 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.263: +2 -2 lines
Log Message:
add Common-Cleaner to list of uninteresting threads to filter out of thread dumps

File Contents

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