ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.252
Committed: Thu Jan 10 04:35:16 2019 UTC (5 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.251: +6 -0 lines
Log Message:
add support for java 17

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