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