11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code Synchronized#multimap}.
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class SynchronizedMultimapTest extends AbstractSetMultimapTest {
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Multimap<String, Integer> create() {
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestMultimap<String, Integer> inner = new TestMultimap<String, Integer>();
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> outer = Synchronized.multimap(inner, inner.mutex);
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return outer;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final class TestMultimap<K, V> extends ForwardingMultimap<K, V>
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements Serializable {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Multimap<K, V> delegate = HashMultimap.create();
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public final Object mutex = new Integer(1); // something Serializable
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Multimap<K, V> delegate() {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return delegate;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public String toString() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.toString();
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object o) {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.equals(o);
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.hashCode();
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int size() {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.size();
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean isEmpty() {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.isEmpty();
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean containsKey(@Nullable Object key) {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.containsKey(key);
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean containsValue(@Nullable Object value) {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.containsValue(value);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean containsEntry(@Nullable Object key,
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Nullable Object value) {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.containsEntry(key, value);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Collection<V> get(@Nullable K key) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Collection is also synchronized? */
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.get(key);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean put(K key, V value) {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.put(key, value);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean putAll(@Nullable K key,
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterable<? extends V> values) {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.putAll(key, values);
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean putAll(Multimap<? extends K, ? extends V> map) {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.putAll(map);
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Collection<V> replaceValues(@Nullable K key,
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterable<? extends V> values) {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.replaceValues(key, values);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean remove(@Nullable Object key,
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Nullable Object value) {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.remove(key, value);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Collection<V> removeAll(@Nullable Object key) {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.removeAll(key);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public void clear() {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super.clear();
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Set<K> keySet() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Set is also synchronized? */
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.keySet();
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Multiset<K> keys() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Set is also synchronized? */
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.keys();
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Collection<V> values() {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Collection is also synchronized? */
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.values();
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Collection<Map.Entry<K, V>> entries() {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Collection is also synchronized? */
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.entries();
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Map<K, Collection<V>> asMap() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(Thread.holdsLock(mutex));
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /* TODO: verify that the Map is also synchronized? */
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return super.asMap();
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSynchronizedListMultimap() {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> multimap
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Multimaps.synchronizedListMultimap(
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ArrayListMultimap.<String, Integer>create());
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", Arrays.asList(3, -1, 2, 4, 1));
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("bar", Arrays.asList(1, 2, 3, 1));
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.removeAll("foo")).hasContentsInOrder(3, -1, 2, 4, 1);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.replaceValues("bar", Arrays.asList(6, 5)))
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(1, 2, 3, 1);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("bar")).hasContentsInOrder(6, 5);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSynchronizedSortedSetMultimap() {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSetMultimap<String, Integer> multimap
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Multimaps.synchronizedSortedSetMultimap(
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            TreeMultimap.<String, Integer>create());
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", Arrays.asList(3, -1, 2, 4, 1));
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("bar", Arrays.asList(1, 2, 3, 1));
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.removeAll("foo")).hasContentsInOrder(-1, 1, 2, 3, 4);
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.replaceValues("bar", Arrays.asList(6, 5)))
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(1, 2, 3);
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("bar")).hasContentsInOrder(5, 6);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSynchronizedArrayListMultimapRandomAccess() {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> delegate = ArrayListMultimap.create();
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate.put("foo", 1);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate.put("foo", 3);
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> multimap
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Multimaps.synchronizedListMultimap(delegate);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("foo") instanceof RandomAccess);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("bar") instanceof RandomAccess);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSynchronizedLinkedListMultimapRandomAccess() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> delegate = LinkedListMultimap.create();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate.put("foo", 1);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate.put("foo", 3);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> multimap
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Multimaps.synchronizedListMultimap(delegate);
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("foo") instanceof RandomAccess);
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("bar") instanceof RandomAccess);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
216