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); }
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)); } }