public void FixedSizeItemsLength() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); var memoryManager = new MemoryManager(fsm, manager); int count = 1000; var items = new Dictionary <DbItemReference, byte[]>(); var r = new Random(); // allocate items for (int i = 0; i < count; i++) { var sizeRange = GetRandomFixedSizeItemsSizeRange(); var content = GenerateRandomSequence(DbItem.GetMaxSize(sizeRange) - r.Next(5)); var reference = memoryManager.Allocate(content); items[reference] = content; } // check lengths foreach (var reference in items.Keys) { Assert.AreEqual(items[reference].Length, memoryManager.GetLength(reference)); } } }
public void FixedSizeItemsAllocation() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); var memoryManager = new MemoryManager(fsm, manager); int count = 100000; var items = new Dictionary <DbItemReference, byte[]>(); // allocate items for (int i = 0; i < count; i++) { var sizeRange = GetRandomFixedSizeItemsSizeRange(); var content = GenerateRandomSequence(DbItem.GetMaxSize(sizeRange)); var reference = memoryManager.Allocate(content); items[reference] = content; } // check contents foreach (var reference in items.Keys) { Assert.IsTrue(AreEqualByteArrays(items[reference], memoryManager.Get(reference).RawData)); } // free half of the items var freedItems = new Dictionary <DbItemReference, byte[]>(); foreach (var reference in items.Keys) { if (_r.NextDouble() > 0.5) { memoryManager.Free(reference); freedItems[reference] = items[reference]; } } // check that the items do not exist foreach (var reference in freedItems.Keys) { Assert.IsNull(memoryManager.Get(reference)); } // and the remaining items still available foreach (var reference in items.Keys.Where(item => !freedItems.ContainsKey(item))) { Assert.IsTrue(AreEqualByteArrays(items[reference], memoryManager.Get(reference).RawData)); } } }
public void OnEmptyStorageShouldReturnMinusOneForRequestedFreePageIndex() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); foreach (var fsmValue in EnumHelper.FixedSizeItemsFsmValues()) { Assert.AreEqual(-1, fsm.GetFreePageIndex(fsmValue)); } } }
public void OnEmptyStorageAllRequestedPagesShouldBeFull() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); int entryCount = PageFormatter.GetFsmEntryCount(manager.FetchPage(1)); for (int i = 0; i < entryCount; i++) { Assert.AreEqual(FsmValue.Full, fsm.Get(i)); } } }
public void MultiPageOperations() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); int entryPerPage = PageFormatter.GetFsmEntryCount(manager.FetchPage(1)); int entryCount = entryPerPage * 3; // check writing to the last page var value = FsmValue.Class0; var index = entryCount - 1; fsm.Set(index, value); Assert.AreEqual(value, fsm.Get(index)); // middle page value = FsmValue.Class1; index = entryPerPage + 1; fsm.Set(index, value); Assert.AreEqual(value, fsm.Get(index)); // the first page value = FsmValue.Class2; index = entryPerPage - 1; fsm.Set(index, value); Assert.AreEqual(value, fsm.Get(index)); for (int i = 0; i < entryCount; i++) { fsm.Set(i, FsmValue.Class3); } for (int i = 0; i < entryCount; i++) { long pageIndex = fsm.GetFreePageIndex(FsmValue.Class3); Assert.AreNotEqual(-1, pageIndex); fsm.Set(i, FsmValue.Full); } } }
public void MultipageItemSegments() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); var memoryManager = new MemoryManager(fsm, manager); var content = GenerateRandomSequence(4096 * 5 + 100); DbItemReference reference = memoryManager.Allocate(content); // check full content Assert.IsTrue(AreEqualByteArrays(content, memoryManager.GetItemSegment(reference, 0, content.Length - 1))); var bytes = new byte[2]; // check first two bytes Array.Copy(content, 0, bytes, 0, 2); Assert.IsTrue(AreEqualByteArrays(bytes, memoryManager.GetItemSegment(reference, 0, 1))); // check next two bytes Array.Copy(content, 2, bytes, 0, 2); Assert.IsTrue(AreEqualByteArrays(bytes, memoryManager.GetItemSegment(reference, 2, 3))); // check last two bytes Array.Copy(content, content.Length - 2, bytes, 0, 2); Assert.IsTrue(AreEqualByteArrays(bytes, memoryManager.GetItemSegment(reference, content.Length - 2, content.Length - 1))); //last but two bytes Array.Copy(content, content.Length - 4, bytes, 0, 2); Assert.IsTrue(AreEqualByteArrays(bytes, memoryManager.GetItemSegment(reference, content.Length - 4, content.Length - 3))); //all except first two bytes and last two bytes bytes = new byte[content.Length - 4]; Array.Copy(content, 2, bytes, 0, content.Length - 4); Assert.IsTrue(AreEqualByteArrays(bytes, memoryManager.GetItemSegment(reference, 2, content.Length - 3))); } }
public void SinglePageOperations() { var manager = new FileSystemPageManager(4096); using (var storage = new Storage(manager)) { storage.CreateNew(StoragePath); var fsm = new FreeSpaceMap(manager); var r = new Random(); int entryCount = PageFormatter.GetFsmEntryCount(manager.FetchPage(1)); for (int i = 0; i < 100000; i++) { var value = (FsmValue)r.Next((int)FsmValue.Max); var index = r.Next(entryCount); fsm.Set(index, value); Assert.AreEqual(value, fsm.Get(index)); } } }