Exemplo n.º 1
0
        public async Task ReadsShouldUnblockWrites()
        {
            var p      = new BufferedPipe(70);
            var input  = new byte[70];
            var input2 = new byte[50];
            var output = new byte[60];

            for (var i = 0; i < 70; i++)
            {
                input[i] = (byte)i;
            }

            // Fill the complete buffer
            await p.WriteAsync(new ArraySegment <byte>(input));

            var writeMoreTask = p.WriteAsync(new ArraySegment <byte>(input2));
            // Read in the background to unblock
            var readTask = Task.Run(async() =>
            {
                await Task.Delay(10);
                return(await p.ReadAsync(new ArraySegment <byte>(output)).AsTask());
            });
            // The next line would deadlock without the reader in the background
            await writeMoreTask;
            var   res = await readTask;

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(60, res.BytesRead);
            for (var i = 0; i < 60; i++)
            {
                Assert.Equal(i, output[i]);
            }
        }
Exemplo n.º 2
0
        public async Task CloseShouldUnblockReads()
        {
            var p      = new BufferedPipe(128);
            var input  = new byte[70];
            var output = new byte[50];

            for (var i = 0; i < 70; i++)
            {
                input[i] = (byte)i;
            }
            // Start read first
            var task = p.ReadAsync(new ArraySegment <byte>(output)).AsTask();
            // Schedule close
            var writeTask = Task.Run(async() =>
            {
                await Task.Delay(10);
                await p.CloseAsync();
            });
            // And wait for read to unblock
            var res = await task;

            Assert.Equal(true, res.EndOfStream);
            Assert.Equal(0, res.BytesRead);
            // The writeTask should also finish
            await writeTask;
        }
Exemplo n.º 3
0
        public async Task WritingOnOneEndShallYieldInDataOnTheOtherEnd()
        {
            var p      = new BufferedPipe(128);
            var input  = new byte[70];
            var output = new byte[50];

            for (var i = 0; i < 70; i++)
            {
                input[i] = (byte)i;
            }

            await p.WriteAsync(new ArraySegment <byte>(input));

            var res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(50, res.BytesRead);
            for (var i = 0; i < 50; i++)
            {
                Assert.Equal(i, output[i]);
            }

            await p.CloseAsync();

            res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(20, res.BytesRead);
            for (var i = 0; i < 20; i++)
            {
                Assert.Equal(50 + i, output[i]);
            }

            await p.CloseAsync();

            res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(true, res.EndOfStream);
            Assert.Equal(0, res.BytesRead);
        }
Exemplo n.º 4
0
        public async Task ReadsShouldBlockIfNoDataIsAvailable()
        {
            var p      = new BufferedPipe(128);
            var input  = new byte[30];
            var output = new byte[50];
            // Fill some data first - first try should succeed
            await p.WriteAsync(new ArraySegment <byte>(input));

            var res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(30, res.BytesRead);

            // Try to read more data from the pipe which wil never get available
            var readTask = Task.Run(async() => await p.ReadAsync(new ArraySegment <byte>(output)));
            // Start a timer in parallel
            var timerTask = Task.Delay(20);

            var finishedTask = await Task.WhenAny(readTask, timerTask);

            Assert.Equal(timerTask, finishedTask);
            Assert.Equal(false, readTask.IsCompleted);
        }
Exemplo n.º 5
0
        public async Task CloseShouldAllowRemainingDataToBeReadBeforeSignalClose()
        {
            var p      = new BufferedPipe(128);
            var input  = new byte[20];
            var output = new byte[10];

            for (var i = 0; i < 20; i++)
            {
                input[i] = (byte)i;
            }
            await p.WriteAsync(new ArraySegment <byte>(input));

            await p.CloseAsync();

            var res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(10, res.BytesRead);
            for (var i = 0; i < 10; i++)
            {
                Assert.Equal(i, output[i]);
            }

            res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(false, res.EndOfStream);
            Assert.Equal(10, res.BytesRead);
            for (var i = 0; i < 10; i++)
            {
                Assert.Equal(i + 10, output[i]);
            }

            res = await p.ReadAsync(new ArraySegment <byte>(output));

            Assert.Equal(true, res.EndOfStream);
            Assert.Equal(0, res.BytesRead);
        }
        public async Task ServerShouldCloseTheConnectionIfNoPrefaceIsSent(
            int nrDummyPrefaceData)
        {
            var inPipe   = new BufferedPipe(1024);
            var outPipe  = new BufferedPipe(1024);
            var http2Con = BuildConnection(true, inPipe, outPipe);

            // Write some dummy data
            // All this data is not long enough to be a preface, so the
            // preface reception should time out
            if (nrDummyPrefaceData != 0)
            {
                var b = new byte[nrDummyPrefaceData];
                for (var i = 0; i < b.Length; i++)
                {
                    b[i] = 10;
                }
                await inPipe.WriteAsync(new ArraySegment <byte>(b));
            }

            // Settings will be sent by connection before the preface is
            // checked - so they must be discarded
            await outPipe.ReadAndDiscardSettings();

            // Wait for the stream to end within 400ms.
            // This is longer than the timeout in the connection waiting for the
            // preface

            var buf          = new byte[1];
            var readTask     = outPipe.ReadAsync(new ArraySegment <byte>(buf)).AsTask();
            var timeoutTask  = Task.Delay(400);
            var finishedTask = await Task.WhenAny(
                new Task[] { readTask, timeoutTask });

            if (ReferenceEquals(finishedTask, readTask))
            {
                var res = readTask.Result;
                Assert.Equal(true, res.EndOfStream);
                Assert.Equal(0, res.BytesRead);
                // Received end of stream
                return;
            }
            Assert.True(false,
                        "Expected connection to close outgoing stream. " +
                        "Got timeout");
        }