ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.160
Committed: Sun Oct 4 00:59:09 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.159: +7 -9 lines
Log Message:
rejigger pool closing infrastructure

File Contents

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