ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.262
Committed: Thu Sep 5 21:26:24 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.261: +1 -1 lines
Log Message:
whitespace

File Contents

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