@Test public void testValueUniqueObject() throws Exception { OnHeapStore<Serializable, Serializable> store = newStore(); String key = "key"; List<String> value = new ArrayList<String>(); value.add("value"); store.put(key, (Serializable) value); // mutate the value -- should not affect cache value.clear(); ValueHolder<Serializable> valueHolder = store.get(key); if (valueHolder.value() == value || !valueHolder.value().equals(Collections.singletonList("value"))) { throw new AssertionError(); } }
@Test public void testKeyCopierCalledOnGetOrComputeIfAbsent() throws Exception { LongCopier keyCopier = new LongCopier(); OnHeapStore<Long, Long> store = newStore( SystemTimeSource.INSTANCE, Expirations.noExpiration(), Eviction.none(), keyCopier, new SerializingCopier<Long>( new CompactJavaSerializer<Long>(ClassLoader.getSystemClassLoader())), 100); ValueHolder<Long> computed = store.getOrComputeIfAbsent( 1L, new Function<Long, ValueHolder<Long>>() { @Override public ValueHolder<Long> apply(final Long key) { return new AbstractValueHolder<Long>(-1, -1) { @Override public Long value() { return key * 1000L; } @Override protected TimeUnit nativeTimeUnit() { return TimeUnit.MILLISECONDS; } }; } }); assertThat(computed.value(), is(1000L)); assertThat(keyCopier.copyForWriteCount, is(1)); assertThat(keyCopier.copyForReadCount, is(0)); }