ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.145
Committed: Fri Sep 25 05:41:29 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.144: +8 -7 lines
Log Message:
optimize runTestProfiled

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