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