diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/AsciiDecoder.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/AsciiDecoder.cs index 10e95d2e56..634efc65db 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/AsciiDecoder.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/AsciiDecoder.cs @@ -14,23 +14,27 @@ namespace Microsoft.AspNetCore.Server.KestrelTests private void FullByteRangeSupported() { var byteRange = Enumerable.Range(0, 256).Select(x => (byte)x).ToArray(); - - var mem = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - mem.End = byteRange.Length; - - var begin = mem.GetIterator(); - var end = GetIterator(begin, byteRange.Length); - - var s = begin.GetAsciiString(end); - - Assert.Equal(s.Length, byteRange.Length); - - for (var i = 0; i < byteRange.Length; i++) + using (var pool = new MemoryPool()) { - var sb = (byte)s[i]; - var b = byteRange[i]; + var mem = pool.Lease(); + mem.GetIterator().CopyFrom(byteRange); - Assert.Equal(sb, b); + var begin = mem.GetIterator(); + var end = GetIterator(begin, byteRange.Length); + + var s = begin.GetAsciiString(end); + + Assert.Equal(s.Length, byteRange.Length); + + for (var i = 0; i < byteRange.Length; i++) + { + var sb = (byte)s[i]; + var b = byteRange[i]; + + Assert.Equal(sb, b); + } + + pool.Return(mem); } } @@ -44,32 +48,40 @@ namespace Microsoft.AspNetCore.Server.KestrelTests .Concat(byteRange) .ToArray(); - var mem0 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - var mem1 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - var mem2 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - var mem3 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - mem0.End = byteRange.Length; - mem1.End = byteRange.Length; - mem2.End = byteRange.Length; - mem3.End = byteRange.Length; - - mem0.Next = mem1; - mem1.Next = mem2; - mem2.Next = mem3; - - var begin = mem0.GetIterator(); - var end = GetIterator(begin, expectedByteRange.Length); - - var s = begin.GetAsciiString(end); - - Assert.Equal(s.Length, expectedByteRange.Length); - - for (var i = 0; i < expectedByteRange.Length; i++) + using (var pool = new MemoryPool()) { - var sb = (byte)s[i]; - var b = expectedByteRange[i]; + var mem0 = pool.Lease(); + var mem1 = pool.Lease(); + var mem2 = pool.Lease(); + var mem3 = pool.Lease(); + mem0.GetIterator().CopyFrom(byteRange); + mem1.GetIterator().CopyFrom(byteRange); + mem2.GetIterator().CopyFrom(byteRange); + mem3.GetIterator().CopyFrom(byteRange); - Assert.Equal(sb, b); + mem0.Next = mem1; + mem1.Next = mem2; + mem2.Next = mem3; + + var begin = mem0.GetIterator(); + var end = GetIterator(begin, expectedByteRange.Length); + + var s = begin.GetAsciiString(end); + + Assert.Equal(s.Length, expectedByteRange.Length); + + for (var i = 0; i < expectedByteRange.Length; i++) + { + var sb = (byte)s[i]; + var b = expectedByteRange[i]; + + Assert.Equal(sb, b); + } + + pool.Return(mem0); + pool.Return(mem1); + pool.Return(mem2); + pool.Return(mem3); } } @@ -78,27 +90,45 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { var byteRange = Enumerable.Range(0, 16384 + 64).Select(x => (byte)x).ToArray(); var expectedByteRange = byteRange.Concat(byteRange).ToArray(); - - var mem0 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - var mem1 = MemoryPoolBlock.Create(new ArraySegment(byteRange), IntPtr.Zero, null, null); - mem0.End = byteRange.Length; - mem1.End = byteRange.Length; - - mem0.Next = mem1; - - var begin = mem0.GetIterator(); - var end = GetIterator(begin, expectedByteRange.Length); - - var s = begin.GetAsciiString(end); - - Assert.Equal(s.Length, expectedByteRange.Length); - - for (var i = 0; i < expectedByteRange.Length; i++) + using (var pool = new MemoryPool()) { - var sb = (byte)s[i]; - var b = expectedByteRange[i]; + var mem0 = pool.Lease(); + var mem1 = pool.Lease(); + mem0.GetIterator().CopyFrom(byteRange); + mem1.GetIterator().CopyFrom(byteRange); - Assert.Equal(sb, b); + var lastBlock = mem0; + while (lastBlock.Next != null) + { + lastBlock = lastBlock.Next; + } + lastBlock.Next = mem1; + + var begin = mem0.GetIterator(); + var end = GetIterator(begin, expectedByteRange.Length); + + var s = begin.GetAsciiString(end); + + Assert.Equal(expectedByteRange.Length, s.Length); + + for (var i = 0; i < expectedByteRange.Length; i++) + { + var sb = (byte)s[i]; + var b = expectedByteRange[i]; + + Assert.Equal(sb, b); + } + + var block = mem0; + while (block != null) + { + var returnBlock = block; + block = block.Next; + pool.Return(returnBlock); + } + + pool.Return(mem0); + pool.Return(mem1); } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolBlockTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolBlockTests.cs index 73bb3b2ef8..748a0ecf34 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolBlockTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolBlockTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block = pool.Lease(256); + var block = pool.Lease(); foreach (var ch in Enumerable.Range(0, 256).Select(x => (byte)x)) { block.Array[block.End++] = ch; @@ -63,9 +63,9 @@ namespace Microsoft.AspNetCore.Server.KestrelTests using (var pool = new MemoryPool()) { - var block1 = pool.Lease(256); - var block2 = block1.Next = pool.Lease(256); - var block3 = block2.Next = pool.Lease(256); + var block1 = pool.Lease(); + var block2 = block1.Next = pool.Lease(); + var block3 = block2.Next = pool.Lease(); foreach (var ch in Enumerable.Range(0, 34).Select(x => (byte)x)) { @@ -123,7 +123,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block = pool.Lease(256); + var block = pool.Lease(); block.End += 256; TestAllLengths(block, 256); pool.Return(block); @@ -132,7 +132,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests for (var fragment = 0; fragment < 256; fragment += 4) { var next = block; - block = pool.Lease(4); + block = pool.Lease(); block.Next = next; block.End += 4; } @@ -168,8 +168,8 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block1 = pool.Lease(256); - var block2 = block1.Next = pool.Lease(256); + var block1 = pool.Lease(); + var block2 = block1.Next = pool.Lease(); block1.End += 100; block2.End += 200; @@ -209,8 +209,8 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block1 = pool.Lease(128); - var block2 = block1.Next = pool.Lease(128); + var block1 = pool.Lease(); + var block2 = block1.Next = pool.Lease(); for (int i = 0; i < 128; i++) { @@ -247,7 +247,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block1 = pool.Lease(128); + var block1 = pool.Lease(); var start = block1.GetIterator(); var end = start; var bufferSize = block1.Data.Count * 3; @@ -289,10 +289,10 @@ namespace Microsoft.AspNetCore.Server.KestrelTests { using (var pool = new MemoryPool()) { - var block1 = pool.Lease(128); - var block2 = block1.Next = pool.Lease(128); - var block3 = block2.Next = pool.Lease(128); - var block4 = block3.Next = pool.Lease(128); + var block1 = pool.Lease(); + var block2 = block1.Next = pool.Lease(); + var block3 = block2.Next = pool.Lease(); + var block4 = block3.Next = pool.Lease(); // There is no data in block2 or block4, so IsEnd should be true after 256 bytes are read. block1.End += 128; diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs index 18fdeb5afd..834c99baad 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs @@ -82,7 +82,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("/localhost:5000/PATH/PATH2/ HTTP/1.1", " %?", ' ', 27)] public void MemorySeek(string raw, string search, char expectResult, int expectIndex) { - var block = _pool.Lease(256); + var block = _pool.Lease(); var chars = raw.ToCharArray().Select(c => (byte)c).ToArray(); Buffer.BlockCopy(chars, 0, block.Array, block.Start, chars.Length); block.End += chars.Length; @@ -126,7 +126,7 @@ namespace Microsoft.AspNetCore.Server.KestrelTests var blocks = new MemoryPoolBlock[4]; for (var i = 0; i < 4; ++i) { - blocks[i] = _pool.Lease(16); + blocks[i] = _pool.Lease(); blocks[i].End += 16; for (var j = 0; j < blocks.Length; ++j) diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/MultipleLoopTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/MultipleLoopTests.cs index c5b8c30c5b..af50bba928 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/MultipleLoopTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/MultipleLoopTests.cs @@ -64,11 +64,11 @@ namespace Microsoft.AspNetCore.Server.KestrelTests var writeRequest = new UvWriteReq(new KestrelTrace(new TestKestrelTrace())); writeRequest.Init(loop); - var block = MemoryPoolBlock.Create( - new ArraySegment(new byte[] { 1, 2, 3, 4 }), - dataPtr: IntPtr.Zero, - pool: null, - slab: null); + + var pool = new MemoryPool(); + var block = pool.Lease(); + block.GetIterator().CopyFrom(new ArraySegment(new byte[] { 1, 2, 3, 4 })); + var start = new MemoryPoolIterator(block, 0); var end = new MemoryPoolIterator(block, block.Data.Count); writeRequest.Write( @@ -81,7 +81,8 @@ namespace Microsoft.AspNetCore.Server.KestrelTests writeRequest.Dispose(); serverConnectionPipe.Dispose(); serverListenPipe.Dispose(); - block.Unpin(); + pool.Return(block); + pool.Dispose(); }, null); diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/NetworkingTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/NetworkingTests.cs index c299331818..dd5c5044fc 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/NetworkingTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/NetworkingTests.cs @@ -177,12 +177,10 @@ namespace Microsoft.AspNetCore.Server.KestrelTests for (var x = 0; x < 2; x++) { var req = new UvWriteReq(new KestrelTrace(new TestKestrelTrace())); - req.Init(loop); - var block = MemoryPoolBlock.Create( - new ArraySegment(new byte[] { 65, 66, 67, 68, 69 }), - dataPtr: IntPtr.Zero, - pool: null, - slab: null); + req.Init(loop); var pool = new MemoryPool(); + var block = pool.Lease(); + block.GetIterator().CopyFrom(new ArraySegment(new byte[] { 65, 66, 67, 68, 69 })); + var start = new MemoryPoolIterator(block, 0); var end = new MemoryPoolIterator(block, block.Data.Count); req.Write( @@ -192,7 +190,8 @@ namespace Microsoft.AspNetCore.Server.KestrelTests 1, (_1, _2, _3, _4) => { - block.Unpin(); + pool.Return(block); + pool.Dispose(); }, null); } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/UrlPathDecoder.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/UrlPathDecoder.cs index 711297fd95..31e1ccdbc9 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/UrlPathDecoder.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/UrlPathDecoder.cs @@ -14,13 +14,27 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [Fact] public void Empty() { - PositiveAssert(string.Empty, string.Empty); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, string.Empty, string.Empty); + + pool.Return(mem); + } } [Fact] public void WhiteSpace() { - PositiveAssert(" ", " "); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, " ", " "); + + pool.Return(mem); + } } [Theory] @@ -30,7 +44,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("/", "/")] public void NormalCases(string raw, string expect) { - PositiveAssert(raw, expect); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, raw, expect); + + pool.Return(mem); + } } [Theory] @@ -39,7 +60,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("/foo%2F%20bar", "/foo%2F bar")] public void SkipForwardSlash(string raw, string expect) { - PositiveAssert(raw, expect); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, raw, expect); + + pool.Return(mem); + } } [Theory] @@ -60,7 +88,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("%20", " ")] public void ValidUTF8(string raw, string expect) { - PositiveAssert(raw, expect); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, raw, expect); + + pool.Return(mem); + } } [Theory] @@ -68,7 +103,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("%E6%88%91%E8%87%AA%E6%A8%AA%E5%88%80%E5%90%91%E5%A4%A9%E7%AC%91%E5%8E%BB%E7%95%99%E8%82%9D%E8%83%86%E4%B8%A4%E6%98%86%E4%BB%91", "我自横刀向天笑去留肝胆两昆仑")] public void Internationalized(string raw, string expect) { - PositiveAssert(raw, expect); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, raw, expect); + + pool.Return(mem); + } } [Theory] @@ -92,7 +134,14 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("%C0%32%A4", "%C02%A4")] public void InvalidUTF8(string raw, string expect) { - PositiveAssert(raw, expect); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); + + PositiveAssert(mem, raw, expect); + + pool.Return(mem); + } } [Theory] @@ -110,21 +159,27 @@ namespace Microsoft.AspNetCore.Server.KestrelTests [InlineData("%C2%B5%40%C3%9F%C3%B6%C3%A4%C3%BC%C3%A0%C3%A1", 44, "µ@ßöäüà%C3%A", 12)] public void DecodeWithBoundary(string raw, int rawLength, string expect, int expectLength) { - var begin = BuildSample(raw); - var end = GetIterator(begin, rawLength); + using (var pool = new MemoryPool()) + { + var mem = pool.Lease(); - var end2 = UrlPathDecoder.Unescape(begin, end); - var result = begin.GetUtf8String(end2); + var begin = BuildSample(mem, raw); + var end = GetIterator(begin, rawLength); - Assert.Equal(expectLength, result.Length); - Assert.Equal(expect, result); + var end2 = UrlPathDecoder.Unescape(begin, end); + var result = begin.GetUtf8String(end2); + + Assert.Equal(expectLength, result.Length); + Assert.Equal(expect, result); + + pool.Return(mem); + } } - private MemoryPoolIterator BuildSample(string data) + private MemoryPoolIterator BuildSample(MemoryPoolBlock mem, string data) { var store = data.Select(c => (byte)c).ToArray(); - var mem = MemoryPoolBlock.Create(new ArraySegment(store), IntPtr.Zero, null, null); - mem.End = store.Length; + mem.GetIterator().CopyFrom(new ArraySegment(store)); return mem.GetIterator(); } @@ -140,27 +195,27 @@ namespace Microsoft.AspNetCore.Server.KestrelTests return result; } - private void PositiveAssert(string raw, string expect) + private void PositiveAssert(MemoryPoolBlock mem, string raw, string expect) { - var begin = BuildSample(raw); + var begin = BuildSample(mem, raw); var end = GetIterator(begin, raw.Length); var result = UrlPathDecoder.Unescape(begin, end); Assert.Equal(expect, begin.GetUtf8String(result)); } - private void PositiveAssert(string raw) + private void PositiveAssert(MemoryPoolBlock mem, string raw) { - var begin = BuildSample(raw); + var begin = BuildSample(mem, raw); var end = GetIterator(begin, raw.Length); var result = UrlPathDecoder.Unescape(begin, end); Assert.NotEqual(raw.Length, begin.GetUtf8String(result).Length); } - private void NegativeAssert(string raw) + private void NegativeAssert(MemoryPoolBlock mem, string raw) { - var begin = BuildSample(raw); + var begin = BuildSample(mem, raw); var end = GetIterator(begin, raw.Length); var resultEnd = UrlPathDecoder.Unescape(begin, end);