public async void ShouldWriteToUnderlyingStreamUponSendAsync()
        {
            var buffer = new byte[1024];
            var stream = new MemoryStream();
            var writer = new ChunkWriter(stream);

            // Write data
            writer.OpenChunk();
            writer.Write(buffer, 0, buffer.Length);
            writer.CloseChunk();

            stream.Length.Should().Be(0);

            await writer.SendAsync();

            stream.Length.Should().Be(buffer.Length + 2);
        }
        public async void ShouldLogDataOnSendAsync()
        {
            var buffer = Enumerable.Range(0, 10).Select(i => (byte)i).ToArray();
            var stream = new MemoryStream();
            var logger = LoggingHelper.GetTraceEnabledLogger();
            var writer = new ChunkWriter(stream, logger.Object);

            // Write data
            writer.OpenChunk();
            writer.Write(buffer, 0, buffer.Length);
            writer.CloseChunk();

            logger.Verify(x => x.Trace("C: {0}", It.IsAny <string>()), Times.Never);

            await writer.SendAsync();

            logger.Verify(x => x.Trace("C: {0}", It.IsAny <string>()), Times.Once);
        }
        public async void ShouldCloseTheChunkWithCorrectSizeAsync(int chunkSize)
        {
            var buffer = Enumerable.Range(0, chunkSize).Select(i => i % byte.MaxValue).Select(i => (byte)i).ToArray();
            var stream = new MemoryStream();
            var writer = new ChunkWriter(stream);

            // Write data
            writer.OpenChunk();
            writer.Write(buffer, 0, buffer.Length);
            writer.CloseChunk();

            // End Of Message Marker
            writer.OpenChunk();
            writer.CloseChunk();

            // Write To Underlying Stream
            await writer.SendAsync();

            var constructed = await ConstructMessage(stream.ToArray());

            constructed.Should().HaveCount(chunkSize);
            constructed.Should().Equal(buffer);
        }