• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  #region Copyright notice and license
2  
3  // Copyright 2019 The gRPC Authors
4  //
5  // Licensed under the Apache License, Version 2.0 (the "License");
6  // you may not use this file except in compliance with the License.
7  // You may obtain a copy of the License at
8  //
9  //     http://www.apache.org/licenses/LICENSE-2.0
10  //
11  // Unless required by applicable law or agreed to in writing, software
12  // distributed under the License is distributed on an "AS IS" BASIS,
13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  // See the License for the specific language governing permissions and
15  // limitations under the License.
16  
17  #endregion
18  
19  using System;
20  using Grpc.Core;
21  using Grpc.Core.Internal;
22  using Grpc.Core.Utils;
23  using NUnit.Framework;
24  
25  namespace Grpc.Core.Internal.Tests
26  {
27      public class SliceBufferSafeHandleTest
28      {
29          [TestCase]
Complete_EmptyBuffer()30          public void Complete_EmptyBuffer()
31          {
32              using (var sliceBuffer = SliceBufferSafeHandle.Create())
33              {
34                  sliceBuffer.Complete();
35                  CollectionAssert.AreEqual(new byte[0], sliceBuffer.ToByteArray());
36              }
37          }
38  
39          [TestCase]
Complete_TailSizeZero()40          public void Complete_TailSizeZero()
41          {
42              using (var sliceBuffer = SliceBufferSafeHandle.Create())
43              {
44                  var origPayload = GetTestBuffer(10);
45                  origPayload.AsSpan().CopyTo(sliceBuffer.GetSpan(origPayload.Length));
46                  sliceBuffer.Advance(origPayload.Length);
47                  // call complete where tail space size == 0
48                  sliceBuffer.Complete();
49                  CollectionAssert.AreEqual(origPayload, sliceBuffer.ToByteArray());
50              }
51          }
52  
53          [TestCase]
Complete_TruncateTailSpace()54          public void Complete_TruncateTailSpace()
55          {
56              using (var sliceBuffer = SliceBufferSafeHandle.Create())
57              {
58                  var origPayload = GetTestBuffer(10);
59                  var dest = sliceBuffer.GetSpan(origPayload.Length + 10);
60                  origPayload.AsSpan().CopyTo(dest);
61                  sliceBuffer.Advance(origPayload.Length);
62                  // call complete where tail space needs to be truncated
63                  sliceBuffer.Complete();
64                  CollectionAssert.AreEqual(origPayload, sliceBuffer.ToByteArray());
65              }
66          }
67  
68          [TestCase]
SliceBufferIsReusable()69          public void SliceBufferIsReusable()
70          {
71              using (var sliceBuffer = SliceBufferSafeHandle.Create())
72              {
73                  var origPayload = GetTestBuffer(10);
74                  origPayload.AsSpan().CopyTo(sliceBuffer.GetSpan(origPayload.Length));
75                  sliceBuffer.Advance(origPayload.Length);
76                  sliceBuffer.Complete();
77                  CollectionAssert.AreEqual(origPayload, sliceBuffer.ToByteArray());
78  
79                  sliceBuffer.Reset();
80  
81                  var origPayload2 = GetTestBuffer(20);
82                  origPayload2.AsSpan().CopyTo(sliceBuffer.GetSpan(origPayload2.Length));
83                  sliceBuffer.Advance(origPayload2.Length);
84                  sliceBuffer.Complete();
85                  CollectionAssert.AreEqual(origPayload2, sliceBuffer.ToByteArray());
86  
87                  sliceBuffer.Reset();
88  
89                  CollectionAssert.AreEqual(new byte[0], sliceBuffer.ToByteArray());
90              }
91          }
92  
93          [TestCase]
SliceBuffer_SizeHintZero()94          public void SliceBuffer_SizeHintZero()
95          {
96              using (var sliceBuffer = SliceBufferSafeHandle.Create())
97              {
98                  var destSpan = sliceBuffer.GetSpan(0);
99                  Assert.IsTrue(destSpan.Length > 0);  // some non-zero size memory is made available
100  
101                  sliceBuffer.Reset();
102  
103                  var destMemory = sliceBuffer.GetMemory(0);
104                  Assert.IsTrue(destMemory.Length > 0);
105              }
106          }
107  
108          [TestCase(0)]
109          [TestCase(1000)]
SliceBuffer_BigPayload(int sizeHint)110          public void SliceBuffer_BigPayload(int sizeHint)
111          {
112              using (var sliceBuffer = SliceBufferSafeHandle.Create())
113              {
114                  var bigPayload = GetTestBuffer(4 * 1024 * 1024);
115  
116                  int offset = 0;
117                  while (offset < bigPayload.Length)
118                  {
119                      var destSpan = sliceBuffer.GetSpan(sizeHint);
120                      int copySize = Math.Min(destSpan.Length, bigPayload.Length - offset);
121                      bigPayload.AsSpan(offset, copySize).CopyTo(destSpan);
122                      sliceBuffer.Advance(copySize);
123                      offset += copySize;
124                  }
125  
126                  sliceBuffer.Complete();
127                  CollectionAssert.AreEqual(bigPayload, sliceBuffer.ToByteArray());
128              }
129          }
130  
131          [TestCase]
SliceBuffer_NegativeSizeHint()132          public void SliceBuffer_NegativeSizeHint()
133          {
134              using (var sliceBuffer = SliceBufferSafeHandle.Create())
135              {
136                  Assert.Throws(typeof(ArgumentException), () => sliceBuffer.GetSpan(-1));
137                  Assert.Throws(typeof(ArgumentException), () => sliceBuffer.GetMemory(-1));
138              }
139          }
140  
141          [TestCase]
SliceBuffer_AdvanceBadArg()142          public void SliceBuffer_AdvanceBadArg()
143          {
144              using (var sliceBuffer = SliceBufferSafeHandle.Create())
145              {
146                  int size = 10;
147                  var destSpan = sliceBuffer.GetSpan(size);
148                  Assert.Throws(typeof(ArgumentException), () => sliceBuffer.Advance(size + 1));
149                  Assert.Throws(typeof(ArgumentException), () => sliceBuffer.Advance(-1));
150              }
151          }
152  
GetTestBuffer(int length)153          private byte[] GetTestBuffer(int length)
154          {
155              var testBuffer = new byte[length];
156              for (int i = 0; i < testBuffer.Length; i++)
157              {
158                  testBuffer[i] = (byte) i;
159              }
160              return testBuffer;
161          }
162      }
163  }
164