d3e87ee929778c30e408800a608d7bcc2d2006fb
[platform/upstream/dotnet/runtime.git] /
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4
5 using Xunit;
6
7 namespace System.Runtime.InteropServices.Tests
8 {
9     public class SafeBufferTests
10     {
11         [Theory]
12         [InlineData(true)]
13         [InlineData(false)]
14         public void Ctor_Bool(bool ownsHandle)
15         {
16             var buffer = new SubBuffer(ownsHandle);
17             Assert.True(buffer.IsInvalid);
18         }
19
20         [Fact]
21         public void Initialize_InvalidNumBytes_ThrowsArgumentOutOfRangeException()
22         {
23             var buffer = new SubBuffer(true);
24             AssertExtensions.Throws<ArgumentOutOfRangeException>("numBytes", () => buffer.Initialize(ulong.MaxValue));
25         }
26
27         [Fact]
28         public void Initialize_NumBytesTimesSizeOfEachElement_ThrowsArgumentOutOfRangeExceptionIfNot64Bit()
29         {
30             var buffer = new SubBuffer(true);
31             AssertExtensions.ThrowsIf<ArgumentOutOfRangeException>(!Environment.Is64BitProcess, () => buffer.Initialize(uint.MaxValue, uint.MaxValue));
32             AssertExtensions.ThrowsIf<ArgumentOutOfRangeException>(!Environment.Is64BitProcess, () => buffer.Initialize<int>(uint.MaxValue));
33         }
34
35         [Fact]
36         public unsafe void AcquirePointer_NotInitialized_ThrowsInvalidOperationException()
37         {
38             var wrapper = new SubBuffer(true);
39             byte* pointer = null;
40             Assert.Throws<InvalidOperationException>(() => wrapper.AcquirePointer(ref pointer));
41         }
42
43         [Fact]
44         public void ReleasePointer_NotInitialized_ThrowsInvalidOperationException()
45         {
46             var wrapper = new SubBuffer(true);
47             Assert.Throws<InvalidOperationException>(() => wrapper.ReleasePointer());
48         }
49
50         [Fact]
51         public void ReadWrite_NotInitialized_ThrowsInvalidOperationException()
52         {
53             var wrapper = new SubBuffer(true);
54
55             Assert.Throws<InvalidOperationException>(() => wrapper.Read<int>(0));
56             Assert.Throws<InvalidOperationException>(() => wrapper.Write(0, 2));
57         }
58
59         [Theory]
60         [InlineData(4)]
61         [InlineData(3)]
62         [InlineData(ulong.MaxValue)]
63         public void ReadWrite_NotEnoughSpaceInBuffer_ThrowsArgumentException(ulong byteOffset)
64         {
65             var buffer = new SubBuffer(true);
66             buffer.Initialize(4);
67
68             Assert.Throws<ArgumentException>(null, () => buffer.Read<int>(byteOffset));
69             Assert.Throws<ArgumentException>(null, () => buffer.Write<int>(byteOffset, 2));
70         }
71
72         [Fact]
73         public void ReadArray_NullArray_ThrowsArgumentNullException()
74         {
75             var wrapper = new SubBuffer(true);
76             AssertExtensions.Throws<ArgumentNullException>("array", () => wrapper.ReadArray<int>(0, null, 0, 0));
77             AssertExtensions.Throws<ArgumentNullException>("array", () => wrapper.WriteArray<int>(0, null, 0, 0));
78         }
79
80         [Fact]
81         public void ReadArray_NegativeIndex_ThrowsArgumentOutOfRangeException()
82         {
83             var wrapper = new SubBuffer(true);
84             AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => wrapper.ReadArray(0, new int[0], -1, 0));
85             AssertExtensions.Throws<ArgumentOutOfRangeException>("index", () => wrapper.WriteArray(0, new int[0], -1, 0));
86         }
87
88         [Fact]
89         public void ReadWriteArray_NegativeCount_ThrowsArgumentOutOfRangeException()
90         {
91             var wrapper = new SubBuffer(true);
92             AssertExtensions.Throws<ArgumentOutOfRangeException>("count", () => wrapper.ReadArray(0, new int[0], 0, -1));
93             AssertExtensions.Throws<ArgumentOutOfRangeException>("count", () => wrapper.WriteArray(0, new int[0], 0, -1));
94         }
95
96         [Theory]
97         [InlineData(0, 1, 0)]
98         [InlineData(0, 0, 1)]
99         [InlineData(2, 3, 0)]
100         [InlineData(2, 2, 1)]
101         [InlineData(2, 1, 2)]
102         [InlineData(2, 0, 3)]
103         public void ReadWriteArray_NegativeCount_ThrowsArgumentOutOfRangeException(int arrayLength, int index, int count)
104         {
105             var wrapper = new SubBuffer(true);
106             AssertExtensions.Throws<ArgumentException>(null, () => wrapper.ReadArray(0, new int[arrayLength], index, count));
107             AssertExtensions.Throws<ArgumentException>(null, () => wrapper.WriteArray(0, new int[arrayLength], index, count));
108         }
109
110         [Fact]
111         public void ReadWriteArray_NotInitialized_ThrowsInvalidOperationException()
112         {
113             var wrapper = new SubBuffer(true);
114             Assert.Throws<InvalidOperationException>(() => wrapper.ReadArray(0, new int[0], 0, 0));
115             Assert.Throws<InvalidOperationException>(() => wrapper.WriteArray(0, new int[0], 0, 0));
116         }
117
118         [Fact]
119         public void ByteLength_GetNotInitialized_ThrowsInvalidOperationException()
120         {
121             var wrapper = new SubBuffer(true);
122             Assert.Throws<InvalidOperationException>(() => wrapper.ByteLength);
123         }
124
125         public class SubBuffer : SafeBuffer
126         {
127             public SubBuffer(bool ownsHandle) : base(ownsHandle) { }
128
129             protected override bool ReleaseHandle()
130             {
131                 throw new NotImplementedException();
132             }
133         }
134     }
135 }