Index: net/tools/quic/end_to_end_test.cc |
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc |
index 19985a80faab0ce95ce3a77d5b3b661cc843bb42..1243e34dde2355af429a3f06af1f090ab3e6d830 100644 |
--- a/net/tools/quic/end_to_end_test.cc |
+++ b/net/tools/quic/end_to_end_test.cc |
@@ -1366,6 +1366,27 @@ TEST_P(EndToEndTest, HeadersAndCryptoStreamsNoConnectionFlowControl) { |
server_thread_->Resume(); |
} |
+TEST_P(EndToEndTest, RequestWithNoBodyWillNeverSendStreamFrameWithFIN) { |
+ // Regression test for b/16010251. |
+ // A stream created on receipt of a simple request with no body will never get |
+ // a stream frame with a FIN. Verify that we don't keep track of the stream in |
+ // the locally closed streams map: it will never be removed if so. |
+ ASSERT_TRUE(Initialize()); |
+ |
+ // Send a simple headers only request, and receive response. |
+ EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); |
+ EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); |
+ |
+ // Now verify that the server is not waiting for a final FIN or RST. |
+ server_thread_->Pause(); |
+ QuicDispatcher* dispatcher = |
+ QuicServerPeer::GetDispatcher(server_thread_->server()); |
+ QuicSession* session = dispatcher->session_map().begin()->second; |
+ EXPECT_EQ(0u, QuicSessionPeer::GetLocallyClosedStreamsHighestOffset( |
+ session).size()); |
+ server_thread_->Resume(); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace tools |