ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.94
Committed: Mon Jan 21 19:32:19 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.93: +3 -1 lines
Log Message:
document command line arg

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