ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.170
Committed: Thu Oct 8 22:39:57 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.169: +7 -1 lines
Log Message:
add even more debugging info to wedged test detection

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