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