ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.163
Committed: Sun Oct 4 05:52:08 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.162: +8 -10 lines
Log Message:
improve delay

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. Ensures that the given time, as measured
753 * by System.nanoTime(), has elapsed.
754 */
755 static void delay(long millis) throws InterruptedException {
756 long nanos = millis * (1000 * 1000);
757 final long wakeupTime = System.nanoTime() + nanos;
758 do {
759 if (millis > 0L)
760 Thread.sleep(millis);
761 else // too short to sleep
762 Thread.yield();
763 nanos = wakeupTime - System.nanoTime();
764 millis = nanos / (1000 * 1000);
765 } while (nanos >= 0L);
766 }
767
768 /**
769 * Allows use of try-with-resources with per-test thread pools.
770 */
771 class PoolCleaner implements AutoCloseable {
772 private final ExecutorService pool;
773 public PoolCleaner(ExecutorService pool) { this.pool = pool; }
774 public void close() { joinPool(pool); }
775 }
776
777 PoolCleaner cleaner(ExecutorService pool) {
778 return new PoolCleaner(pool);
779 }
780
781 /**
782 * Waits out termination of a thread pool or fails doing so.
783 */
784 void joinPool(ExecutorService pool) {
785 try {
786 pool.shutdown();
787 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
788 try {
789 threadFail("ExecutorService " + pool +
790 " did not terminate in a timely manner");
791 } finally {
792 // last resort, for the benefit of subsequent tests
793 pool.shutdownNow();
794 pool.awaitTermination(SMALL_DELAY_MS, MILLISECONDS);
795 }
796 }
797 } catch (SecurityException ok) {
798 // Allowed in case test doesn't have privs
799 } catch (InterruptedException fail) {
800 threadFail("Unexpected InterruptedException");
801 }
802 }
803
804 /** Like Runnable, but with the freedom to throw anything */
805 interface Action { public void run() throws Throwable; }
806
807 /**
808 * Runs all the given actions in parallel, failing if any fail.
809 * Useful for running multiple variants of tests that are
810 * necessarily individually slow because they must block.
811 */
812 void testInParallel(Action ... actions) {
813 ExecutorService pool = Executors.newCachedThreadPool();
814 try (PoolCleaner cleaner = cleaner(pool)) {
815 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
816 for (final Action action : actions)
817 futures.add(pool.submit(new CheckedRunnable() {
818 public void realRun() throws Throwable { action.run();}}));
819 for (Future<?> future : futures)
820 try {
821 assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
822 } catch (ExecutionException ex) {
823 threadUnexpectedException(ex.getCause());
824 } catch (Exception ex) {
825 threadUnexpectedException(ex);
826 }
827 }
828 }
829
830 /**
831 * A debugging tool to print stack traces of most threads, as jstack does.
832 * Uninteresting threads are filtered out.
833 */
834 static void dumpTestThreads() {
835 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
836 System.err.println("------ stacktrace dump start ------");
837 for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
838 String name = info.getThreadName();
839 if ("Signal Dispatcher".equals(name))
840 continue;
841 if ("Reference Handler".equals(name)
842 && info.getLockName().startsWith("java.lang.ref.Reference$Lock"))
843 continue;
844 if ("Finalizer".equals(name)
845 && info.getLockName().startsWith("java.lang.ref.ReferenceQueue$Lock"))
846 continue;
847 if ("checkForWedgedTest".equals(name))
848 continue;
849 System.err.print(info);
850 }
851 System.err.println("------ stacktrace dump end ------");
852 }
853
854 /**
855 * Checks that thread does not terminate within the default
856 * millisecond delay of {@code timeoutMillis()}.
857 */
858 void assertThreadStaysAlive(Thread thread) {
859 assertThreadStaysAlive(thread, timeoutMillis());
860 }
861
862 /**
863 * Checks that thread does not terminate within the given millisecond delay.
864 */
865 void assertThreadStaysAlive(Thread thread, long millis) {
866 try {
867 // No need to optimize the failing case via Thread.join.
868 delay(millis);
869 assertTrue(thread.isAlive());
870 } catch (InterruptedException fail) {
871 threadFail("Unexpected InterruptedException");
872 }
873 }
874
875 /**
876 * Checks that the threads do not terminate within the default
877 * millisecond delay of {@code timeoutMillis()}.
878 */
879 void assertThreadsStayAlive(Thread... threads) {
880 assertThreadsStayAlive(timeoutMillis(), threads);
881 }
882
883 /**
884 * Checks that the threads do not terminate within the given millisecond delay.
885 */
886 void assertThreadsStayAlive(long millis, Thread... threads) {
887 try {
888 // No need to optimize the failing case via Thread.join.
889 delay(millis);
890 for (Thread thread : threads)
891 assertTrue(thread.isAlive());
892 } catch (InterruptedException fail) {
893 threadFail("Unexpected InterruptedException");
894 }
895 }
896
897 /**
898 * Checks that future.get times out, with the default timeout of
899 * {@code timeoutMillis()}.
900 */
901 void assertFutureTimesOut(Future future) {
902 assertFutureTimesOut(future, timeoutMillis());
903 }
904
905 /**
906 * Checks that future.get times out, with the given millisecond timeout.
907 */
908 void assertFutureTimesOut(Future future, long timeoutMillis) {
909 long startTime = System.nanoTime();
910 try {
911 future.get(timeoutMillis, MILLISECONDS);
912 shouldThrow();
913 } catch (TimeoutException success) {
914 } catch (Exception fail) {
915 threadUnexpectedException(fail);
916 } finally { future.cancel(true); }
917 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
918 }
919
920 /**
921 * Fails with message "should throw exception".
922 */
923 public void shouldThrow() {
924 fail("Should throw exception");
925 }
926
927 /**
928 * Fails with message "should throw " + exceptionName.
929 */
930 public void shouldThrow(String exceptionName) {
931 fail("Should throw " + exceptionName);
932 }
933
934 /**
935 * The number of elements to place in collections, arrays, etc.
936 */
937 public static final int SIZE = 20;
938
939 // Some convenient Integer constants
940
941 public static final Integer zero = new Integer(0);
942 public static final Integer one = new Integer(1);
943 public static final Integer two = new Integer(2);
944 public static final Integer three = new Integer(3);
945 public static final Integer four = new Integer(4);
946 public static final Integer five = new Integer(5);
947 public static final Integer six = new Integer(6);
948 public static final Integer seven = new Integer(7);
949 public static final Integer eight = new Integer(8);
950 public static final Integer nine = new Integer(9);
951 public static final Integer m1 = new Integer(-1);
952 public static final Integer m2 = new Integer(-2);
953 public static final Integer m3 = new Integer(-3);
954 public static final Integer m4 = new Integer(-4);
955 public static final Integer m5 = new Integer(-5);
956 public static final Integer m6 = new Integer(-6);
957 public static final Integer m10 = new Integer(-10);
958
959 /**
960 * Runs Runnable r with a security policy that permits precisely
961 * the specified permissions. If there is no current security
962 * manager, the runnable is run twice, both with and without a
963 * security manager. We require that any security manager permit
964 * getPolicy/setPolicy.
965 */
966 public void runWithPermissions(Runnable r, Permission... permissions) {
967 SecurityManager sm = System.getSecurityManager();
968 if (sm == null) {
969 r.run();
970 }
971 runWithSecurityManagerWithPermissions(r, permissions);
972 }
973
974 /**
975 * Runs Runnable r with a security policy that permits precisely
976 * the specified permissions. If there is no current security
977 * manager, a temporary one is set for the duration of the
978 * Runnable. We require that any security manager permit
979 * getPolicy/setPolicy.
980 */
981 public void runWithSecurityManagerWithPermissions(Runnable r,
982 Permission... permissions) {
983 SecurityManager sm = System.getSecurityManager();
984 if (sm == null) {
985 Policy savedPolicy = Policy.getPolicy();
986 try {
987 Policy.setPolicy(permissivePolicy());
988 System.setSecurityManager(new SecurityManager());
989 runWithSecurityManagerWithPermissions(r, permissions);
990 } finally {
991 System.setSecurityManager(null);
992 Policy.setPolicy(savedPolicy);
993 }
994 } else {
995 Policy savedPolicy = Policy.getPolicy();
996 AdjustablePolicy policy = new AdjustablePolicy(permissions);
997 Policy.setPolicy(policy);
998
999 try {
1000 r.run();
1001 } finally {
1002 policy.addPermission(new SecurityPermission("setPolicy"));
1003 Policy.setPolicy(savedPolicy);
1004 }
1005 }
1006 }
1007
1008 /**
1009 * Runs a runnable without any permissions.
1010 */
1011 public void runWithoutPermissions(Runnable r) {
1012 runWithPermissions(r);
1013 }
1014
1015 /**
1016 * A security policy where new permissions can be dynamically added
1017 * or all cleared.
1018 */
1019 public static class AdjustablePolicy extends java.security.Policy {
1020 Permissions perms = new Permissions();
1021 AdjustablePolicy(Permission... permissions) {
1022 for (Permission permission : permissions)
1023 perms.add(permission);
1024 }
1025 void addPermission(Permission perm) { perms.add(perm); }
1026 void clearPermissions() { perms = new Permissions(); }
1027 public PermissionCollection getPermissions(CodeSource cs) {
1028 return perms;
1029 }
1030 public PermissionCollection getPermissions(ProtectionDomain pd) {
1031 return perms;
1032 }
1033 public boolean implies(ProtectionDomain pd, Permission p) {
1034 return perms.implies(p);
1035 }
1036 public void refresh() {}
1037 public String toString() {
1038 List<Permission> ps = new ArrayList<Permission>();
1039 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1040 ps.add(e.nextElement());
1041 return "AdjustablePolicy with permissions " + ps;
1042 }
1043 }
1044
1045 /**
1046 * Returns a policy containing all the permissions we ever need.
1047 */
1048 public static Policy permissivePolicy() {
1049 return new AdjustablePolicy
1050 // Permissions j.u.c. needs directly
1051 (new RuntimePermission("modifyThread"),
1052 new RuntimePermission("getClassLoader"),
1053 new RuntimePermission("setContextClassLoader"),
1054 // Permissions needed to change permissions!
1055 new SecurityPermission("getPolicy"),
1056 new SecurityPermission("setPolicy"),
1057 new RuntimePermission("setSecurityManager"),
1058 // Permissions needed by the junit test harness
1059 new RuntimePermission("accessDeclaredMembers"),
1060 new PropertyPermission("*", "read"),
1061 new java.io.FilePermission("<<ALL FILES>>", "read"));
1062 }
1063
1064 /**
1065 * Sleeps until the given time has elapsed.
1066 * Throws AssertionFailedError if interrupted.
1067 */
1068 void sleep(long millis) {
1069 try {
1070 delay(millis);
1071 } catch (InterruptedException fail) {
1072 AssertionFailedError afe =
1073 new AssertionFailedError("Unexpected InterruptedException");
1074 afe.initCause(fail);
1075 throw afe;
1076 }
1077 }
1078
1079 /**
1080 * Spin-waits up to the specified number of milliseconds for the given
1081 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1082 */
1083 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1084 long startTime = System.nanoTime();
1085 for (;;) {
1086 Thread.State s = thread.getState();
1087 if (s == Thread.State.BLOCKED ||
1088 s == Thread.State.WAITING ||
1089 s == Thread.State.TIMED_WAITING)
1090 return;
1091 else if (s == Thread.State.TERMINATED)
1092 fail("Unexpected thread termination");
1093 else if (millisElapsedSince(startTime) > timeoutMillis) {
1094 threadAssertTrue(thread.isAlive());
1095 return;
1096 }
1097 Thread.yield();
1098 }
1099 }
1100
1101 /**
1102 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1103 * state: BLOCKED, WAITING, or TIMED_WAITING.
1104 */
1105 void waitForThreadToEnterWaitState(Thread thread) {
1106 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1107 }
1108
1109 /**
1110 * Returns the number of milliseconds since time given by
1111 * startNanoTime, which must have been previously returned from a
1112 * call to {@link System#nanoTime()}.
1113 */
1114 static long millisElapsedSince(long startNanoTime) {
1115 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1116 }
1117
1118 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1119 // long startTime = System.nanoTime();
1120 // try {
1121 // r.run();
1122 // } catch (Throwable fail) { threadUnexpectedException(fail); }
1123 // if (millisElapsedSince(startTime) > timeoutMillis/2)
1124 // throw new AssertionFailedError("did not return promptly");
1125 // }
1126
1127 // void assertTerminatesPromptly(Runnable r) {
1128 // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1129 // }
1130
1131 /**
1132 * Checks that timed f.get() returns the expected value, and does not
1133 * wait for the timeout to elapse before returning.
1134 */
1135 <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1136 long startTime = System.nanoTime();
1137 try {
1138 assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1139 } catch (Throwable fail) { threadUnexpectedException(fail); }
1140 if (millisElapsedSince(startTime) > timeoutMillis/2)
1141 throw new AssertionFailedError("timed get did not return promptly");
1142 }
1143
1144 <T> void checkTimedGet(Future<T> f, T expectedValue) {
1145 checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1146 }
1147
1148 /**
1149 * Returns a new started daemon Thread running the given runnable.
1150 */
1151 Thread newStartedThread(Runnable runnable) {
1152 Thread t = new Thread(runnable);
1153 t.setDaemon(true);
1154 t.start();
1155 return t;
1156 }
1157
1158 /**
1159 * Waits for the specified time (in milliseconds) for the thread
1160 * to terminate (using {@link Thread#join(long)}), else interrupts
1161 * the thread (in the hope that it may terminate later) and fails.
1162 */
1163 void awaitTermination(Thread t, long timeoutMillis) {
1164 try {
1165 t.join(timeoutMillis);
1166 } catch (InterruptedException fail) {
1167 threadUnexpectedException(fail);
1168 } finally {
1169 if (t.getState() != Thread.State.TERMINATED) {
1170 t.interrupt();
1171 fail("Test timed out");
1172 }
1173 }
1174 }
1175
1176 /**
1177 * Waits for LONG_DELAY_MS milliseconds for the thread to
1178 * terminate (using {@link Thread#join(long)}), else interrupts
1179 * the thread (in the hope that it may terminate later) and fails.
1180 */
1181 void awaitTermination(Thread t) {
1182 awaitTermination(t, LONG_DELAY_MS);
1183 }
1184
1185 // Some convenient Runnable classes
1186
1187 public abstract class CheckedRunnable implements Runnable {
1188 protected abstract void realRun() throws Throwable;
1189
1190 public final void run() {
1191 try {
1192 realRun();
1193 } catch (Throwable fail) {
1194 threadUnexpectedException(fail);
1195 }
1196 }
1197 }
1198
1199 public abstract class RunnableShouldThrow implements Runnable {
1200 protected abstract void realRun() throws Throwable;
1201
1202 final Class<?> exceptionClass;
1203
1204 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1205 this.exceptionClass = exceptionClass;
1206 }
1207
1208 public final void run() {
1209 try {
1210 realRun();
1211 threadShouldThrow(exceptionClass.getSimpleName());
1212 } catch (Throwable t) {
1213 if (! exceptionClass.isInstance(t))
1214 threadUnexpectedException(t);
1215 }
1216 }
1217 }
1218
1219 public abstract class ThreadShouldThrow extends Thread {
1220 protected abstract void realRun() throws Throwable;
1221
1222 final Class<?> exceptionClass;
1223
1224 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1225 this.exceptionClass = exceptionClass;
1226 }
1227
1228 public final void run() {
1229 try {
1230 realRun();
1231 threadShouldThrow(exceptionClass.getSimpleName());
1232 } catch (Throwable t) {
1233 if (! exceptionClass.isInstance(t))
1234 threadUnexpectedException(t);
1235 }
1236 }
1237 }
1238
1239 public abstract class CheckedInterruptedRunnable implements Runnable {
1240 protected abstract void realRun() throws Throwable;
1241
1242 public final void run() {
1243 try {
1244 realRun();
1245 threadShouldThrow("InterruptedException");
1246 } catch (InterruptedException success) {
1247 threadAssertFalse(Thread.interrupted());
1248 } catch (Throwable fail) {
1249 threadUnexpectedException(fail);
1250 }
1251 }
1252 }
1253
1254 public abstract class CheckedCallable<T> implements Callable<T> {
1255 protected abstract T realCall() throws Throwable;
1256
1257 public final T call() {
1258 try {
1259 return realCall();
1260 } catch (Throwable fail) {
1261 threadUnexpectedException(fail);
1262 return null;
1263 }
1264 }
1265 }
1266
1267 public abstract class CheckedInterruptedCallable<T>
1268 implements Callable<T> {
1269 protected abstract T realCall() throws Throwable;
1270
1271 public final T call() {
1272 try {
1273 T result = realCall();
1274 threadShouldThrow("InterruptedException");
1275 return result;
1276 } catch (InterruptedException success) {
1277 threadAssertFalse(Thread.interrupted());
1278 } catch (Throwable fail) {
1279 threadUnexpectedException(fail);
1280 }
1281 return null;
1282 }
1283 }
1284
1285 public static class NoOpRunnable implements Runnable {
1286 public void run() {}
1287 }
1288
1289 public static class NoOpCallable implements Callable {
1290 public Object call() { return Boolean.TRUE; }
1291 }
1292
1293 public static final String TEST_STRING = "a test string";
1294
1295 public static class StringTask implements Callable<String> {
1296 final String value;
1297 public StringTask() { this(TEST_STRING); }
1298 public StringTask(String value) { this.value = value; }
1299 public String call() { return value; }
1300 }
1301
1302 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1303 return new CheckedCallable<String>() {
1304 protected String realCall() {
1305 try {
1306 latch.await();
1307 } catch (InterruptedException quittingTime) {}
1308 return TEST_STRING;
1309 }};
1310 }
1311
1312 public Runnable countDowner(final CountDownLatch latch) {
1313 return new CheckedRunnable() {
1314 public void realRun() throws InterruptedException {
1315 latch.countDown();
1316 }};
1317 }
1318
1319 class LatchAwaiter extends CheckedRunnable {
1320 static final int NEW = 0;
1321 static final int RUNNING = 1;
1322 static final int DONE = 2;
1323 final CountDownLatch latch;
1324 int state = NEW;
1325 LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1326 public void realRun() throws InterruptedException {
1327 state = 1;
1328 await(latch);
1329 state = 2;
1330 }
1331 }
1332
1333 public LatchAwaiter awaiter(CountDownLatch latch) {
1334 return new LatchAwaiter(latch);
1335 }
1336
1337 public void await(CountDownLatch latch) {
1338 try {
1339 assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
1340 } catch (Throwable fail) {
1341 threadUnexpectedException(fail);
1342 }
1343 }
1344
1345 public void await(Semaphore semaphore) {
1346 try {
1347 assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
1348 } catch (Throwable fail) {
1349 threadUnexpectedException(fail);
1350 }
1351 }
1352
1353 // /**
1354 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1355 // */
1356 // public void await(AtomicBoolean flag) {
1357 // await(flag, LONG_DELAY_MS);
1358 // }
1359
1360 // /**
1361 // * Spin-waits up to the specified timeout until flag becomes true.
1362 // */
1363 // public void await(AtomicBoolean flag, long timeoutMillis) {
1364 // long startTime = System.nanoTime();
1365 // while (!flag.get()) {
1366 // if (millisElapsedSince(startTime) > timeoutMillis)
1367 // throw new AssertionFailedError("timed out");
1368 // Thread.yield();
1369 // }
1370 // }
1371
1372 public static class NPETask implements Callable<String> {
1373 public String call() { throw new NullPointerException(); }
1374 }
1375
1376 public static class CallableOne implements Callable<Integer> {
1377 public Integer call() { return one; }
1378 }
1379
1380 public class ShortRunnable extends CheckedRunnable {
1381 protected void realRun() throws Throwable {
1382 delay(SHORT_DELAY_MS);
1383 }
1384 }
1385
1386 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1387 protected void realRun() throws InterruptedException {
1388 delay(SHORT_DELAY_MS);
1389 }
1390 }
1391
1392 public class SmallRunnable extends CheckedRunnable {
1393 protected void realRun() throws Throwable {
1394 delay(SMALL_DELAY_MS);
1395 }
1396 }
1397
1398 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1399 protected void realRun() {
1400 try {
1401 delay(SMALL_DELAY_MS);
1402 } catch (InterruptedException ok) {}
1403 }
1404 }
1405
1406 public class SmallCallable extends CheckedCallable {
1407 protected Object realCall() throws InterruptedException {
1408 delay(SMALL_DELAY_MS);
1409 return Boolean.TRUE;
1410 }
1411 }
1412
1413 public class MediumRunnable extends CheckedRunnable {
1414 protected void realRun() throws Throwable {
1415 delay(MEDIUM_DELAY_MS);
1416 }
1417 }
1418
1419 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1420 protected void realRun() throws InterruptedException {
1421 delay(MEDIUM_DELAY_MS);
1422 }
1423 }
1424
1425 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1426 return new CheckedRunnable() {
1427 protected void realRun() {
1428 try {
1429 delay(timeoutMillis);
1430 } catch (InterruptedException ok) {}
1431 }};
1432 }
1433
1434 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1435 protected void realRun() {
1436 try {
1437 delay(MEDIUM_DELAY_MS);
1438 } catch (InterruptedException ok) {}
1439 }
1440 }
1441
1442 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1443 protected void realRun() {
1444 try {
1445 delay(LONG_DELAY_MS);
1446 } catch (InterruptedException ok) {}
1447 }
1448 }
1449
1450 /**
1451 * For use as ThreadFactory in constructors
1452 */
1453 public static class SimpleThreadFactory implements ThreadFactory {
1454 public Thread newThread(Runnable r) {
1455 return new Thread(r);
1456 }
1457 }
1458
1459 public interface TrackedRunnable extends Runnable {
1460 boolean isDone();
1461 }
1462
1463 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1464 return new TrackedRunnable() {
1465 private volatile boolean done = false;
1466 public boolean isDone() { return done; }
1467 public void run() {
1468 try {
1469 delay(timeoutMillis);
1470 done = true;
1471 } catch (InterruptedException ok) {}
1472 }
1473 };
1474 }
1475
1476 public static class TrackedShortRunnable implements Runnable {
1477 public volatile boolean done = false;
1478 public void run() {
1479 try {
1480 delay(SHORT_DELAY_MS);
1481 done = true;
1482 } catch (InterruptedException ok) {}
1483 }
1484 }
1485
1486 public static class TrackedSmallRunnable implements Runnable {
1487 public volatile boolean done = false;
1488 public void run() {
1489 try {
1490 delay(SMALL_DELAY_MS);
1491 done = true;
1492 } catch (InterruptedException ok) {}
1493 }
1494 }
1495
1496 public static class TrackedMediumRunnable implements Runnable {
1497 public volatile boolean done = false;
1498 public void run() {
1499 try {
1500 delay(MEDIUM_DELAY_MS);
1501 done = true;
1502 } catch (InterruptedException ok) {}
1503 }
1504 }
1505
1506 public static class TrackedLongRunnable implements Runnable {
1507 public volatile boolean done = false;
1508 public void run() {
1509 try {
1510 delay(LONG_DELAY_MS);
1511 done = true;
1512 } catch (InterruptedException ok) {}
1513 }
1514 }
1515
1516 public static class TrackedNoOpRunnable implements Runnable {
1517 public volatile boolean done = false;
1518 public void run() {
1519 done = true;
1520 }
1521 }
1522
1523 public static class TrackedCallable implements Callable {
1524 public volatile boolean done = false;
1525 public Object call() {
1526 try {
1527 delay(SMALL_DELAY_MS);
1528 done = true;
1529 } catch (InterruptedException ok) {}
1530 return Boolean.TRUE;
1531 }
1532 }
1533
1534 /**
1535 * Analog of CheckedRunnable for RecursiveAction
1536 */
1537 public abstract class CheckedRecursiveAction extends RecursiveAction {
1538 protected abstract void realCompute() throws Throwable;
1539
1540 @Override protected final void compute() {
1541 try {
1542 realCompute();
1543 } catch (Throwable fail) {
1544 threadUnexpectedException(fail);
1545 }
1546 }
1547 }
1548
1549 /**
1550 * Analog of CheckedCallable for RecursiveTask
1551 */
1552 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1553 protected abstract T realCompute() throws Throwable;
1554
1555 @Override protected final T compute() {
1556 try {
1557 return realCompute();
1558 } catch (Throwable fail) {
1559 threadUnexpectedException(fail);
1560 return null;
1561 }
1562 }
1563 }
1564
1565 /**
1566 * For use as RejectedExecutionHandler in constructors
1567 */
1568 public static class NoOpREHandler implements RejectedExecutionHandler {
1569 public void rejectedExecution(Runnable r,
1570 ThreadPoolExecutor executor) {}
1571 }
1572
1573 /**
1574 * A CyclicBarrier that uses timed await and fails with
1575 * AssertionFailedErrors instead of throwing checked exceptions.
1576 */
1577 public class CheckedBarrier extends CyclicBarrier {
1578 public CheckedBarrier(int parties) { super(parties); }
1579
1580 public int await() {
1581 try {
1582 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1583 } catch (TimeoutException timedOut) {
1584 throw new AssertionFailedError("timed out");
1585 } catch (Exception fail) {
1586 AssertionFailedError afe =
1587 new AssertionFailedError("Unexpected exception: " + fail);
1588 afe.initCause(fail);
1589 throw afe;
1590 }
1591 }
1592 }
1593
1594 void checkEmpty(BlockingQueue q) {
1595 try {
1596 assertTrue(q.isEmpty());
1597 assertEquals(0, q.size());
1598 assertNull(q.peek());
1599 assertNull(q.poll());
1600 assertNull(q.poll(0, MILLISECONDS));
1601 assertEquals(q.toString(), "[]");
1602 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1603 assertFalse(q.iterator().hasNext());
1604 try {
1605 q.element();
1606 shouldThrow();
1607 } catch (NoSuchElementException success) {}
1608 try {
1609 q.iterator().next();
1610 shouldThrow();
1611 } catch (NoSuchElementException success) {}
1612 try {
1613 q.remove();
1614 shouldThrow();
1615 } catch (NoSuchElementException success) {}
1616 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1617 }
1618
1619 void assertSerialEquals(Object x, Object y) {
1620 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1621 }
1622
1623 void assertNotSerialEquals(Object x, Object y) {
1624 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1625 }
1626
1627 byte[] serialBytes(Object o) {
1628 try {
1629 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1630 ObjectOutputStream oos = new ObjectOutputStream(bos);
1631 oos.writeObject(o);
1632 oos.flush();
1633 oos.close();
1634 return bos.toByteArray();
1635 } catch (Throwable fail) {
1636 threadUnexpectedException(fail);
1637 return new byte[0];
1638 }
1639 }
1640
1641 @SuppressWarnings("unchecked")
1642 <T> T serialClone(T o) {
1643 try {
1644 ObjectInputStream ois = new ObjectInputStream
1645 (new ByteArrayInputStream(serialBytes(o)));
1646 T clone = (T) ois.readObject();
1647 assertSame(o.getClass(), clone.getClass());
1648 return clone;
1649 } catch (Throwable fail) {
1650 threadUnexpectedException(fail);
1651 return null;
1652 }
1653 }
1654
1655 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1656 Runnable... throwingActions) {
1657 for (Runnable throwingAction : throwingActions) {
1658 boolean threw = false;
1659 try { throwingAction.run(); }
1660 catch (Throwable t) {
1661 threw = true;
1662 if (!expectedExceptionClass.isInstance(t)) {
1663 AssertionFailedError afe =
1664 new AssertionFailedError
1665 ("Expected " + expectedExceptionClass.getName() +
1666 ", got " + t.getClass().getName());
1667 afe.initCause(t);
1668 threadUnexpectedException(afe);
1669 }
1670 }
1671 if (!threw)
1672 shouldThrow(expectedExceptionClass.getName());
1673 }
1674 }
1675
1676 public void assertIteratorExhausted(Iterator<?> it) {
1677 try {
1678 it.next();
1679 shouldThrow();
1680 } catch (NoSuchElementException success) {}
1681 assertFalse(it.hasNext());
1682 }
1683 }