ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.246
Committed: Sun Jul 22 21:25:16 2018 UTC (5 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.245: +10 -6 lines
Log Message:
Fix errorprone warning [AssertionFailureIgnored]

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