public async Task ReadSingleMessageAsync_AdditionalDataInSeparatePipeRead_ThrowError() { // Arrange var requestStream = new SyncPointMemoryStream(); var pipeReader = PipeReader.Create(requestStream); // Act var readTask = pipeReader.ReadSingleMessageAsync(TestServerCallContext, Marshaller.ContextualDeserializer).AsTask(); // Assert Assert.IsFalse(readTask.IsCompleted, "Still waiting for data"); await requestStream.AddDataAndWait(new byte[] { 0x00, // compression = 0 0x00, 0x00, 0x00, 0x01, // length = 1 0x10 }).DefaultTimeout(); Assert.IsFalse(readTask.IsCompleted, "Still waiting for data"); await requestStream.AddDataAndWait(new byte[] { 0x00 }).DefaultTimeout(); var ex = await ExceptionAssert.ThrowsAsync <RpcException>(() => readTask).DefaultTimeout(); // Assert Assert.AreEqual("Additional data after the message received.", ex.Status.Detail); Assert.AreEqual(StatusCode.Internal, ex.StatusCode); }
public async Task MoveNext_TokenCancelledDuringMoveNext_CancelTask() { // Arrange var ms = new SyncPointMemoryStream(); var httpContext = new DefaultHttpContext(); httpContext.Features.Set <IRequestBodyPipeFeature>(new TestRequestBodyPipeFeature(PipeReader.Create(ms))); var serverCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext); var reader = new HttpContextStreamReader <HelloReply>(serverCallContext, MessageHelpers.ServiceMethod.ResponseMarshaller.ContextualDeserializer); var cts = new CancellationTokenSource(); var nextTask = reader.MoveNext(cts.Token); Assert.IsFalse(nextTask.IsCompleted); Assert.IsFalse(nextTask.IsCanceled); cts.Cancel(); try { await nextTask; Assert.Fail(); } catch (TaskCanceledException) { } Assert.IsTrue(nextTask.IsCompleted); Assert.IsTrue(nextTask.IsCanceled); }
public async Task ReadMessageAsync_MessageInMultiplePipeReads_ReadMessageData() { // Arrange var messageData = new byte[] { 0x00, // compression = 0 0x00, 0x00, 0x00, 0x01, // length = 1 0x10 }; var requestStream = new SyncPointMemoryStream(); var pipeReader = PipeReader.Create(requestStream); // Act var readTask = pipeReader.ReadSingleMessageAsync(TestServerCallContext).AsTask(); // Assert foreach (var b in messageData) { Assert.IsFalse(readTask.IsCompleted, "Still waiting for data"); await requestStream.AddDataAndWait(new[] { b }).DefaultTimeout(); } await requestStream.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout(); var readMessageData = await readTask.DefaultTimeout(); // Assert CollectionAssert.AreEqual(new byte[] { 0x10 }, readMessageData); }
public async Task ReadStreamMessageAsync_MessageSplitAcrossReadsWithAdditionalData_ExamineMessageOnly() { // Arrange var emptyMessage = new byte[] { 0x00, // compression = 0 0x00, 0x00, 0x00, 0x00, // length = 0 0x00, // compression = 0 }; var followingMessage = new byte[] { 0x00, 0x00, 0x00, 0x00, // length = 0 0x00, // extra data }; var requestStream = new SyncPointMemoryStream(runContinuationsAsynchronously: false); var pipeReader = new TestPipeReader(PipeReader.Create(requestStream)); var testServerCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(); // Act 1 var messageData1Task = pipeReader.ReadStreamMessageAsync(testServerCallContext, TestDataMarshaller.ContextualDeserializer).AsTask(); await requestStream.AddDataAndWait(emptyMessage).DefaultTimeout(); // Assert 1 Assert.AreEqual(0, (await messageData1Task.DefaultTimeout()) !.Span.Length); Assert.AreEqual(5, pipeReader.Consumed); Assert.AreEqual(5, pipeReader.Examined); // Act 2 var messageData2Task = pipeReader.ReadStreamMessageAsync(testServerCallContext, TestDataMarshaller.ContextualDeserializer).AsTask(); await requestStream.AddDataAndWait(followingMessage).DefaultTimeout(); // Assert 2 Assert.AreEqual(0, (await messageData2Task.DefaultTimeout()) !.Span.Length); Assert.AreEqual(10, pipeReader.Consumed); Assert.AreEqual(10, pipeReader.Examined); // Act 3 var messageData3Task = pipeReader.ReadStreamMessageAsync(testServerCallContext, TestDataMarshaller.ContextualDeserializer).AsTask(); await requestStream.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout(); // Assert 3 var ex = await ExceptionAssert.ThrowsAsync <RpcException>(() => messageData3Task).DefaultTimeout(); Assert.AreEqual("Incomplete message.", ex.Status.Detail); Assert.AreEqual(10, pipeReader.Consumed); Assert.AreEqual(11, pipeReader.Examined); // Examined ahead to ask for more data }
public async Task ReadSingleMessageAsync_MessageInMultiplePipeReads_ReadMessageData() { // Arrange var messageData = new byte[] { 0x00, // compression = 0 0x00, 0x00, 0x00, 0x01, // length = 1 0x10 }; // Run continuations without async so ReadSingleMessageAsync immediately consumes added data var requestStream = new SyncPointMemoryStream(runContinuationsAsynchronously: false); var pipeReader = new TestPipeReader(PipeReader.Create(requestStream)); // Act var readTask = pipeReader.ReadSingleMessageAsync(TestServerCallContext, Marshaller.ContextualDeserializer).AsTask(); // Assert for (var i = 0; i < messageData.Length; i++) { var b = messageData[i]; var isLast = i == messageData.Length - 1; Assert.IsFalse(readTask.IsCompleted, "Still waiting for data"); await requestStream.AddDataAndWait(new[] { b }).DefaultTimeout(); if (!isLast) { Assert.AreEqual(0, pipeReader.Consumed); Assert.AreEqual(i + 1, pipeReader.Examined); } else { Assert.AreEqual(messageData.Length, pipeReader.Consumed); // Consumed message Assert.AreEqual(messageData.Length, pipeReader.Examined); } } await requestStream.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout(); var readMessageData = await readTask.DefaultTimeout(); // Assert CollectionAssert.AreEqual(new byte[] { 0x10 }, readMessageData); }
public void MoveNext_AlreadyCancelledToken_CancelReturnImmediately() { // Arrange var ms = new SyncPointMemoryStream(); var httpContext = new DefaultHttpContext(); var serverCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext); var reader = new HttpContextStreamReader <HelloReply>(serverCallContext, MessageHelpers.ServiceMethod.ResponseMarshaller.ContextualDeserializer); // Act var nextTask = reader.MoveNext(new CancellationToken(true)); // Assert Assert.IsTrue(nextTask.IsCompleted); Assert.IsTrue(nextTask.IsCanceled); }
public void MoveNext_AlreadyCancelledToken_CancelReturnImmediately() { // Arrange var ms = new SyncPointMemoryStream(); var httpContext = new DefaultHttpContext(); var serverCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext); var reader = new HttpContextStreamReader <HelloReply>(serverCallContext, (data) => { var message = new HelloReply(); message.MergeFrom(data); return(message); }); // Act var nextTask = reader.MoveNext(new CancellationToken(true)); // Assert Assert.IsTrue(nextTask.IsCompleted); Assert.IsTrue(nextTask.IsCanceled); }
public async Task MoveNext_TokenCancelledDuringMoveNext_CancelTask() { // Arrange var ms = new SyncPointMemoryStream(); var testSink = new TestSink(); var testLoggerFactory = new TestLoggerFactory(testSink, enabled: true); var httpContext = new DefaultHttpContext(); httpContext.Features.Set <IRequestBodyPipeFeature>(new TestRequestBodyPipeFeature(PipeReader.Create(ms))); var serverCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext, logger: testLoggerFactory.CreateLogger("Test")); var reader = new HttpContextStreamReader <HelloReply>(serverCallContext, MessageHelpers.ServiceMethod.ResponseMarshaller.ContextualDeserializer); var cts = new CancellationTokenSource(); var nextTask = reader.MoveNext(cts.Token); Assert.IsFalse(nextTask.IsCompleted); Assert.IsFalse(nextTask.IsCanceled); cts.Cancel(); try { await nextTask; Assert.Fail(); } catch (TaskCanceledException) { } Assert.IsTrue(nextTask.IsCompleted); Assert.IsTrue(nextTask.IsCanceled); Assert.AreEqual(1, testSink.Writes.Count); Assert.AreEqual("ReadingMessage", testSink.Writes.First().EventId.Name); }
public async Task MoveNext_TokenCancelledDuringMoveNext_CancelTask() { // Arrange var ms = new SyncPointMemoryStream(); var httpContext = new DefaultHttpContext(); httpContext.Request.BodyReader = new StreamPipeReader(ms); var serverCallContext = HttpContextServerCallContextHelper.CreateServerCallContext(httpContext); var reader = new HttpContextStreamReader <HelloReply>(serverCallContext, (data) => { var message = new HelloReply(); message.MergeFrom(data); return(message); }); var cts = new CancellationTokenSource(); var nextTask = reader.MoveNext(cts.Token); Assert.IsFalse(nextTask.IsCompleted); Assert.IsFalse(nextTask.IsCanceled); cts.Cancel(); try { await nextTask; Assert.Fail(); } catch (TaskCanceledException) { } Assert.IsTrue(nextTask.IsCompleted); Assert.IsTrue(nextTask.IsCanceled); }