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 * Other contributors include John Vint 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS; 118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList; 138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays; 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection; 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.List; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue; 208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch; 218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors; 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService; 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.LinkedTransferQueue; 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle@SuppressWarnings({"unchecked", "rawtypes"}) 28e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakpublic class LinkedTransferQueueTest extends JSR166TestCase { 29e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak static class Implementation implements CollectionImplementation { 30e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public Class<?> klazz() { return LinkedTransferQueue.class; } 31e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public Collection emptyCollection() { return new LinkedTransferQueue(); } 32e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public Object makeElement(int i) { return i; } 33e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public boolean isConcurrent() { return true; } 34e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public boolean permitsNulls() { return false; } 35e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak } 368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 379cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // android-note: These tests have been moved into their own separate 389cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // classes to work around CTS issues: 399cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // LinkedTransferQueueBlockingQueueTest.java 409cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // LinkedTransferQueueCollectionTest.java 419cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // 429cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // public static class Generic extends BlockingQueueTest { 439cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // protected BlockingQueue emptyCollection() { 449cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // return new LinkedTransferQueue(); 459cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // } 469cb45b2153a3bf3950cd08f0084172ac794819ecPrzemyslaw Szczepaniak // } 47e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak 48e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak // android-note: Removed because the CTS runner does a bad job of 49e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak // retrying tests that have suite() declarations. 508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return newTestSuite(LinkedTransferQueueTest.class, 56e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak // new Generic().testSuite(), 57e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak // CollectionTest.testSuite(new Implementation())); 588e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 598e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructor builds new queue with size being zero and empty 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * being true 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor1() { 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, new LinkedTransferQueue().size()); 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(new LinkedTransferQueue().isEmpty()); 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing constructor with null collection throws 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * NullPointerException 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2() { 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedTransferQueue(null); 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing from Collection of null elements throws 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * NullPointerException 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor3() { 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(new Integer[SIZE]); 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedTransferQueue(elements); 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initializing constructor with a collection containing some null elements 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throws NullPointerException 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor4() { 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 98e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak for (int i = 0; i < SIZE - 1; ++i) 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = i; 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Collection<Integer> elements = Arrays.asList(ints); 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new LinkedTransferQueue(elements); 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Queue contains all elements of the collection it is initialized by 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor5() { 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = i; 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List intList = Arrays.asList(ints); 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = new LinkedTransferQueue(intList); 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(q.size(), intList.size()); 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(q.toString(), intList.toString()); 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Arrays.equals(q.toArray(), 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle intList.toArray())); 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Arrays.equals(q.toArray(new Object[0]), 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle intList.toArray(new Object[0]))); 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Arrays.equals(q.toArray(new Object[SIZE]), 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle intList.toArray(new Object[SIZE]))); 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(ints[i], q.poll()); 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remainingCapacity() always returns Integer.MAX_VALUE 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemainingCapacity() { 1358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath BlockingQueue q = populatedQueue(SIZE); 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE - i, q.size()); 1398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(i, q.remove()); 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.size()); 1448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.add(i)); 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll(this) throws IllegalArgumentException 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAllSelf() { 152e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak LinkedTransferQueue q = populatedQueue(SIZE); 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(q); 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * addAll of a collection with any null elements throws 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * NullPointerException after possibly adding some elements 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAll3() { 164e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak LinkedTransferQueue q = new LinkedTransferQueue(); 165e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak Integer[] ints = new Integer[SIZE]; 166e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak for (int i = 0; i < SIZE - 1; ++i) 167e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak ints[i] = i; 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.addAll(Arrays.asList(ints)); 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Queue contains all elements, in traversal order, of successful addAll 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAddAll5() { 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] empty = new Integer[0]; 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ints[i] = i; 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = new LinkedTransferQueue(); 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.addAll(Arrays.asList(empty))); 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.addAll(Arrays.asList(ints))); 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(ints[i], q.poll()); 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * all elements successfully put are contained 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPut() { 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>(); 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.size()); 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(i); 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(i)); 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take retrieves elements in FIFO order 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTake() throws InterruptedException { 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.take()); 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * take removes existing elements until empty, then blocks interruptibly 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingTake() throws InterruptedException { 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue q = populatedQueue(SIZE); 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.take()); 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.take(); 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * poll succeeds unless empty 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPoll() throws InterruptedException { 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll()); 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll()); 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll with zero timeout succeeds when non-empty, else times out 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPoll0() throws InterruptedException { 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll(0, MILLISECONDS)); 2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(0, MILLISECONDS)); 2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll with nonzero timeout succeeds when non-empty, else times out 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPoll() throws InterruptedException { 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 276e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak for (int i = 0; i < SIZE; ++i) 277e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS)); 278e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 279e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak 280e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak startTime = System.nanoTime(); 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll(timeoutMillis(), MILLISECONDS)); 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Interrupted timed poll throws InterruptedException instead of 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returning timeout status 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInterruptedTimedPoll() throws InterruptedException { 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue<Integer> q = populatedQueue(SIZE); 2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch aboutToWait = new CountDownLatch(1); 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 295e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 296e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak for (int i = 0; i < SIZE; ++i) 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS)); 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aboutToWait.countDown(); 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 300e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak q.poll(LONG_DELAY_MS, MILLISECONDS); 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 302e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak } catch (InterruptedException success) {} 303e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aboutToWait.await(); 307e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak waitForThreadToEnterWaitState(t); 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 309e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll after thread interrupted throws InterruptedException 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * instead of returning timeout status 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedPollAfterInterrupt() throws InterruptedException { 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final BlockingQueue<Integer> q = populatedQueue(SIZE); 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 321e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 323e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak for (int i = 0; i < SIZE; ++i) 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS)); 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 326e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak q.poll(LONG_DELAY_MS, MILLISECONDS); 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 329e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 332e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peek returns next element, or null if empty 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeek() throws InterruptedException { 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.peek()); 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll()); 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.peek() == null || 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle i != (int) q.peek()); 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.peek()); 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * element returns next element, or throws NoSuchElementException if empty 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testElement() throws InterruptedException { 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.element()); 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll()); 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.element(); 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remove removes next element, or throws NoSuchElementException if empty 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemove() throws InterruptedException { 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.remove()); 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NoSuchElementException success) {} 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * An add following remove(x) succeeds 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveElementAndAdd() throws InterruptedException { 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = new LinkedTransferQueue(); 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.add(one)); 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.add(two)); 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.remove(one)); 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.remove(two)); 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.add(three)); 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(q.take(), three); 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * contains(x) reports true when elements added but not yet removed 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testContains() { 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(i)); 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, (int) q.poll()); 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(i)); 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * clear removes all elements 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testClear() throws InterruptedException { 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.clear(); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(one)); 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.clear(); 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * containsAll(c) is true when c contains a subset of elements 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testContainsAll() { 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> p = new LinkedTransferQueue<Integer>(); 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.containsAll(p)); 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.containsAll(q)); 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.add(i); 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.containsAll(q)); 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * retainAll(c) retains only those elements of c and reports true 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * if changed 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRetainAll() { 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue p = populatedQueue(SIZE); 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle boolean changed = q.retainAll(p); 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (i == 0) { 4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(changed); 4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } else { 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(changed); 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.containsAll(p)); 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE - i, q.size()); 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.remove(); 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * removeAll(c) removes only those elements of c and reports true 4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * if changed 4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemoveAll() { 4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 1; i < SIZE; ++i) { 4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue p = populatedQueue(i); 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.removeAll(p)); 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE - i, q.size()); 4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < i; ++j) { 4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(p.remove())); 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray() contains all elements in FIFO order 4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray() { 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Object[] o = q.toArray(); 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < o.length; i++) { 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(o[i], q.poll()); 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray(a) contains all elements in FIFO order 4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray2() { 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = populatedQueue(SIZE); 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] ints = new Integer[SIZE]; 4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] array = q.toArray(ints); 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ints, array); 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < ints.length; i++) { 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ints[i], q.poll()); 4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toArray(incompatible array type) throws ArrayStoreException 4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToArray1_BadArg() { 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.toArray(new String[10]); 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ArrayStoreException success) {} 5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator iterates through all elements 5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIterator() throws InterruptedException { 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.iterator(); 5148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath int i; 5158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (i = 0; it.hasNext(); i++) 5168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertTrue(q.contains(it.next())); 5178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(i, SIZE); 5188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(it); 5198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 5208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath it = q.iterator(); 5218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (i = 0; it.hasNext(); i++) 5228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(it.next(), q.take()); 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, SIZE); 5248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(it); 5258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 5268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 5278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** 5288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * iterator of empty collection has no elements 5298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath */ 5308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void testEmptyIterator() { 5318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertIteratorExhausted(new LinkedTransferQueue().iterator()); 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator.remove() removes current element 5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIteratorRemove() { 5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Iterator it = q.iterator(); 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.next(); 5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.remove(); 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it = q.iterator(); 5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(it.next(), one); 5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(it.next(), three); 5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(it.hasNext()); 5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * iterator ordering is FIFO 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIteratorOrdering() { 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue<Integer> q 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = new LinkedTransferQueue<Integer>(); 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int k = 0; 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Integer n : q) { 5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(++k, (int) n); 5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(3, k); 5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Modifications do not cause iterators to fail 5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testWeaklyConsistentIteration() { 5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(two); 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(three); 5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Iterator it = q.iterator(); it.hasNext();) { 5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.remove(); 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle it.next(); 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toString contains toStrings of elements 5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToString() { 5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String s = q.toString(); 5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(s.contains(String.valueOf(i))); 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offer transfers elements across Executor tasks 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testOfferInExecutor() { 6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier threadsStarted = new CheckedBarrier(2); 603e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak final ExecutorService executor = Executors.newFixedThreadPool(2); 604e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(executor)) { 6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 606e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak executor.execute(new CheckedRunnable() { 607e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public void realRun() throws InterruptedException { 608e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak threadsStarted.await(); 609e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 610e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS)); 611e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 612e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak }}); 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 614e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak executor.execute(new CheckedRunnable() { 615e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public void realRun() throws InterruptedException { 616e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak threadsStarted.await(); 617e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertSame(one, q.take()); 618e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak checkEmpty(q); 619e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak }}); 620e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak } 6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll retrieves elements across Executor threads 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollInExecutor() { 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CheckedBarrier threadsStarted = new CheckedBarrier(2); 629e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak final ExecutorService executor = Executors.newFixedThreadPool(2); 630e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(executor)) { 6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 632e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak executor.execute(new CheckedRunnable() { 633e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public void realRun() throws InterruptedException { 634e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertNull(q.poll()); 635e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak threadsStarted.await(); 636e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 637e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS)); 638e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 639e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak checkEmpty(q); 640e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak }}); 6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 642e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak executor.execute(new CheckedRunnable() { 643e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak public void realRun() throws InterruptedException { 644e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak threadsStarted.await(); 645e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak q.put(one); 646e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak }}); 647e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak } 6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A deserialized serialized queue has same elements in same order 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSerialization() throws Exception { 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Queue x = populatedQueue(SIZE); 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Queue y = serialClone(x); 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNotSame(y, x); 6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.size(), y.size()); 6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.toString(), y.toString()); 6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(Arrays.equals(x.toArray(), y.toArray())); 6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (!x.isEmpty()) { 6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(y.isEmpty()); 6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.remove(), y.remove()); 6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(y.isEmpty()); 6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c) empties queue into another collection c 6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainTo() { 6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = populatedQueue(SIZE); 6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE, l.size()); 6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) { 6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, l.get(i)); 6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(zero); 6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.add(one); 6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(zero)); 6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(one)); 6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.clear(); 6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.size()); 6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, l.size()); 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; ++i) { 6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, l.get(i)); 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c) empties full queue, unblocking a waiting put. 6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToWithActivePut() throws InterruptedException { 6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = populatedQueue(SIZE); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.put(SIZE + 1); 7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l); 7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(l.size() >= SIZE); 7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; ++i) 7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, l.get(i)); 708e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.size() + l.size() >= SIZE); 7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTo(c, n) empties first min(n, size) elements of queue into c 7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainToN() { 7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = new LinkedTransferQueue(); 7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE + 2; ++i) { 7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < SIZE; j++) { 7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(j)); 7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList l = new ArrayList(); 7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.drainTo(l, i); 7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int k = (i < SIZE) ? i : SIZE; 7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(k, l.size()); 7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(SIZE - k, q.size()); 7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int j = 0; j < k; ++j) 7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(j, l.get(j)); 7288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath do {} while (q.poll() != null); 7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed poll() or take() increments the waiting consumer count; 7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * offer(e) decrements the waiting consumer count 7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testWaitingConsumer() throws InterruptedException { 7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.getWaitingConsumerCount()); 7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.hasWaitingConsumer()); 7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 745e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS)); 7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.getWaitingConsumerCount()); 7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.hasWaitingConsumer()); 749e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.await(); 753e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak waitForThreadToEnterWaitState(t); 7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.getWaitingConsumerCount()); 7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.hasWaitingConsumer()); 7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(one)); 7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, q.getWaitingConsumerCount()); 7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.hasWaitingConsumer()); 7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 761e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * transfer(null) throws NullPointerException 7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTransfer1() throws InterruptedException { 7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue q = new LinkedTransferQueue(); 7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(null); 7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * transfer waits until a poll occurs. The transfered element 7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * is returned by this associated poll. 7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTransfer2() throws InterruptedException { 7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue<Integer> q 7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = new LinkedTransferQueue<Integer>(); 7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(five); 7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.await(); 792e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak waitForThreadToEnterWaitState(t); 7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(five, q.poll()); 7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 796e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * transfer waits until a poll occurs, and then transfers in fifo order 8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTransfer3() throws InterruptedException { 8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue<Integer> q 8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = new LinkedTransferQueue<Integer>(); 8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread first = newStartedThread(new CheckedRunnable() { 8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(four); 8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(!q.contains(four)); 8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread interruptedThread = newStartedThread( 8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new CheckedInterruptedRunnable() { 8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (q.isEmpty()) 8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(five); 8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (q.size() < 2) 8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, q.size()); 8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.poll()); 8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle first.join(); 8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle interruptedThread.interrupt(); 8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle interruptedThread.join(); 8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * transfer waits until a poll occurs, at which point the polling 8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * thread returns the element 8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTransfer4() throws InterruptedException { 8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(four); 8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(four)); 8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(three, q.poll()); 8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (q.isEmpty()) 8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(three)); 8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.poll()); 852e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * transfer waits until a take occurs. The transfered element 8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * is returned by this associated take. 8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTransfer5() throws InterruptedException { 8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue<Integer> q 8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = new LinkedTransferQueue<Integer>(); 8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.transfer(four); 8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (q.isEmpty()) 8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.take()); 8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 875e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer(null) throws NullPointerException 8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer1() { 882e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak final LinkedTransferQueue q = new LinkedTransferQueue(); 8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.tryTransfer(null); 8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer returns false and does not enqueue if there are no 8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * consumers waiting to poll or take. 8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer2() throws InterruptedException { 8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.tryTransfer(new Object())); 8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.hasWaitingConsumer()); 8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * If there is a consumer waiting in timed poll, tryTransfer 9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returns true while successfully transfering object. 9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer3() throws InterruptedException { 9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Object hotPotato = new Object(); 9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (! q.hasWaitingConsumer()) 9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.hasWaitingConsumer()); 9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.tryTransfer(hotPotato)); 9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 917e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 918e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertSame(hotPotato, q.poll(LONG_DELAY_MS, MILLISECONDS)); 919e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 921e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * If there is a consumer waiting in take, tryTransfer returns 9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * true while successfully transfering object. 9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer4() throws InterruptedException { 9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Object hotPotato = new Object(); 9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (! q.hasWaitingConsumer()) 9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.hasWaitingConsumer()); 9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.tryTransfer(hotPotato)); 9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(q.take(), hotPotato); 9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 943e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer blocks interruptibly if no takers 9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer5() throws InterruptedException { 9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.isEmpty()); 9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 956e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS); 9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle q.tryTransfer(new Object(), LONG_DELAY_MS, MILLISECONDS); 9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (InterruptedException success) {} 9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(Thread.interrupted()); 970e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertThreadStaysAlive(t); 9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer gives up after the timeout and returns false 9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer6() throws InterruptedException { 9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 988e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.tryTransfer(new Object(), 9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle timeoutMillis(), MILLISECONDS)); 991e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer waits for any elements previously in to be removed 10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * before transfering to a poll or take 10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer7() throws InterruptedException { 10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(four)); 10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 1009e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 1010e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(q.tryTransfer(five, LONG_DELAY_MS, MILLISECONDS)); 1011e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (q.size() != 2) 10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, q.size()); 10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.poll()); 10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(five, q.poll()); 10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 1021e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak awaitTermination(t); 10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryTransfer attempts to enqueue into the queue and fails 10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * returning false not enqueueing and the successive poll is null 10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryTransfer8() throws InterruptedException { 10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final LinkedTransferQueue q = new LinkedTransferQueue(); 10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(four)); 10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 1032e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak long startTime = System.nanoTime(); 10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.tryTransfer(five, timeoutMillis(), MILLISECONDS)); 1034e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, q.size()); 10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(four, q.poll()); 10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(q.poll()); 10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private LinkedTransferQueue<Integer> populatedQueue(int n) { 10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LinkedTransferQueue<Integer> q = new LinkedTransferQueue<Integer>(); 10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkEmpty(q); 10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < n; i++) { 10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(i, q.size()); 10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.offer(i)); 10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Integer.MAX_VALUE, q.remainingCapacity()); 10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.isEmpty()); 10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return q; 10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 10538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** 10548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * remove(null), contains(null) always return false 10558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath */ 10568e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void testNeverContainsNull() { 10578e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Collection<?>[] qs = { 10588e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath new LinkedTransferQueue<Object>(), 10598e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath populatedQueue(2), 10608e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath }; 10618e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 10628e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (Collection<?> q : qs) { 10638e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.contains(null)); 10648e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertFalse(q.remove(null)); 10658e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 10668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1068