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;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport 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.Delayed;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.DelayQueue;
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService;
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeUnit;
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
28b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakpublic class DelayQueueTest extends JSR166TestCase {
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
305d175dd4d7b128492ef7e3da6a77d80b8fd0aa22Tobias Thierer    // Android-changed: Extend BlockingQueueTest directly instead of creating
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // an inner class and its associated suite.
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class Generic extends BlockingQueueTest {
34b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     protected BlockingQueue emptyCollection() {
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new DelayQueue();
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected PDelay makeElement(int i) {
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new PDelay(i);
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
41b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
42b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    // android-note: Removed because the CTS runner does a bad job of
43b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    // retrying tests that have suite() declarations.
448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return newTestSuite(DelayQueueTest.class,
508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Generic().testSuite());
518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
53008167dfe7530e6a80066006633f2301d3eae012Calin Juravle    protected BlockingQueue emptyCollection() {
54008167dfe7530e6a80066006633f2301d3eae012Calin Juravle        return new DelayQueue();
55008167dfe7530e6a80066006633f2301d3eae012Calin Juravle    }
56008167dfe7530e6a80066006633f2301d3eae012Calin Juravle
57008167dfe7530e6a80066006633f2301d3eae012Calin Juravle    protected PDelay makeElement(int i) {
58008167dfe7530e6a80066006633f2301d3eae012Calin Juravle        return new PDelay(i);
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A delayed implementation for testing.
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Most tests use Pseudodelays, where delays are all elapsed
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * (so, no blocking solely for delays) but are still ordered
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class PDelay implements Delayed {
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int pseudodelay;
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay(int i) { pseudodelay = i; }
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int compareTo(PDelay other) {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int a = this.pseudodelay;
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int b = other.pseudodelay;
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return (a < b) ? -1 : (a > b) ? 1 : 0;
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int compareTo(Delayed y) {
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return compareTo((PDelay)y);
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean equals(Object other) {
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return (other instanceof PDelay) &&
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                this.pseudodelay == ((PDelay)other).pseudodelay;
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // suppress [overrides] javac warning
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int hashCode() { return pseudodelay; }
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public long getDelay(TimeUnit ignore) {
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return Integer.MIN_VALUE + pseudodelay;
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public String toString() {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return String.valueOf(pseudodelay);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Delayed implementation that actually delays
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class NanoDelay implements Delayed {
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long trigger;
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NanoDelay(long i) {
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            trigger = System.nanoTime() + i;
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int compareTo(NanoDelay y) {
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long i = trigger;
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long j = y.trigger;
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i < j) return -1;
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i > j) return 1;
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return 0;
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int compareTo(Delayed y) {
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return compareTo((NanoDelay)y);
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean equals(Object other) {
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return equals((NanoDelay)other);
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean equals(NanoDelay other) {
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return other.trigger == trigger;
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // suppress [overrides] javac warning
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int hashCode() { return (int) trigger; }
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public long getDelay(TimeUnit unit) {
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long n = trigger - System.nanoTime();
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return unit.convert(n, TimeUnit.NANOSECONDS);
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public long getTriggerTime() {
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return trigger;
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public String toString() {
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return String.valueOf(trigger);
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Returns a new queue of given size containing consecutive
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * PDelays 0 ... n.
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private DelayQueue<PDelay> populatedQueue(int n) {
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue<PDelay> q = new DelayQueue<PDelay>();
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
142b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = n - 1; i >= 0; i -= 2)
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new PDelay(i)));
1448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = (n & 1); i < n; i += 2)
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new PDelay(i)));
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
1478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(n, q.size());
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return q;
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new queue has unbounded capacity
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
1568e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, new DelayQueue().remainingCapacity());
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from null Collection throws NPE
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1648e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            new DelayQueue(null);
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection of null elements throws NPE
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor4() {
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            new DelayQueue(Arrays.asList(new PDelay[SIZE]));
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection with some null elements throws NPE
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
183b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        PDelay[] a = new PDelay[SIZE];
184b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
185b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            a[i] = new PDelay(i);
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
187b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            new DelayQueue(Arrays.asList(a));
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements of collection used to initialize
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor6() {
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] ints = new PDelay[SIZE];
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new PDelay(i);
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue(Arrays.asList(ints));
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isEmpty is true before add, false after
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmpty() {
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
2108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new PDelay(1));
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new PDelay(2));
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.remove();
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.remove();
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remainingCapacity() always returns Integer.MAX_VALUE
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemainingCapacity() {
2238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        BlockingQueue q = populatedQueue(SIZE);
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
2278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.remove() instanceof PDelay);
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.size());
2328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.add(new PDelay(i)));
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * offer non-null succeeds
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer() {
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(new PDelay(0)));
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(new PDelay(1)));
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add succeeds
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd() {
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.size());
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.add(new PDelay(i)));
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IAE
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllSelf() {
260b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        DelayQueue q = populatedQueue(SIZE);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll of a collection with any null elements throws NPE after
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * possibly adding some elements
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll3() {
272b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        DelayQueue q = new DelayQueue();
273b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        PDelay[] a = new PDelay[SIZE];
274b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
275b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            a[i] = new PDelay(i);
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
277b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            q.addAll(Arrays.asList(a));
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements of successful addAll
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll5() {
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] empty = new PDelay[0];
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] ints = new PDelay[SIZE];
288b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int i = SIZE - 1; i >= 0; --i)
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new PDelay(i);
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.addAll(Arrays.asList(empty)));
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.addAll(Arrays.asList(ints)));
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully put are contained
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPut() {
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            PDelay x = new PDelay(i);
3048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.put(x);
3058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put doesn't block waiting for take
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake() throws InterruptedException {
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = new DelayQueue();
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(4, q.size());
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer does not time out
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer() throws InterruptedException {
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = new DelayQueue();
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new PDelay(0));
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new PDelay(0), SHORT_DELAY_MS, MILLISECONDS));
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new PDelay(0), LONG_DELAY_MS, MILLISECONDS));
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take retrieves elements in priority order
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTake() throws InterruptedException {
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.take());
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Take removes existing elements until empty, then blocks interruptibly
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTake() throws InterruptedException {
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = populatedQueue(SIZE);
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(new PDelay(i), ((PDelay)q.take()));
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll succeeds unless empty
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll() {
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3928e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.poll());
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout succeeds when non-empty, else times out
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0() throws InterruptedException {
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.poll(0, MILLISECONDS));
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(0, MILLISECONDS));
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout succeeds when non-empty, else times out
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll() throws InterruptedException {
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
4158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.poll(LONG_DELAY_MS, MILLISECONDS));
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed poll throws InterruptedException instead of
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPoll() throws InterruptedException {
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
430b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final DelayQueue q = populatedQueue(SIZE);
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
433b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                long startTime = System.nanoTime();
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
435b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertEquals(new PDelay(i),
436b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                                 ((PDelay)q.poll(LONG_DELAY_MS, MILLISECONDS)));
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
452b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
459b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        checkEmpty(q);
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek returns next element, or null if empty
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek() {
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.peek());
4698e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.poll());
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (q.isEmpty())
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(q.peek());
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(new PDelay(i).equals(q.peek()));
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element returns next element, or throws NSEE if empty
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement() {
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4848e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.element());
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.poll();
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove removes next element, or throws NSEE if empty
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() {
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4998e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(new PDelay(i), q.remove());
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains(x) reports true when elements added but not yet removed
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains() {
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(new PDelay(i)));
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.poll();
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(new PDelay(i)));
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear removes all elements
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear() {
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
5278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay x = new PDelay(1);
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(x);
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(x));
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll(c) is true when c contains a subset of elements
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll() {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue p = new DelayQueue();
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.containsAll(q));
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.add(new PDelay(i));
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.containsAll(q));
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll(c) retains only those elements of c and reports true if changed
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll() {
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue p = populatedQueue(SIZE);
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            boolean changed = q.retainAll(p);
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i == 0)
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(changed);
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(changed);
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
564b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.remove();
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll(c) removes only those elements of c and reports true if changed
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll() {
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < SIZE; ++i) {
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            DelayQueue q = populatedQueue(SIZE);
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            DelayQueue p = populatedQueue(i);
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeAll(p));
577b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < i; ++j) {
5798e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                PDelay x = (PDelay)(p.remove());
5808e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                assertFalse(q.contains(x));
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray contains all elements
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray() throws InterruptedException {
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.sort(o);
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < o.length; i++)
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(o[i], q.take());
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(a) contains all elements
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2() {
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue<PDelay> q = populatedQueue(SIZE);
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] ints = new PDelay[SIZE];
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] array = q.toArray(ints);
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(ints, array);
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.sort(ints);
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < ints.length; i++)
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(ints[i], q.remove());
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(incompatible array type) throws ArrayStoreException
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray1_BadArg() {
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.toArray(new String[10]);
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ArrayStoreException success) {}
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator iterates through all elements
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator() {
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int i = 0;
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (it.hasNext()) {
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(it.next()));
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ++i;
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(i, SIZE);
6328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
6338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
6348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
6358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
6368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * iterator of empty collection has no elements
6378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
6388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testEmptyIterator() {
6398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(new DelayQueue().iterator());
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator.remove removes current element
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove() {
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = new DelayQueue();
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new PDelay(2));
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new PDelay(1));
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new PDelay(3));
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.next();
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.remove();
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it = q.iterator();
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(new PDelay(2), it.next());
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(new PDelay(3), it.next());
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString contains toStrings of elements
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = populatedQueue(SIZE);
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Object e : q)
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(s.contains(e.toString()));
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll transfers elements across Executor tasks
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor() {
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = new DelayQueue();
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
675b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
676b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
677b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
678b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
679b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertNull(q.poll());
680b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
681b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertNotNull(q.poll(LONG_DELAY_MS, MILLISECONDS));
682b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    checkEmpty(q);
683b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
684ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak
685b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
686b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                public void realRun() throws InterruptedException {
687b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    threadsStarted.await();
688b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    q.put(new PDelay(1));
689b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }});
690b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Delayed actions do not occur until their delay elapses
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDelay() throws InterruptedException {
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue<NanoDelay> q = new DelayQueue<NanoDelay>();
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(new NanoDelay(1000000L * (SIZE - i)));
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long last = 0;
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            NanoDelay e = q.take();
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long tt = e.getTriggerTime();
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(System.nanoTime() - tt >= 0);
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i != 0)
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(tt >= last);
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            last = tt;
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek of a non-empty queue returns non-null even if not expired
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekDelayed() {
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new NanoDelay(Long.MAX_VALUE));
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotNull(q.peek());
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll of a non-empty queue returns null if no expired elements.
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollDelayed() {
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new NanoDelay(Long.MAX_VALUE));
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll of a non-empty queue returns null if no expired elements.
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPollDelayed() throws InterruptedException {
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new NanoDelay(LONG_DELAY_MS * 1000000L));
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) empties queue into another collection c
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo() {
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        DelayQueue q = new DelayQueue();
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PDelay[] elems = new PDelay[SIZE];
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            elems[i] = new PDelay(i);
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.add(elems[i]);
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(elems[i], l.get(i));
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(elems[0]);
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(elems[1]);
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(elems[0]));
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(elems[1]));
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.clear();
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; ++i)
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(elems[i], l.get(i));
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties queue
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut() throws InterruptedException {
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final DelayQueue q = populatedQueue(SIZE);
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
775b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                q.put(new PDelay(SIZE + 1));
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() >= SIZE);
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join();
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.size() + l.size() >= SIZE);
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties first min(n, size) elements of queue into c
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() {
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE + 2; ++i) {
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            DelayQueue q = populatedQueue(SIZE);
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayList l = new ArrayList();
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l, i);
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int k = (i < SIZE) ? i : SIZE;
795b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(SIZE - k, q.size());
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(k, l.size());
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8008e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
8018e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remove(null), contains(null) always return false
8028e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
8038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testNeverContainsNull() {
8048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Collection<?> q = populatedQueue(SIZE);
8058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertFalse(q.contains(null));
8068e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertFalse(q.remove(null));
8078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
809