@Test public void destroyWithConcurrentChangeFromNullToValidRetriesAndDoesDestroy() throws RegionClearedException { CustomEntryConcurrentHashMap<Object, EvictableEntry> map = mock(CustomEntryConcurrentHashMap.class); EvictableEntry entry = mock(EvictableEntry.class); when(entry.getValue()).thenReturn("value"); when(entry.destroy(any(), any(), anyBoolean(), anyBoolean(), any(), anyBoolean(), anyBoolean())) .thenReturn(true); when(map.get(KEY)).thenReturn(null).thenReturn(entry); when(map.putIfAbsent(eq(KEY), any())).thenReturn(entry); final TestableVMLRURegionMap arm = new TestableVMLRURegionMap(true, map); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; final boolean evict = false; assertThat(arm.destroy(event, inTokenMode, duringRI, false, evict, expectedOldValue, false)) .isTrue(); verify(entry, times(1)).destroy(eq(arm._getOwner()), eq(event), eq(false), anyBoolean(), eq(expectedOldValue), anyBoolean(), anyBoolean()); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void destroyWithConcurrentChangeFromTombstoneToValidRetriesAndDoesDestroy() throws RegionClearedException { CustomEntryConcurrentHashMap<Object, EvictableEntry> map = mock(CustomEntryConcurrentHashMap.class); EvictableEntry entry = mock(EvictableEntry.class); when(entry.getValue()).thenReturn("value"); when(entry.isTombstone()).thenReturn(true).thenReturn(false); when(entry.destroy(any(), any(), anyBoolean(), anyBoolean(), any(), anyBoolean(), anyBoolean())) .thenReturn(true); when(map.get(KEY)).thenReturn(entry); final TestableVMLRURegionMap arm = new TestableVMLRURegionMap(true, map); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; final boolean evict = false; assertThat(arm.destroy(event, inTokenMode, duringRI, false, evict, expectedOldValue, false)) .isTrue(); verify(entry, times(1)).destroy(eq(arm._getOwner()), eq(event), eq(false), anyBoolean(), eq(expectedOldValue), anyBoolean(), anyBoolean()); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void evictDestroyWithExistingTombstoneInUseByTransactionInTokenModeDoesNothing() throws RegionClearedException { CustomEntryConcurrentHashMap<String, EvictableEntry> map = mock(CustomEntryConcurrentHashMap.class); EvictableEntry entry = mock(EvictableEntry.class); when(entry.isInUseByTransaction()).thenReturn(true); when(entry.getValue()).thenReturn(Token.TOMBSTONE); when(map.get(KEY)).thenReturn(entry); final TestableVMLRURegionMap arm = new TestableVMLRURegionMap(true, map); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); final Object expectedOldValue = null; final boolean inTokenMode = true; final boolean duringRI = false; final boolean evict = true; assertThat(arm.destroy(event, inTokenMode, duringRI, false, evict, expectedOldValue, false)) .isFalse(); verify(entry, never()).destroy(any(), any(), anyBoolean(), anyBoolean(), any(), anyBoolean(), anyBoolean()); verify(arm._getOwner(), never()).basicDestroyPart2(any(), any(), anyBoolean(), anyBoolean(), anyBoolean(), anyBoolean()); verify(arm._getOwner(), never()).basicDestroyPart3(any(), any(), anyBoolean(), anyBoolean(), anyBoolean(), any()); }
Object curVal = le.getValue(); // OFFHEAP: _getValue ok if (curVal != cd) { if (cd instanceof StoredObject) {