18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService;
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.SynchronousQueue;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class SynchronousQueueTest extends JSR166TestCase {
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
28b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    // android-note: These tests have been moved into their own separate
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // classes to work around CTS issues.
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class Fair extends BlockingQueueTest {
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new SynchronousQueue(true);
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
36b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class NonFair extends BlockingQueueTest {
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new SynchronousQueue(false);
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
42b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
43b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    // android-note: Removed because the CTS runner does a bad job of
44b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    // retrying tests that have suite() declarations.
458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return newTestSuite(SynchronousQueueTest.class,
518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Fair().testSuite(),
528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new NonFair().testSuite());
538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Any SynchronousQueue is both empty and full
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull()      { testEmptyFull(false); }
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull_fair() { testEmptyFull(true); }
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull(boolean fair) {
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(zero));
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer fails if no active taker
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer()      { testOffer(false); }
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer_fair() { testOffer(true); }
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer(boolean fair) {
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(one));
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add throws IllegalStateException if no active taker
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd()      { testAdd(false); }
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd_fair() { testAdd(true); }
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd(boolean fair) {
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(one);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IllegalArgumentException
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self()      { testAddAll_self(false); }
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self_fair() { testAddAll_self(true); }
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self(boolean fair) {
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll throws ISE if no active taker
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE()      { testAddAll_ISE(false); }
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE_fair() { testAddAll_ISE(true); }
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE(boolean fair) {
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1];
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < ints.length; i++)
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> coll = Arrays.asList(ints);
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(coll);
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly if no active taker
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut()      { testBlockingPut(false); }
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut_fair() { testBlockingPut(true); }
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut(boolean fair) {
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly waiting for take
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake()      { testPutWithTake(false); }
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake_fair() { testPutWithTake(true); }
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake(boolean fair) {
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertSame(one, q.take()); }
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer times out if elements not taken
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer()      { testTimedOffer(false); }
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer_fair() { testTimedOffer(true); }
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer(boolean fair) {
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll return null if no active putter
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll()      { testPoll(false); }
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll_fair() { testPoll(true); }
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll(boolean fair) {
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout times out if no active putter
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0()      { testTimedPoll0(false); }
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0_fair() { testTimedPoll0(true); }
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0(boolean fair) {
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertNull(q.poll(0, MILLISECONDS)); }
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout times out if no active putter
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll()      { testTimedPoll(false); }
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll_fair() { testTimedPoll(true); }
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll(boolean fair) {
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertNull(q.poll(timeoutMillis(), MILLISECONDS)); }
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll before a delayed offer times out, returning null;
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * after offer succeeds; on interruption throws
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer()      { testTimedPollWithOffer(false); }
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer_fair() { testTimedPollWithOffer(true); }
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer(boolean fair) {
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseOffer = new CountDownLatch(1);
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll(timeoutMillis(), MILLISECONDS));
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseOffer.countDown();
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                startTime = System.nanoTime();
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
281b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseOffer);
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertTrue(q.offer(zero, LONG_DELAY_MS, MILLISECONDS)); }
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
289b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek() returns null if no active putter
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek()      { testPeek(false); }
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek_fair() { testPeek(true); }
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek(boolean fair) {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element() throws NoSuchElementException if no active putter
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement()      { testElement(false); }
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement_fair() { testElement(true); }
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement(boolean fair) {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove() throws NoSuchElementException if no active putter
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove()      { testRemove(false); }
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove_fair() { testRemove(true); }
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove(boolean fair) {
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains returns false
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains()      { testContains(false); }
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains_fair() { testContains(true); }
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains(boolean fair) {
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.contains(zero));
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear ensures isEmpty
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear()      { testClear(false); }
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear_fair() { testClear(true); }
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear(boolean fair) {
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll returns false unless empty
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll()      { testContainsAll(false); }
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll_fair() { testContainsAll(true); }
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll(boolean fair) {
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.containsAll(Arrays.asList(empty)));
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.containsAll(Arrays.asList(ints)));
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll returns false
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll()      { testRetainAll(false); }
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll_fair() { testRetainAll(true); }
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll(boolean fair) {
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.retainAll(Arrays.asList(empty)));
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.retainAll(Arrays.asList(ints)));
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll returns false
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll()      { testRemoveAll(false); }
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll_fair() { testRemoveAll(true); }
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll(boolean fair) {
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.removeAll(Arrays.asList(empty)));
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.containsAll(Arrays.asList(ints)));
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray is empty
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray()      { testToArray(false); }
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_fair() { testToArray(true); }
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray(boolean fair) {
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, o.length);
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(Integer array) returns its argument with the first
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element (if present) nulled out
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2()      { testToArray2(false); }
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2_fair() { testToArray2(true); }
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2(boolean fair) {
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue<Integer> q
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            = new SynchronousQueue<Integer>(fair);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] a;
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a = new Integer[0];
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, q.toArray(a));
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a = new Integer[3];
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.fill(a, 42);
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, q.toArray(a));
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a[0]);
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < a.length; i++)
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(42, (int) a[i]);
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(null) throws NPE
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null()      { testToArray_null(false); }
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null_fair() { testToArray_null(true); }
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null(boolean fair) {
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Object[] o = q.toArray(null);
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator does not traverse any elements
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator()      { testIterator(false); }
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator_fair() { testIterator(true); }
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator(boolean fair) {
4458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(new SynchronousQueue(fair).iterator());
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator remove throws ISE
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove()      { testIteratorRemove(false); }
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove_fair() { testIteratorRemove(true); }
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove(boolean fair) {
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.remove();
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString returns a non-null string
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString()      { testToString(false); }
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString_fair() { testToString(true); }
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString(boolean fair) {
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotNull(s);
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer transfers elements across Executor tasks
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor()      { testOfferInExecutor(false); }
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor_fair() { testOfferInExecutor(true); }
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor(boolean fair) {
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
481b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
482b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
483b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
484b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
485b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
486b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertFalse(q.offer(one));
487b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
488b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS));
489b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertEquals(0, q.remainingCapacity());
490b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
491b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
492b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
493b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
494b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
495b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertSame(one, q.take());
496b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
497b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll retrieves elements across Executor threads
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor()      { testPollInExecutor(false); }
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor_fair() { testPollInExecutor(true); }
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor(boolean fair) {
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
508b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
509b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
510b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
511b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
512b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertNull(q.poll());
513b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
514b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
515b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertTrue(q.isEmpty());
516b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
517b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
518b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
519b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
520b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
521b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    q.put(one);
522b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
523b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a deserialized serialized queue is usable
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() {
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue x = new SynchronousQueue();
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue y = new SynchronousQueue(false);
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue z = new SynchronousQueue(true);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSerialEquals(x, y);
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotSerialEquals(x, z);
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue[] qs = { x, y, z };
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (SynchronousQueue q : qs) {
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            SynchronousQueue clone = serialClone(q);
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNotSame(q, clone);
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSerialEquals(q, clone);
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(clone.isEmpty());
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, clone.size());
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, clone.remainingCapacity());
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(clone.offer(zero));
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) of empty queue doesn't transfer elements
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo()      { testDrainTo(false); }
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo_fair() { testDrainTo(true); }
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo(boolean fair) {
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, l.size());
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties queue, unblocking a waiting put.
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut()      { testDrainToWithActivePut(false); }
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut_fair() { testDrainToWithActivePut(true); }
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut(boolean fair) {
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (l.isEmpty()) {
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l);
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (millisElapsedSince(startTime) > LONG_DELAY_MS)
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fail("timed out");
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.yield();
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() == 1);
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(one, l.get(0));
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties up to n elements of queue into c
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() throws InterruptedException {
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue();
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(two);
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
601b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int drained;
602b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        while ((drained = q.drainTo(l, 1)) == 0) Thread.yield();
603b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(1, drained);
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, l.size());
605b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        while ((drained = q.drainTo(l, 1)) == 0) Thread.yield();
606b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(1, drained);
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.contains(one));
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.contains(two));
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
6158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remove(null), contains(null) always return false
6168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
6178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testNeverContainsNull() {
6188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Collection<?> q = new SynchronousQueue();
6198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertFalse(q.contains(null));
6208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertFalse(q.remove(null));
6218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
6228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
624