| Index: net/quic/chromium/quic_chromium_client_stream_test.cc
|
| diff --git a/net/quic/chromium/quic_chromium_client_stream_test.cc b/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| index 764c2f408f1d9732f31852936fa9a6307235cfd4..1b397b1a3cb5c6cb5bd9fae29a4effc03a450051 100644
|
| --- a/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| +++ b/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| @@ -270,6 +270,7 @@ class QuicChromiumClientStreamTest
|
| }
|
|
|
| QuicCryptoClientConfig crypto_config_;
|
| + testing::StrictMock<MockDelegate> delegate2_;
|
| testing::StrictMock<MockDelegate> delegate_;
|
| MockQuicConnectionHelper helper_;
|
| MockAlarmFactory alarm_factory_;
|
| @@ -615,16 +616,68 @@ TEST_P(QuicChromiumClientStreamTest, WritevStreamDataAsync) {
|
| TEST_P(QuicChromiumClientStreamTest, HeadersBeforeDelegate) {
|
| // We don't use stream_ because we want an incoming server push
|
| // stream.
|
| - QuicChromiumClientStream* stream = new QuicChromiumClientStream(
|
| - GetNthServerInitiatedStreamId(0), &session_, NetLogWithSource());
|
| - session_.ActivateStream(base::WrapUnique(stream));
|
| + QuicStreamId stream_id = GetNthServerInitiatedStreamId(0);
|
| + QuicChromiumClientStream* stream2 =
|
| + new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource());
|
| + session_.ActivateStream(base::WrapUnique(stream2));
|
|
|
| InitializeHeaders();
|
| - stream->SetDelegate(&delegate_);
|
| - ProcessHeadersFull(headers_);
|
|
|
| - // Times(2) because OnClose will be called for stream and stream_.
|
| - EXPECT_CALL(delegate_, OnClose()).Times(2);
|
| + // Receive the headers before the delegate is set.
|
| + QuicHeaderList header_list = AsHeaderList(headers_);
|
| + stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(),
|
| + header_list);
|
| + EXPECT_TRUE(delegate2_.headers_.empty());
|
| +
|
| + // Now set the delegate and verify that the headers are delivered.
|
| + EXPECT_CALL(delegate2_, OnHeadersAvailableMock(
|
| + _, header_list.uncompressed_header_bytes()));
|
| + stream2->SetDelegate(&delegate2_);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(headers_, delegate2_.headers_);
|
| +
|
| + // Both delegates should be notified that theirs streams are closed.
|
| + EXPECT_CALL(delegate2_, OnClose());
|
| + EXPECT_CALL(delegate_, OnClose());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) {
|
| + // We don't use stream_ because we want an incoming server push
|
| + // stream.
|
| + QuicStreamId stream_id = GetNthServerInitiatedStreamId(0);
|
| + QuicChromiumClientStream* stream2 =
|
| + new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource());
|
| + session_.ActivateStream(base::WrapUnique(stream2));
|
| +
|
| + InitializeHeaders();
|
| +
|
| + // Receive the headers and data before the delegate is set.
|
| + QuicHeaderList header_list = AsHeaderList(headers_);
|
| + stream2->OnStreamHeaderList(false, header_list.uncompressed_header_bytes(),
|
| + header_list);
|
| + EXPECT_TRUE(delegate2_.headers_.empty());
|
| + const char data[] = "hello world!";
|
| + stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false,
|
| + /*offset=*/0, data));
|
| +
|
| + // Now set the delegate and verify that the headers are delivered, but
|
| + // not the data, which needs to be read explicitly.
|
| + EXPECT_CALL(delegate2_, OnHeadersAvailableMock(
|
| + _, header_list.uncompressed_header_bytes()));
|
| + stream2->SetDelegate(&delegate2_);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(headers_, delegate2_.headers_);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Now explicitly read the data.
|
| + int data_len = arraysize(data) - 1;
|
| + scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1));
|
| + ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1));
|
| + EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len));
|
| +
|
| + // Both delegates should be notified that theirs streams are closed.
|
| + EXPECT_CALL(delegate2_, OnClose());
|
| + EXPECT_CALL(delegate_, OnClose());
|
| }
|
|
|
| } // namespace
|
|
|