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