Exemplo n.º 1
0
        public async Task CreatingStreamShouldEmitHeaders()
        {
            var inPipe  = new BufferedPipe(1024);
            var outPipe = new BufferedPipe(1024);
            var conn    = await ConnectionUtils.BuildEstablishedConnection(
                false, inPipe, outPipe, loggerProvider);

            var stream1Task = conn.CreateStreamAsync(DefaultGetHeaders, false);
            var stream1     = await stream1Task;

            Assert.Equal(StreamState.Open, stream1.State);
            Assert.Equal(1u, stream1.Id);

            var fh = await outPipe.ReadFrameHeaderWithTimeout();

            Assert.Equal(1u, fh.StreamId);
            Assert.Equal(FrameType.Headers, fh.Type);
            Assert.Equal((byte)HeadersFrameFlags.EndOfHeaders, fh.Flags);
            Assert.Equal(EncodedDefaultGetHeaders.Length, fh.Length);
            var hdrData = new byte[fh.Length];
            await outPipe.ReadWithTimeout(new ArraySegment <byte>(hdrData));

            Assert.Equal(EncodedDefaultGetHeaders, hdrData);

            var stream3Task = conn.CreateStreamAsync(DefaultGetHeaders, true);
            var stream3     = await stream3Task;

            Assert.Equal(StreamState.HalfClosedLocal, stream3.State);
            Assert.Equal(3u, stream3.Id);

            fh = await outPipe.ReadFrameHeaderWithTimeout();

            Assert.Equal(3u, fh.StreamId);
            Assert.Equal(FrameType.Headers, fh.Type);
            Assert.Equal(
                (byte)(HeadersFrameFlags.EndOfHeaders | HeadersFrameFlags.EndOfStream),
                fh.Flags);
            Assert.Equal(EncodedIndexedDefaultGetHeaders.Length, fh.Length);
            var hdrData3 = new byte[fh.Length];
            await outPipe.ReadWithTimeout(new ArraySegment <byte>(hdrData3));

            Assert.Equal(EncodedIndexedDefaultGetHeaders, hdrData3);
        }
Exemplo n.º 2
0
        public async Task CreatedStreamsShouldAlwaysUseIncreasedStreamIds(
            int nrStreams)
        {
            // This test checks if there are race conditions in the stream
            // establish code
            var inPipe  = new BufferedPipe(10 * 1024);
            var outPipe = new BufferedPipe(10 * 1024);
            var conn    = await ConnectionUtils.BuildEstablishedConnection(
                false, inPipe, outPipe, loggerProvider);

            var createStreamTasks = new Task <IStream> [nrStreams];

            for (var i = 0; i < nrStreams; i++)
            {
                // Create the task in the threadpool
                var t = Task.Run(
                    () => conn.CreateStreamAsync(DefaultGetHeaders, false));
                createStreamTasks[i] = t;
            }

            // Wait until all streams are open
            await Task.WhenAll(createStreamTasks);

            var streams = createStreamTasks.Select(t => t.Result).ToList();

            // Check output data
            // Sequence IDs must be always increasing
            var buffer = new byte[Settings.Default.MaxFrameSize];

            for (var i = 0; i < nrStreams; i++)
            {
                var expectedId = 1u + 2 * i;
                var fh         = await outPipe.ReadFrameHeaderWithTimeout();

                Assert.Equal(expectedId, fh.StreamId);
                Assert.Equal(FrameType.Headers, fh.Type);
                Assert.Equal((byte)HeadersFrameFlags.EndOfHeaders, fh.Flags);
                // Discard header data
                await outPipe.ReadWithTimeout(
                    new ArraySegment <byte>(buffer, 0, fh.Length));
            }
        }