/*
* 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.integration;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.impl.config.copy.DefaultCopierConfiguration;
import org.ehcache.impl.config.persistence.CacheManagerPersistenceConfiguration;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.event.CacheEvent;
import org.ehcache.event.CacheEventListener;
import org.ehcache.event.EventFiring;
import org.ehcache.event.EventOrdering;
import org.ehcache.event.EventType;
import org.ehcache.expiry.Duration;
import org.ehcache.expiry.Expirations;
import org.ehcache.impl.internal.TimeSourceConfiguration;
import org.ehcache.impl.copy.SerializingCopier;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.IOException;
import java.util.EnumSet;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import static org.ehcache.config.builders.ResourcePoolsBuilder.heap;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
/**
* Created by alsu on 06/08/15.
*/
public class ExpiryEventsTest {
private static final ResourcePoolsBuilder resourcePoolsBuilder =
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(3, EntryUnit.ENTRIES);
private static final CacheConfigurationBuilder<Long, String> byRefCacheConfigBuilder =
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.withExpiry(Expirations.timeToLiveExpiration(new Duration(1, TimeUnit.SECONDS)));;
private static final CacheConfigurationBuilder<Long, String> byValueCacheConfigBuilder =
byRefCacheConfigBuilder.add(new DefaultCopierConfiguration<String>(
SerializingCopier.<String>asCopierClass(), DefaultCopierConfiguration.Type.VALUE));;
private static final TestTimeSource testTimeSource = new TestTimeSource();
private CacheManager cacheManager;
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Before
public void setup() throws IOException {
cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(new CacheManagerPersistenceConfiguration(folder.newFolder("tempData")))
.using(new TimeSourceConfiguration(testTimeSource))
.build(true);
testTimeSource.setTimeMillis(0);
}
@After
public void tearDown() {
if (cacheManager != null) {
cacheManager.close();
}
}
@Test
public void testExpiredEventsOnHeapByReference() throws Exception {
Cache<Long, String> testCache = cacheManager.createCache("onHeapCache",
byRefCacheConfigBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapByValue() throws Exception {
Cache<Long, String> testCache = cacheManager.createCache("onHeapCache",
byValueCacheConfigBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndOffHeapByReference() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byRefCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.offheap(1, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapOffHeapCache",
configBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndOffHeapByValue() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byValueCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.offheap(1, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapOffHeapCache",
configBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndDiskByReference() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byRefCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.disk(1, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapDiskCache",
configBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndDiskByValue() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byValueCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.disk(1, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapDiskCache",
configBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndOffHeapAndDiskByReference() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byRefCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.offheap(1, MemoryUnit.MB).disk(2, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapOffHeapDiskCache",
configBuilder.build());
performActualTest(testCache);
}
@Test
public void testExpiredEventsOnHeapAndOffHeapAndDiskByValue() throws Exception {
CacheConfigurationBuilder<Long, String> configBuilder = byValueCacheConfigBuilder.withResourcePools(
resourcePoolsBuilder.offheap(1, MemoryUnit.MB).disk(2, MemoryUnit.MB));
Cache<Long, String> testCache = cacheManager.createCache("onHeapOffHeapDiskCache",
configBuilder.build());
performActualTest(testCache);
}
private void performActualTest(Cache<Long, String> testCache) {
final List<Long> expiredKeys = new CopyOnWriteArrayList<Long>();
testCache.getRuntimeConfiguration().registerCacheEventListener(new CacheEventListener<Long, String>() {
@Override
public void onEvent(CacheEvent<? extends Long, ? extends String> event) {
expiredKeys.add(event.getKey());
}
}, EventOrdering.ORDERED, EventFiring.SYNCHRONOUS, EnumSet.of(EventType.EXPIRED));
testCache.put(1L, "one");
testCache.put(2L, "two");
testCache.put(3L, "three");
testCache.put(4L, "four");
testCache.put(5L, "five");
testCache.put(6L, "six");
testCache.put(7L, "seven");
testCache.get(1L);
testCache.get(2L);
testCache.get(3L);
testCache.get(4L);
testCache.get(5L);
testTimeSource.setTimeMillis(1100);
testCache.get(1L);
testCache.get(2L);
testCache.get(3L);
testCache.get(4L);
testCache.get(5L);
testCache.get(6L);
testCache.get(7L);
assertThat(expiredKeys, containsInAnyOrder(1L, 2L, 3L, 4L, 5L, 6L, 7L));
}
}