Index: net/quic/quic_spdy_stream_test.cc |
diff --git a/net/quic/quic_spdy_stream_test.cc b/net/quic/quic_spdy_stream_test.cc |
index 54ebb8a3fd0cd5ba9b628759cea96a3f65461d9d..40c76b3df5bd91d4cdf01f00829116058147db2c 100644 |
--- a/net/quic/quic_spdy_stream_test.cc |
+++ b/net/quic/quic_spdy_stream_test.cc |
@@ -631,6 +631,7 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailers) { |
trailers_block["key1"] = "value1"; |
trailers_block["key2"] = "value2"; |
trailers_block["key3"] = "value3"; |
+ trailers_block[kFinalOffsetHeaderKey] = "0"; |
string trailers = SpdyUtils::SerializeUncompressedHeaders(trailers_block); |
stream_->OnStreamHeaders(trailers); |
stream_->OnStreamHeadersComplete(/*fin=*/true, trailers.size()); |
@@ -709,6 +710,44 @@ TEST_P(QuicSpdyStreamTest, ReceivingTrailersAfterBodyWithFin) { |
stream_->OnStreamHeadersComplete(/*fin=*/true, trailers.size()); |
} |
+TEST_P(QuicSpdyStreamTest, ReceivingTrailersWithOffset) { |
+ // Test that when receiving trailing headers with an offset before response |
+ // body, stream is closed at the right offset. |
+ Initialize(kShouldProcessData); |
+ |
+ // Receive initial headers. |
+ string headers = SpdyUtils::SerializeUncompressedHeaders(headers_); |
+ stream_->OnStreamHeaders(headers); |
+ stream_->OnStreamHeadersComplete(false, headers.size()); |
+ stream_->MarkHeadersConsumed(stream_->decompressed_headers().size()); |
+ |
+ const string body = "this is the body"; |
+ // Receive trailing headers. |
+ SpdyHeaderBlock trailers_block; |
+ trailers_block["key1"] = "value1"; |
+ trailers_block["key2"] = "value2"; |
+ trailers_block["key3"] = "value3"; |
+ trailers_block[kFinalOffsetHeaderKey] = base::IntToString(body.size()); |
+ string trailers = SpdyUtils::SerializeUncompressedHeaders(trailers_block); |
+ stream_->OnStreamHeaders(trailers); |
+ stream_->OnStreamHeadersComplete(/*fin=*/true, trailers.size()); |
+ |
+ // The trailers should be decompressed, and readable from the stream. |
+ EXPECT_TRUE(stream_->trailers_decompressed()); |
+ const string decompressed_trailers = stream_->decompressed_trailers(); |
+ EXPECT_EQ(trailers, decompressed_trailers); |
+ // Consuming the trailers erases them from the stream. |
+ stream_->MarkTrailersConsumed(decompressed_trailers.size()); |
+ EXPECT_EQ("", stream_->decompressed_trailers()); |
+ |
+ EXPECT_FALSE(stream_->IsDoneReading()); |
+ // Receive and consume body. |
+ QuicStreamFrame frame(kClientDataStreamId1, /*fin=*/false, 0, body); |
+ stream_->OnStreamFrame(frame); |
+ EXPECT_EQ(body, stream_->data()); |
+ EXPECT_TRUE(stream_->IsDoneReading()); |
+} |
+ |
TEST_P(QuicSpdyStreamTest, ClosingStreamWithNoTrailers) { |
// Verify that a stream receiving headers, body, and no trailers is correctly |
// marked as done reading on consumption of headers and body. |