You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2016/01/27 01:20:10 UTC
[11/11] incubator-geode git commit: now uses assertThat. Added more
test coverage
now uses assertThat. Added more test coverage
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/3dd04f2f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/3dd04f2f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/3dd04f2f
Branch: refs/heads/feature/GEODE-831
Commit: 3dd04f2f42b76330cf4823b8b5061e2a4fcafa7f
Parents: 062fdad
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Tue Jan 26 16:19:11 2016 -0800
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Tue Jan 26 16:19:11 2016 -0800
----------------------------------------------------------------------
.../internal/offheap/FreeListManager.java | 5 +-
.../internal/offheap/FreeListManagerTest.java | 238 ++++++++++++++++---
2 files changed, 205 insertions(+), 38 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3dd04f2f/gemfire-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
index 8a39f76..9d759f5 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
@@ -300,7 +300,7 @@ public class FreeListManager {
* Or to prevent it from happening we could just check the incoming slabs and throw away a few bytes
* to keep them from being contiguous.
*/
- private boolean compact(int chunkSize) {
+ boolean compact(int chunkSize) {
final long startCompactionTime = this.ma.getStats().startCompaction();
final int countPreSync = this.compactCount.get();
try {
@@ -322,9 +322,6 @@ public class FreeListManager {
while (addr != 0) {
int idx = Arrays.binarySearch(sorted, 0, sortedSize, addr);
//System.out.println("DEBUG addr=" + addr + " size=" + Chunk.getSize(addr) + " idx="+idx + " sortedSize=" + sortedSize);
- if (idx >= 0) {
- throw new IllegalStateException("duplicate memory address found during compaction!");
- }
idx = -idx;
idx--;
if (idx == sortedSize) {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3dd04f2f/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
index 867ed29..e90fa11 100644
--- a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FreeListManagerTest.java
@@ -1,7 +1,11 @@
package com.gemstone.gemfire.internal.offheap;
-import static org.junit.Assert.*;
+//import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
+import static com.googlecode.catchexception.CatchException.*;
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.ArrayList;
import org.junit.After;
import org.junit.AfterClass;
@@ -10,13 +14,16 @@ import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
+import com.gemstone.gemfire.OutOfOffHeapMemoryException;
+
public class FreeListManagerTest {
static {
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
}
+ private final int DEFAULT_SLAB_SIZE = 1024*1024*5;
private final SimpleMemoryAllocatorImpl ma = mock(SimpleMemoryAllocatorImpl.class);
- private final UnsafeMemoryChunk slab = new UnsafeMemoryChunk(1024*1024*5);
+ private final UnsafeMemoryChunk slab = new UnsafeMemoryChunk(DEFAULT_SLAB_SIZE);
private final OffHeapMemoryStats stats = mock(OffHeapMemoryStats.class);
private FreeListManager freeListManager;
@@ -31,92 +38,171 @@ public class FreeListManagerTest {
@Before
public void setUp() throws Exception {
- when(ma.getTotalMemory()).thenReturn((long) slab.getSize());
when(ma.getStats()).thenReturn(stats);
-
- this.freeListManager = new FreeListManager(ma, new UnsafeMemoryChunk[] {slab});
}
@After
public void tearDown() throws Exception {
- slab.release();
+ if (this.freeListManager != null) {
+ this.freeListManager.freeSlabs();
+ }
+ }
+
+ private void setUpSingleSlabManager() {
+ this.freeListManager = new FreeListManager(ma, new UnsafeMemoryChunk[] {slab});
}
@Test
public void usedMemoryIsZeroOnDefault() {
- assertEquals(0, this.freeListManager.getUsedMemory());
+ setUpSingleSlabManager();
+ assertThat(this.freeListManager.getUsedMemory()).isZero();
}
@Test
- public void freeMemoryIsAllocatorTotalOnDefault() {
- assertEquals(ma.getTotalMemory(), this.freeListManager.getFreeMemory());
+ public void freeMemoryIsSlabSizeOnDefault() {
+ setUpSingleSlabManager();
+ assertThat(this.freeListManager.getFreeMemory()).isEqualTo(DEFAULT_SLAB_SIZE);
+ }
+
+ @Test
+ public void totalMemoryIsSlabSizeOnDefault() {
+ setUpSingleSlabManager();
+ assertThat(this.freeListManager.getTotalMemory()).isEqualTo(DEFAULT_SLAB_SIZE);
}
@Test
public void allocateTinyChunkHasCorrectSize() {
+ setUpSingleSlabManager();
int tinySize = 10;
+
Chunk c = this.freeListManager.allocate(tinySize);
- assertNotNull(c);
- assertEquals(tinySize, c.getDataSize());
- assertEquals(computeExpectedSize(tinySize), c.getSize());
+
+ validateChunkSizes(c, tinySize);
+ }
+
+ private void validateChunkSizes(Chunk c, int dataSize) {
+ assertThat(c).isNotNull();
+ assertThat(c.getDataSize()).isEqualTo(dataSize);
+ assertThat(c.getSize()).isEqualTo(computeExpectedSize(dataSize));
}
@Test
public void allocateTinyChunkFromFreeListHasCorrectSize() {
+ setUpSingleSlabManager();
int tinySize = 10;
+
Chunk c = this.freeListManager.allocate(tinySize);
- assertNotNull(c);
Chunk.release(c.getMemoryAddress(), this.freeListManager);
c = this.freeListManager.allocate(tinySize);
- assertEquals(tinySize, c.getDataSize());
- assertEquals(computeExpectedSize(tinySize), c.getSize());
+
+ validateChunkSizes(c, tinySize);
}
@Test
public void allocateTinyChunkFromEmptyFreeListHasCorrectSize() {
+ setUpSingleSlabManager();
int dataSize = 10;
+
Chunk c = this.freeListManager.allocate(dataSize);
- assertNotNull(c);
Chunk.release(c.getMemoryAddress(), this.freeListManager);
this.freeListManager.allocate(dataSize);
// free list will now be empty
c = this.freeListManager.allocate(dataSize);
- assertEquals(dataSize, c.getDataSize());
- assertEquals(computeExpectedSize(dataSize), c.getSize());
+
+ validateChunkSizes(c, dataSize);
}
@Test
public void allocateHugeChunkHasCorrectSize() {
+ setUpSingleSlabManager();
int hugeSize = FreeListManager.MAX_TINY+1;
+
Chunk c = this.freeListManager.allocate(hugeSize);
- assertNotNull(c);
- assertEquals(hugeSize, c.getDataSize());
- assertEquals(computeExpectedSize(hugeSize), c.getSize());
+
+ validateChunkSizes(c, hugeSize);
}
@Test
public void allocateHugeChunkFromEmptyFreeListHasCorrectSize() {
+ setUpSingleSlabManager();
int dataSize = FreeListManager.MAX_TINY+1;
+
Chunk c = this.freeListManager.allocate(dataSize);
- assertNotNull(c);
Chunk.release(c.getMemoryAddress(), this.freeListManager);
this.freeListManager.allocate(dataSize);
// free list will now be empty
c = this.freeListManager.allocate(dataSize);
- assertEquals(dataSize, c.getDataSize());
- assertEquals(computeExpectedSize(dataSize), c.getSize());
+
+ validateChunkSizes(c, dataSize);
}
@Test
public void allocateHugeChunkFromFragmentWithItemInFreeListHasCorrectSize() {
+ setUpSingleSlabManager();
int dataSize = FreeListManager.MAX_TINY+1+1024;
+
Chunk c = this.freeListManager.allocate(dataSize);
- assertNotNull(c);
Chunk.release(c.getMemoryAddress(), this.freeListManager);
dataSize = FreeListManager.MAX_TINY+1;
c = this.freeListManager.allocate(dataSize);
- assertEquals(dataSize, c.getDataSize());
- assertEquals(computeExpectedSize(dataSize), c.getSize());
+
+ validateChunkSizes(c, dataSize);
+ }
+ @Test
+ public void freeTinyMemoryDefault() {
+ setUpSingleSlabManager();
+
+ assertThat(this.freeListManager.getFreeTinyMemory()).isZero();
+ }
+ @Test
+ public void freeTinyMemoryEqualToChunkSize() {
+ setUpSingleSlabManager();
+ int dataSize = 10;
+
+ Chunk c = this.freeListManager.allocate(dataSize);
+ Chunk.release(c.getMemoryAddress(), this.freeListManager);
+
+ assertThat(this.freeListManager.getFreeTinyMemory()).isEqualTo(computeExpectedSize(dataSize));
+ }
+
+ @Test
+ public void freeHugeMemoryDefault() {
+ setUpSingleSlabManager();
+
+ assertThat(this.freeListManager.getFreeHugeMemory()).isZero();
+ }
+ @Test
+ public void freeHugeMemoryEqualToChunkSize() {
+ setUpSingleSlabManager();
+ int dataSize = FreeListManager.MAX_TINY+1+1024;
+
+ Chunk c = this.freeListManager.allocate(dataSize);
+ Chunk.release(c.getMemoryAddress(), this.freeListManager);
+
+ assertThat(this.freeListManager.getFreeHugeMemory()).isEqualTo(computeExpectedSize(dataSize));
+ }
+
+ @Test
+ public void freeFragmentMemoryDefault() {
+ setUpSingleSlabManager();
+
+ assertThat(this.freeListManager.getFreeFragmentMemory()).isEqualTo(DEFAULT_SLAB_SIZE);
+ }
+
+ @Test
+ public void freeFragmentMemorySomeOfFragmentAllocated() {
+ setUpSingleSlabManager();
+ Chunk c = this.freeListManager.allocate(DEFAULT_SLAB_SIZE/4-8);
+
+ assertThat(this.freeListManager.getFreeFragmentMemory()).isEqualTo((DEFAULT_SLAB_SIZE/4)*3);
+ }
+
+ @Test
+ public void freeFragmentMemoryMostOfFragmentAllocated() {
+ setUpSingleSlabManager();
+ Chunk c = this.freeListManager.allocate(DEFAULT_SLAB_SIZE-8-8);
+
+ assertThat(this.freeListManager.getFreeFragmentMemory()).isZero();
}
private int computeExpectedSize(int dataSize) {
@@ -125,11 +211,95 @@ public class FreeListManagerTest {
@Test(expected = AssertionError.class)
public void allocateZeroThrowsAssertion() {
+ setUpSingleSlabManager();
this.freeListManager.allocate(0);
}
+ @Test
+ public void allocateFromMultipleSlabs() {
+ int SMALL_SLAB = 16;
+ int MEDIUM_SLAB = 128;
+ this.freeListManager = new FreeListManager(ma, new UnsafeMemoryChunk[] {
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(MEDIUM_SLAB),
+ slab});
+ this.freeListManager.allocate(SMALL_SLAB-8+1);
+ this.freeListManager.allocate(DEFAULT_SLAB_SIZE-8);
+ this.freeListManager.allocate(SMALL_SLAB-8+1);
+ assertThat(this.freeListManager.getFreeMemory()).isEqualTo(SMALL_SLAB*2+MEDIUM_SLAB-((SMALL_SLAB+8)*2));
+ assertThat(this.freeListManager.getUsedMemory()).isEqualTo(DEFAULT_SLAB_SIZE+(SMALL_SLAB+8)*2);
+ assertThat(this.freeListManager.getTotalMemory()).isEqualTo(DEFAULT_SLAB_SIZE+MEDIUM_SLAB+SMALL_SLAB*2);
+ }
+
+ @Test
+ public void compactWithLargeChunkSizeReturnsFalse() {
+ int SMALL_SLAB = 16;
+ int MEDIUM_SLAB = 128;
+ this.freeListManager = new FreeListManager(ma, new UnsafeMemoryChunk[] {
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(MEDIUM_SLAB),
+ slab});
+ ArrayList<Chunk> chunks = new ArrayList<>();
+ chunks.add(this.freeListManager.allocate(SMALL_SLAB-8+1));
+ chunks.add(this.freeListManager.allocate(DEFAULT_SLAB_SIZE/2-8));
+ chunks.add(this.freeListManager.allocate(DEFAULT_SLAB_SIZE/2-8));
+ chunks.add(this.freeListManager.allocate(SMALL_SLAB-8+1));
+ for (Chunk c: chunks) {
+ Chunk.release(c.getMemoryAddress(), this.freeListManager);
+ }
+
+ assertThat(this.freeListManager.compact(DEFAULT_SLAB_SIZE+1)).isFalse();
+ }
+
+ @Test
+ public void compactWithChunkSizeOfMaxSlabReturnsTrue() {
+ int SMALL_SLAB = 16;
+ int MEDIUM_SLAB = 128;
+ this.freeListManager = new FreeListManager(ma, new UnsafeMemoryChunk[] {
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(SMALL_SLAB),
+ new UnsafeMemoryChunk(MEDIUM_SLAB),
+ slab});
+ ArrayList<Chunk> chunks = new ArrayList<>();
+ chunks.add(this.freeListManager.allocate(SMALL_SLAB-8+1));
+ chunks.add(this.freeListManager.allocate(DEFAULT_SLAB_SIZE/2-8));
+ chunks.add(this.freeListManager.allocate(DEFAULT_SLAB_SIZE/2-8));
+ chunks.add(this.freeListManager.allocate(SMALL_SLAB-8+1));
+ for (Chunk c: chunks) {
+ Chunk.release(c.getMemoryAddress(), this.freeListManager);
+ }
+
+ assertThat(this.freeListManager.compact(DEFAULT_SLAB_SIZE)).isTrue();
+ }
+
+ @Test
+ public void maxAllocationUsesAllMemory() {
+ setUpSingleSlabManager();
+
+ this.freeListManager.allocate(DEFAULT_SLAB_SIZE-8);
+
+ assertThat(this.freeListManager.getFreeMemory()).isZero();
+ assertThat(this.freeListManager.getUsedMemory()).isEqualTo(DEFAULT_SLAB_SIZE);
+ }
+
+
+ @Test
+ public void overMaxAllocationFails() {
+ setUpSingleSlabManager();
+ OutOfOffHeapMemoryListener ooohml = mock(OutOfOffHeapMemoryListener.class);
+ when(this.ma.getOutOfOffHeapMemoryListener()).thenReturn(ooohml);
+
+ catchException(this.freeListManager).allocate(DEFAULT_SLAB_SIZE-7);
+
+ assertThat((Exception)caughtException()).isInstanceOf(OutOfOffHeapMemoryException.class);
+ verify(ooohml).outOfOffHeapMemory(caughtException());
+ }
+
@Test(expected = AssertionError.class)
public void allocateNegativeThrowsAssertion() {
+ setUpSingleSlabManager();
this.freeListManager.allocate(-123);
}
@@ -139,7 +309,7 @@ public class FreeListManagerTest {
FreeListManager.verifyHugeMultiple(-1);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("HUGE_MULTIPLE must be >= 0 and <= " + FreeListManager.HUGE_MULTIPLE + " but it was -1"));
+ assertThat(expected.getMessage()).contains("HUGE_MULTIPLE must be >= 0 and <= " + FreeListManager.HUGE_MULTIPLE + " but it was -1");
}
}
@Test
@@ -148,7 +318,7 @@ public class FreeListManagerTest {
FreeListManager.verifyHugeMultiple(257);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("HUGE_MULTIPLE must be >= 0 and <= 256 but it was 257"));
+ assertThat(expected.getMessage()).contains("HUGE_MULTIPLE must be >= 0 and <= 256 but it was 257");
}
}
@Test
@@ -162,7 +332,7 @@ public class FreeListManagerTest {
FreeListManager.verifyOffHeapFreeListCount(-1);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("gemfire.OFF_HEAP_FREE_LIST_COUNT must be >= 1."));
+ assertThat(expected.getMessage()).contains("gemfire.OFF_HEAP_FREE_LIST_COUNT must be >= 1.");
}
}
@Test
@@ -171,7 +341,7 @@ public class FreeListManagerTest {
FreeListManager.verifyOffHeapFreeListCount(0);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("gemfire.OFF_HEAP_FREE_LIST_COUNT must be >= 1."));
+ assertThat(expected.getMessage()).contains("gemfire.OFF_HEAP_FREE_LIST_COUNT must be >= 1.");
}
}
@Test
@@ -184,7 +354,7 @@ public class FreeListManagerTest {
FreeListManager.verifyOffHeapAlignment(-1);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("gemfire.OFF_HEAP_ALIGNMENT must be a multiple of 8"));
+ assertThat(expected.getMessage()).contains("gemfire.OFF_HEAP_ALIGNMENT must be a multiple of 8");
}
}
@Test
@@ -193,7 +363,7 @@ public class FreeListManagerTest {
FreeListManager.verifyOffHeapAlignment(9);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("gemfire.OFF_HEAP_ALIGNMENT must be a multiple of 8"));
+ assertThat(expected.getMessage()).contains("gemfire.OFF_HEAP_ALIGNMENT must be a multiple of 8");
}
}
@Test
@@ -202,7 +372,7 @@ public class FreeListManagerTest {
FreeListManager.verifyOffHeapAlignment(256+8);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
- assertEquals(true, expected.getMessage().contains("gemfire.OFF_HEAP_ALIGNMENT must be <= 256"));
+ assertThat(expected.getMessage()).contains("gemfire.OFF_HEAP_ALIGNMENT must be <= 256");
}
}
@Test