ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.239
Committed: Tue Jan 23 20:44:11 2018 UTC (6 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.238: +51 -69 lines
Log Message:
migrate from AssertionFailedError to AssertionError

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