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