public void PayloadAsReadOnlySequence_MultiSegmentPayload(int segmentLen1, int segmentLen2, int segmentLen3) { var origBuffer1 = GetTestBuffer(segmentLen1); var origBuffer2 = GetTestBuffer(segmentLen2); var origBuffer3 = GetTestBuffer(segmentLen3); int totalLen = origBuffer1.Length + origBuffer2.Length + origBuffer3.Length; var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> { origBuffer1, origBuffer2, origBuffer3 })); Assert.AreEqual(totalLen, context.PayloadLength); var sequence = context.PayloadAsReadOnlySequence(); Assert.AreEqual(totalLen, sequence.Length); var segmentEnumerator = sequence.GetEnumerator(); Assert.IsTrue(segmentEnumerator.MoveNext()); CollectionAssert.AreEqual(origBuffer1, segmentEnumerator.Current.ToArray()); Assert.IsTrue(segmentEnumerator.MoveNext()); CollectionAssert.AreEqual(origBuffer2, segmentEnumerator.Current.ToArray()); Assert.IsTrue(segmentEnumerator.MoveNext()); CollectionAssert.AreEqual(origBuffer3, segmentEnumerator.Current.ToArray()); Assert.IsFalse(segmentEnumerator.MoveNext()); }
public void ResetContextAndReinitialize() { var origBuffer = GetTestBuffer(100); var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer)); Assert.AreEqual(origBuffer.Length, context.PayloadLength); // Reset invalidates context context.Reset(); Assert.AreEqual(0, context.PayloadLength); Assert.Throws(typeof(NullReferenceException), () => context.PayloadAsNewBuffer()); #if GRPC_CSHARP_SUPPORT_SYSTEM_MEMORY Assert.Throws(typeof(NullReferenceException), () => context.PayloadAsReadOnlySequence()); #endif // Previously reset context can be initialized again var origBuffer2 = GetTestBuffer(50); context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer2)); Assert.AreEqual(origBuffer2.Length, context.PayloadLength); CollectionAssert.AreEqual(origBuffer2, context.PayloadAsNewBuffer()); }
public void PayloadAsNewByteBuffer_SingleSegmentPayload(int segmentLength) { var origBuffer = GetTestBuffer(segmentLength); var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer)); Assert.AreEqual(origBuffer.Length, context.PayloadLength); var payload = context.PayloadAsNewBuffer(); CollectionAssert.AreEqual(origBuffer, payload); }
public void PayloadAsNewByteBuffer_ZeroSegmentPayload() { var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> { })); Assert.AreEqual(0, context.PayloadLength); var payload = context.PayloadAsNewBuffer(); Assert.AreEqual(0, payload.Length); }
public void PayloadAsReadOnlySequence_ZeroSegmentPayload() { var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> { })); Assert.AreEqual(0, context.PayloadLength); var sequence = context.PayloadAsReadOnlySequence(); Assert.AreEqual(ReadOnlySequence <byte> .Empty, sequence); Assert.IsTrue(sequence.IsEmpty); Assert.IsTrue(sequence.IsSingleSegment); }
public void PayloadAsReadOnlySequence_SingleSegmentPayload(int segmentLength) { var origBuffer = GetTestBuffer(segmentLength); var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer)); Assert.AreEqual(origBuffer.Length, context.PayloadLength); var sequence = context.PayloadAsReadOnlySequence(); Assert.AreEqual(origBuffer.Length, sequence.Length); Assert.AreEqual(origBuffer.Length, sequence.First.Length); Assert.IsTrue(sequence.IsSingleSegment); CollectionAssert.AreEqual(origBuffer, sequence.First.ToArray()); }
public void GetPayloadMultipleTimesIsIllegal() { var origBuffer = GetTestBuffer(100); var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateSingleSegmentBufferReader(origBuffer)); Assert.AreEqual(origBuffer.Length, context.PayloadLength); var payload = context.PayloadAsNewBuffer(); CollectionAssert.AreEqual(origBuffer, payload); // Getting payload multiple times is illegal Assert.Throws(typeof(InvalidOperationException), () => context.PayloadAsNewBuffer()); Assert.Throws(typeof(InvalidOperationException), () => context.PayloadAsReadOnlySequence()); }
public static async ValueTask <TResponse?> ReadMessageAsync <TResponse>( this Stream responseStream, DefaultDeserializationContext deserializationContext, ILogger logger, Func <DeserializationContext, TResponse> deserializer, string grpcEncoding, int?maximumMessageSize, Dictionary <string, ICompressionProvider> compressionProviders, bool singleMessage, CancellationToken cancellationToken) where TResponse : class { byte[]? buffer = null; try { GrpcCallLog.ReadingMessage(logger); cancellationToken.ThrowIfCancellationRequested(); // Buffer is used to read header, then message content. // This size was randomly chosen to hopefully be big enough for many small messages. // If the message is larger then the array will be replaced when the message size is known. buffer = ArrayPool <byte> .Shared.Rent(minimumLength : 4096); int read; var received = 0; while ((read = await responseStream.ReadAsync(buffer.AsMemory(received, GrpcProtocolConstants.HeaderSize - received), cancellationToken).ConfigureAwait(false)) > 0) { received += read; if (received == GrpcProtocolConstants.HeaderSize) { break; } } if (received < GrpcProtocolConstants.HeaderSize) { if (received == 0) { GrpcCallLog.NoMessageReturned(logger); return(default);
public void PayloadAsNewByteBuffer_MultiSegmentPayload(int segmentLen1, int segmentLen2, int segmentLen3) { var origBuffer1 = GetTestBuffer(segmentLen1); var origBuffer2 = GetTestBuffer(segmentLen2); var origBuffer3 = GetTestBuffer(segmentLen3); var context = new DefaultDeserializationContext(); context.Initialize(fakeBufferReaderManager.CreateMultiSegmentBufferReader(new List <byte[]> { origBuffer1, origBuffer2, origBuffer3 })); var payload = context.PayloadAsNewBuffer(); var concatenatedOrigBuffers = new List <byte>(); concatenatedOrigBuffers.AddRange(origBuffer1); concatenatedOrigBuffers.AddRange(origBuffer2); concatenatedOrigBuffers.AddRange(origBuffer3); Assert.AreEqual(concatenatedOrigBuffers.Count, context.PayloadLength); Assert.AreEqual(concatenatedOrigBuffers.Count, payload.Length); CollectionAssert.AreEqual(concatenatedOrigBuffers, payload); }
public async Task AsyncDuplexStreamingCall_MessagesStreamed_MessagesReceived() { // Arrange var streamContent = new SyncPointMemoryStream(); PushStreamContent <HelloRequest, HelloReply>?content = null; var httpClient = ClientTestHelpers.CreateTestClient(async request => { content = (PushStreamContent <HelloRequest, HelloReply>)request.Content !; await content.PushComplete.DefaultTimeout(); return(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(streamContent))); }); var invoker = HttpClientCallInvokerFactory.Create(httpClient); // Act var call = invoker.AsyncDuplexStreamingCall <HelloRequest, HelloReply>(ClientTestHelpers.ServiceMethod, string.Empty, new CallOptions()); var requestStream = call.RequestStream; var responseStream = call.ResponseStream; // Assert await call.RequestStream.WriteAsync(new HelloRequest { Name = "1" }).DefaultTimeout(); await call.RequestStream.WriteAsync(new HelloRequest { Name = "2" }).DefaultTimeout(); await call.RequestStream.CompleteAsync().DefaultTimeout(); var deserializationContext = new DefaultDeserializationContext(); Assert.IsNotNull(content); var requestContent = await content !.ReadAsStreamAsync().DefaultTimeout(); var requestMessage = await requestContent.ReadMessageAsync( deserializationContext, NullLogger.Instance, ClientTestHelpers.ServiceMethod.RequestMarshaller.ContextualDeserializer, GrpcProtocolConstants.IdentityGrpcEncoding, maximumMessageSize : null, GrpcProtocolConstants.DefaultCompressionProviders, singleMessage : false, CancellationToken.None).AsTask().DefaultTimeout(); Assert.AreEqual("1", requestMessage !.Name); requestMessage = await requestContent.ReadMessageAsync( deserializationContext, NullLogger.Instance, ClientTestHelpers.ServiceMethod.RequestMarshaller.ContextualDeserializer, GrpcProtocolConstants.IdentityGrpcEncoding, maximumMessageSize : null, GrpcProtocolConstants.DefaultCompressionProviders, singleMessage : false, CancellationToken.None).AsTask().DefaultTimeout(); Assert.AreEqual("2", requestMessage !.Name); Assert.IsNull(responseStream.Current); var moveNextTask1 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask1.IsCompleted); await streamContent.AddDataAndWait(await ClientTestHelpers.GetResponseDataAsync(new HelloReply { Message = "Hello world 1" }).DefaultTimeout()).DefaultTimeout(); Assert.IsTrue(await moveNextTask1.DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 1", responseStream.Current.Message); var moveNextTask2 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask2.IsCompleted); await streamContent.AddDataAndWait(await ClientTestHelpers.GetResponseDataAsync(new HelloReply { Message = "Hello world 2" }).DefaultTimeout()).DefaultTimeout(); Assert.IsTrue(await moveNextTask2.DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 2", responseStream.Current.Message); var moveNextTask3 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask3.IsCompleted); await streamContent.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout(); Assert.IsFalse(await moveNextTask3.DefaultTimeout()); var moveNextTask4 = responseStream.MoveNext(CancellationToken.None); Assert.IsTrue(moveNextTask4.IsCompleted); Assert.IsFalse(await moveNextTask3.DefaultTimeout()); }
public void NullPayloadNotAllowed() { var context = new DefaultDeserializationContext(); Assert.Throws(typeof(InvalidOperationException), () => context.Initialize(fakeBufferReaderManager.CreateNullPayloadBufferReader())); }