18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS; 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList; 128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays; 138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection; 148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Deque; 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingDeque; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue; 208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch; 218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors; 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService; 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.LinkedBlockingDeque; 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class LinkedBlockingDequeTest extends JSR166TestCase { 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: These tests have been moved into their own separate 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // classes to work around CTS issues. 318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static class Unbounded extends BlockingQueueTest { 338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // protected BlockingQueue emptyCollection() { 348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return new LinkedBlockingDeque(); 358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static class Bounded extends BlockingQueueTest { 398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // protected BlockingQueue emptyCollection() { 408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return new LinkedBlockingDeque(SIZE); 418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return newTestSuite(LinkedBlockingDequeTest.class, 508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // new Unbounded().testSuite(), 518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // new Bounded().testSuite()); 528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Returns a new deque of given size containing consecutive 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Integers 0 ... n. 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private LinkedBlockingDeque<Integer> populatedDeque(int n) { 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque<Integer> q = 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedBlockingDeque<Integer>(n); 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < n; i++) 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(new Integer(i))); 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(n, q.size()); 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return q; 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isEmpty is true before add, false after 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testEmpty() { 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(1)); 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(2)); 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.removeFirst(); 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.removeFirst(); 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * size changes when elements added and removed 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSize() { 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i, q.size()); 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.removeFirst(); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.size()); 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(i)); 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offerFirst(null) throws NullPointerException 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferFirstNull() { 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offerFirst(null); 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offerLast(null) throws NullPointerException 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferLastNull() { 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offerLast(null); 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * OfferFirst succeeds 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferFirst() { 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerFirst(new Integer(0))); 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerFirst(new Integer(1))); 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * OfferLast succeeds 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferLast() { 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerLast(new Integer(0))); 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerLast(new Integer(1))); 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollFirst succeeds unless empty 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollFirst() { 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst()); 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollFirst()); 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollLast succeeds unless empty 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollLast() { 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = SIZE-1; i >= 0; --i) { 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollLast()); 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollLast()); 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekFirst returns next element, or null if empty 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeekFirst() { 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.peekFirst()); 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst()); 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.peekFirst() == null || 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle !q.peekFirst().equals(i)); 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekFirst()); 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peek returns next element, or null if empty 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeek() { 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.peek()); 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst()); 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.peek() == null || 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle !q.peek().equals(i)); 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peek()); 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekLast returns next element, or null if empty 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeekLast() { 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = SIZE-1; i >= 0; --i) { 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.peekLast()); 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollLast()); 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.peekLast() == null || 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle !q.peekLast().equals(i)); 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekLast()); 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getFirst() returns first element, or throws NSEE if empty 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testFirstElement() { 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.getFirst()); 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst()); 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.getFirst(); 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekFirst()); 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getLast() returns last element, or throws NSEE if empty 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testLastElement() { 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = SIZE-1; i >= 0; --i) { 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.getLast()); 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollLast()); 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.getLast(); 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekLast()); 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeFirst() removes first element, or throws NSEE if empty 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveFirst() { 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.removeFirst()); 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.removeFirst(); 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekFirst()); 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeLast() removes last element, or throws NSEE if empty 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveLast() { 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = SIZE - 1; i >= 0; --i) { 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.removeLast()); 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.removeLast(); 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peekLast()); 2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remove removes next element, or throws NSEE if empty 2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemove() { 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.remove()); 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeFirstOccurrence(x) removes x and returns true if present 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveFirstOccurrence() { 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2848e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = 1; i < SIZE; i += 2) { 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeFirstOccurrence(new Integer(i))); 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2878e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = 0; i < SIZE; i += 2) { 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeFirstOccurrence(new Integer(i))); 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.removeFirstOccurrence(new Integer(i+1))); 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeLastOccurrence(x) removes x and returns true if present 2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveLastOccurrence() { 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 2998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = 1; i < SIZE; i += 2) { 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeLastOccurrence(new Integer(i))); 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int i = 0; i < SIZE; i += 2) { 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeLastOccurrence(new Integer(i))); 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.removeLastOccurrence(new Integer(i+1))); 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekFirst returns element inserted with addFirst 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddFirst() { 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(3); 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollLast(); 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addFirst(four); 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.peekFirst()); 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekLast returns element inserted with addLast 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddLast() { 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(3); 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollLast(); 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addLast(four); 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.peekLast()); 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A new deque has the indicated capacity, or Integer.MAX_VALUE if 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * none given 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor1() { 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, new LinkedBlockingDeque(SIZE).remainingCapacity()); 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, new LinkedBlockingDeque().remainingCapacity()); 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructor throws IllegalArgumentException if capacity argument nonpositive 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2() { 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedBlockingDeque(0); 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing from null Collection throws NullPointerException 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor3() { 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedBlockingDeque(null); 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing from Collection of null elements throws NullPointerException 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor4() { 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(new Integer[SIZE]); 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedBlockingDeque(elements); 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing from Collection with some null elements throws 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * NullPointerException 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor5() { 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE-1; ++i) 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = i; 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(ints); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedBlockingDeque(elements); 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Deque contains all elements of collection used to initialize 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor6() { 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = i; 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints)); 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(ints[i], q.poll()); 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Deque transitions from empty to full when elements added 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testEmptyFull() { 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(2); 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals("should have room for 2", 2, q.remainingCapacity()); 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offer(three)); 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remainingCapacity decreases on add, increases on remove 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemainingCapacity() { 4158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath BlockingQueue q = populatedDeque(SIZE); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.remainingCapacity()); 4188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(SIZE, q.size() + q.remainingCapacity()); 4198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(i, q.remove()); 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i, q.remainingCapacity()); 4238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(SIZE, q.size() + q.remainingCapacity()); 4248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.add(i)); 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * push(null) throws NPE 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPushNull() { 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(1); 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.push(null); 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * push succeeds if not full; throws ISE if full 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPush() { 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Integer x = new Integer(i); 4478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath q.push(x); 4488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(x, q.peek()); 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.push(new Integer(SIZE)); 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekFirst returns element inserted with push 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPushWithPeek() { 4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(3); 4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollLast(); 4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.push(four); 4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.peekFirst()); 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pop removes next element, or throws NSEE if empty 4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPop() { 4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pop()); 4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pop(); 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Offer succeeds if not full; fails if full 4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOffer() { 4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(1); 4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(zero)); 4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offer(one)); 4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * add succeeds if not full; throws ISE if full 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAdd() { 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.add(new Integer(i))); 4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(SIZE)); 4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll(this) throws IAE 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAllSelf() { 5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(q); 5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll of a collection with any null elements throws NPE after 5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * possibly adding some elements 5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAll3() { 5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE-1; ++i) 5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = new Integer(i); 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(ints); 5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(elements); 5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll throws IllegalStateException if not enough room 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAll4() { 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE - 1); 5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = new Integer(i); 5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(ints); 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(elements); 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalStateException success) {} 5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Deque contains all elements, in traversal order, of successful addAll 5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAll5() { 5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] empty = new Integer[0]; 5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = new Integer(i); 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.addAll(Arrays.asList(empty))); 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.addAll(Arrays.asList(ints))); 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(ints[i], q.poll()); 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * all elements successfully put are contained 5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPut() throws InterruptedException { 5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 5668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Integer x = new Integer(i); 5678e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath q.put(x); 5688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.contains(x)); 5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * put blocks interruptibly if full 5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingPut() throws InterruptedException { 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(i); 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(99); 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(99); 5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * put blocks interruptibly waiting for take when full 6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutWithTake() throws InterruptedException { 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int capacity = 2; 6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity); 6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseTake = new CountDownLatch(1); 6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < capacity; i++) 6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(i); 6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseTake.countDown(); 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(86); 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(99); 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseTake); 6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.take()); 6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed offer times out if full and elements not taken 6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedOffer() throws InterruptedException { 6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(new Object()); 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(new Object()); 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS)); 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS); 6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take retrieves elements in FIFO order 6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTake() throws InterruptedException { 6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.take()); 6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take removes existing elements until empty, then blocks interruptibly 6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingTake() throws InterruptedException { 6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = populatedDeque(SIZE); 6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.take()); 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * poll succeeds unless empty 7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPoll() { 7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.poll()); 7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll()); 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll with zero timeout succeeds when non-empty, else times out 7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPoll0() throws InterruptedException { 7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.poll(0, MILLISECONDS)); 7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(0, MILLISECONDS)); 7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll with nonzero timeout succeeds when non-empty, else times out 7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPoll() throws InterruptedException { 7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS)); 7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(timeoutMillis(), MILLISECONDS)); 7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Interrupted timed poll throws InterruptedException instead of 7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returning timeout status 7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInterruptedTimedPoll() throws InterruptedException { 7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue<Integer> q = populatedDeque(SIZE); 7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch aboutToWait = new CountDownLatch(1); 7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long t0 = System.nanoTime(); 7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS)); 7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS); 7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long t0 = System.nanoTime(); 7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aboutToWait.countDown(); 7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(MEDIUM_DELAY_MS, MILLISECONDS); 7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) { 7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS); 7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aboutToWait.await(); 7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle waitForThreadToEnterWaitState(t, SMALL_DELAY_MS); 7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t, MEDIUM_DELAY_MS); 7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putFirst(null) throws NPE 7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutFirstNull() throws InterruptedException { 7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(null); 7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * all elements successfully putFirst are contained 7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutFirst() throws InterruptedException { 7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 7988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Integer x = new Integer(i); 7998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath q.putFirst(x); 8008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.contains(x)); 8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putFirst blocks interruptibly if full 8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingPutFirst() throws InterruptedException { 8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(i); 8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(99); 8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(99); 8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putFirst blocks interruptibly waiting for take when full 8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutFirstWithTake() throws InterruptedException { 8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int capacity = 2; 8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity); 8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseTake = new CountDownLatch(1); 8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < capacity; i++) 8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(i); 8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseTake.countDown(); 8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(86); 8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(99); 8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseTake); 8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(capacity - 1, q.take()); 8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed offerFirst times out if full and elements not taken 8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedOfferFirst() throws InterruptedException { 8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(new Object()); 8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putFirst(new Object()); 8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offerFirst(new Object(), timeoutMillis(), MILLISECONDS)); 8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offerFirst(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS); 8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take retrieves elements in FIFO order 9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeFirst() throws InterruptedException { 9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.takeFirst()); 9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeFirst() blocks interruptibly when empty 9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeFirstFromEmptyBlocksInterruptibly() { 9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingDeque q = new LinkedBlockingDeque(); 9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeFirst(); 9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(threadStarted); 9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeFirst() throws InterruptedException immediately if interrupted 9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * before waiting 9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeFirstFromEmptyAfterInterrupt() { 9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingDeque q = new LinkedBlockingDeque(); 9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeFirst(); 9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeLast() blocks interruptibly when empty 9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeLastFromEmptyBlocksInterruptibly() { 9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingDeque q = new LinkedBlockingDeque(); 9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeLast(); 9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(threadStarted); 9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeLast() throws InterruptedException immediately if interrupted 9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * before waiting 9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeLastFromEmptyAfterInterrupt() { 9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingDeque q = new LinkedBlockingDeque(); 9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeLast(); 9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeFirst removes existing elements until empty, then blocks interruptibly 9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingTakeFirst() throws InterruptedException { 9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = populatedDeque(SIZE); 9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.takeFirst()); 10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeFirst(); 10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeFirst(); 10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed pollFirst with zero timeout succeeds when non-empty, else times out 10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollFirst0() throws InterruptedException { 10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst(0, MILLISECONDS)); 10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollFirst(0, MILLISECONDS)); 10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed pollFirst with nonzero timeout succeeds when non-empty, else times out 10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollFirst() throws InterruptedException { 10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS)); 10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS)); 10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Interrupted timed pollFirst throws InterruptedException instead of 10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returning timeout status 10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInterruptedTimedPollFirst() throws InterruptedException { 10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS)); 10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollFirst(SMALL_DELAY_MS, MILLISECONDS); 10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollFirst(LONG_DELAY_MS, MILLISECONDS); 10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds; 10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * on interruption throws 10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollFirstWithOfferFirst() throws InterruptedException { 10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier barrier = new CheckedBarrier(2); 10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS)); 10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS)); 11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollFirst(LONG_DELAY_MS, MILLISECONDS); 11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollFirst(LONG_DELAY_MS, MILLISECONDS); 11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS)); 11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putLast(null) throws NPE 11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutLastNull() throws InterruptedException { 11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(null); 11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * all elements successfully putLast are contained 11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutLast() throws InterruptedException { 11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 11458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Integer x = new Integer(i); 11468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath q.putLast(x); 11478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.contains(x)); 11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putLast blocks interruptibly if full 11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingPutLast() throws InterruptedException { 11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE); 11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(i); 11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(99); 11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(99); 11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.size()); 11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * putLast blocks interruptibly waiting for take when full 11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPutLastWithTake() throws InterruptedException { 11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int capacity = 2; 11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity); 11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseTake = new CountDownLatch(1); 11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < capacity; i++) 11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(i); 12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseTake.countDown(); 12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(86); 12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(99); 12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseTake); 12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.take()); 12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed offerLast times out if full and elements not taken 12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedOfferLast() throws InterruptedException { 12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(new Object()); 12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.putLast(new Object()); 12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offerLast(new Object(), timeoutMillis(), MILLISECONDS)); 12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.offerLast(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS); 12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeLast retrieves elements in FIFO order 12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTakeLast() throws InterruptedException { 12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i-1, q.takeLast()); 12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * takeLast removes existing elements until empty, then blocks interruptibly 12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingTakeLast() throws InterruptedException { 12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = populatedDeque(SIZE); 12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i-1, q.takeLast()); 12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeLast(); 12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.takeLast(); 12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed pollLast with zero timeout succeeds when non-empty, else times out 12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollLast0() throws InterruptedException { 12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i-1, q.pollLast(0, MILLISECONDS)); 12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollLast(0, MILLISECONDS)); 13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed pollLast with nonzero timeout succeeds when non-empty, else times out 13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollLast() throws InterruptedException { 13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS)); 13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.pollLast(timeoutMillis(), MILLISECONDS)); 13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Interrupted timed pollLast throws InterruptedException instead of 13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returning timeout status 13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInterruptedTimedPollLast() throws InterruptedException { 13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS)); 13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollLast(LONG_DELAY_MS, MILLISECONDS); 13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.pollLast(LONG_DELAY_MS, MILLISECONDS); 13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll before a delayed offerLast fails; after offerLast succeeds; 13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * on interruption throws 13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollWithOfferLast() throws InterruptedException { 13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier barrier = new CheckedBarrier(2); 13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(timeoutMillis(), MILLISECONDS)); 13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS)); 13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(LONG_DELAY_MS, MILLISECONDS); 13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(LONG_DELAY_MS, MILLISECONDS); 13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS)); 13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * element returns next element, or throws NSEE if empty 13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testElement() { 13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.element()); 14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(); 14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.element(); 14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * contains(x) reports true when elements added but not yet removed 14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testContains() { 14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(new Integer(i))); 14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.poll(); 14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(new Integer(i))); 14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * clear removes all elements 14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testClear() { 14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.clear(); 14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, q.remainingCapacity()); 14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(one)); 14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.clear(); 14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * containsAll(c) is true when c contains a subset of elements 14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testContainsAll() { 14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE); 14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.containsAll(p)); 14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.containsAll(q)); 14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.add(new Integer(i)); 14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.containsAll(q)); 14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * retainAll(c) retains only those elements of c and reports true if changed 14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRetainAll() { 14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque p = populatedDeque(SIZE); 14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle boolean changed = q.retainAll(p); 14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (i == 0) 14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(changed); 14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle else 14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(changed); 14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.containsAll(p)); 14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i, q.size()); 14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.remove(); 14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeAll(c) removes only those elements of c and reports true if changed 14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveAll() { 14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 1; i < SIZE; ++i) { 14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque p = populatedDeque(i); 14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeAll(p)); 14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-i, q.size()); 14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < i; ++j) { 14818e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Integer x = (Integer)(p.remove()); 14828e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.contains(x)); 14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray contains all elements in FIFO order 14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray() throws InterruptedException { 14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Object[] o = q.toArray(); 14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < o.length; i++) 14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(o[i], q.poll()); 14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray(a) contains all elements in FIFO order 14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray2() { 15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque<Integer> q = populatedDeque(SIZE); 15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] array = q.toArray(ints); 15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ints, array); 15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < ints.length; i++) 15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ints[i], q.remove()); 15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray(incompatible array type) throws ArrayStoreException 15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray1_BadArg() { 15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.toArray(new String[10]); 15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ArrayStoreException success) {} 15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator iterates through all elements 15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIterator() throws InterruptedException { 15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.iterator(); 15268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath int i; 15278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (i = 0; it.hasNext(); i++) 15288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.contains(it.next())); 15298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(i, SIZE); 15308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(it); 15318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 15328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath it = q.iterator(); 15338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (i = 0; it.hasNext(); i++) 15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(it.next(), q.take()); 15358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(i, SIZE); 15368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(it); 15378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 15388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 15398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** 15408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * iterator of empty collection has no elements 15418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath */ 15428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void testEmptyIterator() { 15438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Deque c = new LinkedBlockingDeque(); 15448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(c.iterator()); 15458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(c.descendingIterator()); 15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator.remove removes current element 15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIteratorRemove() { 15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(3); 15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.iterator(); 15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.next(); 15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.remove(); 15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it = q.iterator(); 15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(it.next(), one); 15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(it.next(), three); 15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(it.hasNext()); 15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator ordering is FIFO 15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIteratorOrdering() { 15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(3); 15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 15738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 15748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 15768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int k = 0; 15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Iterator it = q.iterator(); it.hasNext();) { 15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(++k, it.next()); 15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(3, k); 15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Modifications do not cause iterators to fail 15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testWeaklyConsistentIteration() { 15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(3); 15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Iterator it = q.iterator(); it.hasNext();) { 15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.next(); 15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Descending iterator iterates through all elements 16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDescendingIterator() { 16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int i = 0; 16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.descendingIterator(); 16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (it.hasNext()) { 16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(it.next())); 16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ++i; 16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, SIZE); 16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(it.hasNext()); 16118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 16128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.next(); 16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 16148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Descending iterator ordering is reverse FIFO 16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDescendingIteratorOrdering() { 16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(); 16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int iters = 0; iters < 100; ++iters) { 16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(3)); 16248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(2)); 16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(1)); 16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int k = 0; 16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Iterator it = q.descendingIterator(); it.hasNext();) { 16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(++k, it.next()); 16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(3, k); 16328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 16338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 16348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * descendingIterator.remove removes current element 16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDescendingIteratorRemove() { 16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(); 16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int iters = 0; iters < 100; ++iters) { 16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(3)); 16458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(2)); 16468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(new Integer(1)); 16478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.descendingIterator(); 16488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(it.next(), new Integer(1)); 16498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.remove(); 16508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(it.next(), new Integer(2)); 16518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it = q.descendingIterator(); 16528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(it.next(), new Integer(2)); 16538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(it.next(), new Integer(3)); 16548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.remove(); 16558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(it.hasNext()); 16568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 16578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toString contains toStrings of elements 16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToString() { 16648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 16658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String s = q.toString(); 16668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 16678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(s.contains(String.valueOf(i))); 16688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offer transfers elements across Executor tasks 16738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferInExecutor() { 16758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 16768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 16778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 16788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService executor = Executors.newFixedThreadPool(2); 16798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier threadsStarted = new CheckedBarrier(2); 16808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle executor.execute(new CheckedRunnable() { 16818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 16828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.offer(three)); 16838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadsStarted.await(); 16848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS)); 16858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.remainingCapacity()); 16868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 16878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle executor.execute(new CheckedRunnable() { 16898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 16908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadsStarted.await(); 16918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, q.take()); 16928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 16938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle joinPool(executor); 16958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll retrieves elements across Executor threads 16998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 17008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollInExecutor() { 17018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = new LinkedBlockingDeque(2); 17028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier threadsStarted = new CheckedBarrier(2); 17038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService executor = Executors.newFixedThreadPool(2); 17048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle executor.execute(new CheckedRunnable() { 17058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 17068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll()); 17078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadsStarted.await(); 17088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS)); 17098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 17108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 17118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle executor.execute(new CheckedRunnable() { 17138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 17148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadsStarted.await(); 17158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(one); 17168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 17178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle joinPool(executor); 17198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 17208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 17228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A deserialized serialized deque has same elements in same order 17238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 17248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSerialization() throws Exception { 17258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Queue x = populatedDeque(SIZE); 17268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Queue y = serialClone(x); 17278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNotSame(y, x); 17298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.size(), y.size()); 17308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.toString(), y.toString()); 17318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Arrays.equals(x.toArray(), y.toArray())); 17328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (!x.isEmpty()) { 17338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(y.isEmpty()); 17348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.remove(), y.remove()); 17358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 17368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(y.isEmpty()); 17378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 17388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 17408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c) empties deque into another collection c 17418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 17428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainTo() { 17438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = populatedDeque(SIZE); 17448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 17458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 17468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 17478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, l.size()); 17488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 17498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(l.get(i), new Integer(i)); 17508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(zero); 17518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 17528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 17538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(zero)); 17548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(one)); 17558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.clear(); 17568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 17578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 17588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, l.size()); 17598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; ++i) 17608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(l.get(i), new Integer(i)); 17618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 17628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 17648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo empties full deque, unblocking a waiting put. 17658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 17668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToWithActivePut() throws InterruptedException { 17678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedBlockingDeque q = populatedDeque(SIZE); 17688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = new Thread(new CheckedRunnable() { 17698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 17708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(new Integer(SIZE+1)); 17718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 17728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.start(); 17748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 17758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 17768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(l.size() >= SIZE); 17778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 17788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(l.get(i), new Integer(i)); 17798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.join(); 17808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.size() + l.size() >= SIZE); 17818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 17828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 17838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 17848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c, n) empties first min(n, size) elements of queue into c 17858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 17868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToN() { 17878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedBlockingDeque q = new LinkedBlockingDeque(); 17888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE + 2; ++i) { 17898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < SIZE; j++) 17908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(new Integer(j))); 17918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 17928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l, i); 17938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int k = (i < SIZE) ? i : SIZE; 17948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(k, l.size()); 17958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE-k, q.size()); 17968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < k; ++j) 17978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(l.get(j), new Integer(j)); 17988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath do {} while (q.poll() != null); 17998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 18008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 18018e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 18028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** 18038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * remove(null), contains(null) always return false 18048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath */ 18058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void testNeverContainsNull() { 18068e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Deque<?>[] qs = { 18078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath new LinkedBlockingDeque<Object>(), 18088e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath populatedDeque(2), 18098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath }; 18108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 18118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (Deque<?> q : qs) { 18128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.contains(null)); 18138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.remove(null)); 18148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.removeFirstOccurrence(null)); 18158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.removeLastOccurrence(null)); 18168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 18178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 18188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 18198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1820