18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea and Martin Buchholz with assistance from members 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * of JCP JSR-166 Expert Group and released to the public domain, as 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * explained at http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes, 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd. 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS; 138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList; 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Arrays; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch; 208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/** 258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Contains "contract" tests applicable to all BlockingQueue implementations. 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic abstract class BlockingQueueTest extends JSR166TestCase { 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /* 298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * This is the start of an attempt to refactor the tests for the 308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * various related implementations of related interfaces without 318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * too much duplicated code. junit does not really support such 328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * testing. Here subclasses of TestCase not only contain tests, 338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * but also configuration information that describes the 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * implementation class, most importantly how to instantiate 358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * instances. 368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** Like suite(), but non-static */ 398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Explicitly instantiated. 408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public Test testSuite() { 428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // // TODO: filter the returned tests using the configuration 438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // // information provided by the subclass via protected methods. 448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return new TestSuite(this.getClass()); 458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle //---------------------------------------------------------------- 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Configuration methods 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle //---------------------------------------------------------------- 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** Returns an empty instance of the implementation class. */ 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected abstract BlockingQueue emptyCollection(); 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Returns an element suitable for insertion in the collection. 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Override for collections with unusual element types. 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected Object makeElement(int i) { 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return Integer.valueOf(i); 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle //---------------------------------------------------------------- 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Tests 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle //---------------------------------------------------------------- 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offer(null) throws NullPointerException 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferNull() { 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Queue q = emptyCollection(); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offer(null); 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * add(null) throws NullPointerException 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddNull() { 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Collection q = emptyCollection(); 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(null); 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed offer(null) throws NullPointerException 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedOfferNull() throws InterruptedException { 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offer(null, LONG_DELAY_MS, MILLISECONDS); 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * put(null) throws NullPointerException 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutNull() throws InterruptedException { 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(null); 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * put(null) throws NullPointerException 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAllNull() throws InterruptedException { 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Collection q = emptyCollection(); 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(null); 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll of a collection with null elements throws NullPointerException 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAllNullElements() { 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Collection q = emptyCollection(); 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Collection<Integer> elements = Arrays.asList(new Integer[SIZE]); 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(elements); 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray(null) throws NullPointerException 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray_NullArray() { 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Collection q = emptyCollection(); 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.toArray(null); 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(null) throws NullPointerException 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToNull() { 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(null); 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(this) throws IllegalArgumentException 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToSelf() { 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(q); 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(null, n) throws NullPointerException 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToNullN() { 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(null, 0); 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(this, n) throws IllegalArgumentException 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToSelfN() { 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(q, 0); 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c, n) returns 0 and does nothing when n <= 0 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToNonPositiveMaxElements() { 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int[] ns = { 0, -1, -42, Integer.MIN_VALUE }; 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int n : ns) 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.drainTo(new ArrayList(), n)); 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (q.remainingCapacity() > 0) { 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Not SynchronousQueue, that is 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Object one = makeElement(1); 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList c = new ArrayList(); 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int n : ns) 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.drainTo(new ArrayList(), n)); 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, q.poll()); 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(c.isEmpty()); 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll before a delayed offer times out; after offer succeeds; 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * on interruption throws 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollWithOffer() throws InterruptedException { 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier barrier = new CheckedBarrier(2); 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Object zero = makeElement(0); 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(timeoutMillis(), MILLISECONDS)); 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS)); 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(LONG_DELAY_MS, MILLISECONDS); 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(LONG_DELAY_MS, MILLISECONDS); 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(zero, LONG_DELAY_MS, MILLISECONDS)); 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take() blocks interruptibly when empty 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeFromEmptyBlocksInterruptibly() { 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(threadStarted); 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take() throws InterruptedException immediately if interrupted 2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * before waiting 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeFromEmptyAfterInterrupt() { 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll() blocks interruptibly when empty 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollFromEmptyBlocksInterruptibly() { 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(2 * LONG_DELAY_MS, MILLISECONDS); 3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(threadStarted); 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll() throws InterruptedException immediately if 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * interrupted before waiting 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollFromEmptyAfterInterrupt() { 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(2 * LONG_DELAY_MS, MILLISECONDS); 3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remove(x) removes x and returns true if present 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * TODO: move to superclass CollectionTest.java 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveElement() { 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = emptyCollection(); 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int size = Math.min(q.remainingCapacity(), SIZE); 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Object[] elts = new Object[size]; 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(makeElement(99))); 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.remove(makeElement(99))); 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < size; i++) 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(elts[i] = makeElement(i)); 3508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = 1; i < size; i += 2) { 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int pass = 0; pass < 2; pass++) { 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals((pass == 0), q.contains(elts[i])); 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals((pass == 0), q.remove(elts[i])); 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(elts[i])); 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(elts[i-1])); 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (i < size - 1) 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(elts[i+1])); 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (size > 0) 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(elts[0])); 3628e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = size-2; i >= 0; i -= 2) { 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(elts[i])); 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(elts[i+1])); 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.remove(elts[i])); 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(elts[i])); 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.remove(elts[i+1])); 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(elts[i+1])); 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** For debugging. */ 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void XXXXtestFails() { 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle fail(emptyCollection().getClass().toString()); 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 379