public async Task CopyToAsyncThrowsOnTimeout() { using (var input = new TestInput()) { var mockTimeoutControl = new Mock <ITimeoutControl>(); input.FrameContext.TimeoutControl = mockTimeoutControl.Object; var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders { HeaderContentLength = "5" }, input.Frame); // Add some input and read it to start PumpAsync input.Add("a"); Assert.Equal(1, await body.ReadAsync(new ArraySegment <byte>(new byte[1]))); // Time out on the next read mockTimeoutControl .Setup(timeoutControl => timeoutControl.TimedOut) .Returns(true); input.Cancel(); using (var ms = new MemoryStream()) { var exception = await Assert.ThrowsAsync <BadHttpRequestException>(() => body.CopyToAsync(ms)); Assert.Equal(StatusCodes.Status408RequestTimeout, exception.StatusCode); } await body.StopAsync(); } }