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      */
 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 
 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 
 295     public JSR166TestCase() { super(); }
 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 
 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);
 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 
 356     public void runBare() throws Throwable {
 357         currentTestCase = this;
 358         if (methodFilter == null
 359             || methodFilter.matcher(toString()).find())
 360             super.runBare();
 361     }
 362 
 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 
 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      */
 390     public static void main(String[] args) {
 391         main(suite(), args);
 392     }
 393 
 394     static class PithyResultPrinter extends junit.textui.ResultPrinter {
 395         PithyResultPrinter(java.io.PrintStream writer) { super(writer); }
 396         long runTime;
 397         public void startTest(Test test) {}
 398         protected void printHeader(long runTime) {
 399             this.runTime = runTime; // defer printing for later
 400         }
 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      */
 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      */
 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 
 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 
 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 
 484     public static boolean atLeastJava6()  { return JAVA_CLASS_VERSION >= 50.0; }
 485     public static boolean atLeastJava7()  { return JAVA_CLASS_VERSION >= 51.0; }
 486     public static boolean atLeastJava8()  { return JAVA_CLASS_VERSION >= 52.0; }
 487     public static boolean atLeastJava9()  { return JAVA_CLASS_VERSION >= 53.0; }
 488     public static boolean atLeastJava10() { return JAVA_CLASS_VERSION >= 54.0; }
 489     public static boolean atLeastJava11() { return JAVA_CLASS_VERSION >= 55.0; }
 490 
 491     /**
 492      * Collects all JSR166 unit tests as one suite.
 493      */
 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. */
 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      */
 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      */
 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      */
 693     static long randomTimeout() { return RANDOM_TIMEOUT; }
 694 
 695     /**
 696      * Returns a timeout that means "no waiting", i.e. not positive.
 697      */
 698     static long randomExpiredTimeout() { return RANDOM_EXPIRED_TIMEOUT; }
 699 
 700     /**
 701      * Returns a random non-null TimeUnit.
 702      */
 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      */
 711     protected long getShortDelay() {
 712         return (long) (50 * delayFactor);
 713     }
 714 
 715     /**
 716      * Sets delays as multiples of SHORT_DELAY.
 717      */
 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      */
 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      */
 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      */
 759     public void threadRecordFailure(Throwable t) {
 760         System.err.println(t);
 761         dumpTestThreads();
 762         threadFailure.compareAndSet(null, t);
 763     }
 764 
 765     public void setUp() {
 766         setDelays();
 767     }
 768 
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 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      */
 930     public void threadShouldThrow() {
 931         threadFail("should throw exception");
 932     }
 933 
 934     /**
 935      * Calls threadFail with message "should throw" + exceptionName.
 936      */
 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      */
 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      */
 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;
 981         public PoolCleaner(ExecutorService pool) { this.pool = pool; }
 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;
 990         public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
 991             super(pool);
 992             this.releaser = releaser;
 993         }
 994         public void close() {
 995             try {
 996                 releaser.run();
 997             } finally {
 998                 super.close();
 999             }
1000         }
1001     }
1002 
1003     PoolCleaner cleaner(ExecutorService pool) {
1004         return new PoolCleaner(pool);
1005     }
1006 
1007     PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
1008         return new PoolCleanerWithReleaser(pool, releaser);
1009     }
1010 
1011     PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
1012         return new PoolCleanerWithReleaser(pool, releaser(latch));
1013     }
1014 
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 }