コード例 #1
0
        public void TryReadAfterCompleteThrows()
        {
            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());

            reader.Complete();
            Assert.Throws <InvalidOperationException>(() => reader.TryRead(out _));
        }
コード例 #2
0
        public async Task CompleteReaderWithoutAdvanceDoesNotThrow()
        {
            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());
            await reader.ReadAsync();

            reader.Complete();
        }
コード例 #3
0
        public async Task ThrowsOnReadAfterCompleteReader()
        {
            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());

            reader.Complete();
            await Assert.ThrowsAsync <InvalidOperationException>(async() => await reader.ReadAsync());
        }
コード例 #4
0
        public async Task BufferingDataPastEndOfStreamCanBeReadAgain()
        {
            var protocol = new TestProtocol();
            var stream   = new ThrowAfterZeroByteReadStream();
            var writer   = PipeWriter.Create(stream);
            var reader   = new MessagePipeReader(PipeReader.Create(stream), protocol);

            protocol.WriteMessage(Encoding.ASCII.GetBytes("Hello World"), writer);
            await writer.FlushAsync().ConfigureAwait(false);

            stream.Position = 0;

            var readResult = await reader.ReadAsync();

            var buffer = readResult.Buffer;

            reader.AdvanceTo(buffer.Start, buffer.End);

            // Make sure IsCompleted is true
            readResult = await reader.ReadAsync();

            buffer = readResult.Buffer;
            reader.AdvanceTo(buffer.Start, buffer.End);
            Assert.True(readResult.IsCompleted);

            var value = await ReadFromPipeAsString(reader);

            Assert.Equal("Hello World", value);
            reader.Complete();
        }
コード例 #5
0
ファイル: MessageTracker.cs プロジェクト: radtek/aims-iis
 private void OnMessageRead(MessagePipeReader sender, Message message)
 {
     if (EventOccured != null)
     {
         EventOccured.Invoke(this, new GenericEventArgs <Message>(message));
     }
 }
コード例 #6
0
        public async Task ConsumePartialBufferWorks()
        {
            var protocol = new TestProtocol();
            var pipe     = new Pipe();
            var reader   = new MessagePipeReader(PipeReader.Create(pipe.Reader.AsStream()), protocol);

            pipe.Writer.WriteEmpty(protocol, 10);
            await pipe.Writer.FlushAsync();

            var readResult = await reader.ReadAsync();

            Assert.Equal(10, readResult.Buffer.Length);
            reader.AdvanceTo(readResult.Buffer.GetPosition(4), readResult.Buffer.End);

            pipe.Writer.WriteEmpty(protocol, 2);
            await pipe.Writer.FlushAsync();

            readResult = await reader.ReadAsync();

            // 6 bytes left over plus 2 newly written bytes
            Assert.Equal(8, readResult.Buffer.Length);
            reader.AdvanceTo(readResult.Buffer.End);

            reader.Complete();

            pipe.Writer.Complete();
            pipe.Reader.Complete();
        }
コード例 #7
0
ファイル: MessageTracker.cs プロジェクト: radtek/aims-iis
 private void OnPipeReaderCreated(PipeManager sender, MessagePipeReader pipeReader)
 {
     pipeReader.MessageRead      += OnMessageRead;
     pipeReader.ConnectionClosed += OnConnectionClosed;
     pipeReader.Start();
     _pipeReaders[pipeReader.PipeName] = pipeReader;
 }
コード例 #8
0
        public async Task CanReadMultipleTimes()
        {
            // This needs to run inline to synchronize the reader and writer
            TaskCompletionSource <object> waitForRead = null;
            var protocol = new TestProtocol();

            async Task DoAsyncRead(PipeReader reader, int[] bufferSizes)
            {
                var index = 0;

                while (true)
                {
                    var readResult = await reader.ReadAsync().ConfigureAwait(false);

                    if (readResult.IsCompleted)
                    {
                        break;
                    }

                    Assert.Equal(bufferSizes[index], readResult.Buffer.Length);
                    reader.AdvanceTo(readResult.Buffer.End);
                    index++;
                    waitForRead?.TrySetResult(null);
                }

                reader.Complete();
            }

            async Task DoAsyncWrites(PipeWriter writer, int[] bufferSizes)
            {
                for (var i = 0; i < bufferSizes.Length; i++)
                {
                    writer.WriteEmpty(protocol, bufferSizes[i]);
                    waitForRead = new TaskCompletionSource <object>();
                    await writer.FlushAsync().ConfigureAwait(false);

                    await waitForRead.Task;
                }

                writer.Complete();
            }

            // We're using the pipe here as a way to pump bytes into the reader asynchronously
            var pipe    = new Pipe();
            var options = new StreamPipeReaderOptions(bufferSize: 4096);
            var reader  = new MessagePipeReader(PipeReader.Create(pipe.Reader.AsStream(), options), protocol);

            var writes = new[] { 4096, 1024, 123, 4096, 100 };

            var readingTask = DoAsyncRead(reader, writes);
            var writingTask = DoAsyncWrites(pipe.Writer, writes);

            await readingTask;
            await writingTask;

            pipe.Reader.Complete();
        }
コード例 #9
0
        public void OnWriterCompletedNoops()
        {
            var fired  = false;
            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());

#pragma warning disable CS0618 // Type or member is obsolete
            reader.OnWriterCompleted((_, __) => { fired = true; }, null);
#pragma warning restore CS0618 // Type or member is obsolete
            reader.Complete();
            Assert.False(fired);
        }
コード例 #10
0
        public void TryReadAfterCancelPendingReadReturnsTrue()
        {
            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());

            reader.CancelPendingRead();

            Assert.True(reader.TryRead(out var result));
            Assert.True(result.IsCanceled);
            reader.AdvanceTo(result.Buffer.End);
            reader.Complete();
        }
コード例 #11
0
        public async Task ReadCanBeCanceledViaCancelPendingReadWhenReadIsAsync()
        {
            var        stream = new CancelledReadsStream();
            PipeReader reader = new MessagePipeReader(PipeReader.Create(stream), new TestProtocol());

            var task = reader.ReadAsync();

            reader.CancelPendingRead();

            stream.WaitForReadTask.TrySetResult(null);

            var readResult = await task;

            Assert.True(readResult.IsCanceled);
            reader.Complete();
        }
コード例 #12
0
        public async ValueTask MessagePipeReaderConsumeNoneEachTime()
        {
            var reader = new MessagePipeReader(pipe.Reader, testProtocol);
            var writer = pipe.Writer;

            for (var i = 0; i < NumIterations; i++)
            {
                testProtocol.WriteMessage(data, writer);
                await writer.FlushAsync().ConfigureAwait(false);

                var result = await reader.ReadAsync();

                reader.AdvanceTo(result.Buffer.Start);
            }
            reader.Complete();
        }
コード例 #13
0
        public async Task ReadAsyncAfterReceivingCompletedReadResultDoesNotThrow()
        {
            var stream     = new ThrowAfterZeroByteReadStream();
            var reader     = new MessagePipeReader(PipeReader.Create(stream), new TestProtocol());
            var readResult = await reader.ReadAsync();

            Assert.True(readResult.Buffer.IsEmpty);
            Assert.True(readResult.IsCompleted);
            reader.AdvanceTo(readResult.Buffer.End);

            readResult = await reader.ReadAsync();

            Assert.True(readResult.Buffer.IsEmpty);
            Assert.True(readResult.IsCompleted);
            reader.AdvanceTo(readResult.Buffer.End);
            reader.Complete();
        }
コード例 #14
0
        public async Task ReadCanBeCancelledViaProvidedCancellationToken()
        {
            var        stream = new CancelledReadsStream();
            PipeReader reader = new MessagePipeReader(PipeReader.Create(stream), new TestProtocol());
            var        cts    = new CancellationTokenSource();

            var task = reader.ReadAsync(cts.Token);

            Assert.False(task.IsCompleted);

            cts.Cancel();

            stream.WaitForReadTask.TrySetResult(null);

            await Assert.ThrowsAsync <OperationCanceledException>(async() => await task);

            reader.Complete();
        }
コード例 #15
0
        public async Task InvalidCursorThrows()
        {
            var protocol = new TestProtocol();
            var pipe     = new Pipe();

            pipe.Writer.WriteEmpty(protocol, 10);
            await pipe.Writer.FlushAsync();

            var readResult = await pipe.Reader.ReadAsync();

            var buffer = readResult.Buffer;

            var reader = new MessagePipeReader(PipeReader.Create(Stream.Null), new TestProtocol());

            Assert.Throws <ArgumentOutOfRangeException>(() => reader.AdvanceTo(buffer.Start, buffer.End));

            pipe.Reader.Complete();
            pipe.Writer.Complete();

            reader.Complete();
        }
コード例 #16
0
        private static MessagePipeReader CreateReader(out Func <byte[], Task> writeFunc)
        {
            var protocol = new TestProtocol();
            var stream   = new MemoryStream();
            var writer   = PipeWriter.Create(stream);
            var reader   = new MessagePipeReader(PipeReader.Create(stream), protocol);

            long written = 0;

            writeFunc = async bytes =>
            {
                var position = stream.Position;
                stream.Position = written;
                protocol.WriteMessage(bytes, writer);
                await writer.FlushAsync().ConfigureAwait(false);

                written         = stream.Position;
                stream.Position = position;
            };
            return(reader);
        }
コード例 #17
0
        public async Task CanUseMultipleMessageReadersOnSameUnderlyingReader()
        {
            var protocol         = new TestProtocol();
            var pipe             = new Pipe();
            var underlyingReader = PipeReader.Create(pipe.Reader.AsStream());

            var reader = new MessagePipeReader(underlyingReader, protocol);

            protocol.WriteMessage(Encoding.ASCII.GetBytes("Hello"), pipe.Writer);
            protocol.WriteMessage(Encoding.ASCII.GetBytes("World"), pipe.Writer);
            await pipe.Writer.FlushAsync();

            var readResult = await reader.ReadAsync();

            Assert.Equal("Hello", Encoding.ASCII.GetString(readResult.Buffer.ToArray()));
            reader.Complete();

            reader     = new MessagePipeReader(underlyingReader, protocol);
            readResult = await reader.ReadAsync();

            Assert.Equal("World", Encoding.ASCII.GetString(readResult.Buffer.ToArray()));

            reader.Complete();
        }
コード例 #18
0
        public async Task DoesNotReturnCompletedIfUnderlyingReaderIsCompletedIfThereAreMoreMessagesToParse()
        {
            var protocol     = new TestProtocol();
            var bufferWriter = new ArrayBufferWriter <byte>();

            protocol.WriteMessage(new byte[100], bufferWriter);
            protocol.WriteMessage(new byte[100], bufferWriter);
            var reader = new MessagePipeReader(
                new CompletingPipeReader(new ReadOnlySequence <byte>(bufferWriter.WrittenMemory)),
                protocol);

            var readResult = await reader.ReadAsync();

            var buffer = readResult.Buffer;

            Assert.Equal(100, buffer.Length);
            Assert.False(readResult.IsCompleted);

            reader.AdvanceTo(buffer.Start);
            readResult = await reader.ReadAsync();

            buffer = readResult.Buffer;

            Assert.Equal(200, buffer.Length);
            Assert.False(readResult.IsCompleted);

            reader.AdvanceTo(buffer.Start);
            readResult = await reader.ReadAsync();

            buffer = readResult.Buffer;

            Assert.Equal(200, buffer.Length);
            Assert.True(readResult.IsCompleted);

            reader.Complete();
        }