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