ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.96
Committed: Mon Jan 21 19:51:46 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.95: +7 -5 lines
Log Message:
fix printAllStackTraces debugging tool

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.13 * 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 jsr166 1.74 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.27 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import junit.framework.*;
10 jsr166 1.79 import java.io.ByteArrayInputStream;
11     import java.io.ByteArrayOutputStream;
12     import java.io.ObjectInputStream;
13     import java.io.ObjectOutputStream;
14 jsr166 1.96 import java.lang.management.ManagementFactory;
15     import java.lang.management.ThreadInfo;
16 jsr166 1.93 import java.util.ArrayList;
17 jsr166 1.72 import java.util.Arrays;
18 jsr166 1.81 import java.util.Date;
19 jsr166 1.93 import java.util.Enumeration;
20     import java.util.List;
21 jsr166 1.72 import java.util.NoSuchElementException;
22 jsr166 1.53 import java.util.PropertyPermission;
23 dl 1.1 import java.util.concurrent.*;
24 jsr166 1.81 import java.util.concurrent.atomic.AtomicBoolean;
25 jsr166 1.53 import java.util.concurrent.atomic.AtomicReference;
26 jsr166 1.36 import static java.util.concurrent.TimeUnit.MILLISECONDS;
27 jsr166 1.66 import static java.util.concurrent.TimeUnit.NANOSECONDS;
28 jsr166 1.53 import java.security.CodeSource;
29     import java.security.Permission;
30     import java.security.PermissionCollection;
31     import java.security.Permissions;
32     import java.security.Policy;
33     import java.security.ProtectionDomain;
34     import java.security.SecurityPermission;
35 dl 1.1
36     /**
37 dl 1.5 * Base class for JSR166 Junit TCK tests. Defines some constants,
38     * utility methods and classes, as well as a simple framework for
39     * helping to make sure that assertions failing in generated threads
40     * cause the associated test that generated them to itself fail (which
41 jsr166 1.27 * JUnit does not otherwise arrange). The rules for creating such
42 dl 1.5 * tests are:
43 dl 1.1 *
44     * <ol>
45     *
46     * <li> All assertions in code running in generated threads must use
47 jsr166 1.27 * the forms {@link #threadFail}, {@link #threadAssertTrue}, {@link
48 dl 1.18 * #threadAssertEquals}, or {@link #threadAssertNull}, (not
49 jsr166 1.50 * {@code fail}, {@code assertTrue}, etc.) It is OK (but not
50 dl 1.1 * particularly recommended) for other code to use these forms too.
51     * Only the most typically used JUnit assertion methods are defined
52     * this way, but enough to live with.</li>
53     *
54 dl 1.18 * <li> If you override {@link #setUp} or {@link #tearDown}, make sure
55 jsr166 1.50 * to invoke {@code super.setUp} and {@code super.tearDown} within
56 dl 1.1 * them. These methods are used to clear and check for thread
57     * assertion failures.</li>
58     *
59 jsr166 1.51 * <li>All delays and timeouts must use one of the constants {@code
60 jsr166 1.50 * SHORT_DELAY_MS}, {@code SMALL_DELAY_MS}, {@code MEDIUM_DELAY_MS},
61     * {@code LONG_DELAY_MS}. The idea here is that a SHORT is always
62 dl 1.5 * discriminable from zero time, and always allows enough time for the
63     * small amounts of computation (creating a thread, calling a few
64 dl 1.1 * methods, etc) needed to reach a timeout point. Similarly, a SMALL
65     * is always discriminable as larger than SHORT and smaller than
66     * MEDIUM. And so on. These constants are set to conservative values,
67 dl 1.2 * but even so, if there is ever any doubt, they can all be increased
68 jsr166 1.27 * in one spot to rerun tests on slower platforms.</li>
69 dl 1.1 *
70     * <li> All threads generated must be joined inside each test case
71 jsr166 1.50 * method (or {@code fail} to do so) before returning from the
72     * method. The {@code joinPool} method can be used to do this when
73 dl 1.1 * using Executors.</li>
74     *
75     * </ol>
76 dl 1.6 *
77 jsr166 1.92 * <p><b>Other notes</b>
78 dl 1.6 * <ul>
79     *
80     * <li> Usually, there is one testcase method per JSR166 method
81     * covering "normal" operation, and then as many exception-testing
82     * methods as there are exceptions the method can throw. Sometimes
83     * there are multiple tests per JSR166 method when the different
84     * "normal" behaviors differ significantly. And sometimes testcases
85     * cover multiple methods when they cannot be tested in
86     * isolation.</li>
87 jsr166 1.27 *
88 dl 1.6 * <li> The documentation style for testcases is to provide as javadoc
89     * a simple sentence or two describing the property that the testcase
90     * method purports to test. The javadocs do not say anything about how
91     * the property is tested. To find out, read the code.</li>
92     *
93     * <li> These tests are "conformance tests", and do not attempt to
94     * test throughput, latency, scalability or other performance factors
95     * (see the separate "jtreg" tests for a set intended to check these
96     * for the most central aspects of functionality.) So, most tests use
97     * the smallest sensible numbers of threads, collection sizes, etc
98     * needed to check basic conformance.</li>
99     *
100     * <li>The test classes currently do not declare inclusion in
101     * any particular package to simplify things for people integrating
102     * them in TCK test suites.</li>
103     *
104 jsr166 1.50 * <li> As a convenience, the {@code main} of this class (JSR166TestCase)
105 dl 1.6 * runs all JSR166 unit tests.</li>
106     *
107     * </ul>
108 dl 1.1 */
109     public class JSR166TestCase extends TestCase {
110 jsr166 1.49 private static final boolean useSecurityManager =
111     Boolean.getBoolean("jsr166.useSecurityManager");
112    
113 jsr166 1.62 protected static final boolean expensiveTests =
114     Boolean.getBoolean("jsr166.expensiveTests");
115    
116 dl 1.6 /**
117 jsr166 1.61 * If true, report on stdout all "slow" tests, that is, ones that
118     * take more than profileThreshold milliseconds to execute.
119     */
120     private static final boolean profileTests =
121     Boolean.getBoolean("jsr166.profileTests");
122    
123     /**
124     * The number of milliseconds that tests are permitted for
125     * execution without being reported, when profileTests is set.
126     */
127     private static final long profileThreshold =
128     Long.getLong("jsr166.profileThreshold", 100);
129    
130     protected void runTest() throws Throwable {
131     if (profileTests)
132     runTestProfiled();
133     else
134     super.runTest();
135     }
136    
137     protected void runTestProfiled() throws Throwable {
138     long t0 = System.nanoTime();
139     try {
140     super.runTest();
141     } finally {
142     long elapsedMillis =
143     (System.nanoTime() - t0) / (1000L * 1000L);
144     if (elapsedMillis >= profileThreshold)
145     System.out.printf("%n%s: %d%n", toString(), elapsedMillis);
146     }
147     }
148 jsr166 1.63
149 jsr166 1.61 /**
150 jsr166 1.94 * Runs all JSR166 unit tests using junit.textui.TestRunner.
151     * Optional command line arg provides the number of iterations to
152     * repeat running the tests.
153 jsr166 1.27 */
154 jsr166 1.41 public static void main(String[] args) {
155 jsr166 1.49 if (useSecurityManager) {
156     System.err.println("Setting a permissive security manager");
157     Policy.setPolicy(permissivePolicy());
158     System.setSecurityManager(new SecurityManager());
159     }
160 jsr166 1.56 int iters = (args.length == 0) ? 1 : Integer.parseInt(args[0]);
161    
162 dl 1.16 Test s = suite();
163 dl 1.22 for (int i = 0; i < iters; ++i) {
164 jsr166 1.41 junit.textui.TestRunner.run(s);
165 dl 1.22 System.gc();
166     System.runFinalization();
167     }
168     System.exit(0);
169 dl 1.6 }
170    
171 jsr166 1.60 public static TestSuite newTestSuite(Object... suiteOrClasses) {
172     TestSuite suite = new TestSuite();
173     for (Object suiteOrClass : suiteOrClasses) {
174     if (suiteOrClass instanceof TestSuite)
175     suite.addTest((TestSuite) suiteOrClass);
176     else if (suiteOrClass instanceof Class)
177     suite.addTest(new TestSuite((Class<?>) suiteOrClass));
178     else
179     throw new ClassCastException("not a test suite or class");
180     }
181     return suite;
182     }
183    
184 dl 1.6 /**
185 jsr166 1.60 * Collects all JSR166 unit tests as one suite.
186 jsr166 1.27 */
187 jsr166 1.41 public static Test suite() {
188 jsr166 1.60 return newTestSuite(
189     ForkJoinPoolTest.suite(),
190     ForkJoinTaskTest.suite(),
191     RecursiveActionTest.suite(),
192     RecursiveTaskTest.suite(),
193     LinkedTransferQueueTest.suite(),
194     PhaserTest.suite(),
195     ThreadLocalRandomTest.suite(),
196     AbstractExecutorServiceTest.suite(),
197     AbstractQueueTest.suite(),
198     AbstractQueuedSynchronizerTest.suite(),
199     AbstractQueuedLongSynchronizerTest.suite(),
200     ArrayBlockingQueueTest.suite(),
201     ArrayDequeTest.suite(),
202     AtomicBooleanTest.suite(),
203     AtomicIntegerArrayTest.suite(),
204     AtomicIntegerFieldUpdaterTest.suite(),
205     AtomicIntegerTest.suite(),
206     AtomicLongArrayTest.suite(),
207     AtomicLongFieldUpdaterTest.suite(),
208     AtomicLongTest.suite(),
209     AtomicMarkableReferenceTest.suite(),
210     AtomicReferenceArrayTest.suite(),
211     AtomicReferenceFieldUpdaterTest.suite(),
212     AtomicReferenceTest.suite(),
213     AtomicStampedReferenceTest.suite(),
214     ConcurrentHashMapTest.suite(),
215     ConcurrentLinkedDequeTest.suite(),
216     ConcurrentLinkedQueueTest.suite(),
217     ConcurrentSkipListMapTest.suite(),
218     ConcurrentSkipListSubMapTest.suite(),
219     ConcurrentSkipListSetTest.suite(),
220     ConcurrentSkipListSubSetTest.suite(),
221     CopyOnWriteArrayListTest.suite(),
222     CopyOnWriteArraySetTest.suite(),
223     CountDownLatchTest.suite(),
224     CyclicBarrierTest.suite(),
225     DelayQueueTest.suite(),
226     EntryTest.suite(),
227     ExchangerTest.suite(),
228     ExecutorsTest.suite(),
229     ExecutorCompletionServiceTest.suite(),
230     FutureTaskTest.suite(),
231     LinkedBlockingDequeTest.suite(),
232     LinkedBlockingQueueTest.suite(),
233     LinkedListTest.suite(),
234     LockSupportTest.suite(),
235     PriorityBlockingQueueTest.suite(),
236     PriorityQueueTest.suite(),
237     ReentrantLockTest.suite(),
238     ReentrantReadWriteLockTest.suite(),
239     ScheduledExecutorTest.suite(),
240     ScheduledExecutorSubclassTest.suite(),
241     SemaphoreTest.suite(),
242     SynchronousQueueTest.suite(),
243     SystemTest.suite(),
244     ThreadLocalTest.suite(),
245     ThreadPoolExecutorTest.suite(),
246     ThreadPoolExecutorSubclassTest.suite(),
247     ThreadTest.suite(),
248     TimeUnitTest.suite(),
249     TreeMapTest.suite(),
250     TreeSetTest.suite(),
251     TreeSubMapTest.suite(),
252     TreeSubSetTest.suite());
253 dl 1.6 }
254    
255 dl 1.1
256 dl 1.2 public static long SHORT_DELAY_MS;
257     public static long SMALL_DELAY_MS;
258     public static long MEDIUM_DELAY_MS;
259     public static long LONG_DELAY_MS;
260    
261    
262     /**
263 jsr166 1.27 * Returns the shortest timed delay. This could
264 dl 1.15 * be reimplemented to use for example a Property.
265 jsr166 1.27 */
266 dl 1.2 protected long getShortDelay() {
267 dl 1.21 return 50;
268 dl 1.2 }
269    
270     /**
271 jsr166 1.27 * Sets delays as multiples of SHORT_DELAY.
272 dl 1.2 */
273 jsr166 1.43 protected void setDelays() {
274 dl 1.2 SHORT_DELAY_MS = getShortDelay();
275 jsr166 1.53 SMALL_DELAY_MS = SHORT_DELAY_MS * 5;
276 dl 1.2 MEDIUM_DELAY_MS = SHORT_DELAY_MS * 10;
277 jsr166 1.71 LONG_DELAY_MS = SHORT_DELAY_MS * 200;
278 dl 1.2 }
279    
280 dl 1.1 /**
281 jsr166 1.81 * Returns a timeout in milliseconds to be used in tests that
282     * verify that operations block or time out.
283     */
284     long timeoutMillis() {
285     return SHORT_DELAY_MS / 4;
286     }
287    
288     /**
289     * Returns a new Date instance representing a time delayMillis
290     * milliseconds in the future.
291     */
292     Date delayedDate(long delayMillis) {
293 jsr166 1.84 return new Date(System.currentTimeMillis() + delayMillis);
294 jsr166 1.81 }
295    
296     /**
297 jsr166 1.53 * The first exception encountered if any threadAssertXXX method fails.
298 dl 1.1 */
299 jsr166 1.53 private final AtomicReference<Throwable> threadFailure
300     = new AtomicReference<Throwable>(null);
301 dl 1.1
302     /**
303 jsr166 1.53 * Records an exception so that it can be rethrown later in the test
304     * harness thread, triggering a test case failure. Only the first
305     * failure is recorded; subsequent calls to this method from within
306     * the same test have no effect.
307 dl 1.1 */
308 jsr166 1.53 public void threadRecordFailure(Throwable t) {
309     threadFailure.compareAndSet(null, t);
310     }
311    
312 jsr166 1.27 public void setUp() {
313 dl 1.2 setDelays();
314 dl 1.1 }
315    
316     /**
317 jsr166 1.85 * Extra checks that get done for all test cases.
318     *
319 jsr166 1.53 * Triggers test case failure if any thread assertions have failed,
320     * by rethrowing, in the test harness thread, any exception recorded
321     * earlier by threadRecordFailure.
322 jsr166 1.85 *
323     * Triggers test case failure if interrupt status is set in the main thread.
324 jsr166 1.53 */
325     public void tearDown() throws Exception {
326 jsr166 1.70 Throwable t = threadFailure.getAndSet(null);
327 jsr166 1.53 if (t != null) {
328     if (t instanceof Error)
329     throw (Error) t;
330     else if (t instanceof RuntimeException)
331     throw (RuntimeException) t;
332     else if (t instanceof Exception)
333     throw (Exception) t;
334 jsr166 1.57 else {
335     AssertionFailedError afe =
336     new AssertionFailedError(t.toString());
337     afe.initCause(t);
338     throw afe;
339     }
340 jsr166 1.53 }
341 jsr166 1.85
342     if (Thread.interrupted())
343     throw new AssertionFailedError("interrupt status set in main thread");
344 dl 1.1 }
345    
346 dl 1.5 /**
347 jsr166 1.53 * Just like fail(reason), but additionally recording (using
348 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
349     * the current testcase will fail.
350 jsr166 1.27 */
351 dl 1.1 public void threadFail(String reason) {
352 jsr166 1.53 try {
353     fail(reason);
354 jsr166 1.57 } catch (AssertionFailedError t) {
355 jsr166 1.53 threadRecordFailure(t);
356     fail(reason);
357     }
358 dl 1.1 }
359    
360 dl 1.5 /**
361 jsr166 1.53 * Just like assertTrue(b), but additionally recording (using
362 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
363     * the current testcase will fail.
364 jsr166 1.27 */
365 dl 1.1 public void threadAssertTrue(boolean b) {
366 jsr166 1.53 try {
367 dl 1.1 assertTrue(b);
368 jsr166 1.57 } catch (AssertionFailedError t) {
369 jsr166 1.53 threadRecordFailure(t);
370     throw t;
371 dl 1.1 }
372     }
373 dl 1.5
374     /**
375 jsr166 1.53 * Just like assertFalse(b), but additionally recording (using
376 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
377     * the current testcase will fail.
378 jsr166 1.27 */
379 dl 1.1 public void threadAssertFalse(boolean b) {
380 jsr166 1.53 try {
381 dl 1.1 assertFalse(b);
382 jsr166 1.57 } catch (AssertionFailedError t) {
383 jsr166 1.53 threadRecordFailure(t);
384     throw t;
385 dl 1.1 }
386     }
387 dl 1.5
388     /**
389 jsr166 1.53 * Just like assertNull(x), but additionally recording (using
390 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
391     * the current testcase will fail.
392 jsr166 1.27 */
393 dl 1.1 public void threadAssertNull(Object x) {
394 jsr166 1.53 try {
395 dl 1.1 assertNull(x);
396 jsr166 1.57 } catch (AssertionFailedError t) {
397 jsr166 1.53 threadRecordFailure(t);
398     throw t;
399 dl 1.1 }
400     }
401 dl 1.5
402     /**
403 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
404 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
405     * the current testcase will fail.
406 jsr166 1.27 */
407 dl 1.1 public void threadAssertEquals(long x, long y) {
408 jsr166 1.53 try {
409 dl 1.1 assertEquals(x, y);
410 jsr166 1.57 } catch (AssertionFailedError t) {
411 jsr166 1.53 threadRecordFailure(t);
412     throw t;
413 dl 1.1 }
414     }
415 dl 1.5
416     /**
417 jsr166 1.53 * Just like assertEquals(x, y), but additionally recording (using
418 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
419     * the current testcase will fail.
420 jsr166 1.27 */
421 dl 1.1 public void threadAssertEquals(Object x, Object y) {
422 jsr166 1.53 try {
423 dl 1.1 assertEquals(x, y);
424 jsr166 1.57 } catch (AssertionFailedError t) {
425 jsr166 1.53 threadRecordFailure(t);
426     throw t;
427 jsr166 1.57 } catch (Throwable t) {
428     threadUnexpectedException(t);
429 dl 1.1 }
430     }
431    
432 dl 1.5 /**
433 jsr166 1.53 * Just like assertSame(x, y), but additionally recording (using
434 jsr166 1.57 * threadRecordFailure) any AssertionFailedError thrown, so that
435     * the current testcase will fail.
436 jsr166 1.52 */
437     public void threadAssertSame(Object x, Object y) {
438 jsr166 1.53 try {
439 jsr166 1.52 assertSame(x, y);
440 jsr166 1.57 } catch (AssertionFailedError t) {
441 jsr166 1.53 threadRecordFailure(t);
442     throw t;
443 jsr166 1.52 }
444     }
445    
446     /**
447 jsr166 1.53 * Calls threadFail with message "should throw exception".
448 jsr166 1.33 */
449 dl 1.3 public void threadShouldThrow() {
450 jsr166 1.53 threadFail("should throw exception");
451 dl 1.3 }
452    
453 dl 1.5 /**
454 jsr166 1.53 * Calls threadFail with message "should throw" + exceptionName.
455 jsr166 1.40 */
456     public void threadShouldThrow(String exceptionName) {
457 jsr166 1.53 threadFail("should throw " + exceptionName);
458 dl 1.3 }
459    
460 dl 1.31 /**
461 jsr166 1.57 * Records the given exception using {@link #threadRecordFailure},
462     * then rethrows the exception, wrapping it in an
463     * AssertionFailedError if necessary.
464 dl 1.31 */
465 jsr166 1.53 public void threadUnexpectedException(Throwable t) {
466     threadRecordFailure(t);
467     t.printStackTrace();
468     if (t instanceof RuntimeException)
469     throw (RuntimeException) t;
470     else if (t instanceof Error)
471     throw (Error) t;
472     else {
473 jsr166 1.57 AssertionFailedError afe =
474     new AssertionFailedError("unexpected exception: " + t);
475 jsr166 1.82 afe.initCause(t);
476 jsr166 1.57 throw afe;
477 jsr166 1.55 }
478 dl 1.31 }
479 dl 1.3
480 dl 1.1 /**
481 jsr166 1.81 * Delays, via Thread.sleep, for the given millisecond delay, but
482 dl 1.76 * if the sleep is shorter than specified, may re-sleep or yield
483     * until time elapses.
484     */
485 jsr166 1.81 static void delay(long millis) throws InterruptedException {
486 dl 1.76 long startTime = System.nanoTime();
487 jsr166 1.80 long ns = millis * 1000 * 1000;
488 dl 1.76 for (;;) {
489 jsr166 1.80 if (millis > 0L)
490     Thread.sleep(millis);
491 dl 1.76 else // too short to sleep
492     Thread.yield();
493     long d = ns - (System.nanoTime() - startTime);
494     if (d > 0L)
495 jsr166 1.80 millis = d / (1000 * 1000);
496 dl 1.76 else
497     break;
498     }
499     }
500    
501     /**
502 jsr166 1.53 * Waits out termination of a thread pool or fails doing so.
503 dl 1.1 */
504 jsr166 1.81 void joinPool(ExecutorService exec) {
505 dl 1.1 try {
506     exec.shutdown();
507 jsr166 1.54 assertTrue("ExecutorService did not terminate in a timely manner",
508 jsr166 1.71 exec.awaitTermination(2 * LONG_DELAY_MS, MILLISECONDS));
509 jsr166 1.33 } catch (SecurityException ok) {
510 dl 1.22 // Allowed in case test doesn't have privs
511 jsr166 1.33 } catch (InterruptedException ie) {
512 jsr166 1.44 fail("Unexpected InterruptedException");
513 dl 1.1 }
514     }
515    
516 jsr166 1.78 /**
517 jsr166 1.95 * A debugging tool to print all stack traces, as jstack does.
518     */
519 jsr166 1.96 static void printAllStackTraces() {
520     for (ThreadInfo info :
521     ManagementFactory.getThreadMXBean()
522     .dumpAllThreads(true, true))
523     System.err.print(info);
524 jsr166 1.95 }
525    
526     /**
527 jsr166 1.81 * Checks that thread does not terminate within the default
528     * millisecond delay of {@code timeoutMillis()}.
529     */
530     void assertThreadStaysAlive(Thread thread) {
531     assertThreadStaysAlive(thread, timeoutMillis());
532     }
533    
534     /**
535 jsr166 1.80 * Checks that thread does not terminate within the given millisecond delay.
536 jsr166 1.78 */
537 jsr166 1.81 void assertThreadStaysAlive(Thread thread, long millis) {
538 jsr166 1.78 try {
539 jsr166 1.80 // No need to optimize the failing case via Thread.join.
540     delay(millis);
541 jsr166 1.78 assertTrue(thread.isAlive());
542     } catch (InterruptedException ie) {
543     fail("Unexpected InterruptedException");
544     }
545     }
546 dl 1.5
547     /**
548 jsr166 1.90 * Checks that the threads do not terminate within the default
549     * millisecond delay of {@code timeoutMillis()}.
550     */
551     void assertThreadsStayAlive(Thread... threads) {
552     assertThreadsStayAlive(timeoutMillis(), threads);
553     }
554    
555     /**
556     * Checks that the threads do not terminate within the given millisecond delay.
557     */
558     void assertThreadsStayAlive(long millis, Thread... threads) {
559     try {
560     // No need to optimize the failing case via Thread.join.
561     delay(millis);
562     for (Thread thread : threads)
563     assertTrue(thread.isAlive());
564     } catch (InterruptedException ie) {
565     fail("Unexpected InterruptedException");
566     }
567     }
568    
569     /**
570 jsr166 1.83 * Checks that future.get times out, with the default timeout of
571     * {@code timeoutMillis()}.
572     */
573     void assertFutureTimesOut(Future future) {
574     assertFutureTimesOut(future, timeoutMillis());
575     }
576    
577     /**
578     * Checks that future.get times out, with the given millisecond timeout.
579     */
580     void assertFutureTimesOut(Future future, long timeoutMillis) {
581     long startTime = System.nanoTime();
582     try {
583     future.get(timeoutMillis, MILLISECONDS);
584     shouldThrow();
585     } catch (TimeoutException success) {
586     } catch (Exception e) {
587     threadUnexpectedException(e);
588     } finally { future.cancel(true); }
589     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
590     }
591    
592     /**
593 jsr166 1.53 * Fails with message "should throw exception".
594 jsr166 1.27 */
595 dl 1.3 public void shouldThrow() {
596     fail("Should throw exception");
597     }
598    
599 dl 1.5 /**
600 jsr166 1.53 * Fails with message "should throw " + exceptionName.
601 jsr166 1.40 */
602     public void shouldThrow(String exceptionName) {
603     fail("Should throw " + exceptionName);
604     }
605    
606     /**
607 dl 1.1 * The number of elements to place in collections, arrays, etc.
608     */
609 jsr166 1.45 public static final int SIZE = 20;
610 dl 1.1
611     // Some convenient Integer constants
612    
613 jsr166 1.47 public static final Integer zero = new Integer(0);
614     public static final Integer one = new Integer(1);
615     public static final Integer two = new Integer(2);
616     public static final Integer three = new Integer(3);
617 jsr166 1.45 public static final Integer four = new Integer(4);
618     public static final Integer five = new Integer(5);
619 jsr166 1.47 public static final Integer six = new Integer(6);
620 jsr166 1.45 public static final Integer seven = new Integer(7);
621     public static final Integer eight = new Integer(8);
622 jsr166 1.47 public static final Integer nine = new Integer(9);
623 jsr166 1.45 public static final Integer m1 = new Integer(-1);
624     public static final Integer m2 = new Integer(-2);
625     public static final Integer m3 = new Integer(-3);
626 jsr166 1.47 public static final Integer m4 = new Integer(-4);
627     public static final Integer m5 = new Integer(-5);
628     public static final Integer m6 = new Integer(-6);
629 jsr166 1.45 public static final Integer m10 = new Integer(-10);
630 dl 1.7
631    
632     /**
633 jsr166 1.49 * Runs Runnable r with a security policy that permits precisely
634     * the specified permissions. If there is no current security
635     * manager, the runnable is run twice, both with and without a
636     * security manager. We require that any security manager permit
637     * getPolicy/setPolicy.
638     */
639     public void runWithPermissions(Runnable r, Permission... permissions) {
640     SecurityManager sm = System.getSecurityManager();
641     if (sm == null) {
642     r.run();
643 jsr166 1.93 }
644     runWithSecurityManagerWithPermissions(r, permissions);
645     }
646    
647     /**
648     * Runs Runnable r with a security policy that permits precisely
649     * the specified permissions. If there is no current security
650     * manager, a temporary one is set for the duration of the
651     * Runnable. We require that any security manager permit
652     * getPolicy/setPolicy.
653     */
654     public void runWithSecurityManagerWithPermissions(Runnable r,
655     Permission... permissions) {
656     SecurityManager sm = System.getSecurityManager();
657     if (sm == null) {
658 jsr166 1.49 Policy savedPolicy = Policy.getPolicy();
659     try {
660     Policy.setPolicy(permissivePolicy());
661     System.setSecurityManager(new SecurityManager());
662 jsr166 1.93 runWithSecurityManagerWithPermissions(r, permissions);
663 jsr166 1.49 } finally {
664     System.setSecurityManager(null);
665     Policy.setPolicy(savedPolicy);
666     }
667     } else {
668     Policy savedPolicy = Policy.getPolicy();
669     AdjustablePolicy policy = new AdjustablePolicy(permissions);
670     Policy.setPolicy(policy);
671    
672     try {
673     r.run();
674     } finally {
675     policy.addPermission(new SecurityPermission("setPolicy"));
676     Policy.setPolicy(savedPolicy);
677     }
678     }
679     }
680    
681     /**
682     * Runs a runnable without any permissions.
683     */
684     public void runWithoutPermissions(Runnable r) {
685     runWithPermissions(r);
686     }
687    
688     /**
689 dl 1.7 * A security policy where new permissions can be dynamically added
690     * or all cleared.
691     */
692 jsr166 1.45 public static class AdjustablePolicy extends java.security.Policy {
693 dl 1.7 Permissions perms = new Permissions();
694 jsr166 1.49 AdjustablePolicy(Permission... permissions) {
695     for (Permission permission : permissions)
696     perms.add(permission);
697     }
698 dl 1.7 void addPermission(Permission perm) { perms.add(perm); }
699     void clearPermissions() { perms = new Permissions(); }
700 jsr166 1.42 public PermissionCollection getPermissions(CodeSource cs) {
701     return perms;
702     }
703     public PermissionCollection getPermissions(ProtectionDomain pd) {
704     return perms;
705     }
706     public boolean implies(ProtectionDomain pd, Permission p) {
707     return perms.implies(p);
708     }
709     public void refresh() {}
710 jsr166 1.93 public String toString() {
711     List<Permission> ps = new ArrayList<Permission>();
712     for (Enumeration<Permission> e = perms.elements(); e.hasMoreElements();)
713     ps.add(e.nextElement());
714     return "AdjustablePolicy with permissions " + ps;
715     }
716 dl 1.7 }
717 dl 1.1
718 jsr166 1.38 /**
719 jsr166 1.49 * Returns a policy containing all the permissions we ever need.
720     */
721     public static Policy permissivePolicy() {
722     return new AdjustablePolicy
723     // Permissions j.u.c. needs directly
724     (new RuntimePermission("modifyThread"),
725     new RuntimePermission("getClassLoader"),
726     new RuntimePermission("setContextClassLoader"),
727     // Permissions needed to change permissions!
728     new SecurityPermission("getPolicy"),
729     new SecurityPermission("setPolicy"),
730     new RuntimePermission("setSecurityManager"),
731     // Permissions needed by the junit test harness
732     new RuntimePermission("accessDeclaredMembers"),
733     new PropertyPermission("*", "read"),
734     new java.io.FilePermission("<<ALL FILES>>", "read"));
735     }
736    
737     /**
738 jsr166 1.60 * Sleeps until the given time has elapsed.
739     * Throws AssertionFailedError if interrupted.
740     */
741     void sleep(long millis) {
742     try {
743 dl 1.76 delay(millis);
744 jsr166 1.60 } catch (InterruptedException ie) {
745     AssertionFailedError afe =
746     new AssertionFailedError("Unexpected InterruptedException");
747     afe.initCause(ie);
748     throw afe;
749     }
750     }
751    
752     /**
753 jsr166 1.88 * Spin-waits up to the specified number of milliseconds for the given
754 jsr166 1.65 * thread to enter a wait state: BLOCKED, WAITING, or TIMED_WAITING.
755     */
756     void waitForThreadToEnterWaitState(Thread thread, long timeoutMillis) {
757 jsr166 1.88 long startTime = System.nanoTime();
758 jsr166 1.65 for (;;) {
759     Thread.State s = thread.getState();
760     if (s == Thread.State.BLOCKED ||
761     s == Thread.State.WAITING ||
762 jsr166 1.67 s == Thread.State.TIMED_WAITING)
763 jsr166 1.65 return;
764 jsr166 1.67 else if (s == Thread.State.TERMINATED)
765     fail("Unexpected thread termination");
766 jsr166 1.88 else if (millisElapsedSince(startTime) > timeoutMillis) {
767 jsr166 1.67 threadAssertTrue(thread.isAlive());
768     return;
769     }
770 jsr166 1.65 Thread.yield();
771     }
772     }
773    
774     /**
775 jsr166 1.75 * Waits up to LONG_DELAY_MS for the given thread to enter a wait
776     * state: BLOCKED, WAITING, or TIMED_WAITING.
777     */
778     void waitForThreadToEnterWaitState(Thread thread) {
779     waitForThreadToEnterWaitState(thread, LONG_DELAY_MS);
780     }
781    
782     /**
783 jsr166 1.66 * Returns the number of milliseconds since time given by
784     * startNanoTime, which must have been previously returned from a
785     * call to {@link System.nanoTime()}.
786     */
787     long millisElapsedSince(long startNanoTime) {
788     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
789     }
790 jsr166 1.68
791 jsr166 1.66 /**
792 jsr166 1.58 * Returns a new started daemon Thread running the given runnable.
793 jsr166 1.38 */
794     Thread newStartedThread(Runnable runnable) {
795     Thread t = new Thread(runnable);
796 jsr166 1.58 t.setDaemon(true);
797 jsr166 1.38 t.start();
798     return t;
799     }
800 dl 1.1
801 jsr166 1.59 /**
802     * Waits for the specified time (in milliseconds) for the thread
803     * to terminate (using {@link Thread#join(long)}), else interrupts
804     * the thread (in the hope that it may terminate later) and fails.
805     */
806     void awaitTermination(Thread t, long timeoutMillis) {
807     try {
808     t.join(timeoutMillis);
809     } catch (InterruptedException ie) {
810     threadUnexpectedException(ie);
811     } finally {
812 jsr166 1.83 if (t.getState() != Thread.State.TERMINATED) {
813 jsr166 1.59 t.interrupt();
814     fail("Test timed out");
815     }
816     }
817     }
818    
819 jsr166 1.75 /**
820     * Waits for LONG_DELAY_MS milliseconds for the thread to
821     * terminate (using {@link Thread#join(long)}), else interrupts
822     * the thread (in the hope that it may terminate later) and fails.
823     */
824     void awaitTermination(Thread t) {
825     awaitTermination(t, LONG_DELAY_MS);
826     }
827    
828 dl 1.1 // Some convenient Runnable classes
829    
830 jsr166 1.45 public abstract class CheckedRunnable implements Runnable {
831     protected abstract void realRun() throws Throwable;
832 jsr166 1.35
833     public final void run() {
834     try {
835     realRun();
836     } catch (Throwable t) {
837     threadUnexpectedException(t);
838     }
839     }
840     }
841    
842 jsr166 1.45 public abstract class RunnableShouldThrow implements Runnable {
843     protected abstract void realRun() throws Throwable;
844 jsr166 1.40
845     final Class<?> exceptionClass;
846    
847     <T extends Throwable> RunnableShouldThrow(Class<T> exceptionClass) {
848     this.exceptionClass = exceptionClass;
849     }
850    
851     public final void run() {
852     try {
853     realRun();
854     threadShouldThrow(exceptionClass.getSimpleName());
855     } catch (Throwable t) {
856     if (! exceptionClass.isInstance(t))
857     threadUnexpectedException(t);
858     }
859     }
860     }
861    
862 jsr166 1.45 public abstract class ThreadShouldThrow extends Thread {
863     protected abstract void realRun() throws Throwable;
864 jsr166 1.40
865     final Class<?> exceptionClass;
866    
867     <T extends Throwable> ThreadShouldThrow(Class<T> exceptionClass) {
868     this.exceptionClass = exceptionClass;
869     }
870    
871     public final void run() {
872     try {
873     realRun();
874     threadShouldThrow(exceptionClass.getSimpleName());
875     } catch (Throwable t) {
876     if (! exceptionClass.isInstance(t))
877     threadUnexpectedException(t);
878     }
879     }
880     }
881    
882 jsr166 1.45 public abstract class CheckedInterruptedRunnable implements Runnable {
883     protected abstract void realRun() throws Throwable;
884 jsr166 1.35
885     public final void run() {
886     try {
887     realRun();
888 jsr166 1.40 threadShouldThrow("InterruptedException");
889 jsr166 1.35 } catch (InterruptedException success) {
890 jsr166 1.81 threadAssertFalse(Thread.interrupted());
891 jsr166 1.35 } catch (Throwable t) {
892     threadUnexpectedException(t);
893     }
894     }
895     }
896    
897 jsr166 1.45 public abstract class CheckedCallable<T> implements Callable<T> {
898     protected abstract T realCall() throws Throwable;
899 jsr166 1.35
900     public final T call() {
901     try {
902     return realCall();
903     } catch (Throwable t) {
904     threadUnexpectedException(t);
905 jsr166 1.53 return null;
906 jsr166 1.35 }
907 jsr166 1.40 }
908     }
909    
910 jsr166 1.53 public abstract class CheckedInterruptedCallable<T>
911     implements Callable<T> {
912 jsr166 1.45 protected abstract T realCall() throws Throwable;
913 jsr166 1.40
914     public final T call() {
915     try {
916     T result = realCall();
917     threadShouldThrow("InterruptedException");
918     return result;
919     } catch (InterruptedException success) {
920 jsr166 1.81 threadAssertFalse(Thread.interrupted());
921 jsr166 1.40 } catch (Throwable t) {
922     threadUnexpectedException(t);
923     }
924     return null;
925 jsr166 1.35 }
926     }
927    
928 jsr166 1.45 public static class NoOpRunnable implements Runnable {
929 dl 1.1 public void run() {}
930     }
931    
932 jsr166 1.45 public static class NoOpCallable implements Callable {
933 dl 1.1 public Object call() { return Boolean.TRUE; }
934 dl 1.10 }
935    
936 jsr166 1.45 public static final String TEST_STRING = "a test string";
937 dl 1.10
938 jsr166 1.45 public static class StringTask implements Callable<String> {
939 dl 1.10 public String call() { return TEST_STRING; }
940     }
941    
942 jsr166 1.48 public Callable<String> latchAwaitingStringTask(final CountDownLatch latch) {
943     return new CheckedCallable<String>() {
944 jsr166 1.64 protected String realCall() {
945 jsr166 1.48 try {
946     latch.await();
947     } catch (InterruptedException quittingTime) {}
948     return TEST_STRING;
949     }};
950     }
951    
952 jsr166 1.73 public Runnable awaiter(final CountDownLatch latch) {
953     return new CheckedRunnable() {
954     public void realRun() throws InterruptedException {
955 jsr166 1.79 await(latch);
956 jsr166 1.73 }};
957     }
958    
959 jsr166 1.79 public void await(CountDownLatch latch) {
960     try {
961     assertTrue(latch.await(LONG_DELAY_MS, MILLISECONDS));
962     } catch (Throwable t) {
963     threadUnexpectedException(t);
964     }
965     }
966    
967 jsr166 1.89 public void await(Semaphore semaphore) {
968     try {
969     assertTrue(semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS));
970     } catch (Throwable t) {
971     threadUnexpectedException(t);
972     }
973     }
974    
975 jsr166 1.81 // /**
976     // * Spin-waits up to LONG_DELAY_MS until flag becomes true.
977     // */
978     // public void await(AtomicBoolean flag) {
979     // await(flag, LONG_DELAY_MS);
980     // }
981    
982     // /**
983     // * Spin-waits up to the specified timeout until flag becomes true.
984     // */
985     // public void await(AtomicBoolean flag, long timeoutMillis) {
986     // long startTime = System.nanoTime();
987     // while (!flag.get()) {
988     // if (millisElapsedSince(startTime) > timeoutMillis)
989     // throw new AssertionFailedError("timed out");
990     // Thread.yield();
991     // }
992     // }
993    
994 jsr166 1.45 public static class NPETask implements Callable<String> {
995 dl 1.10 public String call() { throw new NullPointerException(); }
996     }
997    
998 jsr166 1.45 public static class CallableOne implements Callable<Integer> {
999 dl 1.10 public Integer call() { return one; }
1000 dl 1.1 }
1001    
1002 jsr166 1.45 public class ShortRunnable extends CheckedRunnable {
1003     protected void realRun() throws Throwable {
1004 dl 1.76 delay(SHORT_DELAY_MS);
1005 dl 1.1 }
1006     }
1007    
1008 jsr166 1.45 public class ShortInterruptedRunnable extends CheckedInterruptedRunnable {
1009     protected void realRun() throws InterruptedException {
1010 dl 1.76 delay(SHORT_DELAY_MS);
1011 dl 1.1 }
1012     }
1013    
1014 jsr166 1.45 public class SmallRunnable extends CheckedRunnable {
1015     protected void realRun() throws Throwable {
1016 dl 1.76 delay(SMALL_DELAY_MS);
1017 dl 1.1 }
1018     }
1019    
1020 jsr166 1.45 public class SmallPossiblyInterruptedRunnable extends CheckedRunnable {
1021     protected void realRun() {
1022 dl 1.6 try {
1023 dl 1.76 delay(SMALL_DELAY_MS);
1024 jsr166 1.44 } catch (InterruptedException ok) {}
1025 dl 1.6 }
1026     }
1027    
1028 jsr166 1.45 public class SmallCallable extends CheckedCallable {
1029     protected Object realCall() throws InterruptedException {
1030 dl 1.76 delay(SMALL_DELAY_MS);
1031 dl 1.1 return Boolean.TRUE;
1032     }
1033     }
1034    
1035 jsr166 1.45 public class MediumRunnable extends CheckedRunnable {
1036     protected void realRun() throws Throwable {
1037 dl 1.76 delay(MEDIUM_DELAY_MS);
1038 dl 1.1 }
1039     }
1040    
1041 jsr166 1.45 public class MediumInterruptedRunnable extends CheckedInterruptedRunnable {
1042     protected void realRun() throws InterruptedException {
1043 dl 1.76 delay(MEDIUM_DELAY_MS);
1044 dl 1.1 }
1045     }
1046    
1047 jsr166 1.63 public Runnable possiblyInterruptedRunnable(final long timeoutMillis) {
1048     return new CheckedRunnable() {
1049     protected void realRun() {
1050     try {
1051 dl 1.76 delay(timeoutMillis);
1052 jsr166 1.63 } catch (InterruptedException ok) {}
1053     }};
1054     }
1055    
1056 jsr166 1.45 public class MediumPossiblyInterruptedRunnable extends CheckedRunnable {
1057     protected void realRun() {
1058 dl 1.1 try {
1059 dl 1.76 delay(MEDIUM_DELAY_MS);
1060 jsr166 1.44 } catch (InterruptedException ok) {}
1061 dl 1.1 }
1062     }
1063 dl 1.5
1064 jsr166 1.45 public class LongPossiblyInterruptedRunnable extends CheckedRunnable {
1065     protected void realRun() {
1066 dl 1.12 try {
1067 dl 1.76 delay(LONG_DELAY_MS);
1068 jsr166 1.44 } catch (InterruptedException ok) {}
1069 dl 1.12 }
1070     }
1071    
1072 dl 1.5 /**
1073     * For use as ThreadFactory in constructors
1074     */
1075 jsr166 1.45 public static class SimpleThreadFactory implements ThreadFactory {
1076 jsr166 1.33 public Thread newThread(Runnable r) {
1077 dl 1.5 return new Thread(r);
1078 jsr166 1.27 }
1079 dl 1.5 }
1080    
1081 jsr166 1.61 public interface TrackedRunnable extends Runnable {
1082     boolean isDone();
1083     }
1084    
1085     public static TrackedRunnable trackedRunnable(final long timeoutMillis) {
1086     return new TrackedRunnable() {
1087     private volatile boolean done = false;
1088     public boolean isDone() { return done; }
1089     public void run() {
1090     try {
1091 dl 1.76 delay(timeoutMillis);
1092 jsr166 1.61 done = true;
1093     } catch (InterruptedException ok) {}
1094     }
1095     };
1096     }
1097    
1098 jsr166 1.45 public static class TrackedShortRunnable implements Runnable {
1099     public volatile boolean done = false;
1100 dl 1.5 public void run() {
1101     try {
1102 dl 1.76 delay(SHORT_DELAY_MS);
1103 jsr166 1.61 done = true;
1104     } catch (InterruptedException ok) {}
1105     }
1106     }
1107    
1108     public static class TrackedSmallRunnable implements Runnable {
1109     public volatile boolean done = false;
1110     public void run() {
1111     try {
1112 dl 1.76 delay(SMALL_DELAY_MS);
1113 dl 1.5 done = true;
1114 jsr166 1.44 } catch (InterruptedException ok) {}
1115 dl 1.6 }
1116     }
1117    
1118 jsr166 1.45 public static class TrackedMediumRunnable implements Runnable {
1119     public volatile boolean done = false;
1120 dl 1.6 public void run() {
1121     try {
1122 dl 1.76 delay(MEDIUM_DELAY_MS);
1123 dl 1.6 done = true;
1124 jsr166 1.44 } catch (InterruptedException ok) {}
1125 dl 1.6 }
1126     }
1127    
1128 jsr166 1.45 public static class TrackedLongRunnable implements Runnable {
1129     public volatile boolean done = false;
1130 dl 1.6 public void run() {
1131     try {
1132 dl 1.76 delay(LONG_DELAY_MS);
1133 dl 1.6 done = true;
1134 jsr166 1.44 } catch (InterruptedException ok) {}
1135 dl 1.6 }
1136     }
1137    
1138 jsr166 1.45 public static class TrackedNoOpRunnable implements Runnable {
1139     public volatile boolean done = false;
1140 dl 1.6 public void run() {
1141     done = true;
1142 dl 1.5 }
1143     }
1144    
1145 jsr166 1.45 public static class TrackedCallable implements Callable {
1146     public volatile boolean done = false;
1147 dl 1.5 public Object call() {
1148     try {
1149 dl 1.76 delay(SMALL_DELAY_MS);
1150 dl 1.5 done = true;
1151 jsr166 1.44 } catch (InterruptedException ok) {}
1152 dl 1.5 return Boolean.TRUE;
1153     }
1154     }
1155 dl 1.14
1156 jsr166 1.53 /**
1157     * Analog of CheckedRunnable for RecursiveAction
1158     */
1159     public abstract class CheckedRecursiveAction extends RecursiveAction {
1160     protected abstract void realCompute() throws Throwable;
1161    
1162     public final void compute() {
1163     try {
1164     realCompute();
1165     } catch (Throwable t) {
1166     threadUnexpectedException(t);
1167     }
1168     }
1169     }
1170    
1171     /**
1172     * Analog of CheckedCallable for RecursiveTask
1173     */
1174     public abstract class CheckedRecursiveTask<T> extends RecursiveTask<T> {
1175     protected abstract T realCompute() throws Throwable;
1176    
1177     public final T compute() {
1178     try {
1179     return realCompute();
1180     } catch (Throwable t) {
1181     threadUnexpectedException(t);
1182     return null;
1183     }
1184     }
1185     }
1186 dl 1.5
1187     /**
1188     * For use as RejectedExecutionHandler in constructors
1189     */
1190 jsr166 1.45 public static class NoOpREHandler implements RejectedExecutionHandler {
1191 jsr166 1.35 public void rejectedExecution(Runnable r,
1192     ThreadPoolExecutor executor) {}
1193 dl 1.5 }
1194 jsr166 1.27
1195 jsr166 1.60 /**
1196 jsr166 1.86 * A CyclicBarrier that uses timed await and fails with
1197     * AssertionFailedErrors instead of throwing checked exceptions.
1198 jsr166 1.60 */
1199     public class CheckedBarrier extends CyclicBarrier {
1200     public CheckedBarrier(int parties) { super(parties); }
1201    
1202     public int await() {
1203     try {
1204 jsr166 1.86 return super.await(2 * LONG_DELAY_MS, MILLISECONDS);
1205     } catch (TimeoutException e) {
1206     throw new AssertionFailedError("timed out");
1207 jsr166 1.60 } catch (Exception e) {
1208     AssertionFailedError afe =
1209     new AssertionFailedError("Unexpected exception: " + e);
1210     afe.initCause(e);
1211     throw afe;
1212     }
1213     }
1214     }
1215    
1216 jsr166 1.81 void checkEmpty(BlockingQueue q) {
1217 jsr166 1.72 try {
1218     assertTrue(q.isEmpty());
1219     assertEquals(0, q.size());
1220     assertNull(q.peek());
1221     assertNull(q.poll());
1222     assertNull(q.poll(0, MILLISECONDS));
1223     assertEquals(q.toString(), "[]");
1224     assertTrue(Arrays.equals(q.toArray(), new Object[0]));
1225     assertFalse(q.iterator().hasNext());
1226     try {
1227     q.element();
1228     shouldThrow();
1229     } catch (NoSuchElementException success) {}
1230     try {
1231     q.iterator().next();
1232     shouldThrow();
1233     } catch (NoSuchElementException success) {}
1234     try {
1235     q.remove();
1236     shouldThrow();
1237     } catch (NoSuchElementException success) {}
1238     } catch (InterruptedException ie) {
1239     threadUnexpectedException(ie);
1240     }
1241     }
1242    
1243 jsr166 1.91 void assertSerialEquals(Object x, Object y) {
1244     assertTrue(Arrays.equals(serialBytes(x), serialBytes(y)));
1245     }
1246    
1247     void assertNotSerialEquals(Object x, Object y) {
1248     assertFalse(Arrays.equals(serialBytes(x), serialBytes(y)));
1249     }
1250    
1251     byte[] serialBytes(Object o) {
1252 jsr166 1.79 try {
1253     ByteArrayOutputStream bos = new ByteArrayOutputStream();
1254     ObjectOutputStream oos = new ObjectOutputStream(bos);
1255     oos.writeObject(o);
1256     oos.flush();
1257     oos.close();
1258 jsr166 1.91 return bos.toByteArray();
1259     } catch (Throwable t) {
1260     threadUnexpectedException(t);
1261     return new byte[0];
1262     }
1263     }
1264    
1265     @SuppressWarnings("unchecked")
1266     <T> T serialClone(T o) {
1267     try {
1268 jsr166 1.87 ObjectInputStream ois = new ObjectInputStream
1269 jsr166 1.91 (new ByteArrayInputStream(serialBytes(o)));
1270 jsr166 1.87 T clone = (T) ois.readObject();
1271     assertSame(o.getClass(), clone.getClass());
1272     return clone;
1273 jsr166 1.79 } catch (Throwable t) {
1274     threadUnexpectedException(t);
1275     return null;
1276     }
1277     }
1278 dl 1.1 }