ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.205
Committed: Mon Oct 17 17:52:30 2016 UTC (7 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.204: +1 -0 lines
Log Message:
add ArrayListTest (because it was easy enough to do so)

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
504 // Java8+ test classes
505 if (atLeastJava8()) {
506 String[] java8TestClassNames = {
507 "Atomic8Test",
508 "CompletableFutureTest",
509 "ConcurrentHashMap8Test",
510 "CountedCompleter8Test",
511 "DoubleAccumulatorTest",
512 "DoubleAdderTest",
513 "ForkJoinPool8Test",
514 "ForkJoinTask8Test",
515 "LongAccumulatorTest",
516 "LongAdderTest",
517 "SplittableRandomTest",
518 "StampedLockTest",
519 "SubmissionPublisherTest",
520 "ThreadLocalRandom8Test",
521 "TimeUnit8Test",
522 };
523 addNamedTestClasses(suite, java8TestClassNames);
524 }
525
526 // Java9+ test classes
527 if (atLeastJava9()) {
528 String[] java9TestClassNames = {
529 "AtomicBoolean9Test",
530 "AtomicInteger9Test",
531 "AtomicIntegerArray9Test",
532 "AtomicLong9Test",
533 "AtomicLongArray9Test",
534 "AtomicReference9Test",
535 "AtomicReferenceArray9Test",
536 "ExecutorCompletionService9Test",
537 };
538 addNamedTestClasses(suite, java9TestClassNames);
539 }
540
541 return suite;
542 }
543
544 /** Returns list of junit-style test method names in given class. */
545 public static ArrayList<String> testMethodNames(Class<?> testClass) {
546 Method[] methods = testClass.getDeclaredMethods();
547 ArrayList<String> names = new ArrayList<String>(methods.length);
548 for (Method method : methods) {
549 if (method.getName().startsWith("test")
550 && Modifier.isPublic(method.getModifiers())
551 // method.getParameterCount() requires jdk8+
552 && method.getParameterTypes().length == 0) {
553 names.add(method.getName());
554 }
555 }
556 return names;
557 }
558
559 /**
560 * Returns junit-style testSuite for the given test class, but
561 * parameterized by passing extra data to each test.
562 */
563 public static <ExtraData> Test parameterizedTestSuite
564 (Class<? extends JSR166TestCase> testClass,
565 Class<ExtraData> dataClass,
566 ExtraData data) {
567 try {
568 TestSuite suite = new TestSuite();
569 Constructor c =
570 testClass.getDeclaredConstructor(dataClass, String.class);
571 for (String methodName : testMethodNames(testClass))
572 suite.addTest((Test) c.newInstance(data, methodName));
573 return suite;
574 } catch (Exception e) {
575 throw new Error(e);
576 }
577 }
578
579 /**
580 * Returns junit-style testSuite for the jdk8 extension of the
581 * given test class, but parameterized by passing extra data to
582 * each test. Uses reflection to allow compilation in jdk7.
583 */
584 public static <ExtraData> Test jdk8ParameterizedTestSuite
585 (Class<? extends JSR166TestCase> testClass,
586 Class<ExtraData> dataClass,
587 ExtraData data) {
588 if (atLeastJava8()) {
589 String name = testClass.getName();
590 String name8 = name.replaceAll("Test$", "8Test");
591 if (name.equals(name8)) throw new Error(name);
592 try {
593 return (Test)
594 Class.forName(name8)
595 .getMethod("testSuite", new Class[] { dataClass })
596 .invoke(null, data);
597 } catch (Exception e) {
598 throw new Error(e);
599 }
600 } else {
601 return new TestSuite();
602 }
603 }
604
605 // Delays for timing-dependent tests, in milliseconds.
606
607 public static long SHORT_DELAY_MS;
608 public static long SMALL_DELAY_MS;
609 public static long MEDIUM_DELAY_MS;
610 public static long LONG_DELAY_MS;
611
612 /**
613 * Returns the shortest timed delay. This can be scaled up for
614 * slow machines using the jsr166.delay.factor system property,
615 * or via jtreg's -timeoutFactor: flag.
616 * http://openjdk.java.net/jtreg/command-help.html
617 */
618 protected long getShortDelay() {
619 return (long) (50 * delayFactor);
620 }
621
622 /**
623 * Sets delays as multiples of SHORT_DELAY.
624 */
625 protected void setDelays() {
626 SHORT_DELAY_MS = getShortDelay();
627 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
628 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
629 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
630 }
631
632 /**
633 * Returns a timeout in milliseconds to be used in tests that
634 * verify that operations block or time out.
635 */
636 long timeoutMillis() {
637 return SHORT_DELAY_MS / 4;
638 }
639
640 /**
641 * Returns a new Date instance representing a time at least
642 * delayMillis milliseconds in the future.
643 */
644 Date delayedDate(long delayMillis) {
645 // Add 1 because currentTimeMillis is known to round into the past.
646 return new Date(System.currentTimeMillis() + delayMillis + 1);
647 }
648
649 /**
650 * The first exception encountered if any threadAssertXXX method fails.
651 */
652 private final AtomicReference<Throwable> threadFailure
653 = new AtomicReference<Throwable>(null);
654
655 /**
656 * Records an exception so that it can be rethrown later in the test
657 * harness thread, triggering a test case failure. Only the first
658 * failure is recorded; subsequent calls to this method from within
659 * the same test have no effect.
660 */
661 public void threadRecordFailure(Throwable t) {
662 System.err.println(t);
663 dumpTestThreads();
664 threadFailure.compareAndSet(null, t);
665 }
666
667 public void setUp() {
668 setDelays();
669 }
670
671 void tearDownFail(String format, Object... args) {
672 String msg = toString() + ": " + String.format(format, args);
673 System.err.println(msg);
674 dumpTestThreads();
675 throw new AssertionFailedError(msg);
676 }
677
678 /**
679 * Extra checks that get done for all test cases.
680 *
681 * Triggers test case failure if any thread assertions have failed,
682 * by rethrowing, in the test harness thread, any exception recorded
683 * earlier by threadRecordFailure.
684 *
685 * Triggers test case failure if interrupt status is set in the main thread.
686 */
687 public void tearDown() throws Exception {
688 Throwable t = threadFailure.getAndSet(null);
689 if (t != null) {
690 if (t instanceof Error)
691 throw (Error) t;
692 else if (t instanceof RuntimeException)
693 throw (RuntimeException) t;
694 else if (t instanceof Exception)
695 throw (Exception) t;
696 else {
697 AssertionFailedError afe =
698 new AssertionFailedError(t.toString());
699 afe.initCause(t);
700 throw afe;
701 }
702 }
703
704 if (Thread.interrupted())
705 tearDownFail("interrupt status set in main thread");
706
707 checkForkJoinPoolThreadLeaks();
708 }
709
710 /**
711 * Finds missing PoolCleaners
712 */
713 void checkForkJoinPoolThreadLeaks() throws InterruptedException {
714 Thread[] survivors = new Thread[7];
715 int count = Thread.enumerate(survivors);
716 for (int i = 0; i < count; i++) {
717 Thread thread = survivors[i];
718 String name = thread.getName();
719 if (name.startsWith("ForkJoinPool-")) {
720 // give thread some time to terminate
721 thread.join(LONG_DELAY_MS);
722 if (thread.isAlive())
723 tearDownFail("Found leaked ForkJoinPool thread thread=%s",
724 thread);
725 }
726 }
727
728 if (!ForkJoinPool.commonPool()
729 .awaitQuiescence(LONG_DELAY_MS, MILLISECONDS))
730 tearDownFail("ForkJoin common pool thread stuck");
731 }
732
733 /**
734 * Just like fail(reason), but additionally recording (using
735 * threadRecordFailure) any AssertionFailedError thrown, so that
736 * the current testcase will fail.
737 */
738 public void threadFail(String reason) {
739 try {
740 fail(reason);
741 } catch (AssertionFailedError t) {
742 threadRecordFailure(t);
743 throw t;
744 }
745 }
746
747 /**
748 * Just like assertTrue(b), but additionally recording (using
749 * threadRecordFailure) any AssertionFailedError thrown, so that
750 * the current testcase will fail.
751 */
752 public void threadAssertTrue(boolean b) {
753 try {
754 assertTrue(b);
755 } catch (AssertionFailedError t) {
756 threadRecordFailure(t);
757 throw t;
758 }
759 }
760
761 /**
762 * Just like assertFalse(b), but additionally recording (using
763 * threadRecordFailure) any AssertionFailedError thrown, so that
764 * the current testcase will fail.
765 */
766 public void threadAssertFalse(boolean b) {
767 try {
768 assertFalse(b);
769 } catch (AssertionFailedError t) {
770 threadRecordFailure(t);
771 throw t;
772 }
773 }
774
775 /**
776 * Just like assertNull(x), but additionally recording (using
777 * threadRecordFailure) any AssertionFailedError thrown, so that
778 * the current testcase will fail.
779 */
780 public void threadAssertNull(Object x) {
781 try {
782 assertNull(x);
783 } catch (AssertionFailedError t) {
784 threadRecordFailure(t);
785 throw t;
786 }
787 }
788
789 /**
790 * Just like assertEquals(x, y), but additionally recording (using
791 * threadRecordFailure) any AssertionFailedError thrown, so that
792 * the current testcase will fail.
793 */
794 public void threadAssertEquals(long x, long y) {
795 try {
796 assertEquals(x, y);
797 } catch (AssertionFailedError t) {
798 threadRecordFailure(t);
799 throw t;
800 }
801 }
802
803 /**
804 * Just like assertEquals(x, y), but additionally recording (using
805 * threadRecordFailure) any AssertionFailedError thrown, so that
806 * the current testcase will fail.
807 */
808 public void threadAssertEquals(Object x, Object y) {
809 try {
810 assertEquals(x, y);
811 } catch (AssertionFailedError fail) {
812 threadRecordFailure(fail);
813 throw fail;
814 } catch (Throwable fail) {
815 threadUnexpectedException(fail);
816 }
817 }
818
819 /**
820 * Just like assertSame(x, y), but additionally recording (using
821 * threadRecordFailure) any AssertionFailedError thrown, so that
822 * the current testcase will fail.
823 */
824 public void threadAssertSame(Object x, Object y) {
825 try {
826 assertSame(x, y);
827 } catch (AssertionFailedError fail) {
828 threadRecordFailure(fail);
829 throw fail;
830 }
831 }
832
833 /**
834 * Calls threadFail with message "should throw exception".
835 */
836 public void threadShouldThrow() {
837 threadFail("should throw exception");
838 }
839
840 /**
841 * Calls threadFail with message "should throw" + exceptionName.
842 */
843 public void threadShouldThrow(String exceptionName) {
844 threadFail("should throw " + exceptionName);
845 }
846
847 /**
848 * Records the given exception using {@link #threadRecordFailure},
849 * then rethrows the exception, wrapping it in an
850 * AssertionFailedError if necessary.
851 */
852 public void threadUnexpectedException(Throwable t) {
853 threadRecordFailure(t);
854 t.printStackTrace();
855 if (t instanceof RuntimeException)
856 throw (RuntimeException) t;
857 else if (t instanceof Error)
858 throw (Error) t;
859 else {
860 AssertionFailedError afe =
861 new AssertionFailedError("unexpected exception: " + t);
862 afe.initCause(t);
863 throw afe;
864 }
865 }
866
867 /**
868 * Delays, via Thread.sleep, for the given millisecond delay, but
869 * if the sleep is shorter than specified, may re-sleep or yield
870 * until time elapses. Ensures that the given time, as measured
871 * by System.nanoTime(), has elapsed.
872 */
873 static void delay(long millis) throws InterruptedException {
874 long nanos = millis * (1000 * 1000);
875 final long wakeupTime = System.nanoTime() + nanos;
876 do {
877 if (millis > 0L)
878 Thread.sleep(millis);
879 else // too short to sleep
880 Thread.yield();
881 nanos = wakeupTime - System.nanoTime();
882 millis = nanos / (1000 * 1000);
883 } while (nanos >= 0L);
884 }
885
886 /**
887 * Allows use of try-with-resources with per-test thread pools.
888 */
889 class PoolCleaner implements AutoCloseable {
890 private final ExecutorService pool;
891 public PoolCleaner(ExecutorService pool) { this.pool = pool; }
892 public void close() { joinPool(pool); }
893 }
894
895 /**
896 * An extension of PoolCleaner that has an action to release the pool.
897 */
898 class PoolCleanerWithReleaser extends PoolCleaner {
899 private final Runnable releaser;
900 public PoolCleanerWithReleaser(ExecutorService pool, Runnable releaser) {
901 super(pool);
902 this.releaser = releaser;
903 }
904 public void close() {
905 try {
906 releaser.run();
907 } finally {
908 super.close();
909 }
910 }
911 }
912
913 PoolCleaner cleaner(ExecutorService pool) {
914 return new PoolCleaner(pool);
915 }
916
917 PoolCleaner cleaner(ExecutorService pool, Runnable releaser) {
918 return new PoolCleanerWithReleaser(pool, releaser);
919 }
920
921 PoolCleaner cleaner(ExecutorService pool, CountDownLatch latch) {
922 return new PoolCleanerWithReleaser(pool, releaser(latch));
923 }
924
925 Runnable releaser(final CountDownLatch latch) {
926 return new Runnable() { public void run() {
927 do { latch.countDown(); }
928 while (latch.getCount() > 0);
929 }};
930 }
931
932 PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) {
933 return new PoolCleanerWithReleaser(pool, releaser(flag));
934 }
935
936 Runnable releaser(final AtomicBoolean flag) {
937 return new Runnable() { public void run() { flag.set(true); }};
938 }
939
940 /**
941 * Waits out termination of a thread pool or fails doing so.
942 */
943 void joinPool(ExecutorService pool) {
944 try {
945 pool.shutdown();
946 if (!pool.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS)) {
947 try {
948 threadFail("ExecutorService " + pool +
949 " did not terminate in a timely manner");
950 } finally {
951 // last resort, for the benefit of subsequent tests
952 pool.shutdownNow();
953 pool.awaitTermination(MEDIUM_DELAY_MS, MILLISECONDS);
954 }
955 }
956 } catch (SecurityException ok) {
957 // Allowed in case test doesn't have privs
958 } catch (InterruptedException fail) {
959 threadFail("Unexpected InterruptedException");
960 }
961 }
962
963 /**
964 * Like Runnable, but with the freedom to throw anything.
965 * junit folks had the same idea:
966 * http://junit.org/junit5/docs/snapshot/api/org/junit/gen5/api/Executable.html
967 */
968 interface Action { public void run() throws Throwable; }
969
970 /**
971 * Runs all the given actions in parallel, failing if any fail.
972 * Useful for running multiple variants of tests that are
973 * necessarily individually slow because they must block.
974 */
975 void testInParallel(Action ... actions) {
976 ExecutorService pool = Executors.newCachedThreadPool();
977 try (PoolCleaner cleaner = cleaner(pool)) {
978 ArrayList<Future<?>> futures = new ArrayList<>(actions.length);
979 for (final Action action : actions)
980 futures.add(pool.submit(new CheckedRunnable() {
981 public void realRun() throws Throwable { action.run();}}));
982 for (Future<?> future : futures)
983 try {
984 assertNull(future.get(LONG_DELAY_MS, MILLISECONDS));
985 } catch (ExecutionException ex) {
986 threadUnexpectedException(ex.getCause());
987 } catch (Exception ex) {
988 threadUnexpectedException(ex);
989 }
990 }
991 }
992
993 /**
994 * A debugging tool to print stack traces of most threads, as jstack does.
995 * Uninteresting threads are filtered out.
996 */
997 static void dumpTestThreads() {
998 SecurityManager sm = System.getSecurityManager();
999 if (sm != null) {
1000 try {
1001 System.setSecurityManager(null);
1002 } catch (SecurityException giveUp) {
1003 return;
1004 }
1005 }
1006
1007 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
1008 System.err.println("------ stacktrace dump start ------");
1009 for (ThreadInfo info : threadMXBean.dumpAllThreads(true, true)) {
1010 final String name = info.getThreadName();
1011 String lockName;
1012 if ("Signal Dispatcher".equals(name))
1013 continue;
1014 if ("Reference Handler".equals(name)
1015 && (lockName = info.getLockName()) != null
1016 && lockName.startsWith("java.lang.ref.Reference$Lock"))
1017 continue;
1018 if ("Finalizer".equals(name)
1019 && (lockName = info.getLockName()) != null
1020 && lockName.startsWith("java.lang.ref.ReferenceQueue$Lock"))
1021 continue;
1022 if ("checkForWedgedTest".equals(name))
1023 continue;
1024 System.err.print(info);
1025 }
1026 System.err.println("------ stacktrace dump end ------");
1027
1028 if (sm != null) System.setSecurityManager(sm);
1029 }
1030
1031 /**
1032 * Checks that thread does not terminate within the default
1033 * millisecond delay of {@code timeoutMillis()}.
1034 */
1035 void assertThreadStaysAlive(Thread thread) {
1036 assertThreadStaysAlive(thread, timeoutMillis());
1037 }
1038
1039 /**
1040 * Checks that thread does not terminate within the given millisecond delay.
1041 */
1042 void assertThreadStaysAlive(Thread thread, long millis) {
1043 try {
1044 // No need to optimize the failing case via Thread.join.
1045 delay(millis);
1046 assertTrue(thread.isAlive());
1047 } catch (InterruptedException fail) {
1048 threadFail("Unexpected InterruptedException");
1049 }
1050 }
1051
1052 /**
1053 * Checks that the threads do not terminate within the default
1054 * millisecond delay of {@code timeoutMillis()}.
1055 */
1056 void assertThreadsStayAlive(Thread... threads) {
1057 assertThreadsStayAlive(timeoutMillis(), threads);
1058 }
1059
1060 /**
1061 * Checks that the threads do not terminate within the given millisecond delay.
1062 */
1063 void assertThreadsStayAlive(long millis, Thread... threads) {
1064 try {
1065 // No need to optimize the failing case via Thread.join.
1066 delay(millis);
1067 for (Thread thread : threads)
1068 assertTrue(thread.isAlive());
1069 } catch (InterruptedException fail) {
1070 threadFail("Unexpected InterruptedException");
1071 }
1072 }
1073
1074 /**
1075 * Checks that future.get times out, with the default timeout of
1076 * {@code timeoutMillis()}.
1077 */
1078 void assertFutureTimesOut(Future future) {
1079 assertFutureTimesOut(future, timeoutMillis());
1080 }
1081
1082 /**
1083 * Checks that future.get times out, with the given millisecond timeout.
1084 */
1085 void assertFutureTimesOut(Future future, long timeoutMillis) {
1086 long startTime = System.nanoTime();
1087 try {
1088 future.get(timeoutMillis, MILLISECONDS);
1089 shouldThrow();
1090 } catch (TimeoutException success) {
1091 } catch (Exception fail) {
1092 threadUnexpectedException(fail);
1093 } finally { future.cancel(true); }
1094 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
1095 }
1096
1097 /**
1098 * Fails with message "should throw exception".
1099 */
1100 public void shouldThrow() {
1101 fail("Should throw exception");
1102 }
1103
1104 /**
1105 * Fails with message "should throw " + exceptionName.
1106 */
1107 public void shouldThrow(String exceptionName) {
1108 fail("Should throw " + exceptionName);
1109 }
1110
1111 /**
1112 * The number of elements to place in collections, arrays, etc.
1113 */
1114 public static final int SIZE = 20;
1115
1116 // Some convenient Integer constants
1117
1118 public static final Integer zero = new Integer(0);
1119 public static final Integer one = new Integer(1);
1120 public static final Integer two = new Integer(2);
1121 public static final Integer three = new Integer(3);
1122 public static final Integer four = new Integer(4);
1123 public static final Integer five = new Integer(5);
1124 public static final Integer six = new Integer(6);
1125 public static final Integer seven = new Integer(7);
1126 public static final Integer eight = new Integer(8);
1127 public static final Integer nine = new Integer(9);
1128 public static final Integer m1 = new Integer(-1);
1129 public static final Integer m2 = new Integer(-2);
1130 public static final Integer m3 = new Integer(-3);
1131 public static final Integer m4 = new Integer(-4);
1132 public static final Integer m5 = new Integer(-5);
1133 public static final Integer m6 = new Integer(-6);
1134 public static final Integer m10 = new Integer(-10);
1135
1136 /**
1137 * Runs Runnable r with a security policy that permits precisely
1138 * the specified permissions. If there is no current security
1139 * manager, the runnable is run twice, both with and without a
1140 * security manager. We require that any security manager permit
1141 * getPolicy/setPolicy.
1142 */
1143 public void runWithPermissions(Runnable r, Permission... permissions) {
1144 SecurityManager sm = System.getSecurityManager();
1145 if (sm == null) {
1146 r.run();
1147 }
1148 runWithSecurityManagerWithPermissions(r, permissions);
1149 }
1150
1151 /**
1152 * Runs Runnable r with a security policy that permits precisely
1153 * the specified permissions. If there is no current security
1154 * manager, a temporary one is set for the duration of the
1155 * Runnable. We require that any security manager permit
1156 * getPolicy/setPolicy.
1157 */
1158 public void runWithSecurityManagerWithPermissions(Runnable r,
1159 Permission... permissions) {
1160 SecurityManager sm = System.getSecurityManager();
1161 if (sm == null) {
1162 Policy savedPolicy = Policy.getPolicy();
1163 try {
1164 Policy.setPolicy(permissivePolicy());
1165 System.setSecurityManager(new SecurityManager());
1166 runWithSecurityManagerWithPermissions(r, permissions);
1167 } finally {
1168 System.setSecurityManager(null);
1169 Policy.setPolicy(savedPolicy);
1170 }
1171 } else {
1172 Policy savedPolicy = Policy.getPolicy();
1173 AdjustablePolicy policy = new AdjustablePolicy(permissions);
1174 Policy.setPolicy(policy);
1175
1176 try {
1177 r.run();
1178 } finally {
1179 policy.addPermission(new SecurityPermission("setPolicy"));
1180 Policy.setPolicy(savedPolicy);
1181 }
1182 }
1183 }
1184
1185 /**
1186 * Runs a runnable without any permissions.
1187 */
1188 public void runWithoutPermissions(Runnable r) {
1189 runWithPermissions(r);
1190 }
1191
1192 /**
1193 * A security policy where new permissions can be dynamically added
1194 * or all cleared.
1195 */
1196 public static class AdjustablePolicy extends java.security.Policy {
1197 Permissions perms = new Permissions();
1198 AdjustablePolicy(Permission... permissions) {
1199 for (Permission permission : permissions)
1200 perms.add(permission);
1201 }
1202 void addPermission(Permission perm) { perms.add(perm); }
1203 void clearPermissions() { perms = new Permissions(); }
1204 public PermissionCollection getPermissions(CodeSource cs) {
1205 return perms;
1206 }
1207 public PermissionCollection getPermissions(ProtectionDomain pd) {
1208 return perms;
1209 }
1210 public boolean implies(ProtectionDomain pd, Permission p) {
1211 return perms.implies(p);
1212 }
1213 public void refresh() {}
1214 public String toString() {
1215 List<Permission> ps = new ArrayList<Permission>();
1216 for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
1217 ps.add(e.nextElement());
1218 return "AdjustablePolicy with permissions " + ps;
1219 }
1220 }
1221
1222 /**
1223 * Returns a policy containing all the permissions we ever need.
1224 */
1225 public static Policy permissivePolicy() {
1226 return new AdjustablePolicy
1227 // Permissions j.u.c. needs directly
1228 (new RuntimePermission("modifyThread"),
1229 new RuntimePermission("getClassLoader"),
1230 new RuntimePermission("setContextClassLoader"),
1231 // Permissions needed to change permissions!
1232 new SecurityPermission("getPolicy"),
1233 new SecurityPermission("setPolicy"),
1234 new RuntimePermission("setSecurityManager"),
1235 // Permissions needed by the junit test harness
1236 new RuntimePermission("accessDeclaredMembers"),
1237 new PropertyPermission("*", "read"),
1238 new java.io.FilePermission("<<ALL FILES>>", "read"));
1239 }
1240
1241 /**
1242 * Sleeps until the given time has elapsed.
1243 * Throws AssertionFailedError if interrupted.
1244 */
1245 static void sleep(long millis) {
1246 try {
1247 delay(millis);
1248 } catch (InterruptedException fail) {
1249 AssertionFailedError afe =
1250 new AssertionFailedError("Unexpected InterruptedException");
1251 afe.initCause(fail);
1252 throw afe;
1253 }
1254 }
1255
1256 /**
1257 * Spin-waits up to the specified number of milliseconds for the given
1258 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
1259 */
1260 void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
1261 long startTime = 0L;
1262 for (;;) {
1263 Thread.State s = thread.getState();
1264 if (s == Thread.State.BLOCKED ||
1265 s == Thread.State.WAITING ||
1266 s == Thread.State.TIMED_WAITING)
1267 return;
1268 else if (s == Thread.State.TERMINATED)
1269 fail("Unexpected thread termination");
1270 else if (startTime == 0L)
1271 startTime = System.nanoTime();
1272 else if (millisElapsedSince(startTime) > timeoutMillis) {
1273 threadAssertTrue(thread.isAlive());
1274 return;
1275 }
1276 Thread.yield();
1277 }
1278 }
1279
1280 /**
1281 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
1282 * state: BLOCKED, WAITING, or TIMED_WAITING.
1283 */
1284 void waitForThreadToEnterWaitState(Thread thread) {
1285 waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
1286 }
1287
1288 /**
1289 * Returns the number of milliseconds since time given by
1290 * startNanoTime, which must have been previously returned from a
1291 * call to {@link System#nanoTime()}.
1292 */
1293 static long millisElapsedSince(long startNanoTime) {
1294 return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
1295 }
1296
1297 // void assertTerminatesPromptly(long timeoutMillis, Runnable r) {
1298 // long startTime = System.nanoTime();
1299 // try {
1300 // r.run();
1301 // } catch (Throwable fail) { threadUnexpectedException(fail); }
1302 // if (millisElapsedSince(startTime) > timeoutMillis/2)
1303 // throw new AssertionFailedError("did not return promptly");
1304 // }
1305
1306 // void assertTerminatesPromptly(Runnable r) {
1307 // assertTerminatesPromptly(LONG_DELAY_MS/2, r);
1308 // }
1309
1310 /**
1311 * Checks that timed f.get() returns the expected value, and does not
1312 * wait for the timeout to elapse before returning.
1313 */
1314 <T> void checkTimedGet(Future<T> f, T expectedValue, long timeoutMillis) {
1315 long startTime = System.nanoTime();
1316 try {
1317 assertEquals(expectedValue, f.get(timeoutMillis, MILLISECONDS));
1318 } catch (Throwable fail) { threadUnexpectedException(fail); }
1319 if (millisElapsedSince(startTime) > timeoutMillis/2)
1320 throw new AssertionFailedError("timed get did not return promptly");
1321 }
1322
1323 <T> void checkTimedGet(Future<T> f, T expectedValue) {
1324 checkTimedGet(f, expectedValue, LONG_DELAY_MS);
1325 }
1326
1327 /**
1328 * Returns a new started daemon Thread running the given runnable.
1329 */
1330 Thread newStartedThread(Runnable runnable) {
1331 Thread t = new Thread(runnable);
1332 t.setDaemon(true);
1333 t.start();
1334 return t;
1335 }
1336
1337 /**
1338 * Waits for the specified time (in milliseconds) for the thread
1339 * to terminate (using {@link Thread#join(long)}), else interrupts
1340 * the thread (in the hope that it may terminate later) and fails.
1341 */
1342 void awaitTermination(Thread t, long timeoutMillis) {
1343 try {
1344 t.join(timeoutMillis);
1345 } catch (InterruptedException fail) {
1346 threadUnexpectedException(fail);
1347 } finally {
1348 if (t.getState() != Thread.State.TERMINATED) {
1349 t.interrupt();
1350 threadFail("timed out waiting for thread to terminate");
1351 }
1352 }
1353 }
1354
1355 /**
1356 * Waits for LONG_DELAY_MS milliseconds for the thread to
1357 * terminate (using {@link Thread#join(long)}), else interrupts
1358 * the thread (in the hope that it may terminate later) and fails.
1359 */
1360 void awaitTermination(Thread t) {
1361 awaitTermination(t, LONG_DELAY_MS);
1362 }
1363
1364 // Some convenient Runnable classes
1365
1366 public abstract class CheckedRunnable implements Runnable {
1367 protected abstract void realRun() throws Throwable;
1368
1369 public final void run() {
1370 try {
1371 realRun();
1372 } catch (Throwable fail) {
1373 threadUnexpectedException(fail);
1374 }
1375 }
1376 }
1377
1378 public abstract class RunnableShouldThrow implements Runnable {
1379 protected abstract void realRun() throws Throwable;
1380
1381 final Class<?> exceptionClass;
1382
1383 <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
1384 this.exceptionClass = exceptionClass;
1385 }
1386
1387 public final void run() {
1388 try {
1389 realRun();
1390 threadShouldThrow(exceptionClass.getSimpleName());
1391 } catch (Throwable t) {
1392 if (! exceptionClass.isInstance(t))
1393 threadUnexpectedException(t);
1394 }
1395 }
1396 }
1397
1398 public abstract class ThreadShouldThrow extends Thread {
1399 protected abstract void realRun() throws Throwable;
1400
1401 final Class<?> exceptionClass;
1402
1403 <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
1404 this.exceptionClass = exceptionClass;
1405 }
1406
1407 public final void run() {
1408 try {
1409 realRun();
1410 threadShouldThrow(exceptionClass.getSimpleName());
1411 } catch (Throwable t) {
1412 if (! exceptionClass.isInstance(t))
1413 threadUnexpectedException(t);
1414 }
1415 }
1416 }
1417
1418 public abstract class CheckedInterruptedRunnable implements Runnable {
1419 protected abstract void realRun() throws Throwable;
1420
1421 public final void run() {
1422 try {
1423 realRun();
1424 threadShouldThrow("InterruptedException");
1425 } catch (InterruptedException success) {
1426 threadAssertFalse(Thread.interrupted());
1427 } catch (Throwable fail) {
1428 threadUnexpectedException(fail);
1429 }
1430 }
1431 }
1432
1433 public abstract class CheckedCallable<T> implements Callable<T> {
1434 protected abstract T realCall() throws Throwable;
1435
1436 public final T call() {
1437 try {
1438 return realCall();
1439 } catch (Throwable fail) {
1440 threadUnexpectedException(fail);
1441 return null;
1442 }
1443 }
1444 }
1445
1446 public abstract class CheckedInterruptedCallable<T>
1447 implements Callable<T> {
1448 protected abstract T realCall() throws Throwable;
1449
1450 public final T call() {
1451 try {
1452 T result = realCall();
1453 threadShouldThrow("InterruptedException");
1454 return result;
1455 } catch (InterruptedException success) {
1456 threadAssertFalse(Thread.interrupted());
1457 } catch (Throwable fail) {
1458 threadUnexpectedException(fail);
1459 }
1460 return null;
1461 }
1462 }
1463
1464 public static class NoOpRunnable implements Runnable {
1465 public void run() {}
1466 }
1467
1468 public static class NoOpCallable implements Callable {
1469 public Object call() { return Boolean.TRUE; }
1470 }
1471
1472 public static final String TEST_STRING = "a test string";
1473
1474 public static class StringTask implements Callable<String> {
1475 final String value;
1476 public StringTask() { this(TEST_STRING); }
1477 public StringTask(String value) { this.value = value; }
1478 public String call() { return value; }
1479 }
1480
1481 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
1482 return new CheckedCallable<String>() {
1483 protected String realCall() {
1484 try {
1485 latch.await();
1486 } catch (InterruptedException quittingTime) {}
1487 return TEST_STRING;
1488 }};
1489 }
1490
1491 public Runnable countDowner(final CountDownLatch latch) {
1492 return new CheckedRunnable() {
1493 public void realRun() throws InterruptedException {
1494 latch.countDown();
1495 }};
1496 }
1497
1498 class LatchAwaiter extends CheckedRunnable {
1499 static final int NEW = 0;
1500 static final int RUNNING = 1;
1501 static final int DONE = 2;
1502 final CountDownLatch latch;
1503 int state = NEW;
1504 LatchAwaiter(CountDownLatch latch) { this.latch = latch; }
1505 public void realRun() throws InterruptedException {
1506 state = 1;
1507 await(latch);
1508 state = 2;
1509 }
1510 }
1511
1512 public LatchAwaiter awaiter(CountDownLatch latch) {
1513 return new LatchAwaiter(latch);
1514 }
1515
1516 public void await(CountDownLatch latch, long timeoutMillis) {
1517 try {
1518 if (!latch.await(timeoutMillis, MILLISECONDS))
1519 fail("timed out waiting for CountDownLatch for "
1520 + (timeoutMillis/1000) + " sec");
1521 } catch (Throwable fail) {
1522 threadUnexpectedException(fail);
1523 }
1524 }
1525
1526 public void await(CountDownLatch latch) {
1527 await(latch, LONG_DELAY_MS);
1528 }
1529
1530 public void await(Semaphore semaphore) {
1531 try {
1532 if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS))
1533 fail("timed out waiting for Semaphore for "
1534 + (LONG_DELAY_MS/1000) + " sec");
1535 } catch (Throwable fail) {
1536 threadUnexpectedException(fail);
1537 }
1538 }
1539
1540 // /**
1541 // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
1542 // */
1543 // public void await(AtomicBoolean flag) {
1544 // await(flag, LONG_DELAY_MS);
1545 // }
1546
1547 // /**
1548 // * Spin-waits up to the specified timeout until flag becomes true.
1549 // */
1550 // public void await(AtomicBoolean flag, long timeoutMillis) {
1551 // long startTime = System.nanoTime();
1552 // while (!flag.get()) {
1553 // if (millisElapsedSince(startTime) > timeoutMillis)
1554 // throw new AssertionFailedError("timed out");
1555 // Thread.yield();
1556 // }
1557 // }
1558
1559 public static class NPETask implements Callable<String> {
1560 public String call() { throw new NullPointerException(); }
1561 }
1562
1563 public static class CallableOne implements Callable<Integer> {
1564 public Integer call() { return one; }
1565 }
1566
1567 public class ShortRunnable extends CheckedRunnable {
1568 protected void realRun() throws Throwable {
1569 delay(SHORT_DELAY_MS);
1570 }
1571 }
1572
1573 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1574 protected void realRun() throws InterruptedException {
1575 delay(SHORT_DELAY_MS);
1576 }
1577 }
1578
1579 public class SmallRunnable extends CheckedRunnable {
1580 protected void realRun() throws Throwable {
1581 delay(SMALL_DELAY_MS);
1582 }
1583 }
1584
1585 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1586 protected void realRun() {
1587 try {
1588 delay(SMALL_DELAY_MS);
1589 } catch (InterruptedException ok) {}
1590 }
1591 }
1592
1593 public class SmallCallable extends CheckedCallable {
1594 protected Object realCall() throws InterruptedException {
1595 delay(SMALL_DELAY_MS);
1596 return Boolean.TRUE;
1597 }
1598 }
1599
1600 public class MediumRunnable extends CheckedRunnable {
1601 protected void realRun() throws Throwable {
1602 delay(MEDIUM_DELAY_MS);
1603 }
1604 }
1605
1606 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1607 protected void realRun() throws InterruptedException {
1608 delay(MEDIUM_DELAY_MS);
1609 }
1610 }
1611
1612 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1613 return new CheckedRunnable() {
1614 protected void realRun() {
1615 try {
1616 delay(timeoutMillis);
1617 } catch (InterruptedException ok) {}
1618 }};
1619 }
1620
1621 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1622 protected void realRun() {
1623 try {
1624 delay(MEDIUM_DELAY_MS);
1625 } catch (InterruptedException ok) {}
1626 }
1627 }
1628
1629 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1630 protected void realRun() {
1631 try {
1632 delay(LONG_DELAY_MS);
1633 } catch (InterruptedException ok) {}
1634 }
1635 }
1636
1637 /**
1638 * For use as ThreadFactory in constructors
1639 */
1640 public static class SimpleThreadFactory implements ThreadFactory {
1641 public Thread newThread(Runnable r) {
1642 return new Thread(r);
1643 }
1644 }
1645
1646 public interface TrackedRunnable extends Runnable {
1647 boolean isDone();
1648 }
1649
1650 public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1651 return new TrackedRunnable() {
1652 private volatile boolean done = false;
1653 public boolean isDone() { return done; }
1654 public void run() {
1655 try {
1656 delay(timeoutMillis);
1657 done = true;
1658 } catch (InterruptedException ok) {}
1659 }
1660 };
1661 }
1662
1663 public static class TrackedShortRunnable implements Runnable {
1664 public volatile boolean done = false;
1665 public void run() {
1666 try {
1667 delay(SHORT_DELAY_MS);
1668 done = true;
1669 } catch (InterruptedException ok) {}
1670 }
1671 }
1672
1673 public static class TrackedSmallRunnable implements Runnable {
1674 public volatile boolean done = false;
1675 public void run() {
1676 try {
1677 delay(SMALL_DELAY_MS);
1678 done = true;
1679 } catch (InterruptedException ok) {}
1680 }
1681 }
1682
1683 public static class TrackedMediumRunnable implements Runnable {
1684 public volatile boolean done = false;
1685 public void run() {
1686 try {
1687 delay(MEDIUM_DELAY_MS);
1688 done = true;
1689 } catch (InterruptedException ok) {}
1690 }
1691 }
1692
1693 public static class TrackedLongRunnable implements Runnable {
1694 public volatile boolean done = false;
1695 public void run() {
1696 try {
1697 delay(LONG_DELAY_MS);
1698 done = true;
1699 } catch (InterruptedException ok) {}
1700 }
1701 }
1702
1703 public static class TrackedNoOpRunnable implements Runnable {
1704 public volatile boolean done = false;
1705 public void run() {
1706 done = true;
1707 }
1708 }
1709
1710 public static class TrackedCallable implements Callable {
1711 public volatile boolean done = false;
1712 public Object call() {
1713 try {
1714 delay(SMALL_DELAY_MS);
1715 done = true;
1716 } catch (InterruptedException ok) {}
1717 return Boolean.TRUE;
1718 }
1719 }
1720
1721 /**
1722 * Analog of CheckedRunnable for RecursiveAction
1723 */
1724 public abstract class CheckedRecursiveAction extends RecursiveAction {
1725 protected abstract void realCompute() throws Throwable;
1726
1727 @Override protected final void compute() {
1728 try {
1729 realCompute();
1730 } catch (Throwable fail) {
1731 threadUnexpectedException(fail);
1732 }
1733 }
1734 }
1735
1736 /**
1737 * Analog of CheckedCallable for RecursiveTask
1738 */
1739 public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1740 protected abstract T realCompute() throws Throwable;
1741
1742 @Override protected final T compute() {
1743 try {
1744 return realCompute();
1745 } catch (Throwable fail) {
1746 threadUnexpectedException(fail);
1747 return null;
1748 }
1749 }
1750 }
1751
1752 /**
1753 * For use as RejectedExecutionHandler in constructors
1754 */
1755 public static class NoOpREHandler implements RejectedExecutionHandler {
1756 public void rejectedExecution(Runnable r,
1757 ThreadPoolExecutor executor) {}
1758 }
1759
1760 /**
1761 * A CyclicBarrier that uses timed await and fails with
1762 * AssertionFailedErrors instead of throwing checked exceptions.
1763 */
1764 public static class CheckedBarrier extends CyclicBarrier {
1765 public CheckedBarrier(int parties) { super(parties); }
1766
1767 public int await() {
1768 try {
1769 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1770 } catch (TimeoutException timedOut) {
1771 throw new AssertionFailedError("timed out");
1772 } catch (Exception fail) {
1773 AssertionFailedError afe =
1774 new AssertionFailedError("Unexpected exception: " + fail);
1775 afe.initCause(fail);
1776 throw afe;
1777 }
1778 }
1779 }
1780
1781 void checkEmpty(BlockingQueue q) {
1782 try {
1783 assertTrue(q.isEmpty());
1784 assertEquals(0, q.size());
1785 assertNull(q.peek());
1786 assertNull(q.poll());
1787 assertNull(q.poll(0, MILLISECONDS));
1788 assertEquals(q.toString(), "[]");
1789 assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1790 assertFalse(q.iterator().hasNext());
1791 try {
1792 q.element();
1793 shouldThrow();
1794 } catch (NoSuchElementException success) {}
1795 try {
1796 q.iterator().next();
1797 shouldThrow();
1798 } catch (NoSuchElementException success) {}
1799 try {
1800 q.remove();
1801 shouldThrow();
1802 } catch (NoSuchElementException success) {}
1803 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
1804 }
1805
1806 void assertSerialEquals(Object x, Object y) {
1807 assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1808 }
1809
1810 void assertNotSerialEquals(Object x, Object y) {
1811 assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1812 }
1813
1814 byte[] serialBytes(Object o) {
1815 try {
1816 ByteArrayOutputStream bos = new ByteArrayOutputStream();
1817 ObjectOutputStream oos = new ObjectOutputStream(bos);
1818 oos.writeObject(o);
1819 oos.flush();
1820 oos.close();
1821 return bos.toByteArray();
1822 } catch (Throwable fail) {
1823 threadUnexpectedException(fail);
1824 return new byte[0];
1825 }
1826 }
1827
1828 @SuppressWarnings("unchecked")
1829 <T> T serialClone(T o) {
1830 try {
1831 ObjectInputStream ois = new ObjectInputStream
1832 (new ByteArrayInputStream(serialBytes(o)));
1833 T clone = (T) ois.readObject();
1834 assertSame(o.getClass(), clone.getClass());
1835 return clone;
1836 } catch (Throwable fail) {
1837 threadUnexpectedException(fail);
1838 return null;
1839 }
1840 }
1841
1842 public void assertThrows(Class<? extends Throwable> expectedExceptionClass,
1843 Runnable... throwingActions) {
1844 for (Runnable throwingAction : throwingActions) {
1845 boolean threw = false;
1846 try { throwingAction.run(); }
1847 catch (Throwable t) {
1848 threw = true;
1849 if (!expectedExceptionClass.isInstance(t)) {
1850 AssertionFailedError afe =
1851 new AssertionFailedError
1852 ("Expected " + expectedExceptionClass.getName() +
1853 ", got " + t.getClass().getName());
1854 afe.initCause(t);
1855 threadUnexpectedException(afe);
1856 }
1857 }
1858 if (!threw)
1859 shouldThrow(expectedExceptionClass.getName());
1860 }
1861 }
1862
1863 public void assertIteratorExhausted(Iterator<?> it) {
1864 try {
1865 it.next();
1866 shouldThrow();
1867 } catch (NoSuchElementException success) {}
1868 assertFalse(it.hasNext());
1869 }
1870
1871 public <T> Callable<T> callableThrowing(final Exception ex) {
1872 return new Callable<T>() { public T call() throws Exception { throw ex; }};
1873 }
1874
1875 public Runnable runnableThrowing(final RuntimeException ex) {
1876 return new Runnable() { public void run() { throw ex; }};
1877 }
1878
1879 /** A reusable thread pool to be shared by tests. */
1880 static final ExecutorService cachedThreadPool =
1881 new ThreadPoolExecutor(0, Integer.MAX_VALUE,
1882 1000L, MILLISECONDS,
1883 new SynchronousQueue<Runnable>());
1884
1885 static <T> void shuffle(T[] array) {
1886 Collections.shuffle(Arrays.asList(array), ThreadLocalRandom.current());
1887 }
1888 }