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