Example #1
0
        public static IPipeReader DeflateDecompress(this IPipeReader reader, PipeFactory factory)
        {
            var inflater = new ReadableDeflateTransform(ZLibNative.Deflate_DefaultWindowBits);
            var pipe     = factory.Create();
            var ignore   = inflater.Execute(reader, pipe.Writer);

            return(pipe.Reader);
        }
Example #2
0
        public static IPipeReader CreateGZipCompressReader(this PipeFactory factory, IPipeReader reader, CompressionLevel compressionLevel)
        {
            var deflater = new WritableDeflateTransform(compressionLevel, ZLibNative.GZip_DefaultWindowBits);
            var pipe     = factory.Create();
            var ignore   = deflater.Execute(reader, pipe.Writer);

            return(pipe.Reader);
        }
        public static IPipeReader ReadFile(this PipeFactory factory, string path)
        {
            var pipe = factory.Create();
            var file = new FileReader(pipe.Writer);

            file.OpenReadFile(path);
            return(pipe.Reader);
        }
Example #4
0
        public async Task ParseMessageAcrossMultipleReadsSuccess(string[] messageParts, string expectedMessage)
        {
            using (var pipeFactory = new PipeFactory())
            {
                var parser = new ServerSentEventsMessageParser();
                var pipe   = pipeFactory.Create();

                byte[]     message = null;
                ReadCursor consumed = default, examined = default;
Example #5
0
 public BackpressureTests()
 {
     _pipeFactory = new PipeFactory();
     _pipe        = _pipeFactory.Create(new PipeOptions
     {
         MaximumSizeLow  = 32,
         MaximumSizeHigh = 64
     });
 }
Example #6
0
 public PipeTest()
 {
     _pipeFactory = new PipeFactory();
     Pipe         = _pipeFactory.Create(new PipeOptions()
     {
         MaximumSizeHigh = 65,
         MaximumSizeLow  = 6
     });
 }
Example #7
0
 public void EmptyWriteDoesNotThrow()
 {
     using (var factory = new PipeFactory())
     {
         var pipe   = factory.Create();
         var buffer = pipe.Writer.Alloc();
         buffer.Write(new byte[0], 0, 0);
     }
 }
Example #8
0
 public void EnsureMoreThanPoolBlockSizeThrows()
 {
     using (var factory = new PipeFactory())
     {
         var pipe   = factory.Create();
         var buffer = pipe.Writer.Alloc();
         Assert.Throws <ArgumentOutOfRangeException>(() => buffer.Ensure(8192));
     }
 }
Example #9
0
        public void WriteHex(int value, string hex)
        {
            using (var factory = new PipeFactory())
            {
                var pipe   = factory.Create();
                var buffer = pipe.Writer.Alloc();
                buffer.Append(value, TextEncoder.Utf8, 'x');

                Assert.Equal(hex, buffer.AsReadableBuffer().GetAsciiString());
            }
        }
        private OutputProducer CreateOutputProducer(PipeOptions pipeOptions)
        {
            var pipe           = _pipeFactory.Create(pipeOptions);
            var serviceContext = new TestServiceContext();
            var socketOutput   = new OutputProducer(
                pipe,
                "0",
                serviceContext.Log,
                Mock.Of <ITimeoutControl>());

            return(socketOutput);
        }
Example #11
0
        public FrameConnectionTests()
        {
            _pipeFactory = new PipeFactory();

            _frameConnectionContext = new FrameConnectionContext
            {
                ConnectionId          = "0123456789",
                ConnectionAdapters    = new List <IConnectionAdapter>(),
                ConnectionInformation = new MockConnectionInformation
                {
                    PipeFactory = _pipeFactory
                },
                FrameConnectionId = long.MinValue,
                Input             = _pipeFactory.Create(),
                Output            = _pipeFactory.Create(),
                ServiceContext    = new TestServiceContext
                {
                    SystemClock = new SystemClock()
                }
            };

            _frameConnection = new FrameConnection(_frameConnectionContext);
        }
Example #12
0
        public FrameTests()
        {
            _pipelineFactory = new PipeFactory();
            _input           = _pipelineFactory.Create();
            var output = _pipelineFactory.Create();

            _serviceContext = new TestServiceContext();
            _timeoutControl = new Mock <ITimeoutControl>();
            _frameContext   = new FrameContext
            {
                ServiceContext        = _serviceContext,
                ConnectionInformation = new MockConnectionInformation
                {
                    PipeFactory = _pipelineFactory
                },
                TimeoutControl = _timeoutControl.Object,
                Input          = _input.Reader,
                Output         = output
            };

            _frame = new TestFrame <object>(application: null, context: _frameContext);
            _frame.Reset();
        }
Example #13
0
        internal SocketConnection(Socket socket, PipeFactory factory)
        {
            socket.NoDelay = true;
            _socket        = socket;
            if (factory == null)
            {
                _ownsFactory = true;
                factory      = new PipeFactory();
            }
            _factory = factory;

            _input  = PipeFactory.Create();
            _output = PipeFactory.Create();

            _receiveTask = ReceiveFromSocketAndPushToWriterAsync();
            _sendTask    = ReadFromReaderAndWriteToSocketAsync();
        }
Example #14
0
        public async Task MultipleCompleteReaderWriterCauseDisposeOnlyOnce()
        {
            var pool = new DisposeTrackingBufferPool();

            using (var factory = new PipeFactory(pool))
            {
                var readerWriter = factory.Create();
                await readerWriter.Writer.WriteAsync(new byte[] { 1 });

                readerWriter.Writer.Complete();
                readerWriter.Reader.Complete();
                Assert.Equal(1, pool.Disposed);

                readerWriter.Writer.Complete();
                readerWriter.Reader.Complete();
                Assert.Equal(1, pool.Disposed);
            }
        }
Example #15
0
        public async Task FlushCallbackRunsOnWriterScheduler()
        {
            using (var factory = new PipeFactory())
            {
                using (var scheduler = new ThreadScheduler())
                {
                    var pipe = factory.Create(new PipeOptions
                    {
                        MaximumSizeLow  = 32,
                        MaximumSizeHigh = 64,
                        WriterScheduler = scheduler
                    });

                    var writableBuffer = pipe.Writer.Alloc(64);
                    writableBuffer.Advance(64);
                    var flushAsync = writableBuffer.FlushAsync();

                    Assert.False(flushAsync.IsCompleted);

                    Func <Task> doWrite = async() =>
                    {
                        var oid = Thread.CurrentThread.ManagedThreadId;

                        await flushAsync;

                        Assert.NotEqual(oid, Thread.CurrentThread.ManagedThreadId);

                        pipe.Writer.Complete();

                        Assert.Equal(Thread.CurrentThread.ManagedThreadId, scheduler.Thread.ManagedThreadId);
                    };

                    var writing = doWrite();

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

                    pipe.Reader.Advance(result.Buffer.End, result.Buffer.End);

                    pipe.Reader.Complete();

                    await writing;
                }
            }
        }
Example #16
0
        public async Task GetUInt64GivesExpectedValues()
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();

                var writeBuffer = readerWriter.Writer.Alloc();
                writeBuffer.Ensure(50);
                writeBuffer.Advance(50);        // not even going to pretend to write data here - we're going to cheat
                await writeBuffer.FlushAsync(); // by overwriting the buffer in-situ

                // now read it back
                var result = await readerWriter.Reader.ReadAsync();

                var readBuffer = result.Buffer;

                ReadUInt64GivesExpectedValues(ref readBuffer);
            }
        }
Example #17
0
        public async Task TrimEndTrimsWhitespaceAtEnd(string input, string expected)
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();

                var writeBuffer = readerWriter.Writer.Alloc();
                var bytes       = Encoding.ASCII.GetBytes(input);
                writeBuffer.Write(bytes);
                await writeBuffer.FlushAsync();

                var result = await readerWriter.Reader.ReadAsync();

                var buffer      = result.Buffer;
                var trimmed     = buffer.TrimEnd();
                var outputBytes = trimmed.ToArray();

                Assert.Equal(expected, Encoding.ASCII.GetString(outputBytes));
            }
        }
Example #18
0
        public TestInput()
        {
            _memoryPool      = new MemoryPool();
            _pipelineFactory = new PipeFactory();
            Pipe             = _pipelineFactory.Create();

            FrameContext = new FrameContext
            {
                ServiceContext        = new TestServiceContext(),
                Input                 = Pipe.Reader,
                ConnectionInformation = new MockConnectionInformation
                {
                    PipeFactory = _pipelineFactory
                },
                TimeoutControl = Mock.Of <ITimeoutControl>()
            };

            Frame = new Frame <object>(null, FrameContext);
            Frame.FrameControl = Mock.Of <IFrameControl>();
        }
Example #19
0
        public void Setup()
        {
            PipeFactory = new PipeFactory();
            Pipe        = PipeFactory.Create();

            var serviceContext = new ServiceContext
            {
                HttpParserFactory = f => new HttpParser <Http1ParsingHandler>(),
                ServerOptions     = new KestrelServerOptions(),
            };
            var http1ConnectionContext = new Http1ConnectionContext
            {
                ServiceContext     = serviceContext,
                ConnectionFeatures = new FeatureCollection(),
                PipeFactory        = PipeFactory,
                TimeoutControl     = new MockTimeoutControl()
            };

            Http1Connection = new Http1Connection <object>(application: null, context: http1ConnectionContext);
        }
Example #20
0
        public async Task EqualsDetectsDeltaForAllLocations()
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();

                // populate with dummy data
                const int DataSize = 10000;
                byte[]    data     = new byte[DataSize];
                var       rand     = new Random(12345);
                rand.NextBytes(data);

                var writeBuffer = readerWriter.Writer.Alloc();
                writeBuffer.Write(data);
                await writeBuffer.FlushAsync();

                // now read it back
                var result = await readerWriter.Reader.ReadAsync();

                var readBuffer = result.Buffer;
                Assert.False(readBuffer.IsSingleSpan);
                Assert.Equal(data.Length, readBuffer.Length);

                // check the entire buffer
                EqualsDetectsDeltaForAllLocations(readBuffer, data, 0, data.Length);

                // check the first 32 sub-lengths
                for (int i = 0; i <= 32; i++)
                {
                    var slice = readBuffer.Slice(0, i);
                    EqualsDetectsDeltaForAllLocations(slice, data, 0, i);
                }

                // check the last 32 sub-lengths
                for (int i = 0; i <= 32; i++)
                {
                    var slice = readBuffer.Slice(data.Length - i, i);
                    EqualsDetectsDeltaForAllLocations(slice, data, data.Length - i, i);
                }
            }
        }
Example #21
0
        public async Task ReadTWorksAgainstMultipleBuffers()
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();
                var output       = readerWriter.Writer.Alloc();

                // we're going to try to force 3 buffers for 8 bytes
                output.Write(new byte[] { 0, 1, 2 });
                output.Ensure(4031);
                output.Write(new byte[] { 3, 4, 5 });
                output.Ensure(4031);
                output.Write(new byte[] { 6, 7, 9 });

                var readable = output.AsReadableBuffer();
                Assert.Equal(9, readable.Length);

                int spanCount = 0;
                foreach (var _ in readable)
                {
                    spanCount++;
                }
                Assert.Equal(3, spanCount);

                byte[] local = new byte[9];
                readable.CopyTo(local);
                var span = new Span <byte>(local);

                Assert.Equal(span.Read <byte>(), readable.ReadLittleEndian <byte>());
                Assert.Equal(span.Read <sbyte>(), readable.ReadLittleEndian <sbyte>());
                Assert.Equal(span.Read <short>(), readable.ReadLittleEndian <short>());
                Assert.Equal(span.Read <ushort>(), readable.ReadLittleEndian <ushort>());
                Assert.Equal(span.Read <int>(), readable.ReadLittleEndian <int>());
                Assert.Equal(span.Read <uint>(), readable.ReadLittleEndian <uint>());
                Assert.Equal(span.Read <long>(), readable.ReadLittleEndian <long>());
                Assert.Equal(span.Read <ulong>(), readable.ReadLittleEndian <ulong>());
                Assert.Equal(span.Read <float>(), readable.ReadLittleEndian <float>());
                Assert.Equal(span.Read <double>(), readable.ReadLittleEndian <double>());
                await output.FlushAsync();
            }
        }
Example #22
0
        public async Task WriteDuringReadIsNotReturned()
        {
            var pool = new DisposeTrackingBufferPool();

            var writeSize = 512;

            using (var factory = new PipeFactory(pool))
            {
                var pipe = factory.Create();
                await pipe.Writer.WriteAsync(new byte[writeSize]);

                var buffer     = pipe.Writer.Alloc(writeSize);
                var readResult = await pipe.Reader.ReadAsync();

                pipe.Reader.Advance(readResult.Buffer.End);
                buffer.Write(new byte[writeSize]);
                buffer.Commit();

                Assert.Equal(1, pool.CurrentlyRentedBlocks);
            }
        }
Example #23
0
        public async Task PeekWorkesWithEmptySegments()
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();
                var w            = readerWriter.Writer.Alloc();
                w.Append(ReadableBuffer.Create(new byte[] { 0 }, 0, 0));
                w.Append(ReadableBuffer.Create(new byte[] { 1 }, 0, 1));
                await w.FlushAsync();

                var result = await readerWriter.Reader.ReadAsync();

                var buffer = result.Buffer;
                var reader = new ReadableBufferReader(buffer);

                Assert.Equal(1, reader.Peek());
                Assert.Equal(1, reader.Take());
                Assert.Equal(-1, reader.Peek());
                Assert.Equal(-1, reader.Take());
            }
        }
Example #24
0
        public async Task DefaultWriterSchedulerRunsInline()
        {
            using (var factory = new PipeFactory())
            {
                var pipe = factory.Create(new PipeOptions
                {
                    MaximumSizeLow  = 32,
                    MaximumSizeHigh = 64
                });

                var writableBuffer = pipe.Writer.Alloc(64);
                writableBuffer.Advance(64);
                var flushAsync = writableBuffer.FlushAsync();

                Assert.False(flushAsync.IsCompleted);

                int id = 0;

                Func <Task> doWrite = async() =>
                {
                    await flushAsync;

                    pipe.Writer.Complete();

                    Assert.Equal(Thread.CurrentThread.ManagedThreadId, id);
                };

                var writing = doWrite();

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

                id = Thread.CurrentThread.ManagedThreadId;

                pipe.Reader.Advance(result.Buffer.End, result.Buffer.End);

                pipe.Reader.Complete();

                await writing;
            }
        }
Example #25
0
        public async Task TakeTraversesSegments()
        {
            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();
                var w            = readerWriter.Writer.Alloc();
                w.Append(ReadableBuffer.Create(new byte[] { 1 }, 0, 1));
                w.Append(ReadableBuffer.Create(new byte[] { 2 }, 0, 1));
                w.Append(ReadableBuffer.Create(new byte[] { 3 }, 0, 1));
                await w.FlushAsync();

                var result = await readerWriter.Reader.ReadAsync();

                var buffer = result.Buffer;
                var reader = new ReadableBufferReader(buffer);

                Assert.Equal(1, reader.Take());
                Assert.Equal(2, reader.Take());
                Assert.Equal(3, reader.Take());
                Assert.Equal(-1, reader.Take());
            }
        }
        public void Setup()
        {
            PipeFactory = new PipeFactory();
            Pipe        = PipeFactory.Create();

            var serviceContext = new ServiceContext
            {
                HttpParserFactory = f => new HttpParser <FrameAdapter>(),
                ServerOptions     = new KestrelServerOptions(),
            };
            var frameContext = new FrameContext
            {
                ServiceContext        = serviceContext,
                ConnectionInformation = new MockConnectionInformation
                {
                    PipeFactory = PipeFactory
                },
                TimeoutControl = new MockTimeoutControl()
            };

            Frame = new Frame <object>(application: null, frameContext: frameContext);
        }
Example #27
0
        public async Task CopyToAsyncNativeMemory()
        {
            using (var factory = new PipeFactory(NativeBufferPool.Shared))
            {
                var readerWriter = factory.Create();
                var output       = readerWriter.Writer.Alloc();
                output.Append("Hello World", TextEncoder.Utf8);
                await output.FlushAsync();

                var ms     = new MemoryStream();
                var result = await readerWriter.Reader.ReadAsync();

                var rb = result.Buffer;
                await rb.CopyToAsync(ms);

                ms.Position = 0;
                Assert.Equal(11, rb.Length);
                Assert.Equal(11, ms.Length);
                Assert.Equal(rb.ToArray(), ms.ToArray());
                Assert.Equal("Hello World", Encoding.ASCII.GetString(ms.ToArray()));
            }
        }
Example #28
0
        public async Task TrySliceToSpan(string input, string sliceTo, string expected)
        {
            var sliceToBytes = Encoding.UTF8.GetBytes(sliceTo);

            using (var factory = new PipeFactory())
            {
                var readerWriter = factory.Create();

                var writeBuffer = readerWriter.Writer.Alloc();
                var bytes       = Encoding.UTF8.GetBytes(input);
                writeBuffer.Write(bytes);
                await writeBuffer.FlushAsync();

                var result = await readerWriter.Reader.ReadAsync();

                var            buffer = result.Buffer;
                ReadableBuffer slice;
                ReadCursor     cursor;
                Assert.True(buffer.TrySliceTo(sliceToBytes, out slice, out cursor));
                Assert.Equal(expected, slice.GetUtf8String());
            }
        }
Example #29
0
        public async Task AdvanceToEndReturnsAllBlocks()
        {
            var pool = new DisposeTrackingBufferPool();

            var writeSize = 512;

            using (var factory = new PipeFactory(pool))
            {
                var pipe = factory.Create();
                while (pool.CurrentlyRentedBlocks != 3)
                {
                    var writableBuffer = pipe.Writer.Alloc(writeSize);
                    writableBuffer.Advance(writeSize);
                    await writableBuffer.FlushAsync();
                }

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

                pipe.Reader.Advance(readResult.Buffer.End);

                Assert.Equal(0, pool.CurrentlyRentedBlocks);
            }
        }
        private OutputProducer CreateOutputProducer(PipeOptions pipeOptions, CancellationTokenSource cts = null)
        {
            var pipe = _pipeFactory.Create(pipeOptions);

            var logger         = new TestApplicationErrorLogger();
            var serviceContext = new TestServiceContext
            {
                Log        = new TestKestrelTrace(logger),
                ThreadPool = new InlineLoggingThreadPool(new TestKestrelTrace(logger))
            };
            var transportContext = new TestLibuvTransportContext {
                Log = new LibuvTrace(logger)
            };

            var socket   = new MockSocket(_mockLibuv, _libuvThread.Loop.ThreadId, transportContext.Log);
            var consumer = new LibuvOutputConsumer(pipe.Reader, _libuvThread, socket, "0", transportContext.Log);

            var frame = new Frame <object>(null, new FrameContext
            {
                ServiceContext        = serviceContext,
                ConnectionInformation = new MockConnectionInformation
                {
                    PipeFactory = _pipeFactory
                },
                TimeoutControl = Mock.Of <ITimeoutControl>(),
                Output         = pipe
            });

            if (cts != null)
            {
                frame.RequestAborted.Register(cts.Cancel);
            }

            var ignore = WriteOutputAsync(consumer, pipe.Reader, frame);

            return(frame.Output);
        }