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