From e5ec72c833fedd5c86e8017eedff22ad715e6aac Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Mon, 15 Oct 2018 11:09:25 -0700 Subject: [PATCH] Add test to verify HTTP/2 preamble is included in keep-alive timeout (#3011) #2900 --- .../Http2/Http2TimeoutTests.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/Kestrel.InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs b/test/Kestrel.InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs index d7d75800ca..563837bcfb 100644 --- a/test/Kestrel.InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs +++ b/test/Kestrel.InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure; +using Microsoft.AspNetCore.Testing; using Microsoft.Net.Http.Headers; using Moq; using Xunit; @@ -16,6 +17,31 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests { public class Http2TimeoutTests : Http2TestBase { + [Fact] + public async Task Preamble_NotReceivedInitially_WithinKeepAliveTimeout_ClosesConnection() + { + var mockSystemClock = _serviceContext.MockSystemClock; + var limits = _serviceContext.ServerOptions.Limits; + + _timeoutControl.Initialize(mockSystemClock.UtcNow); + + CreateConnection(); + + _connectionTask = _connection.ProcessRequestsAsync(new DummyApplication(_noopApplication)); + + mockSystemClock.UtcNow += limits.KeepAliveTimeout + Heartbeat.Interval; + _timeoutControl.Tick(mockSystemClock.UtcNow); + + _mockTimeoutHandler.Verify(h => h.OnTimeout(It.IsAny()), Times.Never); + + mockSystemClock.UtcNow += TimeSpan.FromTicks(1); + _timeoutControl.Tick(mockSystemClock.UtcNow); + + _mockTimeoutHandler.Verify(h => h.OnTimeout(TimeoutReason.KeepAlive), Times.Once); + + await WaitForConnectionStopAsync(expectedLastStreamId: 0, ignoreNonGoAwayFrames: false); + } + [Fact] public async Task HEADERS_NotReceivedInitially_WithinKeepAliveTimeout_ClosesConnection() {