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/02/19 02:05:47 UTC

[04/16] incubator-geode git commit: GEODE-855: create unit test for Fragment class

GEODE-855: create unit test for Fragment class


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/45693879
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/45693879
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/45693879

Branch: refs/heads/feature/GEODE-831
Commit: 45693879573b3380f298550b8e1624ee1189f9d4
Parents: b9fe091
Author: Ken Howe <kh...@pivotal.io>
Authored: Tue Jan 26 14:11:16 2016 -0800
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Wed Feb 17 16:17:49 2016 -0800

----------------------------------------------------------------------
 .../internal/offheap/FragmentJUnitTest.java     | 280 +++++++++++++++++++
 1 file changed, 280 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/45693879/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FragmentJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FragmentJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FragmentJUnitTest.java
new file mode 100644
index 0000000..ccc6b67
--- /dev/null
+++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/offheap/FragmentJUnitTest.java
@@ -0,0 +1,280 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.gemstone.gemfire.internal.offheap;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+import static org.hamcrest.CoreMatchers.*;
+
+import java.util.Arrays;
+
+import org.assertj.core.api.JUnitSoftAssertions;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.ExpectedException;
+
+import com.gemstone.gemfire.LogWriter;
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+public class FragmentJUnitTest {
+
+  private SimpleMemoryAllocatorImpl ma;
+  private OutOfOffHeapMemoryListener ooohml;
+  private OffHeapMemoryStats stats;
+  private LogWriter lw;
+  private UnsafeMemoryChunk.Factory umcFactory;
+  private UnsafeMemoryChunk[] slabs;
+  private int numSlabs;
+
+  static {
+    ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
+  }
+  
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+  
+  @Rule
+  public JUnitSoftAssertions softly = new JUnitSoftAssertions();
+
+
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+  }
+
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    ooohml = mock(OutOfOffHeapMemoryListener.class);
+    stats = mock(OffHeapMemoryStats.class);
+    lw = mock(LogWriter.class);
+    
+    numSlabs = 2;
+    umcFactory = new UnsafeMemoryChunk.Factory(){
+      @Override
+      public UnsafeMemoryChunk create(int size) {
+        return new UnsafeMemoryChunk(size);
+      }
+    };
+    slabs = allocateMemorySlabs();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    SimpleMemoryAllocatorImpl.freeOffHeapMemory();
+  }
+  
+  private UnsafeMemoryChunk[] allocateMemorySlabs() {
+    ma = SimpleMemoryAllocatorImpl.create(ooohml, stats, lw, numSlabs, OffHeapStorage.MIN_SLAB_SIZE * numSlabs, OffHeapStorage.MIN_SLAB_SIZE, umcFactory);
+    return ma.getSlabs();
+  }
+
+  
+  @Test
+  public void fragmentConstructorThrowsExceptionForNon8ByteAlignedAddress() {
+      expectedException.expect(IllegalStateException.class);
+      expectedException.expectMessage("address was not 8 byte aligned");
+
+      new Fragment(slabs[0].getMemoryAddress() + 2, 0);
+      fail("Constructor failed to throw exception for non-8-byte alignment");
+  }
+
+  @Test
+  public void zeroSizeFragmentHasNoFreeSpace() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), 0);
+    assertThat(fragment.freeSpace(), is(0));
+  }
+
+  @Test
+  public void unallocatedFragmentHasFreeSpaceEqualToFragmentSize() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getSize()).isEqualTo((int)OffHeapStorage.MIN_SLAB_SIZE);
+    softly.assertThat(fragment.freeSpace()).isEqualTo((int)OffHeapStorage.MIN_SLAB_SIZE);
+  }
+
+  @Test
+  public void allocatingFromFragmentReducesFreeSpace() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256)).isEqualTo(true);
+    softly.assertThat(fragment.freeSpace()).isEqualTo(768);
+    softly.assertThat(fragment.getFreeIndex()).isEqualTo(256);
+  }
+
+  @Test
+  public void fragementAllocationIsUnsafeWithRespectToAllocationSize() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + (int)OffHeapStorage.MIN_SLAB_SIZE + 8)).isEqualTo(true);
+    softly.assertThat(fragment.freeSpace()).isEqualTo(-8);
+  }
+
+  @Test
+  public void getBlockSizeReturnsFreeSpace() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256)).isEqualTo(true);
+    softly.assertThat(fragment.getBlockSize()).isEqualTo(fragment.freeSpace());
+  }
+
+  @Test
+  public void getMemoryAdressIsAlwaysFragmentBaseAddress() {
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getMemoryAddress()).isEqualTo(slabs[0].getMemoryAddress());
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getMemoryAddress()).isEqualTo(slabs[0].getMemoryAddress());
+  }
+  
+  @Test
+  public void getStateIsAlwaysStateUNUSED() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getState()).isEqualTo(MemoryBlock.State.UNUSED);
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getState()).isEqualTo(MemoryBlock.State.UNUSED);
+  }
+
+  @Test
+  public void getFreeListIdIsAlwaysMinus1() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getFreeListId()).isEqualTo(-1);
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getFreeListId()).isEqualTo(-1);
+  }
+
+  @Test
+  public void getRefCountIsAlwaysZero() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getRefCount()).isEqualTo(0);
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getRefCount()).isEqualTo(0);
+  }
+
+  @Test
+  public void getDataTypeIsAlwaysNA() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getDataType()).isEqualTo("N/A");
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getDataType()).isEqualTo("N/A");
+  }
+
+  @Test
+  public void isSerializedIsAlwaysFalse() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.isSerialized()).isEqualTo(false);
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.isSerialized()).isEqualTo(false);
+  }
+
+  @Test
+  public void isCompressedIsAlwaysFalse() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.isCompressed()).isEqualTo(false);
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.isCompressed()).isEqualTo(false);
+  }
+
+  @Test
+  public void getDataValueIsAlwaysNull() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getDataValue()).isNull();
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getDataValue()).isNull();
+  }
+
+  @Test
+  public void getChunkTypeIsAlwaysNull() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    softly.assertThat(fragment.getChunkType()).isNull();
+    fragment.allocate(fragment.getFreeIndex(), fragment.getFreeIndex() + 256);
+    softly.assertThat(fragment.getChunkType()).isNull();
+  }
+
+  @Test
+  public void fragmentEqualsComparesMemoryBlockAddresses() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment0 = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    Fragment sameFragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    Fragment fragment1 = new Fragment(slabs[1].getMemoryAddress(), slabs[1].getSize());
+    softly.assertThat(fragment0.equals(sameFragment)).isEqualTo(true);
+    softly.assertThat(fragment0.equals(fragment1)).isEqualTo(false);
+  }
+
+  @Test
+  public void fragmentEqualsIsFalseForNonFragmentObjects() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment0 = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    assertThat(fragment0.equals(slabs[0]), is(false));
+  }
+
+  @Test
+  public void fragmentHashCodeIsHashCodeOfItsMemoryAddress() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment0 = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    Fragment fragment1 = new Fragment(slabs[1].getMemoryAddress(), slabs[1].getSize());
+    Long fragmentAddress = fragment0.getMemoryAddress();
+    softly.assertThat(fragment0.hashCode()).isEqualTo(fragmentAddress.hashCode())
+                                           .isNotEqualTo(fragment1.hashCode());
+  }
+
+  @Test
+  public void fragmentFillSetsAllBytesToTheSameConstantValue() {
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    Long fragmentAddress = fragment.getMemoryAddress();
+    byte[] bytes = new byte[(int)OffHeapStorage.MIN_SLAB_SIZE];
+    byte[] expectedBytes = new byte[(int)OffHeapStorage.MIN_SLAB_SIZE];
+    Arrays.fill(expectedBytes, Chunk.FILL_BYTE);;
+    fragment.fill();
+    UnsafeMemoryChunk.readAbsoluteBytes(fragmentAddress, bytes, 0, (int)OffHeapStorage.MIN_SLAB_SIZE);
+    assertThat(bytes, is(equalTo(expectedBytes)));
+  }
+
+  @Test
+  public void getNextBlockThrowsExceptionForFragment() {
+    expectedException.expect(UnsupportedOperationException.class);
+
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    fragment.getNextBlock();
+    fail("getNextBlock failed to throw UnsupportedOperationException");
+  }
+
+  @Test
+  public void getSlabIdThrowsExceptionForFragment() {
+    expectedException.expect(UnsupportedOperationException.class);
+
+    slabs = allocateMemorySlabs();
+    Fragment fragment = new Fragment(slabs[0].getMemoryAddress(), slabs[0].getSize());
+    fragment.getSlabId();
+    fail("getSlabId failed to throw UnsupportedOperationException");
+  }
+  
+}