ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.236
Committed: Wed Aug 16 17:18:34 2017 UTC (6 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.235: +12 -0 lines
Log Message:
8186265: Make toString() methods of "task" objects more useful

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