Ejemplo n.º 1
0
        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));
                }
            }
        }
Ejemplo n.º 2
0
        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));
                }
            }
        }
Ejemplo n.º 3
0
        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));
                }
            }
        }
Ejemplo n.º 4
0
        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));
                }
            }
        }
Ejemplo n.º 5
0
        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);
                }
            }
        }
Ejemplo n.º 6
0
        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)));
            }
        }
Ejemplo n.º 7
0
        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));
                }
            }
        }