ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.184
Committed: Wed Feb 10 00:05:20 2016 UTC (8 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.183: +1 -0 lines
Log Message:
sync changes from 8149391: Fix module dependences in java/util tests

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