ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.208
Committed: Sat Nov 5 16:09:50 2016 UTC (7 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.207: +31 -0 lines
Log Message:
add support for Cloneable

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