ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/JSR166TestCase.java
Revision: 1.130
Committed: Tue Apr 21 05:00:23 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.129: +1 -4 lines
Log Message:
atLeastJava9 can finally use java.class.version

File Contents

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