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 |