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 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 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); }