private OffHeapChainMap<String> getChainMapWithExtendedStorageEngine() { PageSource chainSource = new UnlimitedPageSource(new OffHeapBufferSource()); PageSource extendedSource = new UnlimitedPageSource(new OffHeapBufferSource()); Factory<? extends ChainStorageEngine<String>> factory = ExtendedOffHeapChainStorageEngine.createFactory(chainSource, StringPortability.INSTANCE, 4096, 4096, false, false, extendedSource); return new OffHeapChainMap<>(chainSource, factory); }
@Test public void testRemoveMissingKey() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.remove("foo"); assertThat(map.get("foo").isEmpty(), is(true)); }
@Test public void testInitiallyEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); assertThat(map.get("foo"), emptyIterable()); }
@Test public void testAppendToEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testGetAndAppendToEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); assertThat(map.getAndAppend("foo", buffer(1)), emptyIterable()); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testPutWhenKeyIsNull() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.put("key", chain(buffer(1), buffer(2))); assertThat(map.get("key"), contains(element(1), element(2))); }
@Test public void testRemoveDoubleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); assertThat(map.get("foo"), contains(element(1), element(2))); map.remove("foo"); assertThat(map.get("foo").isEmpty(), is(true)); }
@Test public void testPutDoesNotLeakWhenMappingIsNotNull() { UnlimitedPageSource source = new UnlimitedPageSource(new OffHeapBufferSource()); OffHeapChainStorageEngine<String> chainStorage = new OffHeapChainStorageEngine<>(source, StringPortability.INSTANCE, minPageSize, maxPageSize, steal, steal); ReadWriteLockedOffHeapClockCache<String, InternalChain> heads = new EvictionListeningReadWriteLockedOffHeapClockCache<>(callable -> {}, source, chainStorage); OffHeapChainMap<String> map = new OffHeapChainMap<>(heads, chainStorage); map.put("key", chain(buffer(1))); map.put("key", chain(buffer(2))); assertThat(chainStorage.getActiveChains().size(), is(0)); }
@Test public void testMismatchingReplaceSingletonChainAtHeadOnSingletonChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.replaceAtHead("foo", chain(buffer(2)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testPutWhenKeyIsNotNull() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("key", buffer(3)); map.put("key", chain(buffer(1), buffer(2))); assertThat(map.get("key"), contains(element(1), element(2))); }
@Test public void testSequenceBasedChainComparison() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); map.replaceAtHead("foo", map.get("foo"), chain()); assertThat(map.get("foo"), emptyIterable()); }
@Test public void testGetAndAppendToSingletonChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); assertThat(map.getAndAppend("foo", buffer(2)), contains(element(1))); assertThat(map.get("foo"), contains(element(1), element(2))); }
@Test public void testReplaceSingletonChainAtHeadOnDoubleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.replaceAtHead("foo", chain(buffer(1)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(42), element(2))); }
@Test public void testReplacePluralChainAtHeadOnDoubleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.replaceAtHead("foo", chain(buffer(1), buffer(2)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(42))); }
@Test public void testAppendToTripleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); map.append("foo", buffer(4)); assertThat(map.get("foo"), contains(element(1), element(2), element(3), element(4))); }
@Test public void testMismatchingReplacePluralChainAtHead() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.replaceAtHead("foo", chain(buffer(1), buffer(3)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(1), element(2))); }
@Test public void testRemoveSingleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("bar", buffer(2)); assertThat(map.get("foo"), contains(element(1))); assertThat(map.get("bar"), contains(element(2))); map.remove("foo"); assertThat(map.get("foo").isEmpty(), is(true)); assertThat(map.get("bar"), contains(element(2))); }
@Test public void testReplacePluralChainAtHeadOnTripleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); map.replaceAtHead("foo", chain(buffer(1), buffer(2)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(42), element(3))); }
@Test public void testReplacePluralChainAtHeadWithEmpty() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); long before = map.getDataOccupiedMemory(); map.replaceAtHead("foo", chain(buffer(1), buffer(2)), chain()); assertThat(map.getDataOccupiedMemory(), lessThan(before)); assertThat(map.get("foo"), contains(element(3))); }
@Test public void testGetAndAppendToTripleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); assertThat(map.getAndAppend("foo", buffer(4)), contains(element(1), element(2), element(3))); assertThat(map.get("foo"), contains(element(1), element(2), element(3), element(4))); }