package net.yadan.banana.memory.block; import static org.junit.Assert.assertEquals; import net.yadan.banana.memory.IBlockAllocator; import net.yadan.banana.memory.MemInitializer; import net.yadan.banana.memory.initializers.MemSetInitializer; import org.junit.Test; public class BigBlockAllocatorTest extends AbstractBlockAllocatorTest { private static final int MAX_INTS_PER_ARRAY = 20; static { System.setProperty("BigIntBlockAllocator.MAX_INTS_PER_ARRAY", "" + MAX_INTS_PER_ARRAY); } @Override public IBlockAllocator create(int numBlocks, int blockSize, double growthFactor, MemInitializer initializer) { BigBlockAllocator m = new BigBlockAllocator(numBlocks, blockSize, growthFactor, initializer); m.setDebug(true); return m; }; @Test public void testGrowthInsideLastBlock() { int initialMax = 10; int pointers[] = new int[initialMax]; double growthFactor = 2.0; a = create(initialMax, 2, growthFactor, new MemSetInitializer(-1)); for (int i = 0; i < initialMax; i++) { int p = a.malloc(); a.setLong(p, 0, i); pointers[i] = p; } assertEquals(0, a.freeBlocks()); assertEquals(initialMax, a.maxBlocks()); a.malloc(); // grow assertEquals((int) (initialMax * growthFactor), a.maxBlocks()); assertEquals(initialMax + 1, a.usedBlocks()); assertEquals(a.maxBlocks() - a.usedBlocks(), a.freeBlocks()); for (int i = 0; i < initialMax; i++) { assertEquals(i, a.getLong(pointers[i], 0)); } a.clear(); } @Test public void testGrowthOverBlocks() { int initialMax = 12; int pointers[] = new int[initialMax]; double growthFactor = 2.0; int blockSize = 1; a = create(initialMax, blockSize, growthFactor, null); assertEquals(4 * (initialMax + 1) * blockSize, a.computeMemoryUsage()); for (int i = 0; i < initialMax; i++) { int p = a.malloc(); a.setInt(p, 0, i); pointers[i] = p; } assertEquals(0, a.freeBlocks()); assertEquals(initialMax, a.maxBlocks()); assertEquals(initialMax, a.usedBlocks()); a.malloc(); // grow * 2 assertEquals((int) (initialMax * growthFactor), a.maxBlocks()); assertEquals(initialMax + 1, a.usedBlocks()); assertEquals(a.maxBlocks() - a.usedBlocks(), a.freeBlocks()); // + 1 for reserved block assertEquals(4 * (a.maxBlocks() + 1), a.computeMemoryUsage()); for (int i = 0; i < initialMax; i++) { assertEquals(i, a.getInt(pointers[i], 0)); } a.clear(); } @Test public void testGrowthOverBlocksWithBigGrowth() { int initialMax = 12; int pointers[] = new int[initialMax]; int growthFactor = 5; a = create(initialMax, 1, growthFactor, null); for (int i = 0; i < initialMax; i++) { int p = a.malloc(); a.setInt(p, 0, i); pointers[i] = p; } assertEquals(initialMax, a.usedBlocks()); assertEquals(0, a.freeBlocks()); assertEquals(initialMax, a.maxBlocks()); a.malloc(); // grow assertEquals(initialMax + 1, a.usedBlocks()); assertEquals(initialMax * 5, a.maxBlocks()); // +1 block for reserved assertEquals(4 * (1 + a.maxBlocks()), a.computeMemoryUsage()); for (int i = 0; i < initialMax; i++) { assertEquals(i, a.getInt(pointers[i], 0)); } a.clear(); } @Test public void testMultiArrayIntAccess() { a = create(60, 1, 2.0, null); int pointers[] = new int[a.maxBlocks()]; for (int i = 0; i < a.maxBlocks(); i++) { int p = a.malloc(); pointers[i] = p; a.setInt(p, 0, i); assertEquals(i, a.getInt(p, 0)); } for (int i = 0; i < a.maxBlocks(); i++) { a.free(pointers[i]); } } }