/** * 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.integration; import org.jsr107.tck.testutil.ExcludeListExcluder; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.cache.Cache; import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.configuration.FactoryBuilder; import javax.cache.configuration.MutableConfiguration; import javax.cache.expiry.Duration; import javax.cache.expiry.ExpiryPolicy; import java.io.IOException; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** * Functional Tests for {@link javax.cache.integration.CacheLoader}s with * {@link Cache}s that have expiry configured. * * @author Brian Oliver */ public class CacheLoaderWithExpiryTest { /** * Rule used to exclude tests */ @Rule public ExcludeListExcluder rule = new ExcludeListExcluder(CacheLoaderWithExpiryTest.class); /** * The {@link javax.cache.CacheManager} for the each test. */ private CacheManager cacheManager; /** * A {@link org.jsr107.tck.integration.CacheLoaderServer} that will delegate {@link javax.cache.Cache} request * onto the recording {@link javax.cache.integration.CacheLoader}. */ private CacheLoaderServer<String, String> cacheLoaderServer; /** * The {@link javax.cache.Cache} for the each test. */ private Cache<String, String> cache; /** * Establish the {@link javax.cache.CacheManager} and {@link javax.cache.Cache} for a test. */ @Before public void onBeforeEachTest() throws IOException { //establish and open a CacheLoaderServer to handle cache //cache loading requests from a CacheLoaderClient cacheLoaderServer = new CacheLoaderServer<String, String>(10000); cacheLoaderServer.open(); //establish the CacheManager for the tests cacheManager = Caching.getCachingProvider().getCacheManager(); //establish a CacheLoaderClient that a Cache can use for loading entries //(via the CacheLoaderServer) CacheLoaderClient<String, String> cacheLoader = new CacheLoaderClient<>(cacheLoaderServer.getInetAddress(), cacheLoaderServer.getPort()); //establish a Cache Configuration that uses a CacheLoader, Read-Through and Expiry MutableConfiguration<String, String> configuration = new MutableConfiguration<>(); configuration.setTypes(String.class, String.class); configuration.setCacheLoaderFactory(FactoryBuilder.factoryOf(cacheLoader)); configuration.setReadThrough(true); configuration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(ExpireOnAccessPolicy.class)); //configure the cache cacheManager.createCache("cache-loader-test", configuration); cache = cacheManager.getCache("cache-loader-test", String.class, String.class); } /** * Clean up the {@link javax.cache.CacheManager} and {@link javax.cache.Cache} after a test. */ @After public void onAfterEachTest() { //destroy the cache String cacheName = cache.getName(); cacheManager.destroyCache(cacheName); //close the server cacheLoaderServer.close(); cacheLoaderServer = null; cache = null; } /** * Ensure that a {@link javax.cache.Cache#get(Object)} for an expired * entry will cause a {@link CacheLoaderClient#load(Object)}. */ @Test public void shouldLoadWhenMissCausedByExpiry() { RecordingCacheLoader<String> cacheLoader = new RecordingCacheLoader<String>(); cacheLoaderServer.setCacheLoader(cacheLoader); String key = "message"; assertThat(cache.containsKey(key), is(false)); String initialValue = "gudday"; cache.put(key, initialValue); assertThat(cache.containsKey(key), is(true)); String value = cache.get(key); assertThat(value, is(initialValue)); assertThat(cache.containsKey(key), is(false)); String loadedValue = cache.get(key); assertThat(loadedValue, is(equalTo(key))); assertThat(cacheLoader.getLoadCount(), is(1)); assertThat(cacheLoader.hasLoaded(key), is(true)); } /** * An {@link ExpiryPolicy} that will expire {@link Cache} entries * after they've been accessed. */ public static class ExpireOnAccessPolicy implements ExpiryPolicy { @Override public Duration getExpiryForCreation() { return Duration.ETERNAL; } @Override public Duration getExpiryForAccess() { return Duration.ZERO; } @Override public Duration getExpiryForUpdate() { return Duration.ETERNAL; } } }