ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.255
Committed: Sun Jul 28 18:09:25 2019 UTC (4 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.254: +3 -2 lines
Log Message:
timeoutMinutes should take delay factor into account

File Contents

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