ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.260
Committed: Thu Sep 5 17:27:07 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.259: +2 -2 lines
Log Message:
call dumpTestThreads at most once per test method

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 if (threadFailure.compareAndSet(null, t))
758 dumpTestThreads();
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 }
1459 Thread.State state;
1460 if ((state = t.getState()) != Thread.State.TERMINATED) {
1461 t.interrupt();
1462 threadFail("timed out waiting for thread to terminate; "
1463 + "state=" + state);
1464 }
1465 }
1466
1467 /**
1468 * Waits for LONG_DELAY_MS milliseconds for the thread to
1469 * terminate (using {@link Thread#join(long)}), else interrupts
1470 * the thread (in the hope that it may terminate later) and fails.
1471 */
1472 void awaitTermination(Thread t) {
1473 awaitTermination(t, LONG_DELAY_MS);
1474 }
1475
1476 // Some convenient Runnable classes
1477
1478 public abstract class CheckedRunnable implements Runnable {
1479 protected abstract void realRun() throws Throwable;
1480
1481 public final void run() {
1482 try {
1483 realRun();
1484 } catch (Throwable fail) {
1485 threadUnexpectedException(fail);
1486 }
1487 }
1488 }
1489
1490 public abstract class ThreadShouldThrow extends Thread {
1491 protected abstract void realRun() throws Throwable;
1492
1493 final Class<?> exceptionClass;
1494
1495 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1496 this.exceptionClass = exceptionClass;
1497 }
1498
1499 public final void run() {
1500 try {
1501 realRun();
1502 } catch (Throwable t) {
1503 if (! exceptionClass.isInstance(t))
1504 threadUnexpectedException(t);
1505 return;
1506 }
1507 threadShouldThrow(exceptionClass.getSimpleName());
1508 }
1509 }
1510
1511 public abstract class CheckedInterruptedRunnable implements Runnable {
1512 protected abstract void realRun() throws Throwable;
1513
1514 public final void run() {
1515 try {
1516 realRun();
1517 } catch (InterruptedException success) {
1518 threadAssertFalse(Thread.interrupted());
1519 return;
1520 } catch (Throwable fail) {
1521 threadUnexpectedException(fail);
1522 }
1523 threadShouldThrow("InterruptedException");
1524 }
1525 }
1526
1527 public abstract class CheckedCallable<T> implements Callable<T> {
1528 protected abstract T realCall() throws Throwable;
1529
1530 public final T call() {
1531 try {
1532 return realCall();
1533 } catch (Throwable fail) {
1534 threadUnexpectedException(fail);
1535 }
1536 throw new AssertionError("unreached");
1537 }
1538 }
1539
1540 public static class NoOpRunnable implements Runnable {
1541 public void run() {}
1542 }
1543
1544 public static class NoOpCallable implements Callable {
1545 public Object call() { return Boolean.TRUE; }
1546 }
1547
1548 public static final String TEST_STRING = "a test string";
1549
1550 public static class StringTask implements Callable<String> {
1551 final String value;
1552 public StringTask() { this(TEST_STRING); }
1553 public StringTask(String value) { this.value = value; }
1554 public String call() { return value; }
1555 }
1556
1557 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1558 return new CheckedCallable<String>() {
1559 protected String realCall() {
1560 try {
1561 latch.await();
1562 } catch (InterruptedException quittingTime) {}
1563 return TEST_STRING;
1564 }};
1565 }
1566
1567 public Runnable countDowner(final CountDownLatch latch) {
1568 return new CheckedRunnable() {
1569 public void realRun() throws InterruptedException {
1570 latch.countDown();
1571 }};
1572 }
1573
1574 class LatchAwaiter extends CheckedRunnable {
1575 static final int NEW = 0;
1576 static final int RUNNING = 1;
1577 static final int DONE = 2;
1578 final CountDownLatch latch;
1579 int state = NEW;
1580 LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1581 public void realRun() throws InterruptedException {
1582 state = 1;
1583 await(latch);
1584 state = 2;
1585 }
1586 }
1587
1588 public LatchAwaiter awaiter(CountDownLatch latch) {
1589 return new LatchAwaiter(latch);
1590 }
1591
1592 public void await(CountDownLatch latch, long timeoutMillis) {
1593 boolean timedOut = false;
1594 try {
1595 timedOut = !latch.await(timeoutMillis, MILLISECONDS);
1596 } catch (Throwable fail) {
1597 threadUnexpectedException(fail);
1598 }
1599 if (timedOut)
1600 fail("timed out waiting for CountDownLatch for "
1601 + (timeoutMillis/1000) + " sec");
1602 }
1603
1604 public void await(CountDownLatch latch) {
1605 await(latch, LONG_DELAY_MS);
1606 }
1607
1608 public void await(Semaphore semaphore) {
1609 boolean timedOut = false;
1610 try {
1611 timedOut = !semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS);
1612 } catch (Throwable fail) {
1613 threadUnexpectedException(fail);
1614 }
1615 if (timedOut)
1616 fail("timed out waiting for Semaphore for "
1617 + (LONG_DELAY_MS/1000) + " sec");
1618 }
1619
1620 public void await(CyclicBarrier barrier) {
1621 try {
1622 barrier.await(LONG_DELAY_MS, MILLISECONDS);
1623 } catch (Throwable fail) {
1624 threadUnexpectedException(fail);
1625 }
1626 }
1627
1628 // /**
1629 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1630 // */
1631 // public void await(AtomicBoolean flag) {
1632 // await(flag, LONG_DELAY_MS);
1633 // }
1634
1635 // /**
1636 // * Spin-waits up to the specified timeout until flag becomes true.
1637 // */
1638 // public void await(AtomicBoolean flag, long timeoutMillis) {
1639 // long startTime = System.nanoTime();
1640 // while (!flag.get()) {
1641 // if (millisElapsedSince(startTime) > timeoutMillis)
1642 // throw new AssertionError("timed out");
1643 // Thread.yield();
1644 // }
1645 // }
1646
1647 public static class NPETask implements Callable<String> {
1648 public String call() { throw new NullPointerException(); }
1649 }
1650
1651 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1652 return new CheckedRunnable() {
1653 protected void realRun() {
1654 try {
1655 delay(timeoutMillis);
1656 } catch (InterruptedException ok) {}
1657 }};
1658 }
1659
1660 /**
1661 * For use as ThreadFactory in constructors
1662 */
1663 public static class SimpleThreadFactory implements ThreadFactory {
1664 public Thread newThread(Runnable r) {
1665 return new Thread(r);
1666 }
1667 }
1668
1669 public interface TrackedRunnable extends Runnable {
1670 boolean isDone();
1671 }
1672
1673 public static class TrackedNoOpRunnable implements Runnable {
1674 public volatile boolean done = false;
1675 public void run() {
1676 done = true;
1677 }
1678 }
1679
1680 /**
1681 * Analog of CheckedRunnable for RecursiveAction
1682 */
1683 public abstract class CheckedRecursiveAction extends RecursiveAction {
1684 protected abstract void realCompute() throws Throwable;
1685
1686 @Override protected final void compute() {
1687 try {
1688 realCompute();
1689 } catch (Throwable fail) {
1690 threadUnexpectedException(fail);
1691 }
1692 }
1693 }
1694
1695 /**
1696 * Analog of CheckedCallable for RecursiveTask
1697 */
1698 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1699 protected abstract T realCompute() throws Throwable;
1700
1701 @Override protected final T compute() {
1702 try {
1703 return realCompute();
1704 } catch (Throwable fail) {
1705 threadUnexpectedException(fail);
1706 }
1707 throw new AssertionError("unreached");
1708 }
1709 }
1710
1711 /**
1712 * For use as RejectedExecutionHandler in constructors
1713 */
1714 public static class NoOpREHandler implements RejectedExecutionHandler {
1715 public void rejectedExecution(Runnable r,
1716 ThreadPoolExecutor executor) {}
1717 }
1718
1719 /**
1720 * A CyclicBarrier that uses timed await and fails with
1721 * AssertionErrors instead of throwing checked exceptions.
1722 */
1723 public static class CheckedBarrier extends CyclicBarrier {
1724 public CheckedBarrier(int parties) { super(parties); }
1725
1726 public int await() {
1727 try {
1728 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1729 } catch (TimeoutException timedOut) {
1730 throw new AssertionError("timed out");
1731 } catch (Exception fail) {
1732 throw new AssertionError("Unexpected exception: " + fail, fail);
1733 }
1734 }
1735 }
1736
1737 void checkEmpty(BlockingQueue q) {
1738 try {
1739 assertTrue(q.isEmpty());
1740 assertEquals(0, q.size());
1741 assertNull(q.peek());
1742 assertNull(q.poll());
1743 assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit()));
1744 assertEquals(q.toString(), "[]");
1745 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1746 assertFalse(q.iterator().hasNext());
1747 try {
1748 q.element();
1749 shouldThrow();
1750 } catch (NoSuchElementException success) {}
1751 try {
1752 q.iterator().next();
1753 shouldThrow();
1754 } catch (NoSuchElementException success) {}
1755 try {
1756 q.remove();
1757 shouldThrow();
1758 } catch (NoSuchElementException success) {}
1759 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1760 }
1761
1762 void assertSerialEquals(Object x, Object y) {
1763 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1764 }
1765
1766 void assertNotSerialEquals(Object x, Object y) {
1767 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1768 }
1769
1770 byte[] serialBytes(Object o) {
1771 try {
1772 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1773 ObjectOutputStream oos = new ObjectOutputStream(bos);
1774 oos.writeObject(o);
1775 oos.flush();
1776 oos.close();
1777 return bos.toByteArray();
1778 } catch (Throwable fail) {
1779 threadUnexpectedException(fail);
1780 return new byte[0];
1781 }
1782 }
1783
1784 void assertImmutable(Object o) {
1785 if (o instanceof Collection) {
1786 assertThrows(
1787 UnsupportedOperationException.class,
1788 () -> ((Collection) o).add(null));
1789 }
1790 }
1791
1792 @SuppressWarnings("unchecked")
1793 <T> T serialClone(T o) {
1794 T clone = null;
1795 try {
1796 ObjectInputStream ois = new ObjectInputStream
1797 (new ByteArrayInputStream(serialBytes(o)));
1798 clone = (T) ois.readObject();
1799 } catch (Throwable fail) {
1800 threadUnexpectedException(fail);
1801 }
1802 if (o == clone) assertImmutable(o);
1803 else assertSame(o.getClass(), clone.getClass());
1804 return clone;
1805 }
1806
1807 /**
1808 * A version of serialClone that leaves error handling (for
1809 * e.g. NotSerializableException) up to the caller.
1810 */
1811 @SuppressWarnings("unchecked")
1812 <T> T serialClonePossiblyFailing(T o)
1813 throws ReflectiveOperationException, java.io.IOException {
1814 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1815 ObjectOutputStream oos = new ObjectOutputStream(bos);
1816 oos.writeObject(o);
1817 oos.flush();
1818 oos.close();
1819 ObjectInputStream ois = new ObjectInputStream
1820 (new ByteArrayInputStream(bos.toByteArray()));
1821 T clone = (T) ois.readObject();
1822 if (o == clone) assertImmutable(o);
1823 else assertSame(o.getClass(), clone.getClass());
1824 return clone;
1825 }
1826
1827 /**
1828 * If o implements Cloneable and has a public clone method,
1829 * returns a clone of o, else null.
1830 */
1831 @SuppressWarnings("unchecked")
1832 <T> T cloneableClone(T o) {
1833 if (!(o instanceof Cloneable)) return null;
1834 final T clone;
1835 try {
1836 clone = (T) o.getClass().getMethod("clone").invoke(o);
1837 } catch (NoSuchMethodException ok) {
1838 return null;
1839 } catch (ReflectiveOperationException unexpected) {
1840 throw new Error(unexpected);
1841 }
1842 assertNotSame(o, clone); // not 100% guaranteed by spec
1843 assertSame(o.getClass(), clone.getClass());
1844 return clone;
1845 }
1846
1847 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1848 Action... throwingActions) {
1849 for (Action throwingAction : throwingActions) {
1850 boolean threw = false;
1851 try { throwingAction.run(); }
1852 catch (Throwable t) {
1853 threw = true;
1854 if (!expectedExceptionClass.isInstance(t))
1855 throw new AssertionError(
1856 "Expected " + expectedExceptionClass.getName() +
1857 ", got " + t.getClass().getName(),
1858 t);
1859 }
1860 if (!threw)
1861 shouldThrow(expectedExceptionClass.getName());
1862 }
1863 }
1864
1865 public void assertIteratorExhausted(Iterator<?> it) {
1866 try {
1867 it.next();
1868 shouldThrow();
1869 } catch (NoSuchElementException success) {}
1870 assertFalse(it.hasNext());
1871 }
1872
1873 public <T> Callable<T> callableThrowing(final Exception ex) {
1874 return new Callable<T>() { public T call() throws Exception { throw ex; }};
1875 }
1876
1877 public Runnable runnableThrowing(final RuntimeException ex) {
1878 return new Runnable() { public void run() { throw ex; }};
1879 }
1880
1881 /** A reusable thread pool to be shared by tests. */
1882 static final ExecutorService cachedThreadPool =
1883 new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1884 1000L, MILLISECONDS,
1885 new SynchronousQueue<Runnable>());
1886
1887 static <T> void shuffle(T[] array) {
1888 Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1889 }
1890
1891 /**
1892 * Returns the same String as would be returned by {@link
1893 * Object#toString}, whether or not the given object's class
1894 * overrides toString().
1895 *
1896 * @see System#identityHashCode
1897 */
1898 static String identityString(Object x) {
1899 return x.getClass().getName()
1900 + "@" + Integer.toHexString(System.identityHashCode(x));
1901 }
1902
1903 // --- Shared assertions for Executor tests ---
1904
1905 /**
1906 * Returns maximum number of tasks that can be submitted to given
1907 * pool (with bounded queue) before saturation (when submission
1908 * throws RejectedExecutionException).
1909 */
1910 static final int saturatedSize(ThreadPoolExecutor pool) {
1911 BlockingQueue<Runnable> q = pool.getQueue();
1912 return pool.getMaximumPoolSize() + q.size() + q.remainingCapacity();
1913 }
1914
1915 @SuppressWarnings("FutureReturnValueIgnored")
1916 void assertNullTaskSubmissionThrowsNullPointerException(Executor e) {
1917 try {
1918 e.execute((Runnable) null);
1919 shouldThrow();
1920 } catch (NullPointerException success) {}
1921
1922 if (! (e instanceof ExecutorService)) return;
1923 ExecutorService es = (ExecutorService) e;
1924 try {
1925 es.submit((Runnable) null);
1926 shouldThrow();
1927 } catch (NullPointerException success) {}
1928 try {
1929 es.submit((Runnable) null, Boolean.TRUE);
1930 shouldThrow();
1931 } catch (NullPointerException success) {}
1932 try {
1933 es.submit((Callable) null);
1934 shouldThrow();
1935 } catch (NullPointerException success) {}
1936
1937 if (! (e instanceof ScheduledExecutorService)) return;
1938 ScheduledExecutorService ses = (ScheduledExecutorService) e;
1939 try {
1940 ses.schedule((Runnable) null,
1941 randomTimeout(), randomTimeUnit());
1942 shouldThrow();
1943 } catch (NullPointerException success) {}
1944 try {
1945 ses.schedule((Callable) null,
1946 randomTimeout(), randomTimeUnit());
1947 shouldThrow();
1948 } catch (NullPointerException success) {}
1949 try {
1950 ses.scheduleAtFixedRate((Runnable) null,
1951 randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1952 shouldThrow();
1953 } catch (NullPointerException success) {}
1954 try {
1955 ses.scheduleWithFixedDelay((Runnable) null,
1956 randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
1957 shouldThrow();
1958 } catch (NullPointerException success) {}
1959 }
1960
1961 void setRejectedExecutionHandler(
1962 ThreadPoolExecutor p, RejectedExecutionHandler handler) {
1963 p.setRejectedExecutionHandler(handler);
1964 assertSame(handler, p.getRejectedExecutionHandler());
1965 }
1966
1967 void assertTaskSubmissionsAreRejected(ThreadPoolExecutor p) {
1968 final RejectedExecutionHandler savedHandler = p.getRejectedExecutionHandler();
1969 final long savedTaskCount = p.getTaskCount();
1970 final long savedCompletedTaskCount = p.getCompletedTaskCount();
1971 final int savedQueueSize = p.getQueue().size();
1972 final boolean stock = (p.getClass().getClassLoader() == null);
1973
1974 Runnable r = () -> {};
1975 Callable<Boolean> c = () -> Boolean.TRUE;
1976
1977 class Recorder implements RejectedExecutionHandler {
1978 public volatile Runnable r = null;
1979 public volatile ThreadPoolExecutor p = null;
1980 public void reset() { r = null; p = null; }
1981 public void rejectedExecution(Runnable r, ThreadPoolExecutor p) {
1982 assertNull(this.r);
1983 assertNull(this.p);
1984 this.r = r;
1985 this.p = p;
1986 }
1987 }
1988
1989 // check custom handler is invoked exactly once per task
1990 Recorder recorder = new Recorder();
1991 setRejectedExecutionHandler(p, recorder);
1992 for (int i = 2; i--> 0; ) {
1993 recorder.reset();
1994 p.execute(r);
1995 if (stock && p.getClass() == ThreadPoolExecutor.class)
1996 assertSame(r, recorder.r);
1997 assertSame(p, recorder.p);
1998
1999 recorder.reset();
2000 assertFalse(p.submit(r).isDone());
2001 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2002 assertSame(p, recorder.p);
2003
2004 recorder.reset();
2005 assertFalse(p.submit(r, Boolean.TRUE).isDone());
2006 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2007 assertSame(p, recorder.p);
2008
2009 recorder.reset();
2010 assertFalse(p.submit(c).isDone());
2011 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2012 assertSame(p, recorder.p);
2013
2014 if (p instanceof ScheduledExecutorService) {
2015 ScheduledExecutorService s = (ScheduledExecutorService) p;
2016 ScheduledFuture<?> future;
2017
2018 recorder.reset();
2019 future = s.schedule(r, randomTimeout(), randomTimeUnit());
2020 assertFalse(future.isDone());
2021 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2022 assertSame(p, recorder.p);
2023
2024 recorder.reset();
2025 future = s.schedule(c, randomTimeout(), randomTimeUnit());
2026 assertFalse(future.isDone());
2027 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2028 assertSame(p, recorder.p);
2029
2030 recorder.reset();
2031 future = s.scheduleAtFixedRate(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2032 assertFalse(future.isDone());
2033 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2034 assertSame(p, recorder.p);
2035
2036 recorder.reset();
2037 future = s.scheduleWithFixedDelay(r, randomTimeout(), LONG_DELAY_MS, MILLISECONDS);
2038 assertFalse(future.isDone());
2039 if (stock) assertTrue(!((FutureTask) recorder.r).isDone());
2040 assertSame(p, recorder.p);
2041 }
2042 }
2043
2044 // Checking our custom handler above should be sufficient, but
2045 // we add some integration tests of standard handlers.
2046 final AtomicReference<Thread> thread = new AtomicReference<>();
2047 final Runnable setThread = () -> thread.set(Thread.currentThread());
2048
2049 setRejectedExecutionHandler(p, new ThreadPoolExecutor.AbortPolicy());
2050 try {
2051 p.execute(setThread);
2052 shouldThrow();
2053 } catch (RejectedExecutionException success) {}
2054 assertNull(thread.get());
2055
2056 setRejectedExecutionHandler(p, new ThreadPoolExecutor.DiscardPolicy());
2057 p.execute(setThread);
2058 assertNull(thread.get());
2059
2060 setRejectedExecutionHandler(p, new ThreadPoolExecutor.CallerRunsPolicy());
2061 p.execute(setThread);
2062 if (p.isShutdown())
2063 assertNull(thread.get());
2064 else
2065 assertSame(Thread.currentThread(), thread.get());
2066
2067 setRejectedExecutionHandler(p, savedHandler);
2068
2069 // check that pool was not perturbed by handlers
2070 assertEquals(savedTaskCount, p.getTaskCount());
2071 assertEquals(savedCompletedTaskCount, p.getCompletedTaskCount());
2072 assertEquals(savedQueueSize, p.getQueue().size());
2073 }
2074
2075 void assertCollectionsEquals(Collection<?> x, Collection<?> y) {
2076 assertEquals(x, y);
2077 assertEquals(y, x);
2078 assertEquals(x.isEmpty(), y.isEmpty());
2079 assertEquals(x.size(), y.size());
2080 if (x instanceof List) {
2081 assertEquals(x.toString(), y.toString());
2082 }
2083 if (x instanceof List || x instanceof Set) {
2084 assertEquals(x.hashCode(), y.hashCode());
2085 }
2086 if (x instanceof List || x instanceof Deque) {
2087 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2088 assertTrue(Arrays.equals(x.toArray(new Object[0]),
2089 y.toArray(new Object[0])));
2090 }
2091 }
2092
2093 /**
2094 * A weaker form of assertCollectionsEquals which does not insist
2095 * that the two collections satisfy Object#equals(Object), since
2096 * they may use identity semantics as Deques do.
2097 */
2098 void assertCollectionsEquivalent(Collection<?> x, Collection<?> y) {
2099 if (x instanceof List || x instanceof Set)
2100 assertCollectionsEquals(x, y);
2101 else {
2102 assertEquals(x.isEmpty(), y.isEmpty());
2103 assertEquals(x.size(), y.size());
2104 assertEquals(new HashSet(x), new HashSet(y));
2105 if (x instanceof Deque) {
2106 assertTrue(Arrays.equals(x.toArray(), y.toArray()));
2107 assertTrue(Arrays.equals(x.toArray(new Object[0]),
2108 y.toArray(new Object[0])));
2109 }
2110 }
2111 }
2112 }