public void TestBlockStoragePersistent() { using (var ms = new MemoryStream()) { var storage = new BlockStorage(ms); using (var firstBlock = storage.CreateNew()) using (var secondBlock = storage.CreateNew()) using (var thirdBlock = storage.CreateNew()) { Assert.AreEqual(0, firstBlock.Id); Assert.AreEqual(1, secondBlock.Id); secondBlock.SetHeader(1, 100); secondBlock.SetHeader(2, 200); Assert.AreEqual(2, thirdBlock.Id); Assert.AreEqual(storage.BlockSize * 3, ms.Length); } // Test to make sure our creation persists var storage2 = new BlockStorage(ms); Assert.AreEqual(0, storage2.Find(0).Id); Assert.AreEqual(1, storage2.Find(1).Id); Assert.AreEqual(2, storage2.Find(2).Id); Assert.AreEqual(100, storage2.Find(1).GetHeader(1)); Assert.AreEqual(200, storage2.Find(1).GetHeader(2)); } }
public void TestManangingBlockInstances() { var manager = new BlockStorage(new MemoryStream()); var a = manager.CreateNew(); var b = manager.CreateNew(); Assert.AreSame(a, manager.Find(0)); Assert.AreSame(b, manager.Find(1)); Assert.AreNotSame(a, b); a.Dispose(); Assert.AreNotSame(a, manager.Find(0)); }
public void Test8KBlock() { using (var ms = new MemoryStream()) { var blockStorage = new BlockStorage(ms, 12288, 48); using (var block = blockStorage.CreateNew()) { Assert.Throws <ArgumentOutOfRangeException>(delegate { block.Write(new byte[4048], 0, 1, 8192); }); Assert.Throws <ArgumentOutOfRangeException>(delegate { block.Write(new byte[4048], 0, 0, 8193); }); } // Test data var data = UnitTestHelper.RandomData(8192); var ex0 = new byte[blockStorage.BlockContentSize]; var ex1 = new byte[2381]; var ex2 = new byte[37]; var ex3 = new byte[137]; var ex4 = new byte[6028]; var ex5 = new byte[1000]; Buffer.BlockCopy(src: data, srcOffset: 16, dst: ex0, dstOffset: 1294, count: 2381); Buffer.BlockCopy(src: data, srcOffset: 16, dst: ex1, dstOffset: 0, count: 2381); Buffer.BlockCopy(src: data, srcOffset: 16, dst: ex2, dstOffset: 0, count: 37); Buffer.BlockCopy(src: data, srcOffset: 32, dst: ex3, dstOffset: 0, count: 137); Buffer.BlockCopy(src: data, srcOffset: 32, dst: ex4, dstOffset: 0, count: 6028); Buffer.BlockCopy(src: data, srcOffset: 32, dst: ex5, dstOffset: 0, count: 1000); // Test using (var a = blockStorage.CreateNew()) using (var b = blockStorage.CreateNew()) using (var c = blockStorage.CreateNew()) using (var d = blockStorage.CreateNew()) using (var e = blockStorage.CreateNew()) { // Write a.Write(src: data, srcOffset: 16, dstOffset: 1294, count: 2381); b.Write(src: data, srcOffset: 16, dstOffset: 12, count: 37); c.Write(src: data, srcOffset: 32, dstOffset: 4078, count: 137); d.Write(src: data, srcOffset: 32, dstOffset: 4048, count: 6028); e.Write(src: data, srcOffset: 32, dstOffset: 4096 - 1000 - 48, count: 1000); // Assert var t0 = new byte[blockStorage.BlockContentSize]; var t1 = new byte[2381]; var t2 = new byte[37]; var t3 = new byte[137]; var t4 = new byte[6028]; var t5 = new byte[1000]; a.Read(dst: t0, dstOffset: 0, srcOffset: 0, count: t0.Length); a.Read(dst: t1, dstOffset: 0, srcOffset: 1294, count: 2381); b.Read(dst: t2, dstOffset: 0, srcOffset: 12, count: 37); c.Read(dst: t3, dstOffset: 0, srcOffset: 4078, count: 137); d.Read(dst: t4, dstOffset: 0, srcOffset: 4048, count: 6028); e.Read(dst: t5, dstOffset: 0, srcOffset: 4096 - 1000 - 48, count: 1000); Assert.IsTrue(ex0.SequenceEqual(t0)); Assert.IsTrue(ex1.SequenceEqual(t1)); Assert.IsTrue(ex2.SequenceEqual(t2)); Assert.IsTrue(ex3.SequenceEqual(t3)); Assert.IsTrue(ex4.SequenceEqual(t4)); Assert.IsTrue(ex5.SequenceEqual(t5)); } // Test persistent blockStorage = new BlockStorage(new MemoryStream(ms.ToArray()), 12288, 48); using (var a = blockStorage.Find(1)) using (var b = blockStorage.Find(2)) using (var c = blockStorage.Find(3)) using (var d = blockStorage.Find(4)) using (var e = blockStorage.Find(5)) { // Assert var t1 = new byte[2381]; var t2 = new byte[37]; var t3 = new byte[137]; var t4 = new byte[6028]; var t5 = new byte[1000]; a.Read(dst: t1, dstOffset: 0, srcOffset: 1294, count: 2381); b.Read(dst: t2, dstOffset: 0, srcOffset: 12, count: 37); c.Read(dst: t3, dstOffset: 0, srcOffset: 4078, count: 137); d.Read(dst: t4, dstOffset: 0, srcOffset: 4048, count: 6028); e.Read(dst: t5, dstOffset: 0, srcOffset: 4096 - 1000 - 48, count: 1000); Assert.IsTrue(ex1.SequenceEqual(t1)); Assert.IsTrue(ex2.SequenceEqual(t2)); Assert.IsTrue(ex3.SequenceEqual(t3)); Assert.IsTrue(ex4.SequenceEqual(t4)); Assert.IsTrue(ex5.SequenceEqual(t5)); } } }
public void Test4kBlock() { using (var ms = new MemoryStream()) { var blockStorage = new BlockStorage(ms, 4096, 48); using (var block = blockStorage.CreateNew()) { Assert.Throws <ArgumentOutOfRangeException>(delegate { block.Write(new byte[4048], 0, 1, 4048); }); Assert.Throws <ArgumentOutOfRangeException>(delegate { block.Write(new byte[4048], 0, 0, 4049); }); } // Generate random data var d1 = UnitTestHelper.RandomData(4048); var d2 = UnitTestHelper.RandomData(1294); var d3 = UnitTestHelper.RandomData(4048); // Write using (var a = blockStorage.CreateNew()) using (var b = blockStorage.CreateNew()) using (var c = blockStorage.CreateNew()) { // Write a.Write(d1, 0, 0, 4048); b.Write(d2, 0, 0, 1294); c.Write(d3, 0, 0, 4048); var r1 = new byte[4048]; a.Read(r1, 0, 0, 4048); var r2 = new byte[1294]; b.Read(r2, 0, 0, 1294); var r3 = new byte[4048]; c.Read(r3, 0, 0, 4048); Assert.True(d1.SequenceEqual(r1)); Assert.True(d2.SequenceEqual(r2)); Assert.True(d3.SequenceEqual(r3)); } // Test persistence blockStorage = new BlockStorage(new MemoryStream(ms.ToArray()), 4096, 48); using (var a = blockStorage.Find(1u)) using (var b = blockStorage.Find(2u)) using (var c = blockStorage.Find(3u)) { var r1 = new byte[4048]; a.Read(r1, 0, 0, 4048); var r2 = new byte[1294]; b.Read(r2, 0, 0, 1294); var r3 = new byte[4048]; c.Read(r3, 0, 0, 4048); Assert.True(d1.SequenceEqual(r1)); Assert.True(d2.SequenceEqual(r2)); Assert.True(d3.SequenceEqual(r3)); } } }