18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea and Martin Buchholz with assistance from members
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * of JCP JSR-166 Expert Group and released to the public domain, as
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * explained at http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle *
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Arrays;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/**
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Contains "contract" tests applicable to all BlockingQueue implementations.
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic abstract class BlockingQueueTest extends JSR166TestCase {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /*
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * This is the start of an attempt to refactor the tests for the
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * various related implementations of related interfaces without
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * too much duplicated code.  junit does not really support such
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * testing.  Here subclasses of TestCase not only contain tests,
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * but also configuration information that describes the
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * implementation class, most importantly how to instantiate
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * instances.
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /** Like suite(), but non-static */
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Explicitly instantiated.
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public Test testSuite() {
428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //    // TODO: filter the returned tests using the configuration
438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //    // information provided by the subclass via protected methods.
448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //    return new TestSuite(this.getClass());
458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    //----------------------------------------------------------------
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Configuration methods
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    //----------------------------------------------------------------
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** Returns an empty instance of the implementation class. */
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    protected abstract BlockingQueue emptyCollection();
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Returns an element suitable for insertion in the collection.
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Override for collections with unusual element types.
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    protected Object makeElement(int i) {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return Integer.valueOf(i);
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    //----------------------------------------------------------------
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Tests
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    //----------------------------------------------------------------
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer(null) throws NullPointerException
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferNull() {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Queue q = emptyCollection();
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offer(null);
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add(null) throws NullPointerException
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddNull() {
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Collection q = emptyCollection();
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(null);
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer(null) throws NullPointerException
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOfferNull() throws InterruptedException {
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offer(null, LONG_DELAY_MS, MILLISECONDS);
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put(null) throws NullPointerException
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutNull() throws InterruptedException {
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.put(null);
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put(null) throws NullPointerException
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllNull() throws InterruptedException {
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Collection q = emptyCollection();
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(null);
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll of a collection with null elements throws NullPointerException
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllNullElements() {
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Collection q = emptyCollection();
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(elements);
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(null) throws NullPointerException
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_NullArray() {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Collection q = emptyCollection();
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.toArray(null);
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(null) throws NullPointerException
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToNull() {
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(null);
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(this) throws IllegalArgumentException
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToSelf() {
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(q);
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(null, n) throws NullPointerException
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToNullN() {
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(null, 0);
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(this, n) throws IllegalArgumentException
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToSelfN() {
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(q, 0);
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) returns 0 and does nothing when n <= 0
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToNonPositiveMaxElements() {
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int[] ns = { 0, -1, -42, Integer.MIN_VALUE };
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int n : ns)
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, q.drainTo(new ArrayList(), n));
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (q.remainingCapacity() > 0) {
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            // Not SynchronousQueue, that is
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Object one = makeElement(1);
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(one);
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayList c = new ArrayList();
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int n : ns)
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.drainTo(new ArrayList(), n));
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, q.size());
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(one, q.poll());
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(c.isEmpty());
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll before a delayed offer times out; after offer succeeds;
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * on interruption throws
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer() throws InterruptedException {
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier barrier = new CheckedBarrier(2);
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Object zero = makeElement(0);
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll(timeoutMillis(), MILLISECONDS));
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(zero, LONG_DELAY_MS, MILLISECONDS));
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        barrier.await();
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take() blocks interruptibly when empty
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeFromEmptyBlocksInterruptibly() {
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadStarted.countDown();
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(threadStarted);
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take() throws InterruptedException immediately if interrupted
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * before waiting
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTakeFromEmptyAfterInterrupt() {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll() blocks interruptibly when empty
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollFromEmptyBlocksInterruptibly() {
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch threadStarted = new CountDownLatch(1);
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadStarted.countDown();
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(2 * LONG_DELAY_MS, MILLISECONDS);
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(threadStarted);
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll() throws InterruptedException immediately if
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * interrupted before waiting
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollFromEmptyAfterInterrupt() {
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(2 * LONG_DELAY_MS, MILLISECONDS);
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove(x) removes x and returns true if present
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * TODO: move to superclass CollectionTest.java
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveElement() {
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue q = emptyCollection();
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int size = Math.min(q.remainingCapacity(), SIZE);
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Object[] elts = new Object[size];
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.contains(makeElement(99)));
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.remove(makeElement(99)));
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < size; i++)
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(elts[i] = makeElement(i));
3508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = 1; i < size; i += 2) {
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int pass = 0; pass < 2; pass++) {
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals((pass == 0), q.contains(elts[i]));
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals((pass == 0), q.remove(elts[i]));
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.contains(elts[i]));
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.contains(elts[i-1]));
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (i < size - 1)
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(q.contains(elts[i+1]));
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (size > 0)
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(elts[0]));
3628e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = size-2; i >= 0; i -= 2) {
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(elts[i]));
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(elts[i+1]));
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.remove(elts[i]));
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(elts[i]));
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.remove(elts[i+1]));
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(elts[i+1]));
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** For debugging. */
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void XXXXtestFails() {
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        fail(emptyCollection().getClass().toString());
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
379