ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.174
Committed: Fri Oct 9 19:09:59 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.173: +5 -2 lines
Log Message:
check for wedged tests at least every 15 minutes

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