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