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