/* * 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 java.io.Serializable; import org.ehcache.Cache; import org.ehcache.CacheManager; import org.ehcache.config.CacheConfiguration; import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.CacheManagerBuilder; import org.ehcache.config.units.MemoryUnit; import org.junit.Test; import static org.ehcache.config.builders.ResourcePoolsBuilder.newResourcePoolsBuilder; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; /** * @author Abhilash * */ public class OverSizeMappingTest { @Test public void testOverSizedObjectGetsReturnedFromLowerTier() { CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withDefaultSizeOfMaxObjectSize(500, MemoryUnit.B) .withDefaultSizeOfMaxObjectGraph(1000) .build(true); CacheConfiguration<String, String> objectSize = CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class, String.class, newResourcePoolsBuilder() .heap(100, MemoryUnit.KB).offheap(10, MemoryUnit.MB).build()) .build(); Cache<String, String> objectSizeCache = cacheManager.createCache("objectSize", objectSize); objectSizeCache.put("key1", getOverSizedObject()); assertThat(objectSizeCache.get("key1"), equalTo(getOverSizedObject())); CacheConfiguration<String, ObjectSizeGreaterThanN> objectGraphSize = CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class, ObjectSizeGreaterThanN.class, newResourcePoolsBuilder() .heap(100, MemoryUnit.KB).offheap(100, MemoryUnit.MB).build()) .build(); Cache<String, ObjectSizeGreaterThanN> objectGraphSizeCache = cacheManager.createCache("objectGraphSize", objectGraphSize); objectGraphSizeCache.put("key1", getObjectSizeGreaterThanN(1002)); assertThat(objectGraphSizeCache.get("key1"), equalTo(getObjectSizeGreaterThanN(1002))); } @Test public void testOverSizedObjectPutFailsWithOnHeapAsAuthority() { CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withDefaultSizeOfMaxObjectSize(500, MemoryUnit.B).build(true); CacheConfiguration<String, String> cacheConfiguration = CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class, String.class, newResourcePoolsBuilder() .heap(100, MemoryUnit.KB).build()) .build(); Cache<String, String> cache = cacheManager.createCache("cache", cacheConfiguration); cache.put("key1", getOverSizedObject()); assertThat(cache.get("key1"), nullValue()); cache.put("key1", "value1"); cache.replace("key1", getOverSizedObject()); assertThat(cache.get("key1"), nullValue()); } private static String getOverSizedObject() { return new String(new byte[1000]); } private static ObjectSizeGreaterThanN getObjectSizeGreaterThanN(int n) { return new ObjectSizeGreaterThanN(n); } private static class ObjectSizeGreaterThanN implements Serializable { private final Integer[] arr; private ObjectSizeGreaterThanN(int n) { arr = new Integer[n]; for (int i = 0; i < arr.length; i++) { arr[i] = new Integer(i); } } // just for this test @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof ObjectSizeGreaterThanN && this.arr.length == ((ObjectSizeGreaterThanN)obj).arr.length ) { return true; } return false; } } }