ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.207
Committed: Thu Nov 3 20:41:32 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.206: +2 -1 lines
Log Message:
add VectorTest

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