ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.257
Committed: Wed Aug 14 23:06:11 2019 UTC (4 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.256: +21 -0 lines
Log Message:
fix very rare race in testInterruptedFailingAcquire

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