--- jsr166/src/test/tck/Collection8Test.java 2016/12/18 20:47:28 1.44 +++ jsr166/src/test/tck/Collection8Test.java 2017/05/29 19:15:02 1.46 @@ -140,12 +140,12 @@ public class Collection8Test extends JSR } if (c instanceof BlockingQueue) { BlockingQueue q = (BlockingQueue) c; - assertNull(q.poll(0L, MILLISECONDS)); + assertNull(q.poll(randomExpiredTimeout(), randomTimeUnit())); } if (c instanceof BlockingDeque) { BlockingDeque q = (BlockingDeque) c; - assertNull(q.pollFirst(0L, MILLISECONDS)); - assertNull(q.pollLast(0L, MILLISECONDS)); + assertNull(q.pollFirst(randomExpiredTimeout(), randomTimeUnit())); + assertNull(q.pollLast(randomExpiredTimeout(), randomTimeUnit())); } } @@ -727,6 +727,31 @@ public class Collection8Test extends JSR } /** + * Concurrent Spliterators, once exhausted, stay exhausted. + */ + public void testStickySpliteratorExhaustion() throws Throwable { + if (!impl.isConcurrent()) return; + if (!testImplementationDetails) return; + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final Consumer alwaysThrows = e -> { throw new AssertionError(); }; + final Collection c = impl.emptyCollection(); + final Spliterator s = c.spliterator(); + if (rnd.nextBoolean()) { + assertFalse(s.tryAdvance(alwaysThrows)); + } else { + s.forEachRemaining(alwaysThrows); + } + final Object one = impl.makeElement(1); + // Spliterator should not notice added element + c.add(one); + if (rnd.nextBoolean()) { + assertFalse(s.tryAdvance(alwaysThrows)); + } else { + s.forEachRemaining(alwaysThrows); + } + } + + /** * Motley crew of threads concurrently randomly hammer the collection. */ public void testDetectRaces() throws Throwable {