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 Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ArrayBlockingQueue;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ArrayBlockingQueueTest extends JSR166TestCase {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
29e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // android-note: These tests have been moved into their own separate
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // classes to work around CTS issues.
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class Fair extends BlockingQueueTest {
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new ArrayBlockingQueue(SIZE, true);
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
37e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class NonFair extends BlockingQueueTest {
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new ArrayBlockingQueue(SIZE, false);
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
43e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
44e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // android-note: Removed because the CTS runner does a bad job of
45e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // retrying tests that have suite() declarations.
468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return newTestSuite(ArrayBlockingQueueTest.class,
528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Fair().testSuite(),
538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new NonFair().testSuite());
548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Returns a new queue of given size containing consecutive
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Integers 0 ... n.
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private ArrayBlockingQueue<Integer> populatedQueue(int n) {
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(n);
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < n; i++)
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new Integer(i)));
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(n, q.size());
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return q;
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new queue has the indicated capacity
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, new ArrayBlockingQueue(SIZE).remainingCapacity());
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws IAE if capacity argument nonpositive
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ArrayBlockingQueue(0);
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from null Collection throws NPE
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ArrayBlockingQueue(1, true, null);
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection of null elements throws NPE
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor4() {
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ArrayBlockingQueue(SIZE, false, elements);
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection with some null elements throws NPE
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
114e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            new ArrayBlockingQueue(SIZE, false, elements);
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from too large collection throws IAE
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor6() {
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new ArrayBlockingQueue(SIZE - 1, false, elements);
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements of collection used to initialize
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor7() {
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE, true, elements);
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue transitions from empty to full when elements added
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull() {
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(2);
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, q.remainingCapacity());
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(three));
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remainingCapacity decreases on add, increases on remove
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemainingCapacity() {
1698e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        BlockingQueue q = populatedQueue(SIZE);
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.remainingCapacity());
1728e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(SIZE, q.size() + q.remainingCapacity());
1738e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(i, q.remove());
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
176e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - i, q.remainingCapacity());
1778e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(SIZE, q.size() + q.remainingCapacity());
1788e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.add(i));
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Offer succeeds if not full; fails if full
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer() {
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(1);
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(zero));
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(one));
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add succeeds if not full; throws ISE if full
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd() {
1958e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
1968e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 0; i < SIZE; ++i) {
1978e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.add(new Integer(i)));
1988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
1998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(0, q.remainingCapacity());
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(SIZE));
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IAE
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllSelf() {
2108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        ArrayBlockingQueue q = populatedQueue(SIZE);
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll of a collection with any null elements throws NPE after
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * possibly adding some elements
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll3() {
2228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
2238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Integer[] ints = new Integer[SIZE];
224e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
2258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            ints[i] = new Integer(i);
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(Arrays.asList(ints));
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll throws ISE if not enough room
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll4() {
2368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        ArrayBlockingQueue q = new ArrayBlockingQueue(1);
2378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Integer[] ints = new Integer[SIZE];
2388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 0; i < SIZE; ++i)
2398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            ints[i] = new Integer(i);
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(Arrays.asList(ints));
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements, in traversal order, of successful addAll
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll5() {
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.addAll(Arrays.asList(empty)));
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.addAll(Arrays.asList(ints)));
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully put are contained
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPut() throws InterruptedException {
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2678e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Integer x = new Integer(i);
2688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.put(x);
2698e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly if full
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut() throws InterruptedException {
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i)
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(i);
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(SIZE, q.size());
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly waiting for take when full
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake() throws InterruptedException {
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int capacity = 2;
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(capacity);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < capacity; i++)
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(i);
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(86);
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.take());
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer times out if full and elements not taken
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer() throws InterruptedException {
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Object());
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Object());
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take retrieves elements in FIFO order
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTake() throws InterruptedException {
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.take());
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Take removes existing elements until empty, then blocks interruptibly
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTake() throws InterruptedException {
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = populatedQueue(SIZE);
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, q.take());
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll succeeds unless empty
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll() {
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout succeeds when non-empty, else times out
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0() throws InterruptedException {
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll(0, MILLISECONDS));
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(0, MILLISECONDS));
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout succeeds when non-empty, else times out
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll() throws InterruptedException {
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed poll throws InterruptedException instead of
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPoll() throws InterruptedException {
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue<Integer> q = populatedQueue(SIZE);
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch aboutToWait = new CountDownLatch(1);
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
461e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                long startTime = System.nanoTime();
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                aboutToWait.countDown();
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
467e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    q.poll(LONG_DELAY_MS, MILLISECONDS);
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {
470e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
474e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        await(aboutToWait);
475e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        waitForThreadToEnterWaitState(t, LONG_DELAY_MS);
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
477e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        awaitTermination(t);
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek returns next element, or null if empty
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek() {
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.peek());
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.peek() == null ||
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       !q.peek().equals(i));
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element returns next element, or throws NSEE if empty
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement() {
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.element());
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove removes next element, or throws NSEE if empty
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() {
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.remove());
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains(x) reports true when elements added but not yet removed
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains() {
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(new Integer(i)));
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(new Integer(i)));
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear removes all elements
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear() {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.remainingCapacity());
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll(c) is true when c contains a subset of elements
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll() {
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue p = new ArrayBlockingQueue(SIZE);
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.containsAll(q));
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.add(new Integer(i));
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.containsAll(q));
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll(c) retains only those elements of c and reports true if changed
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll() {
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue p = populatedQueue(SIZE);
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            boolean changed = q.retainAll(p);
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i == 0)
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(changed);
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(changed);
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
580e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.remove();
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll(c) removes only those elements of c and reports true if changed
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll() {
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < SIZE; ++i) {
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayBlockingQueue q = populatedQueue(SIZE);
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayBlockingQueue p = populatedQueue(i);
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeAll(p));
593e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < i; ++j) {
5958e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Integer x = (Integer)(p.remove());
5968e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                assertFalse(q.contains(x));
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkToArray(ArrayBlockingQueue q) {
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int size = q.size();
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(size, o.length);
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < size; i++) {
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Integer x = (Integer) it.next();
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals((Integer)o[0] + i, (int) x);
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(o[i], x);
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray() contains all elements in FIFO order
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray() {
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray(q);
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(i);
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // Provoke wraparound
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray(q);
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray(q);
627e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            q.add(SIZE + i);
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray(q);
631e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE + i, q.poll());
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkToArray2(ArrayBlockingQueue q) {
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int size = q.size();
637e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Integer[] a1 = (size == 0) ? null : new Integer[size - 1];
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] a2 = new Integer[size];
639e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Integer[] a3 = new Integer[size + 2];
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (size > 0) Arrays.fill(a1, 42);
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.fill(a2, 42);
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.fill(a3, 42);
643e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Integer[] b1 = (size == 0) ? null : (Integer[]) q.toArray(a1);
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] b2 = (Integer[]) q.toArray(a2);
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] b3 = (Integer[]) q.toArray(a3);
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a2, b2);
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a3, b3);
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < size; i++) {
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Integer x = (Integer) it.next();
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(b1[i], x);
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(b1[0] + i, (int) x);
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(b2[i], x);
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(b3[i], x);
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a3[size]);
657e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        assertEquals(42, (int) a3[size + 1]);
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (size > 0) {
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNotSame(a1, b1);
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(size, b1.length);
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < a1.length; i++) {
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(42, (int) a1[i]);
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(a) contains all elements in FIFO order
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2() {
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE);
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray2(q);
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(i);
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // Provoke wraparound
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray2(q);
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray2(q);
681e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            q.add(SIZE + i);
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; i++) {
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkToArray2(q);
685e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE + i, q.poll());
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(incompatible array type) throws ArrayStoreException
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray1_BadArg() {
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.toArray(new String[10]);
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ArrayStoreException success) {}
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator iterates through all elements
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator() throws InterruptedException {
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
7068e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        int i;
7078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (i = 0; it.hasNext(); i++)
7088e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(it.next()));
7098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(i, SIZE);
7108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
7118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
7128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        it = q.iterator();
7138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (i = 0; it.hasNext(); i++)
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), q.take());
7158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(i, SIZE);
7168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
7178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
7188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
7198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
7208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * iterator of empty collection has no elements
7218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
7228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testEmptyIterator() {
7238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(new ArrayBlockingQueue(SIZE).iterator());
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator.remove removes current element
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove() {
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.next();
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.remove();
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it = q.iterator();
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(it.next(), one);
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(it.next(), three);
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator ordering is FIFO
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorOrdering() {
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals("queue should be full", 0, q.remainingCapacity());
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int k = 0;
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Iterator it = q.iterator(); it.hasNext();) {
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(++k, it.next());
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(3, k);
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Modifications do not cause iterators to fail
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWeaklyConsistentIteration() {
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(3);
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Iterator it = q.iterator(); it.hasNext();) {
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.next();
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString contains toStrings of elements
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(s.contains(String.valueOf(i)));
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer transfers elements across Executor tasks
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor() {
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
797e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
798e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
799e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
800e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
801e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertFalse(q.offer(three));
802e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
803e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
804e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertEquals(0, q.remainingCapacity());
805e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
806e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
807e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
808e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
809e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
810e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertEquals(0, q.remainingCapacity());
811e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertSame(one, q.take());
812e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
813e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll retrieves elements across Executor threads
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor() {
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = new ArrayBlockingQueue(2);
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
822e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
823e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
824e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
825e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
826e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertNull(q.poll());
827e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
828e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
829e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    checkEmpty(q);
830e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
831e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
832e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
833e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
834e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
835e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    q.put(one);
836e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
837e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A deserialized serialized queue has same elements in same order
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() throws Exception {
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue x = populatedQueue(SIZE);
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue y = serialClone(x);
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotSame(x, y);
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(x.size(), y.size());
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(x.toString(), y.toString());
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!x.isEmpty()) {
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(y.isEmpty());
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(x.remove(), y.remove());
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(y.isEmpty());
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) empties queue into another collection c
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo() {
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayBlockingQueue q = populatedQueue(SIZE);
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, l.size());
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(zero);
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(zero));
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.clear();
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; ++i)
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties full queue, unblocking a waiting put.
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut() throws InterruptedException {
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ArrayBlockingQueue q = populatedQueue(SIZE);
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
889e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                q.put(new Integer(SIZE + 1));
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() >= SIZE);
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join();
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.size() + l.size() >= SIZE);
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties first min(n, size) elements of queue into c
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() {
906e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        ArrayBlockingQueue q = new ArrayBlockingQueue(SIZE * 2);
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE + 2; ++i) {
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < SIZE; j++)
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new Integer(j)));
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayList l = new ArrayList();
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l, i);
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int k = (i < SIZE) ? i : SIZE;
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(k, l.size());
914e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - k, q.size());
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < k; ++j)
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(l.get(j), new Integer(j));
9178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            do {} while (q.poll() != null);
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
9228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remove(null), contains(null) always return false
9238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
9248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testNeverContainsNull() {
9258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Collection<?>[] qs = {
9268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            new ArrayBlockingQueue<Object>(10),
9278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            populatedQueue(2),
9288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        };
9298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
9308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (Collection<?> q : qs) {
9318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.contains(null));
9328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.remove(null));
9338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
9348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
936