diff options
Diffstat (limited to 'android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetBasherTest.java')
-rw-r--r-- | android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetBasherTest.java | 176 |
1 files changed, 0 insertions, 176 deletions
diff --git a/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetBasherTest.java b/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetBasherTest.java deleted file mode 100644 index ddc2bf1c7..000000000 --- a/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetBasherTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2011 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.common.collect; - -import com.google.common.base.Function; -import com.google.common.primitives.Ints; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; -import junit.framework.TestCase; - -/** - * Basher test for {@link ConcurrentHashMultiset}: start a bunch of threads, have each of them do - * operations at random. Each thread keeps track of the per-key deltas that it's directly - * responsible for; after all threads have completed, we sum the per-key deltas and compare to the - * existing multiset values. - * - * @author mike nonemacher - */ - -public class ConcurrentHashMultisetBasherTest extends TestCase { - - public void testAddAndRemove_ConcurrentHashMap() throws Exception { - testAddAndRemove(new ConcurrentHashMap<String, AtomicInteger>()); - } - - public void testAddAndRemove_ConcurrentSkipListMap() throws Exception { - testAddAndRemove(new ConcurrentSkipListMap<String, AtomicInteger>()); - } - - public void testAddAndRemove_MapMakerMap() throws Exception { - MapMaker mapMaker = new MapMaker(); - // force MapMaker to use its own MapMakerInternalMap - mapMaker.useCustomMap = true; - testAddAndRemove(mapMaker.<String, AtomicInteger>makeMap()); - } - - private void testAddAndRemove(ConcurrentMap<String, AtomicInteger> map) - throws ExecutionException, InterruptedException { - - final ConcurrentHashMultiset<String> multiset = new ConcurrentHashMultiset<>(map); - int nThreads = 20; - int tasksPerThread = 10; - int nTasks = nThreads * tasksPerThread; - ExecutorService pool = Executors.newFixedThreadPool(nThreads); - ImmutableList<String> keys = ImmutableList.of("a", "b", "c"); - try { - List<Future<int[]>> futures = Lists.newArrayListWithExpectedSize(nTasks); - for (int i = 0; i < nTasks; i++) { - futures.add(pool.submit(new MutateTask(multiset, keys))); - } - - int[] deltas = new int[3]; - for (Future<int[]> future : futures) { - int[] taskDeltas = future.get(); - for (int i = 0; i < deltas.length; i++) { - deltas[i] += taskDeltas[i]; - } - } - - List<Integer> actualCounts = - Lists.transform( - keys, - new Function<String, Integer>() { - @Override - public Integer apply(String key) { - return multiset.count(key); - } - }); - assertEquals("Counts not as expected", Ints.asList(deltas), actualCounts); - } finally { - pool.shutdownNow(); - } - - // Since we have access to the backing map, verify that there are no zeroes in the map - for (AtomicInteger value : map.values()) { - assertTrue("map should not contain a zero", value.get() != 0); - } - } - - private static class MutateTask implements Callable<int[]> { - private final ConcurrentHashMultiset<String> multiset; - private final ImmutableList<String> keys; - private final Random random = new Random(); - - private MutateTask(ConcurrentHashMultiset<String> multiset, ImmutableList<String> keys) { - this.multiset = multiset; - this.keys = keys; - } - - @Override - public int[] call() throws Exception { - int iterations = 100000; - int nKeys = keys.size(); - int[] deltas = new int[nKeys]; - Operation[] operations = Operation.values(); - for (int i = 0; i < iterations; i++) { - int keyIndex = random.nextInt(nKeys); - String key = keys.get(keyIndex); - Operation op = operations[random.nextInt(operations.length)]; - switch (op) { - case ADD: - { - int delta = random.nextInt(10); - multiset.add(key, delta); - deltas[keyIndex] += delta; - break; - } - case SET_COUNT: - { - int newValue = random.nextInt(3); - int oldValue = multiset.setCount(key, newValue); - deltas[keyIndex] += (newValue - oldValue); - break; - } - case SET_COUNT_IF: - { - int newValue = random.nextInt(3); - int oldValue = multiset.count(key); - if (multiset.setCount(key, oldValue, newValue)) { - deltas[keyIndex] += (newValue - oldValue); - } - break; - } - case REMOVE: - { - int delta = random.nextInt(6); // [0, 5] - int oldValue = multiset.remove(key, delta); - deltas[keyIndex] -= Math.min(delta, oldValue); - break; - } - case REMOVE_EXACTLY: - { - int delta = random.nextInt(5); // [0, 4] - if (multiset.removeExactly(key, delta)) { - deltas[keyIndex] -= delta; - } - break; - } - } - } - return deltas; - } - - private enum Operation { - ADD, - SET_COUNT, - SET_COUNT_IF, - REMOVE, - REMOVE_EXACTLY, - ; - } - } -} |