| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "net/quic/chromium/quic_chromium_client_stream.h" | 5 #include "net/quic/chromium/quic_chromium_client_stream.h" | 
| 6 | 6 | 
| 7 #include <string> | 7 #include <string> | 
| 8 | 8 | 
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" | 
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" | 
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 263 | 263 | 
| 264   QuicStreamId GetNthClientInitiatedStreamId(int n) { | 264   QuicStreamId GetNthClientInitiatedStreamId(int n) { | 
| 265     return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); | 265     return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); | 
| 266   } | 266   } | 
| 267 | 267 | 
| 268   QuicStreamId GetNthServerInitiatedStreamId(int n) { | 268   QuicStreamId GetNthServerInitiatedStreamId(int n) { | 
| 269     return QuicSpdySessionPeer::GetNthServerInitiatedStreamId(session_, n); | 269     return QuicSpdySessionPeer::GetNthServerInitiatedStreamId(session_, n); | 
| 270   } | 270   } | 
| 271 | 271 | 
| 272   QuicCryptoClientConfig crypto_config_; | 272   QuicCryptoClientConfig crypto_config_; | 
|  | 273   testing::StrictMock<MockDelegate> delegate2_; | 
| 273   testing::StrictMock<MockDelegate> delegate_; | 274   testing::StrictMock<MockDelegate> delegate_; | 
| 274   MockQuicConnectionHelper helper_; | 275   MockQuicConnectionHelper helper_; | 
| 275   MockAlarmFactory alarm_factory_; | 276   MockAlarmFactory alarm_factory_; | 
| 276   MockQuicClientSessionBase session_; | 277   MockQuicClientSessionBase session_; | 
| 277   QuicChromiumClientStream* stream_; | 278   QuicChromiumClientStream* stream_; | 
| 278   SpdyHeaderBlock headers_; | 279   SpdyHeaderBlock headers_; | 
| 279   QuicClientPushPromiseIndex push_promise_index_; | 280   QuicClientPushPromiseIndex push_promise_index_; | 
| 280 }; | 281 }; | 
| 281 | 282 | 
| 282 INSTANTIATE_TEST_CASE_P(Version, | 283 INSTANTIATE_TEST_CASE_P(Version, | 
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 608   EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) | 609   EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) | 
| 609       .WillOnce(Return(QuicConsumedData(buf2->size(), true))); | 610       .WillOnce(Return(QuicConsumedData(buf2->size(), true))); | 
| 610   stream_->OnCanWrite(); | 611   stream_->OnCanWrite(); | 
| 611   ASSERT_TRUE(callback.have_result()); | 612   ASSERT_TRUE(callback.have_result()); | 
| 612   EXPECT_THAT(callback.WaitForResult(), IsOk()); | 613   EXPECT_THAT(callback.WaitForResult(), IsOk()); | 
| 613 } | 614 } | 
| 614 | 615 | 
| 615 TEST_P(QuicChromiumClientStreamTest, HeadersBeforeDelegate) { | 616 TEST_P(QuicChromiumClientStreamTest, HeadersBeforeDelegate) { | 
| 616   // We don't use stream_ because we want an incoming server push | 617   // We don't use stream_ because we want an incoming server push | 
| 617   // stream. | 618   // stream. | 
| 618   QuicChromiumClientStream* stream = new QuicChromiumClientStream( | 619   QuicStreamId stream_id = GetNthServerInitiatedStreamId(0); | 
| 619       GetNthServerInitiatedStreamId(0), &session_, NetLogWithSource()); | 620   QuicChromiumClientStream* stream2 = | 
| 620   session_.ActivateStream(base::WrapUnique(stream)); | 621       new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource()); | 
|  | 622   session_.ActivateStream(base::WrapUnique(stream2)); | 
| 621 | 623 | 
| 622   InitializeHeaders(); | 624   InitializeHeaders(); | 
| 623   stream->SetDelegate(&delegate_); |  | 
| 624   ProcessHeadersFull(headers_); |  | 
| 625 | 625 | 
| 626   // Times(2) because OnClose will be called for stream and stream_. | 626   // Receive the headers before the delegate is set. | 
| 627   EXPECT_CALL(delegate_, OnClose()).Times(2); | 627   QuicHeaderList header_list = AsHeaderList(headers_); | 
|  | 628   stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(), | 
|  | 629                               header_list); | 
|  | 630   EXPECT_TRUE(delegate2_.headers_.empty()); | 
|  | 631 | 
|  | 632   // Now set the delegate and verify that the headers are delivered. | 
|  | 633   EXPECT_CALL(delegate2_, OnHeadersAvailableMock( | 
|  | 634                               _, header_list.uncompressed_header_bytes())); | 
|  | 635   stream2->SetDelegate(&delegate2_); | 
|  | 636   base::RunLoop().RunUntilIdle(); | 
|  | 637   EXPECT_EQ(headers_, delegate2_.headers_); | 
|  | 638 | 
|  | 639   // Both delegates should be notified that theirs streams are closed. | 
|  | 640   EXPECT_CALL(delegate2_, OnClose()); | 
|  | 641   EXPECT_CALL(delegate_, OnClose()); | 
|  | 642 } | 
|  | 643 | 
|  | 644 TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) { | 
|  | 645   // We don't use stream_ because we want an incoming server push | 
|  | 646   // stream. | 
|  | 647   QuicStreamId stream_id = GetNthServerInitiatedStreamId(0); | 
|  | 648   QuicChromiumClientStream* stream2 = | 
|  | 649       new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource()); | 
|  | 650   session_.ActivateStream(base::WrapUnique(stream2)); | 
|  | 651 | 
|  | 652   InitializeHeaders(); | 
|  | 653 | 
|  | 654   // Receive the headers and data before the delegate is set. | 
|  | 655   QuicHeaderList header_list = AsHeaderList(headers_); | 
|  | 656   stream2->OnStreamHeaderList(false, header_list.uncompressed_header_bytes(), | 
|  | 657                               header_list); | 
|  | 658   EXPECT_TRUE(delegate2_.headers_.empty()); | 
|  | 659   const char data[] = "hello world!"; | 
|  | 660   stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false, | 
|  | 661                                          /*offset=*/0, data)); | 
|  | 662 | 
|  | 663   // Now set the delegate and verify that the headers are delivered, but | 
|  | 664   // not the data, which needs to be read explicitly. | 
|  | 665   EXPECT_CALL(delegate2_, OnHeadersAvailableMock( | 
|  | 666                               _, header_list.uncompressed_header_bytes())); | 
|  | 667   stream2->SetDelegate(&delegate2_); | 
|  | 668   base::RunLoop().RunUntilIdle(); | 
|  | 669   EXPECT_EQ(headers_, delegate2_.headers_); | 
|  | 670   base::RunLoop().RunUntilIdle(); | 
|  | 671 | 
|  | 672   // Now explicitly read the data. | 
|  | 673   int data_len = arraysize(data) - 1; | 
|  | 674   scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1)); | 
|  | 675   ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); | 
|  | 676   EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len)); | 
|  | 677 | 
|  | 678   // Both delegates should be notified that theirs streams are closed. | 
|  | 679   EXPECT_CALL(delegate2_, OnClose()); | 
|  | 680   EXPECT_CALL(delegate_, OnClose()); | 
| 628 } | 681 } | 
| 629 | 682 | 
| 630 }  // namespace | 683 }  // namespace | 
| 631 }  // namespace test | 684 }  // namespace test | 
| 632 }  // namespace net | 685 }  // namespace net | 
| OLD | NEW | 
|---|