ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.168
Committed: Mon Oct 5 22:53:25 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.167: +1 -1 lines
Log Message:
improve awaitTermination

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