SGF-547 - Configure Eviction with annotations.
(cherry picked from commit fffb2b0de6d54bae436be1ec51dee2db51e5f041) Signed-off-by: John Blum <jblum@pivotal.io>
This commit is contained in:
@@ -46,7 +46,6 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.data.gemfire.fork.LocatorProcess;
|
||||
import org.springframework.data.gemfire.process.ProcessExecutor;
|
||||
import org.springframework.data.gemfire.process.ProcessInputStreamListener;
|
||||
import org.springframework.data.gemfire.process.ProcessWrapper;
|
||||
import org.springframework.data.gemfire.test.support.FileUtils;
|
||||
import org.springframework.data.gemfire.test.support.ThreadUtils;
|
||||
@@ -81,15 +80,15 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
@Rule
|
||||
public TestRule watchman = new TestWatcher() {
|
||||
@Override
|
||||
protected void failed(final Throwable t, final Description description) {
|
||||
protected void failed(Throwable throwable, Description description) {
|
||||
System.err.println(String.format("Test '%1$s' failed...", description.getDisplayName()));
|
||||
System.err.println(ThrowableUtils.toString(t));
|
||||
System.err.println(ThrowableUtils.toString(throwable));
|
||||
System.err.println("Locator process log file contents were...");
|
||||
System.err.println(getLocatorProcessOutput(description));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finished(final Description description) {
|
||||
protected void finished(Description description) {
|
||||
if (Boolean.valueOf(System.getProperty("spring.gemfire.fork.clean", Boolean.TRUE.toString()))) {
|
||||
try {
|
||||
FileUtils.write(new File(locatorWorkingDirectory.getParent(),
|
||||
@@ -102,7 +101,7 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
}
|
||||
}
|
||||
|
||||
private String getLocatorProcessOutput(final Description description) {
|
||||
private String getLocatorProcessOutput(Description description) {
|
||||
try {
|
||||
String locatorProcessOutputString = StringUtils.collectionToDelimitedString(locatorProcessOutput,
|
||||
FileUtils.LINE_SEPARATOR, String.format("[%1$s] - ", description.getMethodName()), "");
|
||||
@@ -128,20 +127,18 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
|
||||
ZipUtils.unzip(new ClassPathResource("/cluster_config.zip"), locatorWorkingDirectory);
|
||||
|
||||
List<String> arguments = new ArrayList<String>();
|
||||
List<String> arguments = new ArrayList<>();
|
||||
|
||||
arguments.add("-Dgemfire.name=" + locatorName);
|
||||
arguments.add("-Dgemfire.mcast-port=0");
|
||||
arguments.add("-Dgemfire.log-level=error");
|
||||
arguments.add("-Dspring.gemfire.enable-cluster-configuration=true");
|
||||
arguments.add("-Dspring.gemfire.load-cluster-configuration=true");
|
||||
|
||||
locatorProcess = ProcessExecutor.launch(locatorWorkingDirectory, LocatorProcess.class,
|
||||
arguments.toArray(new String[arguments.size()]));
|
||||
|
||||
locatorProcess.register(new ProcessInputStreamListener() {
|
||||
@Override public void onInput(final String input) {
|
||||
locatorProcessOutput.add(input);
|
||||
}
|
||||
});
|
||||
locatorProcess.register(input -> locatorProcessOutput.add(input));
|
||||
|
||||
locatorProcess.registerShutdownHook();
|
||||
|
||||
@@ -191,11 +188,11 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
return baseLocation.concat(File.separator).concat(configLocation);
|
||||
}
|
||||
|
||||
protected Region getRegion(final ConfigurableApplicationContext applicationContext, final String regionBeanName) {
|
||||
protected Region getRegion(ConfigurableApplicationContext applicationContext, String regionBeanName) {
|
||||
return applicationContext.getBean(regionBeanName, Region.class);
|
||||
}
|
||||
|
||||
protected ConfigurableApplicationContext newApplicationContext(final String... configLocations) {
|
||||
protected ConfigurableApplicationContext newApplicationContext(String... configLocations) {
|
||||
ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext(configLocations);
|
||||
applicationContext.registerShutdownHook();
|
||||
return applicationContext;
|
||||
@@ -204,7 +201,7 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
@Test
|
||||
@Ignore
|
||||
// TODO re-enable the test once the GemFire Cluster Configuration Service race condition has been properly fixed!
|
||||
public void testClusterConfiguration() {
|
||||
public void clusterConfigurationTest() {
|
||||
ConfigurableApplicationContext applicationContext = newApplicationContext(
|
||||
getLocation("cacheUsingClusterConfigurationIntegrationTest.xml"));
|
||||
|
||||
@@ -225,17 +222,18 @@ public class CacheClusterConfigurationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLocalOnlyConfiguration() {
|
||||
public void localConfigurationTest() {
|
||||
try {
|
||||
newApplicationContext(getLocation("cacheUsingLocalOnlyConfigurationIntegrationTest.xml"));
|
||||
|
||||
fail("Loading the 'cacheUsingLocalOnlyConfigurationIntegrationTest.xml' Spring ApplicationContext"
|
||||
+ " configuration file should have resulted in an Exception due to the Region lookup on"
|
||||
+ " 'ClusterConfigRegion' when GemFire Cluster Configuration is disabled!");
|
||||
}
|
||||
catch (BeanCreationException expected) {
|
||||
assertTrue(expected.getCause() instanceof BeanInitializationException);
|
||||
assertTrue(expected.getCause().getMessage().contains("Cannot find Region [ClusterConfigRegion] in Cache"));
|
||||
assertTrue(expected.getCause().getMessage().matches(
|
||||
"Region \\[ClusterConfigRegion\\] in Cache \\[.*\\] not found"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
*/
|
||||
package org.springframework.data.gemfire.client;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
@@ -55,6 +55,7 @@ import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.data.gemfire.TestUtils;
|
||||
import org.springframework.data.gemfire.config.xml.GemfireConstants;
|
||||
import org.springframework.data.gemfire.util.ArrayUtils;
|
||||
|
||||
/**
|
||||
* @author David Turanski
|
||||
@@ -66,7 +67,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
factoryBean = new ClientRegionFactoryBean<Object, Object>();
|
||||
factoryBean = new ClientRegionFactoryBean<>();
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -78,7 +79,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
@Test
|
||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||
public void testLookupFallbackUsingDefaultShortcut() throws Exception {
|
||||
final String testRegionName = "TestRegion";
|
||||
String testRegionName = "TestRegion";
|
||||
|
||||
ClientCache mockClientCache = mock(ClientCache.class);
|
||||
ClientRegionFactory mockClientRegionFactory = mock(ClientRegionFactory.class);
|
||||
@@ -118,15 +119,18 @@ public class ClientRegionFactoryBeanTest {
|
||||
when(mockPool.getName()).thenReturn("TestPoolTwo");
|
||||
when(mockSnapshot.getInputStream()).thenReturn(mock(InputStream.class));
|
||||
|
||||
EvictionAttributes evictionAttributes = EvictionAttributes.createLRUEntryAttributes();
|
||||
|
||||
factoryBean.setAttributes(mockRegionAttributes);
|
||||
factoryBean.setBeanFactory(mockBeanFactory);
|
||||
factoryBean.setDiskStoreName("TestDiskStoreTwo");
|
||||
factoryBean.setEvictionAttributes(evictionAttributes);
|
||||
factoryBean.setPersistent(false);
|
||||
factoryBean.setPoolName("TestPoolTwo");
|
||||
factoryBean.setSnapshot(mockSnapshot);
|
||||
factoryBean.setShortcut(null);
|
||||
|
||||
Region actualRegion = factoryBean.lookupFallback(mockClientCache, testRegionName);
|
||||
Region actualRegion = factoryBean.lookupRegion(mockClientCache, testRegionName);
|
||||
|
||||
assertSame(mockRegion, actualRegion);
|
||||
|
||||
@@ -141,7 +145,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
verify(mockClientRegionFactory, times(1)).setDiskSynchronous(eq(false));
|
||||
verify(mockClientRegionFactory, times(1)).setEntryIdleTimeout(any(ExpirationAttributes.class));
|
||||
verify(mockClientRegionFactory, times(1)).setEntryTimeToLive(any(ExpirationAttributes.class));
|
||||
verify(mockClientRegionFactory, times(1)).setEvictionAttributes(any(EvictionAttributes.class));
|
||||
verify(mockClientRegionFactory, times(1)).setEvictionAttributes(eq(evictionAttributes));
|
||||
verify(mockClientRegionFactory, times(1)).setInitialCapacity(eq(101));
|
||||
verify(mockClientRegionFactory, times(1)).setKeyConstraint(eq(Long.class));
|
||||
verify(mockClientRegionFactory, times(1)).setLoadFactor(eq(0.75f));
|
||||
@@ -153,7 +157,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
verify(mockClientRegionFactory, times(1)).setPoolName(eq("TestPoolTwo"));
|
||||
verify(mockClientRegionFactory, times(1)).setDiskStoreName(eq("TestDiskStoreTwo"));
|
||||
verify(mockClientRegionFactory, times(1)).create(eq(testRegionName));
|
||||
verify(mockRegion, times(1)).loadSnapshot(any(InputStream.class));
|
||||
verify(mockRegion, never()).loadSnapshot(any(InputStream.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -176,7 +180,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.setPoolName("TestPool");
|
||||
factoryBean.setShortcut(null);
|
||||
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupFallback(mockClientCache, "TestRegion");
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupRegion(mockClientCache, "TestRegion");
|
||||
|
||||
assertSame(mockRegion, actualRegion);
|
||||
|
||||
@@ -204,7 +208,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.setBeanFactory(mockBeanFactory);
|
||||
factoryBean.setShortcut(ClientRegionShortcut.CACHING_PROXY);
|
||||
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupFallback(mockClientCache, "TestRegion");
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupRegion(mockClientCache, "TestRegion");
|
||||
|
||||
assertSame(mockRegion, actualRegion);
|
||||
|
||||
@@ -233,7 +237,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.setParent(mockRegion);
|
||||
factoryBean.setShortcut(ClientRegionShortcut.PROXY);
|
||||
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupFallback(mockClientCache, "TestSubRegion");
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupRegion(mockClientCache, "TestSubRegion");
|
||||
|
||||
assertSame(mockSubRegion, actualRegion);
|
||||
|
||||
@@ -259,7 +263,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.setBeanFactory(mockBeanFactory);
|
||||
factoryBean.setShortcut(ClientRegionShortcut.LOCAL_HEAP_LRU);
|
||||
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupFallback(mockClientCache, "TestRegion");
|
||||
Region<Object, Object> actualRegion = factoryBean.lookupRegion(mockClientCache, "TestRegion");
|
||||
|
||||
assertSame(mockRegion, actualRegion);
|
||||
|
||||
@@ -323,7 +327,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
|
||||
@Test
|
||||
public void testCloseDestroySettings() {
|
||||
final ClientRegionFactoryBean<Object, Object> factory = new ClientRegionFactoryBean<Object, Object>();
|
||||
final ClientRegionFactoryBean<Object, Object> factory = new ClientRegionFactoryBean<>();
|
||||
|
||||
assertNotNull(factory);
|
||||
assertFalse(factory.isClose());
|
||||
@@ -429,7 +433,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.resolveClientRegionShortcut();
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertEquals("Client Region Shortcut 'CACHING_PROXY' is invalid when persistent is true.",
|
||||
assertEquals("Client Region Shortcut 'CACHING_PROXY' is invalid when persistent is true",
|
||||
expected.getMessage());
|
||||
throw expected;
|
||||
}
|
||||
@@ -456,7 +460,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.resolveClientRegionShortcut();
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertEquals("Client Region Shortcut 'LOCAL_PERSISTENT' is invalid when persistent is false.",
|
||||
assertEquals("Client Region Shortcut 'LOCAL_PERSISTENT' is invalid when persistent is false",
|
||||
expected.getMessage());
|
||||
throw expected;
|
||||
}
|
||||
@@ -503,7 +507,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.resolveClientRegionShortcut();
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertEquals("Data Policy 'NORMAL' is invalid when persistent is true.", expected.getMessage());
|
||||
assertEquals("Data Policy 'NORMAL' is invalid when persistent is true", expected.getMessage());
|
||||
throw expected;
|
||||
}
|
||||
}
|
||||
@@ -529,7 +533,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
factoryBean.resolveClientRegionShortcut();
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertEquals("Data Policy 'PERSISTENT_REPLICATE' is invalid when persistent is false.", expected.getMessage());
|
||||
assertEquals("Data Policy 'PERSISTENT_REPLICATE' is invalid when persistent is false", expected.getMessage());
|
||||
throw expected;
|
||||
}
|
||||
}
|
||||
@@ -548,10 +552,6 @@ public class ClientRegionFactoryBeanTest {
|
||||
return new Interest<K>(key);
|
||||
}
|
||||
|
||||
protected <K> Interest<K>[] toArray(Interest<K>... interests) {
|
||||
return interests;
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void destroyCallsRegionClose() throws Exception {
|
||||
@@ -569,7 +569,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
};
|
||||
|
||||
clientRegionFactoryBean.setClose(true);
|
||||
clientRegionFactoryBean.setInterests(toArray(newInterest("test")));
|
||||
clientRegionFactoryBean.setInterests(ArrayUtils.asArray(newInterest("test")));
|
||||
|
||||
assertThat(clientRegionFactoryBean.isClose(), is(true));
|
||||
assertThat(clientRegionFactoryBean.isDestroy(), is(false));
|
||||
@@ -604,7 +604,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
|
||||
clientRegionFactoryBean.setClose(false);
|
||||
clientRegionFactoryBean.setDestroy(true);
|
||||
clientRegionFactoryBean.setInterests(toArray(newInterest("test")));
|
||||
clientRegionFactoryBean.setInterests(ArrayUtils.asArray(newInterest("test")));
|
||||
|
||||
assertThat(clientRegionFactoryBean.isClose(), is(false));
|
||||
assertThat(clientRegionFactoryBean.isDestroy(), is(true));
|
||||
@@ -638,7 +638,7 @@ public class ClientRegionFactoryBeanTest {
|
||||
};
|
||||
|
||||
clientRegionFactoryBean.setClose(true);
|
||||
clientRegionFactoryBean.setInterests(toArray(newInterest("test")));
|
||||
clientRegionFactoryBean.setInterests(ArrayUtils.asArray(newInterest("test")));
|
||||
|
||||
assertThat(clientRegionFactoryBean.isClose(), is(true));
|
||||
assertThat(clientRegionFactoryBean.isDestroy(), is(false));
|
||||
@@ -685,5 +685,4 @@ public class ClientRegionFactoryBeanTest {
|
||||
|
||||
clientRegionFactoryBean.destroy();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or 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 org.springframework.data.gemfire.config.annotation;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.springframework.data.gemfire.config.annotation.EnableEviction.EvictionPolicy;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.apache.geode.cache.Cache;
|
||||
import org.apache.geode.cache.EvictionAttributes;
|
||||
import org.apache.geode.cache.Region;
|
||||
import org.apache.geode.cache.RegionAttributes;
|
||||
import org.apache.geode.cache.RegionFactory;
|
||||
import org.apache.geode.cache.util.ObjectSizer;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.mockito.invocation.InvocationOnMock;
|
||||
import org.mockito.stubbing.Answer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.gemfire.EvictionActionType;
|
||||
import org.springframework.data.gemfire.EvictionAttributesFactoryBean;
|
||||
import org.springframework.data.gemfire.EvictionPolicyType;
|
||||
import org.springframework.data.gemfire.PartitionedRegionFactoryBean;
|
||||
import org.springframework.data.gemfire.ReplicatedRegionFactoryBean;
|
||||
import org.springframework.data.gemfire.util.ArrayUtils;
|
||||
|
||||
/**
|
||||
* Unit tests for the {@link EnableEviction} annotation and {@link EvictionConfiguration} class.
|
||||
*
|
||||
* @author John Blum
|
||||
* @see org.junit.Test
|
||||
* @see org.mockito.Mockito
|
||||
* @see org.springframework.data.gemfire.config.annotation.EnableEviction
|
||||
* @see org.springframework.data.gemfire.config.annotation.EvictionConfiguration
|
||||
* @see org.springframework.data.gemfire.EvictionAttributesFactoryBean
|
||||
* @see org.apache.geode.cache.Region
|
||||
* @see org.apache.geode.cache.EvictionAttributes
|
||||
* @since 1.9.0
|
||||
*/
|
||||
public class EnableEvictionConfigurationUnitTests {
|
||||
|
||||
private ConfigurableApplicationContext applicationContext;
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
if (applicationContext != null) {
|
||||
applicationContext.close();
|
||||
}
|
||||
}
|
||||
|
||||
protected void assertEvictionAttributes(Region region, EvictionAttributes expectedEvictionAttributes) {
|
||||
assertThat(region).isNotNull();
|
||||
assertThat(region.getAttributes()).isNotNull();
|
||||
assertEvictionAttributes(region.getAttributes().getEvictionAttributes(), expectedEvictionAttributes);
|
||||
}
|
||||
|
||||
protected void assertEvictionAttributes(EvictionAttributes actualEvictionAttributes,
|
||||
EvictionAttributes expectedEvictionAttributes) {
|
||||
|
||||
assertThat(actualEvictionAttributes).isNotNull();
|
||||
assertThat(actualEvictionAttributes.getAction()).isEqualTo(expectedEvictionAttributes.getAction());
|
||||
assertThat(actualEvictionAttributes.getAlgorithm()).isEqualTo(expectedEvictionAttributes.getAlgorithm());
|
||||
assertThat(actualEvictionAttributes.getObjectSizer()).isEqualTo(expectedEvictionAttributes.getObjectSizer());
|
||||
|
||||
if (!EvictionPolicyType.HEAP_PERCENTAGE.equals(
|
||||
EvictionPolicyType.valueOf(actualEvictionAttributes.getAlgorithm()))) {
|
||||
assertThat(actualEvictionAttributes.getMaximum()).isEqualTo(expectedEvictionAttributes.getMaximum());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected <K, V> Region<K, V> getRegion(String beanName) {
|
||||
return applicationContext.getBean(beanName, Region.class);
|
||||
}
|
||||
|
||||
protected AnnotationConfigApplicationContext newApplicationContext(Class<?>... annotatedClasses) {
|
||||
return new AnnotationConfigApplicationContext(annotatedClasses);
|
||||
}
|
||||
|
||||
protected EvictionAttributes newEvictionAttributes(Integer maximum, EvictionPolicyType type, EvictionActionType action,
|
||||
ObjectSizer... objectSizer) {
|
||||
|
||||
EvictionAttributesFactoryBean evictionAttributesFactory = new EvictionAttributesFactoryBean();
|
||||
|
||||
evictionAttributesFactory.setAction(action.getEvictionAction());
|
||||
evictionAttributesFactory.setObjectSizer(ArrayUtils.getFirst(objectSizer));
|
||||
evictionAttributesFactory.setThreshold(maximum);
|
||||
evictionAttributesFactory.setType(type);
|
||||
evictionAttributesFactory.afterPropertiesSet();
|
||||
|
||||
return evictionAttributesFactory.getObject();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void usesDefaultEvictionPolicyConfiguration() {
|
||||
applicationContext = newApplicationContext(DefaultEvictionPolicyConfiguration.class);
|
||||
|
||||
EvictionAttributes defaultEvictionAttributes = EvictionAttributes.createLRUEntryAttributes();
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("PartitionRegion", Region.class), defaultEvictionAttributes);
|
||||
assertEvictionAttributes(applicationContext.getBean("ReplicateRegion", Region.class), defaultEvictionAttributes);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void usesCustomEvictionPolicyConfiguration() {
|
||||
applicationContext = newApplicationContext(CustomEvictionPolicyConfiguration.class);
|
||||
|
||||
ObjectSizer mockObjectSizer = applicationContext.getBean("mockObjectSizer", ObjectSizer.class);
|
||||
|
||||
EvictionAttributes customEvictionAttributes = newEvictionAttributes(65536, EvictionPolicyType.MEMORY_SIZE,
|
||||
EvictionActionType.OVERFLOW_TO_DISK, mockObjectSizer);
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("PartitionRegion", Region.class), customEvictionAttributes);
|
||||
assertEvictionAttributes(applicationContext.getBean("ReplicateRegion", Region.class), customEvictionAttributes);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void usesRegionSpecificEvictionPolicyConfiguration() {
|
||||
applicationContext = newApplicationContext(RegionSpecificEvictionPolicyConfiguration.class);
|
||||
|
||||
ObjectSizer mockObjectSizer = applicationContext.getBean("mockObjectSizer", ObjectSizer.class);
|
||||
|
||||
EvictionAttributes partitionRegionEvictionAttributes = newEvictionAttributes(null,
|
||||
EvictionPolicyType.HEAP_PERCENTAGE, EvictionActionType.OVERFLOW_TO_DISK, mockObjectSizer);
|
||||
|
||||
EvictionAttributes replicateRegionEvictionAttributes = newEvictionAttributes(10000,
|
||||
EvictionPolicyType.ENTRY_COUNT, EvictionActionType.LOCAL_DESTROY);
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("PartitionRegion", Region.class),
|
||||
partitionRegionEvictionAttributes);
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("ReplicateRegion", Region.class),
|
||||
replicateRegionEvictionAttributes);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void usesLastMatchingEvictionPolicyConfiguration() {
|
||||
applicationContext = newApplicationContext(LastMatchingWinsEvictionPolicyConfiguration.class);
|
||||
|
||||
EvictionAttributes lastMatchingEvictionAttributes = newEvictionAttributes(99, EvictionPolicyType.ENTRY_COUNT,
|
||||
EvictionActionType.OVERFLOW_TO_DISK);
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("PartitionRegion", Region.class),
|
||||
lastMatchingEvictionAttributes);
|
||||
|
||||
assertEvictionAttributes(applicationContext.getBean("ReplicateRegion", Region.class),
|
||||
lastMatchingEvictionAttributes);
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@SuppressWarnings("unused")
|
||||
static class CacheRegionConfiguration {
|
||||
|
||||
@Bean("mockCache")
|
||||
@SuppressWarnings("unchecked")
|
||||
Cache mockCache() {
|
||||
Cache mockCache = mock(Cache.class);
|
||||
|
||||
RegionFactory mockRegionFactory = mock(RegionFactory.class);
|
||||
|
||||
final AtomicReference<EvictionAttributes> evictionAttributes =
|
||||
new AtomicReference<>(null);
|
||||
|
||||
when(mockCache.createRegionFactory()).thenReturn(mockRegionFactory);
|
||||
|
||||
when(mockRegionFactory.setEvictionAttributes(any(EvictionAttributes.class))).thenAnswer(
|
||||
new Answer<RegionFactory>() {
|
||||
@Override
|
||||
public RegionFactory answer(InvocationOnMock invocation) throws Throwable {
|
||||
evictionAttributes.set(invocation.getArgumentAt(0, EvictionAttributes.class));
|
||||
return (RegionFactory) invocation.getMock();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
when(mockRegionFactory.create(anyString())).thenAnswer(new Answer<Region>() {
|
||||
@Override
|
||||
public Region answer(InvocationOnMock invocation) throws Throwable {
|
||||
String regionName = invocation.getArgumentAt(0, String.class);
|
||||
|
||||
Region mockRegion = mock(Region.class, regionName);
|
||||
|
||||
RegionAttributes mockRegionAttributes =
|
||||
mock(RegionAttributes.class, regionName.concat("Attributes"));
|
||||
|
||||
when(mockRegion.getName()).thenReturn(regionName);
|
||||
when(mockRegion.getFullPath()).thenReturn(String.format("%1$s%2$s", Region.SEPARATOR, regionName));
|
||||
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
|
||||
when(mockRegionAttributes.getEvictionAttributes()).thenReturn(evictionAttributes.get());
|
||||
|
||||
return mockRegion;
|
||||
}
|
||||
});
|
||||
|
||||
return mockCache;
|
||||
}
|
||||
|
||||
@Bean("PartitionRegion")
|
||||
PartitionedRegionFactoryBean<Object, Object> mockPartitionRegion(Cache gemfireCache) {
|
||||
PartitionedRegionFactoryBean<Object, Object> partitionRegion =
|
||||
new PartitionedRegionFactoryBean<>();
|
||||
|
||||
partitionRegion.setCache(gemfireCache);
|
||||
partitionRegion.setClose(false);
|
||||
partitionRegion.setPersistent(false);
|
||||
|
||||
return partitionRegion;
|
||||
}
|
||||
|
||||
@Bean("ReplicateRegion")
|
||||
ReplicatedRegionFactoryBean<Object, Object> mockReplicateRegion(Cache gemfireCache) {
|
||||
ReplicatedRegionFactoryBean<Object, Object> replicateRegion =
|
||||
new ReplicatedRegionFactoryBean<>();
|
||||
|
||||
replicateRegion.setCache(gemfireCache);
|
||||
replicateRegion.setClose(false);
|
||||
replicateRegion.setPersistent(false);
|
||||
|
||||
return replicateRegion;
|
||||
}
|
||||
|
||||
@Bean
|
||||
ObjectSizer mockObjectSizer() {
|
||||
return mock(ObjectSizer.class);
|
||||
}
|
||||
}
|
||||
|
||||
@EnableEviction
|
||||
static class DefaultEvictionPolicyConfiguration extends CacheRegionConfiguration {
|
||||
}
|
||||
|
||||
@EnableEviction(policies = @EvictionPolicy(maximum = 65536, type = EvictionPolicyType.MEMORY_SIZE,
|
||||
action = EvictionActionType.OVERFLOW_TO_DISK, objectSizerName = "mockObjectSizer"))
|
||||
static class CustomEvictionPolicyConfiguration extends CacheRegionConfiguration {
|
||||
}
|
||||
|
||||
@EnableEviction(policies = {
|
||||
@EvictionPolicy(maximum = 85, type = EvictionPolicyType.HEAP_PERCENTAGE, action = EvictionActionType.OVERFLOW_TO_DISK,
|
||||
objectSizerName = "mockObjectSizer", regionNames = "PartitionRegion"),
|
||||
@EvictionPolicy(maximum = 10000, type = EvictionPolicyType.ENTRY_COUNT, action = EvictionActionType.LOCAL_DESTROY,
|
||||
regionNames = "ReplicateRegion")
|
||||
})
|
||||
static class RegionSpecificEvictionPolicyConfiguration extends CacheRegionConfiguration {
|
||||
}
|
||||
|
||||
@EnableEviction(policies = {
|
||||
@EvictionPolicy(maximum = 1, type = EvictionPolicyType.ENTRY_COUNT, action = EvictionActionType.LOCAL_DESTROY,
|
||||
objectSizerName = "mockObjectSizer", regionNames = "ReplicateRegion"),
|
||||
@EvictionPolicy(maximum = 99, type = EvictionPolicyType.ENTRY_COUNT, action = EvictionActionType.OVERFLOW_TO_DISK)
|
||||
})
|
||||
static class LastMatchingWinsEvictionPolicyConfiguration extends CacheRegionConfiguration {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user