blob: 7c4ff652bd3085db88df4ae4f7d77f00161e6128 [file] [log] [blame]
#region Copyright notice and license
// Copyright 2018 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System;
using System.Collections.Generic;
using Grpc.Core;
using Grpc.Core.Internal;
using Grpc.Core.Utils;
using NUnit.Framework;
namespace Grpc.Core.Internal.Tests
{
public class FakeBufferReaderManagerTest
{
FakeBufferReaderManager fakeBufferReaderManager;
[SetUp]
public void Init()
{
fakeBufferReaderManager = new FakeBufferReaderManager();
}
[TearDown]
public void Cleanup()
{
fakeBufferReaderManager.Dispose();
}
[TestCase]
public void NullPayload()
{
var fakeBufferReader = fakeBufferReaderManager.CreateNullPayloadBufferReader();
Assert.IsFalse(fakeBufferReader.TotalLength.HasValue);
Assert.Throws(typeof(ArgumentNullException), () => fakeBufferReader.TryGetNextSlice(out Slice slice));
}
[TestCase]
public void ZeroSegmentPayload()
{
var fakeBufferReader = fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List<byte[]> {});
Assert.AreEqual(0, fakeBufferReader.TotalLength.Value);
Assert.IsFalse(fakeBufferReader.TryGetNextSlice(out Slice slice));
}
[TestCase(0)]
[TestCase(1)]
[TestCase(10)]
[TestCase(30)]
[TestCase(100)]
[TestCase(1000)]
public void SingleSegmentPayload(int bufferLen)
{
var origBuffer = GetTestBuffer(bufferLen);
var fakeBufferReader = fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer);
Assert.AreEqual(origBuffer.Length, fakeBufferReader.TotalLength.Value);
Assert.IsTrue(fakeBufferReader.TryGetNextSlice(out Slice slice));
AssertSliceDataEqual(origBuffer, slice);
Assert.IsFalse(fakeBufferReader.TryGetNextSlice(out Slice slice2));
}
[TestCase(0, 5, 10)]
[TestCase(1, 1, 1)]
[TestCase(10, 100, 1000)]
[TestCase(100, 100, 10)]
[TestCase(1000, 1000, 1000)]
public void MultiSegmentPayload(int segmentLen1, int segmentLen2, int segmentLen3)
{
var origBuffer1 = GetTestBuffer(segmentLen1);
var origBuffer2 = GetTestBuffer(segmentLen2);
var origBuffer3 = GetTestBuffer(segmentLen3);
var fakeBufferReader = fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List<byte[]> { origBuffer1, origBuffer2, origBuffer3 });
Assert.AreEqual(origBuffer1.Length + origBuffer2.Length + origBuffer3.Length, fakeBufferReader.TotalLength.Value);
Assert.IsTrue(fakeBufferReader.TryGetNextSlice(out Slice slice1));
AssertSliceDataEqual(origBuffer1, slice1);
Assert.IsTrue(fakeBufferReader.TryGetNextSlice(out Slice slice2));
AssertSliceDataEqual(origBuffer2, slice2);
Assert.IsTrue(fakeBufferReader.TryGetNextSlice(out Slice slice3));
AssertSliceDataEqual(origBuffer3, slice3);
Assert.IsFalse(fakeBufferReader.TryGetNextSlice(out Slice slice4));
}
private void AssertSliceDataEqual(byte[] expected, Slice actual)
{
var actualSliceData = new byte[actual.Length];
actual.CopyTo(new ArraySegment<byte>(actualSliceData));
CollectionAssert.AreEqual(expected, actualSliceData);
}
// create a buffer of given size and fill it with some data
private byte[] GetTestBuffer(int length)
{
var testBuffer = new byte[length];
for (int i = 0; i < testBuffer.Length; i++)
{
testBuffer[i] = (byte) i;
}
return testBuffer;
}
}
}