1 /* 2 * Copyright (C) 2013 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.Deque; 22 import java.util.Iterator; 23 import junit.framework.TestCase; 24 import org.checkerframework.checker.nullness.qual.Nullable; 25 26 /** 27 * Tests for {@link Synchronized#deque} and {@link Queues#synchronizedDeque}. 28 * 29 * @author Kurt Alfred Kluever 30 */ 31 public class SynchronizedDequeTest extends TestCase { 32 create()33 protected Deque<String> create() { 34 TestDeque<String> inner = new TestDeque<>(); 35 Deque<String> outer = Synchronized.deque(inner, inner.mutex); 36 outer.add("foo"); // necessary because we try to remove elements later on 37 return outer; 38 } 39 40 private static final class TestDeque<E> implements Deque<E> { 41 private final Deque<E> delegate = Lists.newLinkedList(); 42 public final Object mutex = new Integer(1); // something Serializable 43 44 @Override offer(E o)45 public boolean offer(E o) { 46 assertTrue(Thread.holdsLock(mutex)); 47 return delegate.offer(o); 48 } 49 50 @Override poll()51 public @Nullable E poll() { 52 assertTrue(Thread.holdsLock(mutex)); 53 return delegate.poll(); 54 } 55 56 @Override remove()57 public E remove() { 58 assertTrue(Thread.holdsLock(mutex)); 59 return delegate.remove(); 60 } 61 62 @Override remove(Object object)63 public boolean remove(Object object) { 64 assertTrue(Thread.holdsLock(mutex)); 65 return delegate.remove(object); 66 } 67 68 @Override peek()69 public @Nullable E peek() { 70 assertTrue(Thread.holdsLock(mutex)); 71 return delegate.peek(); 72 } 73 74 @Override element()75 public E element() { 76 assertTrue(Thread.holdsLock(mutex)); 77 return delegate.element(); 78 } 79 80 @Override iterator()81 public Iterator<E> iterator() { 82 // We explicitly don't lock for iterator() 83 assertFalse(Thread.holdsLock(mutex)); 84 return delegate.iterator(); 85 } 86 87 @Override size()88 public int size() { 89 assertTrue(Thread.holdsLock(mutex)); 90 return delegate.size(); 91 } 92 93 @Override removeAll(Collection<?> collection)94 public boolean removeAll(Collection<?> collection) { 95 assertTrue(Thread.holdsLock(mutex)); 96 return delegate.removeAll(collection); 97 } 98 99 @Override isEmpty()100 public boolean isEmpty() { 101 assertTrue(Thread.holdsLock(mutex)); 102 return delegate.isEmpty(); 103 } 104 105 @Override contains(Object object)106 public boolean contains(Object object) { 107 assertTrue(Thread.holdsLock(mutex)); 108 return delegate.contains(object); 109 } 110 111 @Override add(E element)112 public boolean add(E element) { 113 assertTrue(Thread.holdsLock(mutex)); 114 return delegate.add(element); 115 } 116 117 @Override containsAll(Collection<?> collection)118 public boolean containsAll(Collection<?> collection) { 119 assertTrue(Thread.holdsLock(mutex)); 120 return delegate.containsAll(collection); 121 } 122 123 @Override addAll(Collection<? extends E> collection)124 public boolean addAll(Collection<? extends E> collection) { 125 assertTrue(Thread.holdsLock(mutex)); 126 return delegate.addAll(collection); 127 } 128 129 @Override retainAll(Collection<?> collection)130 public boolean retainAll(Collection<?> collection) { 131 assertTrue(Thread.holdsLock(mutex)); 132 return delegate.retainAll(collection); 133 } 134 135 @Override clear()136 public void clear() { 137 assertTrue(Thread.holdsLock(mutex)); 138 delegate.clear(); 139 } 140 141 @Override toArray()142 public Object[] toArray() { 143 assertTrue(Thread.holdsLock(mutex)); 144 return delegate.toArray(); 145 } 146 147 @Override toArray(T[] array)148 public <T> T[] toArray(T[] array) { 149 assertTrue(Thread.holdsLock(mutex)); 150 return delegate.toArray(array); 151 } 152 153 @Override addFirst(E e)154 public void addFirst(E e) { 155 assertTrue(Thread.holdsLock(mutex)); 156 delegate.addFirst(e); 157 } 158 159 @Override addLast(E e)160 public void addLast(E e) { 161 assertTrue(Thread.holdsLock(mutex)); 162 delegate.addLast(e); 163 } 164 165 @Override offerFirst(E e)166 public boolean offerFirst(E e) { 167 assertTrue(Thread.holdsLock(mutex)); 168 return delegate.offerFirst(e); 169 } 170 171 @Override offerLast(E e)172 public boolean offerLast(E e) { 173 assertTrue(Thread.holdsLock(mutex)); 174 return delegate.offerLast(e); 175 } 176 177 @Override removeFirst()178 public E removeFirst() { 179 assertTrue(Thread.holdsLock(mutex)); 180 return delegate.removeFirst(); 181 } 182 183 @Override removeLast()184 public E removeLast() { 185 assertTrue(Thread.holdsLock(mutex)); 186 return delegate.removeLast(); 187 } 188 189 @Override pollFirst()190 public @Nullable E pollFirst() { 191 assertTrue(Thread.holdsLock(mutex)); 192 return delegate.pollFirst(); 193 } 194 195 @Override pollLast()196 public @Nullable E pollLast() { 197 assertTrue(Thread.holdsLock(mutex)); 198 return delegate.pollLast(); 199 } 200 201 @Override getFirst()202 public E getFirst() { 203 assertTrue(Thread.holdsLock(mutex)); 204 return delegate.getFirst(); 205 } 206 207 @Override getLast()208 public E getLast() { 209 assertTrue(Thread.holdsLock(mutex)); 210 return delegate.getLast(); 211 } 212 213 @Override peekFirst()214 public @Nullable E peekFirst() { 215 assertTrue(Thread.holdsLock(mutex)); 216 return delegate.peekFirst(); 217 } 218 219 @Override peekLast()220 public @Nullable E peekLast() { 221 assertTrue(Thread.holdsLock(mutex)); 222 return delegate.peekLast(); 223 } 224 225 @Override removeFirstOccurrence(Object o)226 public boolean removeFirstOccurrence(Object o) { 227 assertTrue(Thread.holdsLock(mutex)); 228 return delegate.removeFirstOccurrence(o); 229 } 230 231 @Override removeLastOccurrence(Object o)232 public boolean removeLastOccurrence(Object o) { 233 assertTrue(Thread.holdsLock(mutex)); 234 return delegate.removeLastOccurrence(o); 235 } 236 237 @Override push(E e)238 public void push(E e) { 239 assertTrue(Thread.holdsLock(mutex)); 240 delegate.push(e); 241 } 242 243 @Override pop()244 public E pop() { 245 assertTrue(Thread.holdsLock(mutex)); 246 return delegate.pop(); 247 } 248 249 @Override descendingIterator()250 public Iterator<E> descendingIterator() { 251 assertTrue(Thread.holdsLock(mutex)); 252 return delegate.descendingIterator(); 253 } 254 255 private static final long serialVersionUID = 0; 256 } 257 258 @SuppressWarnings("CheckReturnValue") testHoldsLockOnAllOperations()259 public void testHoldsLockOnAllOperations() { 260 create().element(); 261 create().offer("foo"); 262 create().peek(); 263 create().poll(); 264 create().remove(); 265 create().add("foo"); 266 create().addAll(ImmutableList.of("foo")); 267 create().clear(); 268 create().contains("foo"); 269 create().containsAll(ImmutableList.of("foo")); 270 create().equals(new ArrayDeque<>(ImmutableList.of("foo"))); 271 create().hashCode(); 272 create().isEmpty(); 273 create().iterator(); 274 create().remove("foo"); 275 create().removeAll(ImmutableList.of("foo")); 276 create().retainAll(ImmutableList.of("foo")); 277 create().size(); 278 create().toArray(); 279 create().toArray(new String[] {"foo"}); 280 create().addFirst("e"); 281 create().addLast("e"); 282 create().offerFirst("e"); 283 create().offerLast("e"); 284 create().removeFirst(); 285 create().removeLast(); 286 create().pollFirst(); 287 create().pollLast(); 288 create().getFirst(); 289 create().getLast(); 290 create().peekFirst(); 291 create().peekLast(); 292 create().removeFirstOccurrence("e"); 293 create().removeLastOccurrence("e"); 294 create().push("e"); 295 create().pop(); 296 create().descendingIterator(); 297 } 298 } 299