@Test public void test_replaceAtHead_doesNotConsumeBuffer() throws Exception { ServerStore store = newStore(); ByteBuffer payload = createPayload(1L); Chain expected = newChainBuilder().build(newElementBuilder().build(payload), newElementBuilder().build(payload)); Chain update = newChainBuilder().build(newElementBuilder().build(payload)); store.replaceAtHead(1L, expected, update); MatcherAssert.assertThat(payload.remaining(), Is.is(8)); }
@Test public void test_replaceAtHead_doesNotConsumeBuffer_evenWhenOversizeMappingException() throws Exception { OffHeapServerStore store = (OffHeapServerStore) spy(newStore()); final OffHeapChainMap<Object> offHeapChainMap = getOffHeapChainMapMock(); doThrow(OversizeMappingException.class).when(offHeapChainMap).replaceAtHead(any(), any(Chain.class), any(Chain.class)); when(store.segmentFor(anyLong())).then(new Answer<Object>() { int invocations = 0; @Override public Object answer(InvocationOnMock invocation) throws Throwable { if (invocations++ < 10) { return offHeapChainMap; } else { return invocation.callRealMethod(); } } }); when(store.tryShrinkOthers(anyLong())).thenReturn(true); ByteBuffer payload = createPayload(1L); Chain expected = newChainBuilder().build(newElementBuilder().build(payload), newElementBuilder().build(payload)); Chain update = newChainBuilder().build(newElementBuilder().build(payload)); store.replaceAtHead(1L, expected, update); assertThat(payload.remaining(), is(8)); }
@Test public void test_getAndAppend_doesNotConsumeBuffer_evenWhenOversizeMappingException() throws Exception { OffHeapServerStore store = (OffHeapServerStore) spy(newStore()); final OffHeapChainMap<Object> offHeapChainMap = getOffHeapChainMapMock(); doThrow(OversizeMappingException.class).when(offHeapChainMap).getAndAppend(any(), any(ByteBuffer.class)); when(store.segmentFor(anyLong())).then(new Answer<Object>() { int invocations = 0; @Override public Object answer(InvocationOnMock invocation) throws Throwable { if (invocations++ < 10) { return offHeapChainMap; } else { return invocation.callRealMethod(); } } }); when(store.tryShrinkOthers(anyLong())).thenReturn(true); ByteBuffer payload = createPayload(1L); store.getAndAppend(1L, payload); assertThat(payload.remaining(), is(8)); Chain expected = newChainBuilder().build(newElementBuilder().build(payload), newElementBuilder().build(payload)); Chain update = newChainBuilder().build(newElementBuilder().build(payload)); store.replaceAtHead(1L, expected, update); assertThat(payload.remaining(), is(8)); }
@Test public void testReplaceAtHeadSucceedsMappingExistsHeadMatchesStrictly() throws Exception { ServerStore store = newStore(); populateStore(store); Chain existingMapping = store.get(1); store.replaceAtHead(1, existingMapping, chainBuilder.build(elementBuilder.build(createPayload(11)))); Chain chain = store.get(1); assertChainAndReverseChainOnlyHave(chain, 11); store.append(2, createPayload(22)); store.append(2, createPayload(222)); existingMapping = store.get(2); store.replaceAtHead(2, existingMapping, chainBuilder.build(elementBuilder.build(createPayload(2222)))); chain = store.get(2); assertChainAndReverseChainOnlyHave(chain, 2222); }
@Test public void testReplaceAtHeadIgnoredMappingExistsHeadMisMatch() throws Exception { ServerStore store = newStore(); populateStore(store); store.append(1, createPayload(11)); store.append(1, createPayload(111)); Chain mappingReadFirst = store.get(1); store.replaceAtHead(1, mappingReadFirst, chainBuilder.build(elementBuilder.build(createPayload(111)))); Chain current = store.get(1); assertChainAndReverseChainOnlyHave(current, 111); store.append(1, createPayload(1111)); store.replaceAtHead(1, mappingReadFirst, chainBuilder.build(elementBuilder.build(createPayload(11111)))); Chain toVerify = store.get(1); assertChainAndReverseChainOnlyHave(toVerify, 111, 1111); }
@Test public void testReplaceAtHeadSucceedsMappingExistsHeadMatches() throws Exception { ServerStore store = newStore(); populateStore(store); Chain existingMapping = store.get(1); store.append(1, createPayload(11)); store.replaceAtHead(1, existingMapping, chainBuilder.build(elementBuilder.build(createPayload(111)))); Chain chain = store.get(1); assertChainAndReverseChainOnlyHave(chain, 111, 11); store.append(2, createPayload(22)); existingMapping = store.get(2); store.append(2, createPayload(222)); store.replaceAtHead(2, existingMapping, chainBuilder.build(elementBuilder.build(createPayload(2222)))); chain = store.get(2); assertChainAndReverseChainOnlyHave(chain, 2222, 222); }