ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.266
Committed: Sat Sep 7 17:40:05 2019 UTC (4 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.265: +36 -17 lines
Log Message:
Handle changes to Reference Handler stacktrace due to JDK-8156500

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