ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.251
Committed: Wed Dec 12 16:59:55 2018 UTC (5 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.250: +1 -0 lines
Log Message:
Add LinkedHashMapTest

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