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