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