ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.161
Committed: Sun Oct 4 03:49:33 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.160: +16 -5 lines
Log Message:
improve testSaturatedExecute4

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 class LatchAwaiter extends CheckedRunnable {
1322 final static int NEW = 0;
1323 final static int RUNNING = 1;
1324 final static int DONE = 2;
1325 final CountDownLatch latch;
1326 int state = NEW;
1327 LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1328 public void realRun() throws InterruptedException {
1329 state = 1;
1330 await(latch);
1331 state = 2;
1332 }
1333 }
1334
1335 public LatchAwaiter awaiter(CountDownLatch latch) {
1336 return new LatchAwaiter(latch);
1337 }
1338
1339 public void await(CountDownLatch latch) {
1340 try {
1341 assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
1342 } catch (Throwable fail) {
1343 threadUnexpectedException(fail);
1344 }
1345 }
1346
1347 public void await(Semaphore semaphore) {
1348 try {
1349 assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
1350 } catch (Throwable fail) {
1351 threadUnexpectedException(fail);
1352 }
1353 }
1354
1355 // /**
1356 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1357 // */
1358 // public void await(AtomicBoolean flag) {
1359 // await(flag, LONG_DELAY_MS);
1360 // }
1361
1362 // /**
1363 // * Spin-waits up to the specified timeout until flag becomes true.
1364 // */
1365 // public void await(AtomicBoolean flag, long timeoutMillis) {
1366 // long startTime = System.nanoTime();
1367 // while (!flag.get()) {
1368 // if (millisElapsedSince(startTime) > timeoutMillis)
1369 // throw new AssertionFailedError("timed out");
1370 // Thread.yield();
1371 // }
1372 // }
1373
1374 public static class NPETask implements Callable<String> {
1375 public String call() { throw new NullPointerException(); }
1376 }
1377
1378 public static class CallableOne implements Callable<Integer> {
1379 public Integer call() { return one; }
1380 }
1381
1382 public class ShortRunnable extends CheckedRunnable {
1383 protected void realRun() throws Throwable {
1384 delay(SHORT_DELAY_MS);
1385 }
1386 }
1387
1388 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1389 protected void realRun() throws InterruptedException {
1390 delay(SHORT_DELAY_MS);
1391 }
1392 }
1393
1394 public class SmallRunnable extends CheckedRunnable {
1395 protected void realRun() throws Throwable {
1396 delay(SMALL_DELAY_MS);
1397 }
1398 }
1399
1400 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1401 protected void realRun() {
1402 try {
1403 delay(SMALL_DELAY_MS);
1404 } catch (InterruptedException ok) {}
1405 }
1406 }
1407
1408 public class SmallCallable extends CheckedCallable {
1409 protected Object realCall() throws InterruptedException {
1410 delay(SMALL_DELAY_MS);
1411 return Boolean.TRUE;
1412 }
1413 }
1414
1415 public class MediumRunnable extends CheckedRunnable {
1416 protected void realRun() throws Throwable {
1417 delay(MEDIUM_DELAY_MS);
1418 }
1419 }
1420
1421 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1422 protected void realRun() throws InterruptedException {
1423 delay(MEDIUM_DELAY_MS);
1424 }
1425 }
1426
1427 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1428 return new CheckedRunnable() {
1429 protected void realRun() {
1430 try {
1431 delay(timeoutMillis);
1432 } catch (InterruptedException ok) {}
1433 }};
1434 }
1435
1436 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1437 protected void realRun() {
1438 try {
1439 delay(MEDIUM_DELAY_MS);
1440 } catch (InterruptedException ok) {}
1441 }
1442 }
1443
1444 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1445 protected void realRun() {
1446 try {
1447 delay(LONG_DELAY_MS);
1448 } catch (InterruptedException ok) {}
1449 }
1450 }
1451
1452 /**
1453 * For use as ThreadFactory in constructors
1454 */
1455 public static class SimpleThreadFactory implements ThreadFactory {
1456 public Thread newThread(Runnable r) {
1457 return new Thread(r);
1458 }
1459 }
1460
1461 public interface TrackedRunnable extends Runnable {
1462 boolean isDone();
1463 }
1464
1465 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1466 return new TrackedRunnable() {
1467 private volatile boolean done = false;
1468 public boolean isDone() { return done; }
1469 public void run() {
1470 try {
1471 delay(timeoutMillis);
1472 done = true;
1473 } catch (InterruptedException ok) {}
1474 }
1475 };
1476 }
1477
1478 public static class TrackedShortRunnable implements Runnable {
1479 public volatile boolean done = false;
1480 public void run() {
1481 try {
1482 delay(SHORT_DELAY_MS);
1483 done = true;
1484 } catch (InterruptedException ok) {}
1485 }
1486 }
1487
1488 public static class TrackedSmallRunnable implements Runnable {
1489 public volatile boolean done = false;
1490 public void run() {
1491 try {
1492 delay(SMALL_DELAY_MS);
1493 done = true;
1494 } catch (InterruptedException ok) {}
1495 }
1496 }
1497
1498 public static class TrackedMediumRunnable implements Runnable {
1499 public volatile boolean done = false;
1500 public void run() {
1501 try {
1502 delay(MEDIUM_DELAY_MS);
1503 done = true;
1504 } catch (InterruptedException ok) {}
1505 }
1506 }
1507
1508 public static class TrackedLongRunnable implements Runnable {
1509 public volatile boolean done = false;
1510 public void run() {
1511 try {
1512 delay(LONG_DELAY_MS);
1513 done = true;
1514 } catch (InterruptedException ok) {}
1515 }
1516 }
1517
1518 public static class TrackedNoOpRunnable implements Runnable {
1519 public volatile boolean done = false;
1520 public void run() {
1521 done = true;
1522 }
1523 }
1524
1525 public static class TrackedCallable implements Callable {
1526 public volatile boolean done = false;
1527 public Object call() {
1528 try {
1529 delay(SMALL_DELAY_MS);
1530 done = true;
1531 } catch (InterruptedException ok) {}
1532 return Boolean.TRUE;
1533 }
1534 }
1535
1536 /**
1537 * Analog of CheckedRunnable for RecursiveAction
1538 */
1539 public abstract class CheckedRecursiveAction extends RecursiveAction {
1540 protected abstract void realCompute() throws Throwable;
1541
1542 @Override protected final void compute() {
1543 try {
1544 realCompute();
1545 } catch (Throwable fail) {
1546 threadUnexpectedException(fail);
1547 }
1548 }
1549 }
1550
1551 /**
1552 * Analog of CheckedCallable for RecursiveTask
1553 */
1554 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1555 protected abstract T realCompute() throws Throwable;
1556
1557 @Override protected final T compute() {
1558 try {
1559 return realCompute();
1560 } catch (Throwable fail) {
1561 threadUnexpectedException(fail);
1562 return null;
1563 }
1564 }
1565 }
1566
1567 /**
1568 * For use as RejectedExecutionHandler in constructors
1569 */
1570 public static class NoOpREHandler implements RejectedExecutionHandler {
1571 public void rejectedExecution(Runnable r,
1572 ThreadPoolExecutor executor) {}
1573 }
1574
1575 /**
1576 * A CyclicBarrier that uses timed await and fails with
1577 * AssertionFailedErrors instead of throwing checked exceptions.
1578 */
1579 public class CheckedBarrier extends CyclicBarrier {
1580 public CheckedBarrier(int parties) { super(parties); }
1581
1582 public int await() {
1583 try {
1584 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1585 } catch (TimeoutException timedOut) {
1586 throw new AssertionFailedError("timed out");
1587 } catch (Exception fail) {
1588 AssertionFailedError afe =
1589 new AssertionFailedError("Unexpected exception: " + fail);
1590 afe.initCause(fail);
1591 throw afe;
1592 }
1593 }
1594 }
1595
1596 void checkEmpty(BlockingQueue q) {
1597 try {
1598 assertTrue(q.isEmpty());
1599 assertEquals(0, q.size());
1600 assertNull(q.peek());
1601 assertNull(q.poll());
1602 assertNull(q.poll(0, MILLISECONDS));
1603 assertEquals(q.toString(), "[]");
1604 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1605 assertFalse(q.iterator().hasNext());
1606 try {
1607 q.element();
1608 shouldThrow();
1609 } catch (NoSuchElementException success) {}
1610 try {
1611 q.iterator().next();
1612 shouldThrow();
1613 } catch (NoSuchElementException success) {}
1614 try {
1615 q.remove();
1616 shouldThrow();
1617 } catch (NoSuchElementException success) {}
1618 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1619 }
1620
1621 void assertSerialEquals(Object x, Object y) {
1622 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1623 }
1624
1625 void assertNotSerialEquals(Object x, Object y) {
1626 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1627 }
1628
1629 byte[] serialBytes(Object o) {
1630 try {
1631 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1632 ObjectOutputStream oos = new ObjectOutputStream(bos);
1633 oos.writeObject(o);
1634 oos.flush();
1635 oos.close();
1636 return bos.toByteArray();
1637 } catch (Throwable fail) {
1638 threadUnexpectedException(fail);
1639 return new byte[0];
1640 }
1641 }
1642
1643 @SuppressWarnings("unchecked")
1644 <T> T serialClone(T o) {
1645 try {
1646 ObjectInputStream ois = new ObjectInputStream
1647 (new ByteArrayInputStream(serialBytes(o)));
1648 T clone = (T) ois.readObject();
1649 assertSame(o.getClass(), clone.getClass());
1650 return clone;
1651 } catch (Throwable fail) {
1652 threadUnexpectedException(fail);
1653 return null;
1654 }
1655 }
1656
1657 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1658 Runnable... throwingActions) {
1659 for (Runnable throwingAction : throwingActions) {
1660 boolean threw = false;
1661 try { throwingAction.run(); }
1662 catch (Throwable t) {
1663 threw = true;
1664 if (!expectedExceptionClass.isInstance(t)) {
1665 AssertionFailedError afe =
1666 new AssertionFailedError
1667 ("Expected " + expectedExceptionClass.getName() +
1668 ", got " + t.getClass().getName());
1669 afe.initCause(t);
1670 threadUnexpectedException(afe);
1671 }
1672 }
1673 if (!threw)
1674 shouldThrow(expectedExceptionClass.getName());
1675 }
1676 }
1677
1678 public void assertIteratorExhausted(Iterator<?> it) {
1679 try {
1680 it.next();
1681 shouldThrow();
1682 } catch (NoSuchElementException success) {}
1683 assertFalse(it.hasNext());
1684 }
1685 }