| 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 | 
|  |