/*
* Copyright 2010-2013 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.xml;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import javax.annotation.Resource;
import org.apache.geode.cache.CustomExpiry;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.ExpirationAction;
import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.Region;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;
/**
* The RegionExpirationAttributesNamespaceTest class is a test suite of test cases testing the configuration of
* ExpirationAttribute settings on Region Entries.
*
* @author John Blum
* @see org.junit.Test
* @see org.junit.runner.RunWith
* @see org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer
* @see org.springframework.test.context.ContextConfiguration
* @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
* @see org.apache.geode.cache.Region
* @see org.apache.geode.cache.RegionAttributes
* @see org.apache.geode.cache.EvictionAttributes
* @since 1.5.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = GemfireTestApplicationContextInitializer.class)
@SuppressWarnings("unused")
public class RegionExpirationAttributesNamespaceTest {
@Resource(name = "ReplicateExample")
private Region<?, ?> replicateExample;
@Resource(name = "PreloadedExample")
private Region<?, ?> preloadedExample;
@Resource(name = "PartitionExample")
private Region<?, ?> partitionExample;
@Resource(name = "LocalExample")
private Region<?, ?> localExample;
protected void assertRegionMetaData(final Region<?, ?> region, final String regionName, final DataPolicy dataPolicy) {
assertRegionMetaData(region, regionName, Region.SEPARATOR + regionName, dataPolicy);
}
protected void assertRegionMetaData(final Region<?, ?> region, final String regionName, final String regionFullPath,
final DataPolicy dataPolicy) {
assertNotNull(String.format("The '%1$s' Region was not properly configured and initialized!", regionName), region);
assertEquals(regionName, region.getName());
assertEquals(regionFullPath, region.getFullPath());
assertNotNull(region.getAttributes());
assertEquals(dataPolicy, region.getAttributes().getDataPolicy());
}
protected void assertNoExpiration(final ExpirationAttributes expirationAttributes) {
if (expirationAttributes != null) {
//assertEquals(ExpirationAction.INVALIDATE, expirationAttributes.getAction());
assertEquals(0, expirationAttributes.getTimeout());
}
}
protected void assertExpirationAttributes(final ExpirationAttributes expirationAttributes,
final int timeout, final ExpirationAction action) {
assertNotNull(expirationAttributes);
assertEquals(timeout, expirationAttributes.getTimeout());
assertEquals(action, expirationAttributes.getAction());
}
@SuppressWarnings("unchecked")
protected void assertCustomExpiry(final CustomExpiry<?, ?> customExpiry, final String name,
final int timeout, final ExpirationAction action) {
assertNotNull(customExpiry);
assertEquals(name, customExpiry.toString());
assertExpirationAttributes(customExpiry.getExpiry(mock(Region.Entry.class)), timeout, action);
}
@Test
public void testReplicateExampleExpirationAttributes() {
assertRegionMetaData(replicateExample, "ReplicateExample", DataPolicy.REPLICATE);
assertExpirationAttributes(replicateExample.getAttributes().getEntryTimeToLive(),
600, ExpirationAction.DESTROY);
assertExpirationAttributes(replicateExample.getAttributes().getEntryIdleTimeout(),
300, ExpirationAction.INVALIDATE);
assertNull(replicateExample.getAttributes().getCustomEntryTimeToLive());
assertNull(replicateExample.getAttributes().getCustomEntryIdleTimeout());
}
@Test
public void testPreloadedExampleExpirationAttributes() {
assertRegionMetaData(preloadedExample, "PreloadedExample", DataPolicy.PRELOADED);
assertExpirationAttributes(preloadedExample.getAttributes().getEntryTimeToLive(),
120, ExpirationAction.LOCAL_DESTROY);
assertNoExpiration(preloadedExample.getAttributes().getEntryIdleTimeout());
assertNull(preloadedExample.getAttributes().getCustomEntryTimeToLive());
assertNull(preloadedExample.getAttributes().getCustomEntryIdleTimeout());
}
@Test
public void testPartitionExampleExpirationAttributes() {
assertRegionMetaData(partitionExample, "PartitionExample", DataPolicy.PARTITION);
assertExpirationAttributes(partitionExample.getAttributes().getEntryTimeToLive(),
300, ExpirationAction.DESTROY);
assertNoExpiration(partitionExample.getAttributes().getEntryIdleTimeout());
assertNull(partitionExample.getAttributes().getCustomEntryTimeToLive());
assertCustomExpiry(partitionExample.getAttributes().getCustomEntryIdleTimeout(), "PartitionCustomExpiry",
120, ExpirationAction.INVALIDATE);
}
@Test
public void testLocalExampleExpirationAttributes() {
assertRegionMetaData(localExample, "LocalExample", DataPolicy.NORMAL);
assertNoExpiration(localExample.getAttributes().getEntryTimeToLive());
assertNoExpiration(localExample.getAttributes().getEntryIdleTimeout());
assertCustomExpiry(localExample.getAttributes().getCustomEntryTimeToLive(), "LocalTtlCustomExpiry",
180, ExpirationAction.LOCAL_DESTROY);
assertCustomExpiry(localExample.getAttributes().getCustomEntryIdleTimeout(), "LocalTtiCustomExpiry",
60, ExpirationAction.LOCAL_INVALIDATE);
}
public static class TestCustomExpiry<K, V> implements CustomExpiry<K, V> {
private ExpirationAction action;
private Integer timeout;
private String name;
@Override
public ExpirationAttributes getExpiry(final Region.Entry<K, V> kvEntry) {
Assert.state(timeout != null, "The expiration 'timeout' must be specified!");
Assert.state(action != null, "The expiration 'action' must be specified!");
return new ExpirationAttributes(timeout, action);
}
public void setAction(final ExpirationAction action) {
this.action = action;
}
public void setName(final String name) {
this.name = name;
}
public void setTimeout(final Integer timeout) {
this.timeout = timeout;
}
@Override
public void close() {
}
@Override
public String toString() {
return this.name;
}
}
}