/**
* Copyright 2011-2013 Terracotta, Inc.
* Copyright 2011-2013 Oracle, 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.jsr107.tck.testutil;
import org.junit.After;
import org.junit.Before;
import javax.cache.Cache;
import javax.cache.configuration.MutableCacheEntryListenerConfiguration;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.event.CacheEntryCreatedListener;
import javax.cache.event.CacheEntryEvent;
import javax.cache.event.CacheEntryExpiredListener;
import javax.cache.event.CacheEntryListenerException;
import javax.cache.event.CacheEntryRemovedListener;
import javax.cache.event.CacheEntryUpdatedListener;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import static javax.cache.event.EventType.CREATED;
import static javax.cache.event.EventType.REMOVED;
import static javax.cache.event.EventType.UPDATED;
import static org.junit.Assert.assertEquals;
/**
* Unit test support base class
*
* @author Yannis Cosmadopoulos
* @since 1.0
*/
public abstract class CacheTestSupport<K, V> extends TestSupport {
protected Cache<K, V> cache;
protected MyCacheEntryListener<K, V> listener;
protected MutableCacheEntryListenerConfiguration<K, V> listenerConfiguration;
@Before
public void setUp() throws IOException {
cache = getCacheManager().createCache(getTestCacheName(), extraSetup(newMutableConfiguration()));
}
@After
public void teardown() {
getCacheManager().destroyCache(getTestCacheName());
}
/**
* Constructs a new {@link MutableConfiguration} for the test.
*
* @return a new {@link MutableConfiguration}
*/
abstract protected MutableConfiguration<K, V> newMutableConfiguration();
protected MutableConfiguration<K, V> extraSetup(MutableConfiguration<K, V> configuration) {
return configuration;
}
private LinkedHashMap<Long, String> createLSData(int count, long now) {
LinkedHashMap<Long, String> map = new LinkedHashMap<Long, String>(count);
for (int i = 0; i < count; i++) {
Long key = now + i;
map.put(key, "value" + key);
}
return map;
}
private LinkedHashMap<Date, Date> createDDData(int count, long now) {
LinkedHashMap<Date, Date> map = new LinkedHashMap<Date, Date>(count);
for (int i = 0; i < count; i++) {
map.put(new Date(now + i), new Date(now + 1000 + i));
}
return map;
}
protected LinkedHashMap<Date, Date> createDDData(int count) {
return createDDData(count, System.currentTimeMillis());
}
protected LinkedHashMap<Long, String> createLSData(int count) {
return createLSData(count, System.currentTimeMillis());
}
/**
* Test listener
*
* @param <K>
* @param <V>
*/
public static class MyCacheEntryListener<K, V> implements CacheEntryCreatedListener<K, V>,
CacheEntryUpdatedListener<K, V>, CacheEntryExpiredListener<K, V>,
CacheEntryRemovedListener<K, V>, Serializable,
AutoCloseable {
AtomicInteger created = new AtomicInteger();
AtomicInteger updated = new AtomicInteger();
AtomicInteger removed = new AtomicInteger();
ArrayList<CacheEntryEvent<K, V>> entries = new ArrayList<CacheEntryEvent<K, V>>();
public int getCreated() {
return created.get();
}
public int getUpdated() {
return updated.get();
}
public int getRemoved() {
return removed.get();
}
public ArrayList<CacheEntryEvent<K, V>> getEntries() {
return entries;
}
@Override
public void onCreated(Iterable<CacheEntryEvent<? extends K, ? extends V>> events) throws CacheEntryListenerException {
for (CacheEntryEvent<? extends K, ? extends V> event : events) {
assertEquals(CREATED, event.getEventType());
created.incrementAndGet();
// added for code coverage.
event.getKey();
event.getValue();
event.getSource();
}
}
@Override
public void onExpired(Iterable<CacheEntryEvent<? extends K, ? extends V>> events) throws CacheEntryListenerException {
//SKIP: we don't count expiry events as they can occur asynchronously
}
@Override
public void onRemoved(Iterable<CacheEntryEvent<? extends K, ? extends V>> events) throws CacheEntryListenerException {
for (CacheEntryEvent<? extends K, ? extends V> event : events) {
assertEquals(REMOVED, event.getEventType());
removed.incrementAndGet();
event.getKey();
if (event.isOldValueAvailable()) {
event.getOldValue();
}
}
}
@Override
public void onUpdated(Iterable<CacheEntryEvent<? extends K, ? extends V>> events) throws CacheEntryListenerException {
for (CacheEntryEvent<? extends K, ? extends V> event : events) {
assertEquals(UPDATED, event.getEventType());
updated.incrementAndGet();
event.getKey();
if (event.isOldValueAvailable()) {
event.getOldValue();
}
}
}
@Override
public void close() throws Exception {
// added for code coverage
}
}
}