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
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport junit.framework.*;
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Arrays;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue;
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;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS;
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class SynchronousQueueTest extends JSR166TestCase {
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Any SynchronousQueue is both empty and full
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull()      { testEmptyFull(false); }
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull_fair() { testEmptyFull(true); }
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmptyFull(boolean fair) {
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(zero));
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer fails if no active taker
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer()      { testOffer(false); }
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer_fair() { testOffer(true); }
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer(boolean fair) {
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.offer(one));
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add throws IllegalStateException if no active taker
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd()      { testAdd(false); }
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd_fair() { testAdd(true); }
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd(boolean fair) {
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(one);
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IllegalArgumentException
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self()      { testAddAll_self(false); }
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self_fair() { testAddAll_self(true); }
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_self(boolean fair) {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll throws ISE if no active taker
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE()      { testAddAll_ISE(false); }
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE_fair() { testAddAll_ISE(true); }
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll_ISE(boolean fair) {
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue q = new SynchronousQueue(fair);
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1];
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < ints.length; i++)
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> coll = Arrays.asList(ints);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(coll);
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly if no active taker
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut()      { testBlockingPut(false); }
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut_fair() { testBlockingPut(true); }
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingPut(boolean fair) {
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put blocks interruptibly waiting for take
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake()      { testPutWithTake(false); }
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake_fair() { testPutWithTake(true); }
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake(boolean fair) {
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseTake = new CountDownLatch(1);
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseTake.countDown();
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(99);
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseTake);
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertSame(one, q.take()); }
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.remainingCapacity());
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer times out if elements not taken
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer()      { testTimedOffer(false); }
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer_fair() { testTimedOffer(true); }
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer(boolean fair) {
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(new Object(), timeoutMillis(), MILLISECONDS));
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.offer(new Object(), 2 * LONG_DELAY_MS, MILLISECONDS);
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll return null if no active putter
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll()      { testPoll(false); }
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll_fair() { testPoll(true); }
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll(boolean fair) {
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout times out if no active putter
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0()      { testTimedPoll0(false); }
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0_fair() { testTimedPoll0(true); }
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0(boolean fair) {
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertNull(q.poll(0, MILLISECONDS)); }
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout times out if no active putter
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll()      { testTimedPoll(false); }
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll_fair() { testTimedPoll(true); }
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll(boolean fair) {
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertNull(q.poll(timeoutMillis(), MILLISECONDS)); }
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll before a delayed offer times out, returning null;
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * after offer succeeds; on interruption throws
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer()      { testTimedPollWithOffer(false); }
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer_fair() { testTimedPollWithOffer(true); }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollWithOffer(boolean fair) {
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseOffer = new CountDownLatch(1);
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll(timeoutMillis(), MILLISECONDS));
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseOffer.countDown();
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                startTime = System.nanoTime();
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(zero, q.poll(LONG_DELAY_MS, MILLISECONDS));
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseOffer);
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try { assertTrue(q.offer(zero, LONG_DELAY_MS, MILLISECONDS)); }
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        catch (InterruptedException e) { threadUnexpectedException(e); }
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek() returns null if no active putter
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek()      { testPeek(false); }
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek_fair() { testPeek(true); }
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek(boolean fair) {
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element() throws NoSuchElementException if no active putter
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement()      { testElement(false); }
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement_fair() { testElement(true); }
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement(boolean fair) {
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove() throws NoSuchElementException if no active putter
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove()      { testRemove(false); }
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove_fair() { testRemove(true); }
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove(boolean fair) {
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains returns false
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains()      { testContains(false); }
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains_fair() { testContains(true); }
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains(boolean fair) {
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.contains(zero));
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear ensures isEmpty
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear()      { testClear(false); }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear_fair() { testClear(true); }
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear(boolean fair) {
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll returns false unless empty
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll()      { testContainsAll(false); }
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll_fair() { testContainsAll(true); }
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll(boolean fair) {
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.containsAll(Arrays.asList(empty)));
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.containsAll(Arrays.asList(ints)));
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll returns false
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll()      { testRetainAll(false); }
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll_fair() { testRetainAll(true); }
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll(boolean fair) {
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.retainAll(Arrays.asList(empty)));
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.retainAll(Arrays.asList(ints)));
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll returns false
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll()      { testRemoveAll(false); }
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll_fair() { testRemoveAll(true); }
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll(boolean fair) {
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.removeAll(Arrays.asList(empty)));
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[1]; ints[0] = zero;
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.containsAll(Arrays.asList(ints)));
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray is empty
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray()      { testToArray(false); }
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_fair() { testToArray(true); }
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray(boolean fair) {
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, o.length);
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(Integer array) returns its argument with the first
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element (if present) nulled out
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2()      { testToArray2(false); }
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2_fair() { testToArray2(true); }
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2(boolean fair) {
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue<Integer> q
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            = new SynchronousQueue<Integer>(fair);
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] a;
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a = new Integer[0];
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, q.toArray(a));
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a = new Integer[3];
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.fill(a, 42);
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, q.toArray(a));
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a[0]);
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < a.length; i++)
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(42, (int) a[i]);
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(null) throws NPE
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null()      { testToArray_null(false); }
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null_fair() { testToArray_null(true); }
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray_null(boolean fair) {
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Object o[] = q.toArray(null);
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator does not traverse any elements
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator()      { testIterator(false); }
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator_fair() { testIterator(true); }
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator(boolean fair) {
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Object x = it.next();
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator remove throws ISE
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove()      { testIteratorRemove(false); }
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove_fair() { testIteratorRemove(true); }
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove(boolean fair) {
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            it.remove();
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString returns a non-null string
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString()      { testToString(false); }
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString_fair() { testToString(true); }
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString(boolean fair) {
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotNull(s);
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer transfers elements across Executor tasks
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor()      { testOfferInExecutor(false); }
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor_fair() { testOfferInExecutor(true); }
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferInExecutor(boolean fair) {
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService executor = Executors.newFixedThreadPool(2);
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(q.offer(one));
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(one, LONG_DELAY_MS, MILLISECONDS));
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, q.remainingCapacity());
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(one, q.take());
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(executor);
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll retrieves elements across Executor threads
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor()      { testPollInExecutor(false); }
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor_fair() { testPollInExecutor(true); }
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor(boolean fair) {
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ExecutorService executor = Executors.newFixedThreadPool(2);
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.poll());
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.isEmpty());
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        executor.execute(new CheckedRunnable() {
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                threadsStarted.await();
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        joinPool(executor);
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a deserialized serialized queue is usable
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() {
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue x = new SynchronousQueue();
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue y = new SynchronousQueue(false);
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue z = new SynchronousQueue(true);
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSerialEquals(x, y);
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotSerialEquals(x, z);
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SynchronousQueue[] qs = { x, y, z };
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (SynchronousQueue q : qs) {
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            SynchronousQueue clone = serialClone(q);
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNotSame(q, clone);
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSerialEquals(q, clone);
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(clone.isEmpty());
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, clone.size());
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, clone.remainingCapacity());
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(clone.offer(zero));
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) of empty queue doesn't transfer elements
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo()      { testDrainTo(false); }
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo_fair() { testDrainTo(true); }
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo(boolean fair) {
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, l.size());
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties queue, unblocking a waiting put.
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut()      { testDrainToWithActivePut(false); }
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut_fair() { testDrainToWithActivePut(true); }
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut(boolean fair) {
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue(fair);
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (l.isEmpty()) {
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l);
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (millisElapsedSince(startTime) > LONG_DELAY_MS)
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fail("timed out");
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.yield();
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() == 1);
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(one, l.get(0));
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties up to n elements of queue into c
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() throws InterruptedException {
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue q = new SynchronousQueue();
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(one);
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(two);
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        delay(SHORT_DELAY_MS);
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l, 1);
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, l.size());
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l, 1);
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.contains(one));
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.contains(two));
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
590