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 */
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Deque;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingDeque;
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.LinkedBlockingDeque;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class LinkedBlockingDequeTest extends JSR166TestCase {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // 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 Unbounded extends BlockingQueueTest {
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new LinkedBlockingDeque();
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class Bounded extends BlockingQueueTest {
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new LinkedBlockingDeque(SIZE);
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return newTestSuite(LinkedBlockingDequeTest.class,
508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Unbounded().testSuite(),
518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Bounded().testSuite());
528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Returns a new deque of given size containing consecutive
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Integers 0 ... n.
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private LinkedBlockingDeque<Integer> populatedDeque(int n) {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque<Integer> q =
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new LinkedBlockingDeque<Integer>(n);
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < n; i++)
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new Integer(i)));
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(n, q.size());
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return q;
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isEmpty is true before add, false after
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmpty() {
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new Integer(1));
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new Integer(2));
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.removeFirst();
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.removeFirst();
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * size changes when elements added and removed
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSize() {
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i, q.size());
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.removeFirst();
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.size());
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(i));
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offerFirst(null) throws NullPointerException
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferFirstNull() {
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offerFirst(null);
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offerLast(null) throws NullPointerException
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferLastNull() {
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offerLast(null);
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * OfferFirst succeeds
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferFirst() {
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerFirst(new Integer(0)));
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerFirst(new Integer(1)));
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * OfferLast succeeds
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferLast() {
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerLast(new Integer(0)));
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerLast(new Integer(1)));
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollFirst succeeds unless empty
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollFirst() {
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst());
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollFirst());
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollLast succeeds unless empty
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollLast() {
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = SIZE-1; i >= 0; --i) {
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollLast());
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollLast());
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekFirst returns next element, or null if empty
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekFirst() {
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.peekFirst());
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst());
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.peekFirst() == null ||
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       !q.peekFirst().equals(i));
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekFirst());
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek returns next element, or null if empty
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek() {
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.peek());
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst());
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.peek() == null ||
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       !q.peek().equals(i));
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekLast returns next element, or null if empty
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekLast() {
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = SIZE-1; i >= 0; --i) {
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.peekLast());
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollLast());
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.peekLast() == null ||
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       !q.peekLast().equals(i));
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekLast());
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getFirst() returns first element, or throws NSEE if empty
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFirstElement() {
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.getFirst());
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst());
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.getFirst();
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekFirst());
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getLast() returns last element, or throws NSEE if empty
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testLastElement() {
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = SIZE-1; i >= 0; --i) {
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.getLast());
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollLast());
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.getLast();
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekLast());
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeFirst() removes first element, or throws NSEE if empty
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveFirst() {
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.removeFirst());
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.removeFirst();
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekFirst());
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeLast() removes last element, or throws NSEE if empty
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveLast() {
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = SIZE - 1; i >= 0; --i) {
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.removeLast());
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.removeLast();
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peekLast());
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove removes next element, or throws NSEE if empty
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() {
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.remove());
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeFirstOccurrence(x) removes x and returns true if present
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveFirstOccurrence() {
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2848e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 1; i < SIZE; i += 2) {
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeFirstOccurrence(new Integer(i)));
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2878e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 0; i < SIZE; i += 2) {
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeFirstOccurrence(new Integer(i)));
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.removeFirstOccurrence(new Integer(i+1)));
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeLastOccurrence(x) removes x and returns true if present
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveLastOccurrence() {
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
2998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 1; i < SIZE; i += 2) {
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeLastOccurrence(new Integer(i)));
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 0; i < SIZE; i += 2) {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeLastOccurrence(new Integer(i)));
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.removeLastOccurrence(new Integer(i+1)));
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekFirst returns element inserted with addFirst
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddFirst() {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(3);
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.pollLast();
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.addFirst(four);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(four, q.peekFirst());
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekLast returns element inserted with addLast
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddLast() {
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(3);
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.pollLast();
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.addLast(four);
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(four, q.peekLast());
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new deque has the indicated capacity, or Integer.MAX_VALUE if
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * none given
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, new LinkedBlockingDeque(SIZE).remainingCapacity());
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(Integer.MAX_VALUE, new LinkedBlockingDeque().remainingCapacity());
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws IllegalArgumentException if capacity argument nonpositive
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new LinkedBlockingDeque(0);
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from null Collection throws NullPointerException
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new LinkedBlockingDeque(null);
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection of null elements throws NullPointerException
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor4() {
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new LinkedBlockingDeque(elements);
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection with some null elements throws
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * NullPointerException
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE-1; ++i)
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new LinkedBlockingDeque(elements);
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Deque contains all elements of collection used to initialize
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor6() {
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(Arrays.asList(ints));
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Deque transitions from empty to full when elements added
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull() {
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(2);
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals("should have room for 2", 2, q.remainingCapacity());
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(three));
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remainingCapacity decreases on add, increases on remove
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemainingCapacity() {
4158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        BlockingQueue q = populatedDeque(SIZE);
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.remainingCapacity());
4188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(SIZE, q.size() + q.remainingCapacity());
4198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(i, q.remove());
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i, q.remainingCapacity());
4238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(SIZE, q.size() + q.remainingCapacity());
4248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.add(i));
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * push(null) throws NPE
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPushNull() {
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            LinkedBlockingDeque q = new LinkedBlockingDeque(1);
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.push(null);
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * push succeeds if not full; throws ISE if full
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPush() {
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0; i < SIZE; ++i) {
4468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Integer x = new Integer(i);
4478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                q.push(x);
4488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                assertEquals(x, q.peek());
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, q.remainingCapacity());
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.push(new Integer(SIZE));
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekFirst returns element inserted with push
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPushWithPeek() {
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(3);
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.pollLast();
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.push(four);
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(four, q.peekFirst());
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pop removes next element, or throws NSEE if empty
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPop() {
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pop());
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.pop();
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Offer succeeds if not full; fails if full
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer() {
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(1);
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(zero));
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(one));
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add succeeds if not full; throws ISE if full
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd() {
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.add(new Integer(i)));
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(SIZE));
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IAE
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllSelf() {
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll of a collection with any null elements throws NPE after
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * possibly adding some elements
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll3() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE-1; ++i)
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(elements);
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll throws IllegalStateException if not enough room
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll4() {
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE - 1);
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(elements);
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Deque contains all elements, in traversal order, of successful addAll
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll5() {
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.addAll(Arrays.asList(empty)));
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.addAll(Arrays.asList(ints)));
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully put are contained
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPut() throws InterruptedException {
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Integer x = new Integer(i);
5678e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.put(x);
5688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly if full
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut() throws InterruptedException {
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i)
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(i);
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(SIZE, q.size());
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly waiting for take when full
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake() throws InterruptedException {
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int capacity = 2;
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < capacity; i++)
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(i);
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(86);
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.take());
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer times out if full and elements not taken
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer() throws InterruptedException {
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Object());
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Object());
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take retrieves elements in FIFO order
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTake() throws InterruptedException {
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.take());
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take removes existing elements until empty, then blocks interruptibly
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTake() throws InterruptedException {
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = populatedDeque(SIZE);
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, q.take());
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll succeeds unless empty
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll() {
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout succeeds when non-empty, else times out
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0() throws InterruptedException {
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll(0, MILLISECONDS));
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(0, MILLISECONDS));
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout succeeds when non-empty, else times out
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll() throws InterruptedException {
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll(LONG_DELAY_MS, MILLISECONDS));
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed poll throws InterruptedException instead of
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPoll() throws InterruptedException {
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue<Integer> q = populatedDeque(SIZE);
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch aboutToWait = new CountDownLatch(1);
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    long t0 = System.nanoTime();
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(t0) < SMALL_DELAY_MS);
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long t0 = System.nanoTime();
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                aboutToWait.countDown();
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(MEDIUM_DELAY_MS, MILLISECONDS);
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(t0) < MEDIUM_DELAY_MS);
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        aboutToWait.await();
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t, MEDIUM_DELAY_MS);
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putFirst(null) throws NPE
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutFirstNull() throws InterruptedException {
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.putFirst(null);
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully putFirst are contained
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutFirst() throws InterruptedException {
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Integer x = new Integer(i);
7998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.putFirst(x);
8008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putFirst blocks interruptibly if full
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPutFirst() throws InterruptedException {
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i)
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putFirst(i);
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(SIZE, q.size());
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putFirst(99);
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putFirst(99);
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putFirst blocks interruptibly waiting for take when full
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutFirstWithTake() throws InterruptedException {
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int capacity = 2;
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < capacity; i++)
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putFirst(i);
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putFirst(86);
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putFirst(99);
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(capacity - 1, q.take());
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offerFirst times out if full and elements not taken
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOfferFirst() throws InterruptedException {
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putFirst(new Object());
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putFirst(new Object());
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offerFirst(new Object(), timeoutMillis(), MILLISECONDS));
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offerFirst(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take retrieves elements in FIFO order
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeFirst() throws InterruptedException {
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.takeFirst());
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeFirst() blocks interruptibly when empty
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeFirstFromEmptyBlocksInterruptibly() {
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingDeque q = new LinkedBlockingDeque();
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadStarted.countDown();
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeFirst();
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(threadStarted);
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeFirst() throws InterruptedException immediately if interrupted
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * before waiting
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeFirstFromEmptyAfterInterrupt() {
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingDeque q = new LinkedBlockingDeque();
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeFirst();
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeLast() blocks interruptibly when empty
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeLastFromEmptyBlocksInterruptibly() {
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingDeque q = new LinkedBlockingDeque();
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadStarted.countDown();
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeLast();
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(threadStarted);
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeLast() throws InterruptedException immediately if interrupted
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * before waiting
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeLastFromEmptyAfterInterrupt() {
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingDeque q = new LinkedBlockingDeque();
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeLast();
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeFirst removes existing elements until empty, then blocks interruptibly
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTakeFirst() throws InterruptedException {
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = populatedDeque(SIZE);
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, q.takeFirst());
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeFirst();
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeFirst();
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed pollFirst with zero timeout succeeds when non-empty, else times out
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollFirst0() throws InterruptedException {
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst(0, MILLISECONDS));
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollFirst(0, MILLISECONDS));
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed pollFirst with nonzero timeout succeeds when non-empty, else times out
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollFirst() throws InterruptedException {
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed pollFirst throws InterruptedException instead of
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPollFirst() throws InterruptedException {
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                LinkedBlockingDeque q = populatedDeque(SIZE);
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollFirst(SMALL_DELAY_MS, MILLISECONDS);
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed pollFirst before a delayed offerFirst fails; after offerFirst succeeds;
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * on interruption throws
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollFirstWithOfferFirst() throws InterruptedException {
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier barrier = new CheckedBarrier(2);
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.pollFirst(timeoutMillis(), MILLISECONDS));
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(zero, q.pollFirst(LONG_DELAY_MS, MILLISECONDS));
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollFirst(LONG_DELAY_MS, MILLISECONDS);
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerFirst(zero, LONG_DELAY_MS, MILLISECONDS));
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putLast(null) throws NPE
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutLastNull() throws InterruptedException {
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.putLast(null);
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully putLast are contained
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutLast() throws InterruptedException {
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
11458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Integer x = new Integer(i);
11468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.putLast(x);
11478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putLast blocks interruptibly if full
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPutLast() throws InterruptedException {
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(SIZE);
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i)
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putLast(i);
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(SIZE, q.size());
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putLast(99);
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putLast(99);
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * putLast blocks interruptibly waiting for take when full
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutLastWithTake() throws InterruptedException {
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int capacity = 2;
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(capacity);
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < capacity; i++)
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putLast(i);
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putLast(86);
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.putLast(99);
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.take());
12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offerLast times out if full and elements not taken
12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOfferLast() throws InterruptedException {
12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putLast(new Object());
12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.putLast(new Object());
12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offerLast(new Object(), timeoutMillis(), MILLISECONDS));
12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offerLast(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeLast retrieves elements in FIFO order
12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeLast() throws InterruptedException {
12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i-1, q.takeLast());
12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * takeLast removes existing elements until empty, then blocks interruptibly
12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTakeLast() throws InterruptedException {
12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = populatedDeque(SIZE);
12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(SIZE-i-1, q.takeLast());
12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeLast();
12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.takeLast();
12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed pollLast with zero timeout succeeds when non-empty, else times out
12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollLast0() throws InterruptedException {
12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i-1, q.pollLast(0, MILLISECONDS));
12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollLast(0, MILLISECONDS));
13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed pollLast with nonzero timeout succeeds when non-empty, else times out
13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollLast() throws InterruptedException {
13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.pollLast(timeoutMillis(), MILLISECONDS));
13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed pollLast throws InterruptedException instead of
13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPollLast() throws InterruptedException {
13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                LinkedBlockingDeque q = populatedDeque(SIZE);
13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(SIZE-i-1, q.pollLast(LONG_DELAY_MS, MILLISECONDS));
13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollLast(LONG_DELAY_MS, MILLISECONDS);
13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.pollLast(LONG_DELAY_MS, MILLISECONDS);
13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll before a delayed offerLast fails; after offerLast succeeds;
13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * on interruption throws
13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOfferLast() throws InterruptedException {
13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier barrier = new CheckedBarrier(2);
13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll(timeoutMillis(), MILLISECONDS));
13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offerLast(zero, LONG_DELAY_MS, MILLISECONDS));
13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element returns next element, or throws NSEE if empty
13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement() {
13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.element());
14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.poll();
14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains(x) reports true when elements added but not yet removed
14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains() {
14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(new Integer(i)));
14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.poll();
14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(new Integer(i)));
14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear removes all elements
14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear() {
14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.remainingCapacity());
14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll(c) is true when c contains a subset of elements
14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll() {
14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque p = new LinkedBlockingDeque(SIZE);
14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.containsAll(q));
14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.add(new Integer(i));
14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.containsAll(q));
14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll(c) retains only those elements of c and reports true if changed
14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll() {
14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque p = populatedDeque(SIZE);
14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            boolean changed = q.retainAll(p);
14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i == 0)
14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(changed);
14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(changed);
14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i, q.size());
14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.remove();
14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll(c) removes only those elements of c and reports true if changed
14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll() {
14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < SIZE; ++i) {
14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            LinkedBlockingDeque q = populatedDeque(SIZE);
14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            LinkedBlockingDeque p = populatedDeque(i);
14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeAll(p));
14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-i, q.size());
14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < i; ++j) {
14818e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Integer x = (Integer)(p.remove());
14828e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                assertFalse(q.contains(x));
14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray contains all elements in FIFO order
14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray() throws InterruptedException {
14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < o.length; i++)
14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(o[i], q.poll());
14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(a) contains all elements in FIFO order
14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2() {
15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque<Integer> q = populatedDeque(SIZE);
15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] array = q.toArray(ints);
15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(ints, array);
15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < ints.length; i++)
15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(ints[i], q.remove());
15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(incompatible array type) throws ArrayStoreException
15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray1_BadArg() {
15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.toArray(new String[10]);
15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ArrayStoreException success) {}
15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator iterates through all elements
15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator() throws InterruptedException {
15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
15268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        int i;
15278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (i = 0; it.hasNext(); i++)
15288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(it.next()));
15298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(i, SIZE);
15308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
15318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
15328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        it = q.iterator();
15338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (i = 0; it.hasNext(); i++)
15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), q.take());
15358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(i, SIZE);
15368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
15378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
15388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
15398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
15408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * iterator of empty collection has no elements
15418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
15428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testEmptyIterator() {
15438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Deque c = new LinkedBlockingDeque();
15448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(c.iterator());
15458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(c.descendingIterator());
15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator.remove removes current element
15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove() {
15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.next();
15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.remove();
15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it = q.iterator();
15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(it.next(), one);
15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(it.next(), three);
15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator ordering is FIFO
15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorOrdering() {
15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
15738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
15748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
15768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int k = 0;
15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Iterator it = q.iterator(); it.hasNext();) {
15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(++k, it.next());
15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(3, k);
15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Modifications do not cause iterators to fail
15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWeaklyConsistentIteration() {
15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(3);
15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(three);
15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Iterator it = q.iterator(); it.hasNext();) {
15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.next();
15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Descending iterator iterates through all elements
16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDescendingIterator() {
16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int i = 0;
16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.descendingIterator();
16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (it.hasNext()) {
16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(it.next()));
16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ++i;
16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(i, SIZE);
16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
16118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
16128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.next();
16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
16148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Descending iterator ordering is reverse FIFO
16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDescendingIteratorOrdering() {
16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque();
16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int iters = 0; iters < 100; ++iters) {
16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(3));
16248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(2));
16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(1));
16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int k = 0;
16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (Iterator it = q.descendingIterator(); it.hasNext();) {
16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(++k, it.next());
16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(3, k);
16328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
16338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
16348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * descendingIterator.remove removes current element
16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDescendingIteratorRemove() {
16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque();
16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int iters = 0; iters < 100; ++iters) {
16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(3));
16458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(2));
16468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new Integer(1));
16478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Iterator it = q.descendingIterator();
16488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), new Integer(1));
16498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.remove();
16508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), new Integer(2));
16518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it = q.descendingIterator();
16528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), new Integer(2));
16538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(it.next(), new Integer(3));
16548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.remove();
16558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(it.hasNext());
16568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
16578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString contains toStrings of elements
16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
16648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
16658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
16668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
16678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(s.contains(String.valueOf(i)));
16688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
16698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer transfers elements across Executor tasks
16738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor() {
16758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
16768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
16778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
16788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService executor = Executors.newFixedThreadPool(2);
16798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
16808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
16818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
16828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(three));
16838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
16848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(three, LONG_DELAY_MS, MILLISECONDS));
16858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
16868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
16878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
16898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
16908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
16918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(one, q.take());
16928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
16938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(executor);
16958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll retrieves elements across Executor threads
16998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor() {
17018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = new LinkedBlockingDeque(2);
17028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
17038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService executor = Executors.newFixedThreadPool(2);
17048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
17058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
17068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll());
17078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
17088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
17098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkEmpty(q);
17108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
17118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
17138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
17148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
17158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
17168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
17178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(executor);
17198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A deserialized serialized deque has same elements in same order
17238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() throws Exception {
17258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue x = populatedDeque(SIZE);
17268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue y = serialClone(x);
17278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotSame(y, x);
17298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(x.size(), y.size());
17308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(x.toString(), y.toString());
17318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
17328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!x.isEmpty()) {
17338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(y.isEmpty());
17348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(x.remove(), y.remove());
17358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
17368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(y.isEmpty());
17378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) empties deque into another collection c
17418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo() {
17438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = populatedDeque(SIZE);
17448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
17458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
17468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
17478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, l.size());
17488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
17498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
17508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(zero);
17518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
17528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
17538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(zero));
17548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
17558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.clear();
17568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
17578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
17588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
17598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; ++i)
17608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
17618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties full deque, unblocking a waiting put.
17658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut() throws InterruptedException {
17678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final LinkedBlockingDeque q = populatedDeque(SIZE);
17688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
17698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
17708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Integer(SIZE+1));
17718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
17728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
17748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
17758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
17768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() >= SIZE);
17778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
17788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
17798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join();
17808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.size() + l.size() >= SIZE);
17818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties first min(n, size) elements of queue into c
17858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() {
17878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        LinkedBlockingDeque q = new LinkedBlockingDeque();
17888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE + 2; ++i) {
17898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < SIZE; j++)
17908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new Integer(j)));
17918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayList l = new ArrayList();
17928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l, i);
17938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int k = (i < SIZE) ? i : SIZE;
17948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(k, l.size());
17958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(SIZE-k, q.size());
17968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < k; ++j)
17978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(l.get(j), new Integer(j));
17988e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            do {} while (q.poll() != null);
17998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
18008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
18018e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
18028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
18038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remove(null), contains(null) always return false
18048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
18058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testNeverContainsNull() {
18068e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Deque<?>[] qs = {
18078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            new LinkedBlockingDeque<Object>(),
18088e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            populatedDeque(2),
18098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        };
18108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
18118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (Deque<?> q : qs) {
18128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.contains(null));
18138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.remove(null));
18148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.removeFirstOccurrence(null));
18158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.removeLastOccurrence(null));
18168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
18178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1820