/*
* Copyright Terracotta, Inc.
*
* 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 org.ehcache.core;
import java.util.*;
import org.ehcache.config.CacheConfiguration;
import org.ehcache.core.events.CacheEventDispatcher;
import org.ehcache.core.spi.store.Store;
import org.ehcache.core.spi.store.Store.ValueHolder;
import org.ehcache.expiry.Expiry;
import org.ehcache.core.spi.function.Function;
import org.ehcache.spi.loaderwriter.CacheLoaderWriter;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.slf4j.LoggerFactory;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.ehcache.core.EhcacheBulkMethodsTest.entry;
import static org.ehcache.core.EhcacheBulkMethodsTest.valueHolder;
/**
* @author Abhilash
*
*/
@SuppressWarnings("unchecked")
public class EhcacheWithLoaderWriterBulkMethodsTest {
@Test
public void testPutAllWithWriter() throws Exception {
Store<Number, CharSequence> store = mock(Store.class);
when(store.bulkCompute((Set<Integer>) argThat(hasItems(1, 2, 3)), any(Function.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Function<List<Map.Entry<Integer, String>>, Object> function =
(Function<List<Map.Entry<Integer, String>>, Object>)invocation.getArguments()[1];
function.apply(Arrays.asList(entry(1, "one"), entry(2, "two"), entry(3, "three")));
return null;
}
});
CacheLoaderWriter<Number, CharSequence> cacheLoaderWriter = mock(CacheLoaderWriter.class);
InternalCache<Number, CharSequence> ehcache = getCache(store, cacheLoaderWriter);
ehcache.init();
ehcache.putAll(new LinkedHashMap<Number, CharSequence>() {{
put(1, "one");
put(2, "two");
put(3, "three");
}});
verify(store).bulkCompute((Set<? extends Number>) argThat(hasItems(1, 2, 3)), any(Function.class));
verify(cacheLoaderWriter).writeAll(argThat(hasItems(entry(1, "one"), entry(2, "two"), entry(3, "three"))));
}
@Test
public void testGetAllWithLoader() throws Exception {
Store<Number, CharSequence> store = mock(Store.class);
when(store.bulkComputeIfAbsent((Set<? extends Number>)argThat(hasItems(1, 2, 3)), any(Function.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Function function = (Function)invocation.getArguments()[1];
function.apply(invocation.getArguments()[0]);
final Map<Number, ValueHolder<CharSequence>>loaderValues = new LinkedHashMap<Number, ValueHolder<CharSequence>>();
loaderValues.put(1, valueHolder((CharSequence)"one"));
loaderValues.put(2, valueHolder((CharSequence)"two"));
loaderValues.put(3, null);
return loaderValues;
}
});
CacheLoaderWriter<Number, CharSequence> cacheLoaderWriter = mock(CacheLoaderWriter.class);
InternalCache<Number, CharSequence> ehcache = getCache(store, cacheLoaderWriter);
ehcache.init();
Map<Number, CharSequence> result = ehcache.getAll(new HashSet<Number>(Arrays.asList(1, 2, 3)));
assertThat(result, hasEntry((Number)1, (CharSequence) "one"));
assertThat(result, hasEntry((Number)2, (CharSequence) "two"));
assertThat(result, hasEntry((Number)3, (CharSequence) null));
verify(store).bulkComputeIfAbsent((Set<? extends Number>)argThat(hasItems(1, 2, 3)), any(Function.class));
verify(cacheLoaderWriter).loadAll(argThat(hasItems(1, 2, 3)));
}
@Test
public void testRemoveAllWithWriter() throws Exception {
Store<Number, CharSequence> store = mock(Store.class);
when(store.bulkCompute((Set<? extends Number>) argThat(hasItems(1, 2, 3)), any(Function.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Function function = (Function)invocation.getArguments()[1];
function.apply(Arrays.asList(entry(1, "one"), entry(2, "two"), entry(3, "three")));
return null;
}
});
CacheLoaderWriter<Number, CharSequence> cacheLoaderWriter = mock(CacheLoaderWriter.class);
InternalCache<Number, CharSequence> ehcache = getCache(store, cacheLoaderWriter);
ehcache.init();
ehcache.removeAll(new LinkedHashSet<Number>(Arrays.asList(1, 2, 3)));
verify(store).bulkCompute((Set<? extends Number>) argThat(hasItems(1, 2, 3)), any(Function.class));
verify(cacheLoaderWriter).deleteAll(argThat(hasItems(1, 2, 3)));
}
protected InternalCache<Number, CharSequence> getCache(Store<Number, CharSequence> store, CacheLoaderWriter cacheLoaderWriter) {
CacheConfiguration<Number, CharSequence> cacheConfig = mock(CacheConfiguration.class);
when(cacheConfig.getExpiry()).thenReturn(mock(Expiry.class));
CacheEventDispatcher<Number, CharSequence> cacheEventDispatcher = mock(CacheEventDispatcher.class);
return new EhcacheWithLoaderWriter<Number, CharSequence>(cacheConfig, store, cacheLoaderWriter, cacheEventDispatcher, LoggerFactory.getLogger(EhcacheWithLoaderWriter.class + "-" + "EhcacheWithLoaderWriterBulkMethodsTest"));
}
}