ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.250
Committed: Sat Nov 24 21:48:19 2018 UTC (5 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.249: +1 -0 lines
Log Message:
appease errorprone [MissingCasesInEnumSwitch]

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