17dd252788645e940eada959bdde927426e2531c9Paul Duffin/* 27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2007 The Guava Authors 37dd252788645e940eada959bdde927426e2531c9Paul Duffin * 47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License. 67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at 77dd252788645e940eada959bdde927426e2531c9Paul Duffin * 87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 97dd252788645e940eada959bdde927426e2531c9Paul Duffin * 107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software 117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and 147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License. 157dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 167dd252788645e940eada959bdde927426e2531c9Paul Duffin 177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect; 187dd252788645e940eada959bdde927426e2531c9Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Collection; 227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Iterator; 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Queue; 247dd252788645e940eada959bdde927426e2531c9Paul Duffin 257dd252788645e940eada959bdde927426e2531c9Paul Duffin/** 267dd252788645e940eada959bdde927426e2531c9Paul Duffin * Tests for {@link Synchronized#queue} and {@link Queues#synchronizedQueue}. 277dd252788645e940eada959bdde927426e2531c9Paul Duffin * 287dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Kurt Alfred Kluever 297dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 307dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic class SynchronizedQueueTest extends TestCase { 317dd252788645e940eada959bdde927426e2531c9Paul Duffin 327dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Queue<String> create() { 337dd252788645e940eada959bdde927426e2531c9Paul Duffin TestQueue<String> inner = new TestQueue<String>(); 347dd252788645e940eada959bdde927426e2531c9Paul Duffin Queue<String> outer = Synchronized.queue(inner, inner.mutex); 357dd252788645e940eada959bdde927426e2531c9Paul Duffin outer.add("foo"); // necessary because we try to remove elements later on 367dd252788645e940eada959bdde927426e2531c9Paul Duffin return outer; 377dd252788645e940eada959bdde927426e2531c9Paul Duffin } 387dd252788645e940eada959bdde927426e2531c9Paul Duffin 397dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final class TestQueue<E> implements Queue<E> { 407dd252788645e940eada959bdde927426e2531c9Paul Duffin private final Queue<E> delegate = Lists.newLinkedList(); 417dd252788645e940eada959bdde927426e2531c9Paul Duffin public final Object mutex = new Integer(1); // something Serializable 427dd252788645e940eada959bdde927426e2531c9Paul Duffin 437dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 447dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean offer(E o) { 457dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 467dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.offer(o); 477dd252788645e940eada959bdde927426e2531c9Paul Duffin } 487dd252788645e940eada959bdde927426e2531c9Paul Duffin 497dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 507dd252788645e940eada959bdde927426e2531c9Paul Duffin public E poll() { 517dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 527dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.poll(); 537dd252788645e940eada959bdde927426e2531c9Paul Duffin } 547dd252788645e940eada959bdde927426e2531c9Paul Duffin 557dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 567dd252788645e940eada959bdde927426e2531c9Paul Duffin public E remove() { 577dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 587dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.remove(); 597dd252788645e940eada959bdde927426e2531c9Paul Duffin } 607dd252788645e940eada959bdde927426e2531c9Paul Duffin 617dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 627dd252788645e940eada959bdde927426e2531c9Paul Duffin public E peek() { 637dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 647dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.peek(); 657dd252788645e940eada959bdde927426e2531c9Paul Duffin } 667dd252788645e940eada959bdde927426e2531c9Paul Duffin 677dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 687dd252788645e940eada959bdde927426e2531c9Paul Duffin public E element() { 697dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 707dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.element(); 717dd252788645e940eada959bdde927426e2531c9Paul Duffin } 727dd252788645e940eada959bdde927426e2531c9Paul Duffin 737dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 747dd252788645e940eada959bdde927426e2531c9Paul Duffin public Iterator<E> iterator() { 757dd252788645e940eada959bdde927426e2531c9Paul Duffin // We explicitly don't lock for iterator() 767dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(Thread.holdsLock(mutex)); 777dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.iterator(); 787dd252788645e940eada959bdde927426e2531c9Paul Duffin } 797dd252788645e940eada959bdde927426e2531c9Paul Duffin 807dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 817dd252788645e940eada959bdde927426e2531c9Paul Duffin public int size() { 827dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 837dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.size(); 847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 857dd252788645e940eada959bdde927426e2531c9Paul Duffin 867dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 877dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean removeAll(Collection<?> collection) { 887dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 897dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.removeAll(collection); 907dd252788645e940eada959bdde927426e2531c9Paul Duffin } 917dd252788645e940eada959bdde927426e2531c9Paul Duffin 927dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 937dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean isEmpty() { 947dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 957dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.isEmpty(); 967dd252788645e940eada959bdde927426e2531c9Paul Duffin } 977dd252788645e940eada959bdde927426e2531c9Paul Duffin 987dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 997dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean contains(Object object) { 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1017dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.contains(object); 1027dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin 1047dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1057dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean add(E element) { 1067dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1077dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.add(element); 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean remove(Object object) { 1127dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1137dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.remove(object); 1147dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1157dd252788645e940eada959bdde927426e2531c9Paul Duffin 1167dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1177dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean containsAll(Collection<?> collection) { 1187dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.containsAll(collection); 1207dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1217dd252788645e940eada959bdde927426e2531c9Paul Duffin 1227dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1237dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean addAll(Collection<? extends E> collection) { 1247dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1257dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.addAll(collection); 1267dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1277dd252788645e940eada959bdde927426e2531c9Paul Duffin 1287dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1297dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean retainAll(Collection<?> collection) { 1307dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1317dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.retainAll(collection); 1327dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1337dd252788645e940eada959bdde927426e2531c9Paul Duffin 1347dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1357dd252788645e940eada959bdde927426e2531c9Paul Duffin public void clear() { 1367dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1377dd252788645e940eada959bdde927426e2531c9Paul Duffin delegate.clear(); 1387dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1397dd252788645e940eada959bdde927426e2531c9Paul Duffin 1407dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1417dd252788645e940eada959bdde927426e2531c9Paul Duffin public Object[] toArray() { 1427dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1437dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.toArray(); 1447dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1457dd252788645e940eada959bdde927426e2531c9Paul Duffin 1467dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 1477dd252788645e940eada959bdde927426e2531c9Paul Duffin public <T> T[] toArray(T[] array) { 1487dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(Thread.holdsLock(mutex)); 1497dd252788645e940eada959bdde927426e2531c9Paul Duffin return delegate.toArray(array); 1507dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1517dd252788645e940eada959bdde927426e2531c9Paul Duffin 1527dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final long serialVersionUID = 0; 1537dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1547dd252788645e940eada959bdde927426e2531c9Paul Duffin 1557dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testHoldsLockOnAllOperations() { 1567dd252788645e940eada959bdde927426e2531c9Paul Duffin create().element(); 1577dd252788645e940eada959bdde927426e2531c9Paul Duffin create().offer("foo"); 1587dd252788645e940eada959bdde927426e2531c9Paul Duffin create().peek(); 1597dd252788645e940eada959bdde927426e2531c9Paul Duffin create().poll(); 1607dd252788645e940eada959bdde927426e2531c9Paul Duffin create().remove(); 1617dd252788645e940eada959bdde927426e2531c9Paul Duffin create().add("foo"); 1627dd252788645e940eada959bdde927426e2531c9Paul Duffin create().addAll(ImmutableList.of("foo")); 1637dd252788645e940eada959bdde927426e2531c9Paul Duffin create().clear(); 1647dd252788645e940eada959bdde927426e2531c9Paul Duffin create().contains("foo"); 1657dd252788645e940eada959bdde927426e2531c9Paul Duffin create().containsAll(ImmutableList.of("foo")); 1667dd252788645e940eada959bdde927426e2531c9Paul Duffin create().equals(ImmutableList.of("foo")); 1677dd252788645e940eada959bdde927426e2531c9Paul Duffin create().hashCode(); 1687dd252788645e940eada959bdde927426e2531c9Paul Duffin create().isEmpty(); 1697dd252788645e940eada959bdde927426e2531c9Paul Duffin create().iterator(); 1707dd252788645e940eada959bdde927426e2531c9Paul Duffin create().remove("foo"); 1717dd252788645e940eada959bdde927426e2531c9Paul Duffin create().removeAll(ImmutableList.of("foo")); 1727dd252788645e940eada959bdde927426e2531c9Paul Duffin create().retainAll(ImmutableList.of("foo")); 1737dd252788645e940eada959bdde927426e2531c9Paul Duffin create().size(); 1747dd252788645e940eada959bdde927426e2531c9Paul Duffin create().toArray(); 1757dd252788645e940eada959bdde927426e2531c9Paul Duffin create().toArray(new String[] { "foo" }); 1767dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1777dd252788645e940eada959bdde927426e2531c9Paul Duffin} 178