public async Task CompletesWithLastRead()
        {
            var pipe      = new Pipe();
            var decryptor = new PipelinedDecryptor(pipe.Reader);

            pipe.Writer.Write(new byte[] { 0xC1, 0x03, 0x01 });
            pipe.Writer.Complete();
            var result = await decryptor.Reader.ReadAsync().ConfigureAwait(false);

            Assert.That(result.IsCompleted, Is.True);
        }
        public async Task CompletesAfterReadAsyncIsCalled()
        {
            var pipe      = new Pipe();
            var decryptor = new PipelinedDecryptor(pipe.Reader);
            var reading   = decryptor.Reader.ReadAsync().ConfigureAwait(false);
            await pipe.Writer.CompleteAsync().ConfigureAwait(false);

            var result = await reading;
            await Task.Delay(10).ConfigureAwait(false);

            Assert.That(result.IsCompleted, Is.True);
        }
        /// <summary>
        /// Decrypts the specified encrypted packet and compares the result it with the specified decrypted packet.
        /// </summary>
        /// <param name="encryptedPacket">The encrypted packet.</param>
        /// <param name="decryptedPacket">The expected decrypted packet.</param>
        /// <returns>The task.</returns>
        private async Task Decrypt(byte[] encryptedPacket, byte[] decryptedPacket)
        {
            var pipe      = new Pipe();
            var decryptor = new PipelinedDecryptor(pipe.Reader);

            pipe.Writer.Write(encryptedPacket);
            await pipe.Writer.FlushAsync().ConfigureAwait(false);

            var readResult = await decryptor.Reader.ReadAsync().ConfigureAwait(false);

            var result = readResult.Buffer.ToArray();

            Assert.That(result, Is.EquivalentTo(decryptedPacket));
        }
        public async Task CompletesAfterReadAsyncIsCalled()
        {
            var pipe      = new Pipe();
            var decryptor = new PipelinedDecryptor(pipe.Reader);
            var completed = false;

            decryptor.Reader.OnWriterCompleted((e, o) => completed = true, null);
            var reading = decryptor.Reader.ReadAsync();

            pipe.Writer.Complete();
            var result = await reading;

            Assert.That(completed && result.IsCompleted, Is.True);
        }