• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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