1 /* 2 * Written by Doug Lea and Martin Buchholz with assistance from 3 * members of JCP JSR-166 Expert Group and released to the public 4 * domain, as explained at 5 * http://creativecommons.org/publicdomain/zero/1.0/ 6 */ 7 8 package jsr166; 9 10 import static java.util.concurrent.TimeUnit.MILLISECONDS; 11 12 import java.util.ArrayList; 13 import java.util.Collection; 14 import java.util.Collections; 15 import java.util.concurrent.CountDownLatch; 16 import java.util.concurrent.Executors; 17 import java.util.concurrent.ExecutorService; 18 import java.util.concurrent.Future; 19 import java.util.concurrent.atomic.AtomicBoolean; 20 import java.util.concurrent.atomic.AtomicLong; 21 import java.util.function.Consumer; 22 23 import junit.framework.Test; 24 25 /** 26 * Contains tests applicable to all jdk8+ Collection implementations. 27 * An extension of CollectionTest. 28 */ 29 // Android-changed: Made class abstract so it will be ignored by test runners. 30 public abstract class Collection8Test extends JSR166TestCase { 31 final CollectionImplementation impl; 32 33 /** Tests are parameterized by a Collection implementation. */ Collection8Test(CollectionImplementation impl, String methodName)34 Collection8Test(CollectionImplementation impl, String methodName) { 35 super(methodName); 36 this.impl = impl; 37 } 38 testSuite(CollectionImplementation impl)39 public static Test testSuite(CollectionImplementation impl) { 40 return parameterizedTestSuite(Collection8Test.class, 41 CollectionImplementation.class, 42 impl); 43 } 44 45 /** 46 * stream().forEach returns elements in the collection 47 */ testForEach()48 public void testForEach() throws Throwable { 49 final Collection c = impl.emptyCollection(); 50 final AtomicLong count = new AtomicLong(0L); 51 final Object x = impl.makeElement(1); 52 final Object y = impl.makeElement(2); 53 final ArrayList found = new ArrayList(); 54 Consumer<Object> spy = (o) -> { found.add(o); }; 55 c.stream().forEach(spy); 56 assertTrue(found.isEmpty()); 57 58 assertTrue(c.add(x)); 59 c.stream().forEach(spy); 60 assertEquals(Collections.singletonList(x), found); 61 found.clear(); 62 63 assertTrue(c.add(y)); 64 c.stream().forEach(spy); 65 assertEquals(2, found.size()); 66 assertTrue(found.contains(x)); 67 assertTrue(found.contains(y)); 68 found.clear(); 69 70 c.clear(); 71 c.stream().forEach(spy); 72 assertTrue(found.isEmpty()); 73 } 74 testForEachConcurrentStressTest()75 public void testForEachConcurrentStressTest() throws Throwable { 76 if (!impl.isConcurrent()) return; 77 final Collection c = impl.emptyCollection(); 78 final long testDurationMillis = timeoutMillis(); 79 final AtomicBoolean done = new AtomicBoolean(false); 80 final Object elt = impl.makeElement(1); 81 final Future<?> f1, f2; 82 final ExecutorService pool = Executors.newCachedThreadPool(); 83 try (PoolCleaner cleaner = cleaner(pool, done)) { 84 final CountDownLatch threadsStarted = new CountDownLatch(2); 85 Runnable checkElt = () -> { 86 threadsStarted.countDown(); 87 while (!done.get()) 88 c.stream().forEach((x) -> { assertSame(x, elt); }); }; 89 Runnable addRemove = () -> { 90 threadsStarted.countDown(); 91 while (!done.get()) { 92 assertTrue(c.add(elt)); 93 assertTrue(c.remove(elt)); 94 }}; 95 f1 = pool.submit(checkElt); 96 f2 = pool.submit(addRemove); 97 Thread.sleep(testDurationMillis); 98 } 99 assertNull(f1.get(0L, MILLISECONDS)); 100 assertNull(f2.get(0L, MILLISECONDS)); 101 } 102 103 // public void testCollection8DebugFail() { fail(); } 104 } 105