/* * 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.clustered; import org.ehcache.Cache; import org.ehcache.PersistentCacheManager; import org.ehcache.clustered.client.config.ClusteredStoreConfiguration; import org.ehcache.clustered.client.config.builders.ClusteredResourcePoolBuilder; import org.ehcache.clustered.client.config.builders.ClusteringServiceConfigurationBuilder; import org.ehcache.clustered.common.Consistency; import org.ehcache.config.CacheConfiguration; import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.CacheManagerBuilder; import org.ehcache.config.builders.ResourcePoolsBuilder; import org.ehcache.config.units.EntryUnit; import org.ehcache.config.units.MemoryUnit; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import org.terracotta.testing.rules.BasicExternalCluster; import org.terracotta.testing.rules.Cluster; import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.ehcache.clustered.client.config.builders.ClusteringServiceConfigurationBuilder.cluster; import static org.ehcache.config.builders.CacheConfigurationBuilder.newCacheConfigurationBuilder; import static org.ehcache.config.builders.CacheManagerBuilder.newCacheManagerBuilder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; public class BasicClusteredCacheOpsTest { private static final String RESOURCE_CONFIG = "<config xmlns:ohr='http://www.terracotta.org/config/offheap-resource'>" + "<ohr:offheap-resources>" + "<ohr:resource name=\"primary-server-resource\" unit=\"MB\">64</ohr:resource>" + "</ohr:offheap-resources>" + "</config>\n"; @ClassRule public static Cluster CLUSTER = new BasicExternalCluster(new File("build/cluster"), 1, Collections.<File>emptyList(), "", RESOURCE_CONFIG, ""); @BeforeClass public static void waitForActive() throws Exception { CLUSTER.getClusterControl().waitForActive(); } @Test public void basicCacheCRUD() throws Exception { final CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = CacheManagerBuilder.newCacheManagerBuilder() .with(ClusteringServiceConfigurationBuilder.cluster(CLUSTER.getConnectionURI().resolve("/crud-cm")) .autoCreate() .defaultServerResource("primary-server-resource")); final PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(false); cacheManager.init(); try { CacheConfiguration<Long, String> config = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .with(ClusteredResourcePoolBuilder.clusteredDedicated("primary-server-resource", 1, MemoryUnit.MB))).build(); Cache<Long, String> cache = cacheManager.createCache("clustered-cache", config); cache.put(1L, "The one"); assertThat(cache.containsKey(2L), is(false)); cache.put(2L, "The two"); assertThat(cache.containsKey(2L), is(true)); cache.put(1L, "Another one"); cache.put(3L, "The three"); assertThat(cache.get(1L), equalTo("Another one")); assertThat(cache.get(2L), equalTo("The two")); assertThat(cache.get(3L), equalTo("The three")); cache.remove(1L); assertThat(cache.get(1L), is(nullValue())); cache.clear(); assertThat(cache.get(1L), is(nullValue())); assertThat(cache.get(2L), is(nullValue())); assertThat(cache.get(3L), is(nullValue())); } finally { cacheManager.close(); } } @Test public void basicCacheCAS() throws Exception { final CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = newCacheManagerBuilder() .with(cluster(CLUSTER.getConnectionURI().resolve("/cas-cm")).autoCreate()) .withCache("clustered-cache", newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100, EntryUnit.ENTRIES) .with(ClusteredResourcePoolBuilder.clusteredDedicated("primary-server-resource", 2, MemoryUnit.MB))) .add(new ClusteredStoreConfiguration(Consistency.STRONG))); final PersistentCacheManager cacheManager1 = clusteredCacheManagerBuilder.build(true); try { final PersistentCacheManager cacheManager2 = clusteredCacheManagerBuilder.build(true); try { final Cache<Long, String> cache1 = cacheManager1.getCache("clustered-cache", Long.class, String.class); final Cache<Long, String> cache2 = cacheManager2.getCache("clustered-cache", Long.class, String.class); assertThat(cache1.putIfAbsent(1L, "one"), nullValue()); assertThat(cache2.putIfAbsent(1L, "another one"), is("one")); assertThat(cache2.remove(1L, "another one"), is(false)); assertThat(cache1.replace(1L, "another one"), is("one")); assertThat(cache2.replace(1L, "another one", "yet another one"), is(true)); assertThat(cache1.remove(1L, "yet another one"), is(true)); assertThat(cache2.replace(1L, "one"), nullValue()); assertThat(cache1.replace(1L, "another one", "yet another one"), is(false)); } finally { cacheManager2.close(); } } finally { cacheManager1.close(); } } @Test public void basicClusteredBulk() throws Exception { final CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = newCacheManagerBuilder() .with(cluster(CLUSTER.getConnectionURI().resolve("/bulk-cm")).autoCreate()) .withCache("clustered-cache", newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .with(ClusteredResourcePoolBuilder.clusteredDedicated("primary-server-resource", 2, MemoryUnit.MB))) .add(new ClusteredStoreConfiguration(Consistency.STRONG))); final PersistentCacheManager cacheManager1 = clusteredCacheManagerBuilder.build(true); try { final PersistentCacheManager cacheManager2 = clusteredCacheManagerBuilder.build(true); try { final Cache<Long, String> cache1 = cacheManager1.getCache("clustered-cache", Long.class, String.class); final Cache<Long, String> cache2 = cacheManager2.getCache("clustered-cache", Long.class, String.class); Map<Long, String> entriesMap = new HashMap<Long, String>(); entriesMap.put(1L, "one"); entriesMap.put(2L, "two"); entriesMap.put(3L, "three"); cache1.putAll(entriesMap); Set<Long> keySet = new HashSet<Long>(Arrays.asList(1L, 2L, 3L)); Map<Long, String> all = cache2.getAll(keySet); assertThat(all.get(1L), is("one")); assertThat(all.get(2L), is("two")); assertThat(all.get(3L), is("three")); cache2.removeAll(keySet); all = cache1.getAll(keySet); assertThat(all.get(1L), nullValue()); assertThat(all.get(2L), nullValue()); assertThat(all.get(3L), nullValue()); } finally { cacheManager2.close(); } } finally { cacheManager1.close(); } } }