1 /* 2 * Copyright (C) 2007 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect; 18 19 import java.util.ArrayDeque; 20 import java.util.Collection; 21 import java.util.Iterator; 22 import java.util.Queue; 23 import junit.framework.TestCase; 24 import org.checkerframework.checker.nullness.qual.Nullable; 25 26 /** 27 * Tests for {@link Synchronized#queue} and {@link Queues#synchronizedQueue}. 28 * 29 * @author Kurt Alfred Kluever 30 */ 31 public class SynchronizedQueueTest extends TestCase { 32 create()33 protected Queue<String> create() { 34 TestQueue<String> inner = new TestQueue<>(); 35 Queue<String> outer = Synchronized.queue(inner, null); 36 inner.mutex = outer; 37 outer.add("foo"); // necessary because we try to remove elements later on 38 return outer; 39 } 40 41 private static final class TestQueue<E> implements Queue<E> { 42 private final Queue<E> delegate = Lists.newLinkedList(); 43 public Object mutex; 44 45 @Override offer(E o)46 public boolean offer(E o) { 47 assertTrue(Thread.holdsLock(mutex)); 48 return delegate.offer(o); 49 } 50 51 @Override poll()52 public @Nullable E poll() { 53 assertTrue(Thread.holdsLock(mutex)); 54 return delegate.poll(); 55 } 56 57 @Override remove()58 public E remove() { 59 assertTrue(Thread.holdsLock(mutex)); 60 return delegate.remove(); 61 } 62 63 @Override remove(Object object)64 public boolean remove(Object object) { 65 assertTrue(Thread.holdsLock(mutex)); 66 return delegate.remove(object); 67 } 68 69 @Override peek()70 public @Nullable E peek() { 71 assertTrue(Thread.holdsLock(mutex)); 72 return delegate.peek(); 73 } 74 75 @Override element()76 public E element() { 77 assertTrue(Thread.holdsLock(mutex)); 78 return delegate.element(); 79 } 80 81 @Override iterator()82 public Iterator<E> iterator() { 83 // We explicitly don't lock for iterator() 84 assertFalse(Thread.holdsLock(mutex)); 85 return delegate.iterator(); 86 } 87 88 @Override size()89 public int size() { 90 assertTrue(Thread.holdsLock(mutex)); 91 return delegate.size(); 92 } 93 94 @Override removeAll(Collection<?> collection)95 public boolean removeAll(Collection<?> collection) { 96 assertTrue(Thread.holdsLock(mutex)); 97 return delegate.removeAll(collection); 98 } 99 100 @Override isEmpty()101 public boolean isEmpty() { 102 assertTrue(Thread.holdsLock(mutex)); 103 return delegate.isEmpty(); 104 } 105 106 @Override contains(Object object)107 public boolean contains(Object object) { 108 assertTrue(Thread.holdsLock(mutex)); 109 return delegate.contains(object); 110 } 111 112 @Override add(E element)113 public boolean add(E element) { 114 assertTrue(Thread.holdsLock(mutex)); 115 return delegate.add(element); 116 } 117 118 @Override containsAll(Collection<?> collection)119 public boolean containsAll(Collection<?> collection) { 120 assertTrue(Thread.holdsLock(mutex)); 121 return delegate.containsAll(collection); 122 } 123 124 @Override addAll(Collection<? extends E> collection)125 public boolean addAll(Collection<? extends E> collection) { 126 assertTrue(Thread.holdsLock(mutex)); 127 return delegate.addAll(collection); 128 } 129 130 @Override retainAll(Collection<?> collection)131 public boolean retainAll(Collection<?> collection) { 132 assertTrue(Thread.holdsLock(mutex)); 133 return delegate.retainAll(collection); 134 } 135 136 @Override clear()137 public void clear() { 138 assertTrue(Thread.holdsLock(mutex)); 139 delegate.clear(); 140 } 141 142 @Override toArray()143 public Object[] toArray() { 144 assertTrue(Thread.holdsLock(mutex)); 145 return delegate.toArray(); 146 } 147 148 @Override toArray(T[] array)149 public <T> T[] toArray(T[] array) { 150 assertTrue(Thread.holdsLock(mutex)); 151 return delegate.toArray(array); 152 } 153 154 private static final long serialVersionUID = 0; 155 } 156 157 @SuppressWarnings("CheckReturnValue") testHoldsLockOnAllOperations()158 public void testHoldsLockOnAllOperations() { 159 create().element(); 160 create().offer("foo"); 161 create().peek(); 162 create().poll(); 163 create().remove(); 164 create().add("foo"); 165 create().addAll(ImmutableList.of("foo")); 166 create().clear(); 167 create().contains("foo"); 168 create().containsAll(ImmutableList.of("foo")); 169 create().equals(new ArrayDeque<>(ImmutableList.of("foo"))); 170 create().hashCode(); 171 create().isEmpty(); 172 create().iterator(); 173 create().remove("foo"); 174 create().removeAll(ImmutableList.of("foo")); 175 create().retainAll(ImmutableList.of("foo")); 176 create().size(); 177 create().toArray(); 178 create().toArray(new String[] {"foo"}); 179 } 180 } 181