Skip to content

Commit 4ab3240

Browse files
committed
Even more tests
1 parent c5a1edc commit 4ab3240

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

shared/Microsoft.Extensions.Buffers.MemoryPool.Sources/MemoryPoolBlock.Debug.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,15 @@ protected override void Dispose(bool disposing)
7171
}
7272
}
7373

74-
public override Span<byte> GetSpan() => new Span<byte>(_slab.Array, _offset, _length);
74+
public override Span<byte> GetSpan()
75+
{
76+
if (!_slab.IsActive)
77+
{
78+
MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPoolBlock);
79+
}
80+
81+
return new Span<byte>(_slab.Array, _offset, _length);
82+
}
7583

7684
public override MemoryHandle Pin(int byteOffset = 0)
7785
{
@@ -95,6 +103,11 @@ public override MemoryHandle Pin(int byteOffset = 0)
95103

96104
protected override bool TryGetArray(out ArraySegment<byte> segment)
97105
{
106+
if (!_slab.IsActive)
107+
{
108+
MemoryPoolThrowHelper.ThrowObjectDisposedException(MemoryPoolThrowHelper.ExceptionArgument.MemoryPoolBlock);
109+
}
110+
98111
segment = new ArraySegment<byte>(_slab.Array, _offset, _length);
99112
return true;
100113
}

test/Microsoft.Extensions.Internal.Test/MemoryPoolTests.Debug.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using System;
77
using System.Buffers;
8+
using System.Runtime.InteropServices;
89
using Xunit;
910

1011
namespace Microsoft.Extensions.Internal.Test
@@ -31,6 +32,67 @@ public void DisposeWithActiveBlocksThrows()
3132
exception = Assert.Throws<InvalidOperationException>(() => block.Dispose());
3233
Assert.Equal("Block is being returned to disposed pool", exception.Message);
3334
}
35+
36+
[Fact]
37+
public void GetMemoryOfDisposedThrows()
38+
{
39+
var memoryPool = new SlabMemoryPool();
40+
var block = memoryPool.Rent();
41+
42+
var exception = Assert.Throws<InvalidOperationException>(() => memoryPool.Dispose());
43+
Assert.Equal("Memory pool with active blocks is being disposed, 30 of 31 returned", exception.Message);
44+
45+
exception = Assert.Throws<ObjectDisposedException>(() => block.Memory);
46+
Assert.Equal("Cannot access a disposed object.\r\nObject name: 'MemoryPoolBlock'.", exception.Message);
47+
}
48+
49+
[Fact]
50+
public void GetMemoryPinOfDisposedThrows()
51+
{
52+
var memoryPool = new SlabMemoryPool();
53+
var block = memoryPool.Rent();
54+
var memory = block.Memory;
55+
var exception = Assert.Throws<InvalidOperationException>(() => memoryPool.Dispose());
56+
Assert.Equal("Memory pool with active blocks is being disposed, 30 of 31 returned", exception.Message);
57+
58+
exception = Assert.Throws<ObjectDisposedException>(() => memory.Pin());
59+
Assert.Equal("Cannot access a disposed object.\r\nObject name: 'MemoryPoolBlock'.", exception.Message);
60+
}
61+
62+
[Fact]
63+
public void GetMemorySpanOfDisposedThrows()
64+
{
65+
var memoryPool = new SlabMemoryPool();
66+
var block = memoryPool.Rent();
67+
var memory = block.Memory;
68+
var exception = Assert.Throws<InvalidOperationException>(() => memoryPool.Dispose());
69+
Assert.Equal("Memory pool with active blocks is being disposed, 30 of 31 returned", exception.Message);
70+
71+
var threw = false;
72+
try
73+
{
74+
_ = memory.Span;
75+
}
76+
catch (ObjectDisposedException ode)
77+
{
78+
threw = true;
79+
Assert.Equal("Cannot access a disposed object.\r\nObject name: 'MemoryPoolBlock'.", ode.Message);
80+
}
81+
Assert.True(threw);
82+
}
83+
84+
[Fact]
85+
public void GetMemoryTryGetArrayOfDisposedThrows()
86+
{
87+
var memoryPool = new SlabMemoryPool();
88+
var block = memoryPool.Rent();
89+
var memory = block.Memory;
90+
var exception = Assert.Throws<InvalidOperationException>(() => memoryPool.Dispose());
91+
Assert.Equal("Memory pool with active blocks is being disposed, 30 of 31 returned", exception.Message);
92+
93+
exception = Assert.Throws<ObjectDisposedException>(() => MemoryMarshal.TryGetArray<byte>(memory, out _));
94+
Assert.Equal("Cannot access a disposed object.\r\nObject name: 'MemoryPoolBlock'.", exception.Message);
95+
}
3496
}
3597
}
3698

0 commit comments

Comments
 (0)