| 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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 QuicChromiumClientStreamTest() | 199 QuicChromiumClientStreamTest() |
| 200 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), | 200 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
| 201 session_(new MockQuicConnection(&helper_, | 201 session_(new MockQuicConnection(&helper_, |
| 202 &alarm_factory_, | 202 &alarm_factory_, |
| 203 Perspective::IS_CLIENT, | 203 Perspective::IS_CLIENT, |
| 204 SupportedVersions(GetParam())), | 204 SupportedVersions(GetParam())), |
| 205 &push_promise_index_) { | 205 &push_promise_index_) { |
| 206 stream_ = new QuicChromiumClientStream(kTestStreamId, &session_, | 206 stream_ = new QuicChromiumClientStream(kTestStreamId, &session_, |
| 207 NetLogWithSource()); | 207 NetLogWithSource()); |
| 208 session_.ActivateStream(base::WrapUnique(stream_)); | 208 session_.ActivateStream(base::WrapUnique(stream_)); |
| 209 stream_->SetDelegate(&delegate_); | 209 handle_ = stream_->CreateHandle(&delegate_); |
| 210 } | 210 } |
| 211 | 211 |
| 212 void InitializeHeaders() { | 212 void InitializeHeaders() { |
| 213 headers_[":host"] = "www.google.com"; | 213 headers_[":host"] = "www.google.com"; |
| 214 headers_[":path"] = "/index.hml"; | 214 headers_[":path"] = "/index.hml"; |
| 215 headers_[":scheme"] = "https"; | 215 headers_[":scheme"] = "https"; |
| 216 headers_["cookie"] = | 216 headers_["cookie"] = |
| 217 "__utma=208381060.1228362404.1372200928.1372200928.1372200928.1; " | 217 "__utma=208381060.1228362404.1372200928.1372200928.1372200928.1; " |
| 218 "__utmc=160408618; " | 218 "__utmc=160408618; " |
| 219 "GX=DQAAAOEAAACWJYdewdE9rIrW6qw3PtVi2-d729qaa-74KqOsM1NVQblK4VhX" | 219 "GX=DQAAAOEAAACWJYdewdE9rIrW6qw3PtVi2-d729qaa-74KqOsM1NVQblK4VhX" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 | 271 |
| 272 QuicStreamId GetNthClientInitiatedStreamId(int n) { | 272 QuicStreamId GetNthClientInitiatedStreamId(int n) { |
| 273 return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); | 273 return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); |
| 274 } | 274 } |
| 275 | 275 |
| 276 QuicStreamId GetNthServerInitiatedStreamId(int n) { | 276 QuicStreamId GetNthServerInitiatedStreamId(int n) { |
| 277 return QuicSpdySessionPeer::GetNthServerInitiatedStreamId(session_, n); | 277 return QuicSpdySessionPeer::GetNthServerInitiatedStreamId(session_, n); |
| 278 } | 278 } |
| 279 | 279 |
| 280 QuicCryptoClientConfig crypto_config_; | 280 QuicCryptoClientConfig crypto_config_; |
| 281 std::unique_ptr<QuicChromiumClientStream::Handle> handle_; |
| 282 testing::StrictMock<MockDelegate> delegate_; |
| 283 std::unique_ptr<QuicChromiumClientStream::Handle> handle2_; |
| 281 testing::StrictMock<MockDelegate> delegate2_; | 284 testing::StrictMock<MockDelegate> delegate2_; |
| 282 testing::StrictMock<MockDelegate> delegate_; | |
| 283 MockQuicConnectionHelper helper_; | 285 MockQuicConnectionHelper helper_; |
| 284 MockAlarmFactory alarm_factory_; | 286 MockAlarmFactory alarm_factory_; |
| 285 MockQuicClientSessionBase session_; | 287 MockQuicClientSessionBase session_; |
| 286 QuicChromiumClientStream* stream_; | 288 QuicChromiumClientStream* stream_; |
| 287 SpdyHeaderBlock headers_; | 289 SpdyHeaderBlock headers_; |
| 288 QuicClientPushPromiseIndex push_promise_index_; | 290 QuicClientPushPromiseIndex push_promise_index_; |
| 289 }; | 291 }; |
| 290 | 292 |
| 291 INSTANTIATE_TEST_CASE_P(Version, | 293 INSTANTIATE_TEST_CASE_P(Version, |
| 292 QuicChromiumClientStreamTest, | 294 QuicChromiumClientStreamTest, |
| 293 ::testing::ValuesIn(AllSupportedVersions())); | 295 ::testing::ValuesIn(AllSupportedVersions())); |
| 294 | 296 |
| 297 TEST_P(QuicChromiumClientStreamTest, Handle) { |
| 298 EXPECT_TRUE(handle_->IsOpen()); |
| 299 EXPECT_EQ(kTestStreamId, handle_->id()); |
| 300 EXPECT_EQ(QUIC_NO_ERROR, handle_->connection_error()); |
| 301 EXPECT_EQ(QUIC_STREAM_NO_ERROR, handle_->stream_error()); |
| 302 EXPECT_TRUE(handle_->IsFirstStream()); |
| 303 EXPECT_FALSE(handle_->IsDoneReading()); |
| 304 EXPECT_FALSE(handle_->fin_sent()); |
| 305 EXPECT_FALSE(handle_->fin_received()); |
| 306 EXPECT_EQ(0u, handle_->stream_bytes_read()); |
| 307 EXPECT_EQ(0u, handle_->stream_bytes_written()); |
| 308 EXPECT_EQ(0u, handle_->NumBytesConsumed()); |
| 309 |
| 310 InitializeHeaders(); |
| 311 QuicStreamOffset offset = 0; |
| 312 ProcessHeadersFull(headers_); |
| 313 QuicStreamFrame frame2(kTestStreamId, true, offset, QuicStringPiece()); |
| 314 EXPECT_CALL(delegate_, OnClose()); |
| 315 stream_->OnStreamFrame(frame2); |
| 316 EXPECT_TRUE(handle_->fin_received()); |
| 317 handle_->OnFinRead(); |
| 318 |
| 319 const char kData1[] = "hello world"; |
| 320 const size_t kDataLen = arraysize(kData1); |
| 321 |
| 322 // All data written. |
| 323 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) |
| 324 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
| 325 TestCompletionCallback callback; |
| 326 EXPECT_EQ(OK, handle_->WriteStreamData(QuicStringPiece(kData1, kDataLen), |
| 327 true, callback.callback())); |
| 328 |
| 329 EXPECT_FALSE(handle_->IsOpen()); |
| 330 EXPECT_EQ(kTestStreamId, handle_->id()); |
| 331 EXPECT_EQ(QUIC_NO_ERROR, handle_->connection_error()); |
| 332 EXPECT_EQ(QUIC_STREAM_NO_ERROR, handle_->stream_error()); |
| 333 EXPECT_TRUE(handle_->IsFirstStream()); |
| 334 EXPECT_TRUE(handle_->IsDoneReading()); |
| 335 EXPECT_TRUE(handle_->fin_sent()); |
| 336 EXPECT_TRUE(handle_->fin_received()); |
| 337 EXPECT_EQ(0u, handle_->stream_bytes_read()); |
| 338 EXPECT_EQ(kDataLen, handle_->stream_bytes_written()); |
| 339 EXPECT_EQ(0u, handle_->NumBytesConsumed()); |
| 340 |
| 341 EXPECT_EQ(ERR_CONNECTION_CLOSED, |
| 342 handle_->WriteStreamData(QuicStringPiece(kData1, kDataLen), true, |
| 343 callback.callback())); |
| 344 |
| 345 std::vector<scoped_refptr<IOBuffer>> buffers = { |
| 346 scoped_refptr<IOBuffer>(new IOBuffer(10))}; |
| 347 std::vector<int> lengths = {10}; |
| 348 EXPECT_EQ( |
| 349 ERR_CONNECTION_CLOSED, |
| 350 handle_->WritevStreamData(buffers, lengths, true, callback.callback())); |
| 351 |
| 352 SpdyHeaderBlock headers; |
| 353 EXPECT_EQ(0u, handle_->WriteHeaders(std::move(headers), true, nullptr)); |
| 354 } |
| 355 |
| 356 TEST_P(QuicChromiumClientStreamTest, HandleAfterConnectionClose) { |
| 357 // Verify that the delegate's OnClose is called after closing the connection. |
| 358 EXPECT_CALL(delegate_, OnClose()); |
| 359 EXPECT_CALL(session_, |
| 360 SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 361 stream_->OnConnectionClosed(QUIC_INVALID_FRAME_DATA, |
| 362 ConnectionCloseSource::FROM_PEER); |
| 363 |
| 364 EXPECT_FALSE(handle_->IsOpen()); |
| 365 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, handle_->connection_error()); |
| 366 } |
| 367 |
| 368 TEST_P(QuicChromiumClientStreamTest, HandleAfterStreamReset) { |
| 369 // Verify that the delegate's OnClose is called after the stream is reset, |
| 370 // but that the Handle still behaves correctly. |
| 371 EXPECT_CALL(delegate_, OnClose()); |
| 372 QuicRstStreamFrame rst(kTestStreamId, QUIC_STREAM_CANCELLED, 0); |
| 373 EXPECT_CALL(session_, |
| 374 SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 375 stream_->OnStreamReset(rst); |
| 376 |
| 377 EXPECT_FALSE(handle_->IsOpen()); |
| 378 EXPECT_EQ(QUIC_STREAM_CANCELLED, handle_->stream_error()); |
| 379 } |
| 380 |
| 381 TEST_P(QuicChromiumClientStreamTest, HandleAfterClearDelegate) { |
| 382 EXPECT_TRUE(handle_->IsOpen()); |
| 383 handle_->ClearDelegate(); |
| 384 |
| 385 // Verify that the delegate's OnClose is not called after ClearDelegate. |
| 386 EXPECT_CALL(delegate_, OnClose()).Times(0); |
| 387 QuicRstStreamFrame rst(kTestStreamId, QUIC_STREAM_CANCELLED, 0); |
| 388 EXPECT_CALL(session_, |
| 389 SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
| 390 stream_->OnStreamReset(rst); |
| 391 |
| 392 EXPECT_FALSE(handle_->IsOpen()); |
| 393 EXPECT_EQ(QUIC_STREAM_CANCELLED, handle_->stream_error()); |
| 394 } |
| 395 |
| 295 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { | 396 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { |
| 296 InitializeHeaders(); | 397 InitializeHeaders(); |
| 297 QuicStreamOffset offset = 0; | 398 QuicStreamOffset offset = 0; |
| 298 ProcessHeadersFull(headers_); | 399 ProcessHeadersFull(headers_); |
| 299 QuicStreamFrame frame2(kTestStreamId, true, offset, QuicStringPiece()); | 400 QuicStreamFrame frame2(kTestStreamId, true, offset, QuicStringPiece()); |
| 300 EXPECT_CALL(delegate_, OnClose()); | 401 EXPECT_CALL(delegate_, OnClose()); |
| 301 stream_->OnStreamFrame(frame2); | 402 stream_->OnStreamFrame(frame2); |
| 302 } | 403 } |
| 303 | 404 |
| 304 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { | 405 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 EXPECT_CALL(delegate_, OnDataAvailable()) | 453 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 353 .WillOnce(testing::Invoke(CreateFunctor( | 454 .WillOnce(testing::Invoke(CreateFunctor( |
| 354 &QuicChromiumClientStream::Reset, | 455 &QuicChromiumClientStream::Reset, |
| 355 base::Unretained(stream_), QUIC_STREAM_CANCELLED))); | 456 base::Unretained(stream_), QUIC_STREAM_CANCELLED))); |
| 356 base::RunLoop().RunUntilIdle(); | 457 base::RunLoop().RunUntilIdle(); |
| 357 | 458 |
| 358 EXPECT_CALL(delegate_, OnClose()); | 459 EXPECT_CALL(delegate_, OnClose()); |
| 359 } | 460 } |
| 360 | 461 |
| 361 TEST_P(QuicChromiumClientStreamTest, OnError) { | 462 TEST_P(QuicChromiumClientStreamTest, OnError) { |
| 362 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)); | 463 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)).Times(1); |
| 363 | 464 |
| 364 stream_->OnError(ERR_INTERNET_DISCONNECTED); | 465 stream_->OnError(ERR_INTERNET_DISCONNECTED); |
| 365 EXPECT_FALSE(stream_->GetDelegate()); | 466 stream_->OnError(ERR_INTERNET_DISCONNECTED); |
| 366 } | 467 } |
| 367 | 468 |
| 368 TEST_P(QuicChromiumClientStreamTest, OnTrailers) { | 469 TEST_P(QuicChromiumClientStreamTest, OnTrailers) { |
| 369 InitializeHeaders(); | 470 InitializeHeaders(); |
| 370 ProcessHeadersFull(headers_); | 471 ProcessHeadersFull(headers_); |
| 371 | 472 |
| 372 const char data[] = "hello world!"; | 473 const char data[] = "hello world!"; |
| 373 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 474 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
| 374 /*offset=*/0, data)); | 475 /*offset=*/0, data)); |
| 375 | 476 |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 | 734 |
| 634 // Receive the headers before the delegate is set. | 735 // Receive the headers before the delegate is set. |
| 635 QuicHeaderList header_list = AsHeaderList(headers_); | 736 QuicHeaderList header_list = AsHeaderList(headers_); |
| 636 stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(), | 737 stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(), |
| 637 header_list); | 738 header_list); |
| 638 EXPECT_TRUE(delegate2_.headers_.empty()); | 739 EXPECT_TRUE(delegate2_.headers_.empty()); |
| 639 | 740 |
| 640 // Now set the delegate and verify that the headers are delivered. | 741 // Now set the delegate and verify that the headers are delivered. |
| 641 EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( | 742 EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( |
| 642 _, header_list.uncompressed_header_bytes())); | 743 _, header_list.uncompressed_header_bytes())); |
| 643 stream2->SetDelegate(&delegate2_); | 744 handle2_ = stream2->CreateHandle(&delegate2_); |
| 644 base::RunLoop().RunUntilIdle(); | 745 base::RunLoop().RunUntilIdle(); |
| 645 EXPECT_EQ(headers_, delegate2_.headers_); | 746 EXPECT_EQ(headers_, delegate2_.headers_); |
| 646 | 747 |
| 647 // Both delegates should be notified that theirs streams are closed. | 748 // Both delegates should be notified that theirs streams are closed. |
| 648 EXPECT_CALL(delegate2_, OnClose()); | 749 EXPECT_CALL(delegate2_, OnClose()); |
| 649 EXPECT_CALL(delegate_, OnClose()); | 750 EXPECT_CALL(delegate_, OnClose()); |
| 650 } | 751 } |
| 651 | 752 |
| 652 TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) { | 753 TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) { |
| 653 // We don't use stream_ because we want an incoming server push | 754 // We don't use stream_ because we want an incoming server push |
| (...skipping 11 matching lines...) Expand all Loading... |
| 665 header_list); | 766 header_list); |
| 666 EXPECT_TRUE(delegate2_.headers_.empty()); | 767 EXPECT_TRUE(delegate2_.headers_.empty()); |
| 667 const char data[] = "hello world!"; | 768 const char data[] = "hello world!"; |
| 668 stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false, | 769 stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false, |
| 669 /*offset=*/0, data)); | 770 /*offset=*/0, data)); |
| 670 | 771 |
| 671 // Now set the delegate and verify that the headers are delivered, but | 772 // Now set the delegate and verify that the headers are delivered, but |
| 672 // not the data, which needs to be read explicitly. | 773 // not the data, which needs to be read explicitly. |
| 673 EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( | 774 EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( |
| 674 _, header_list.uncompressed_header_bytes())); | 775 _, header_list.uncompressed_header_bytes())); |
| 675 stream2->SetDelegate(&delegate2_); | 776 handle2_ = stream2->CreateHandle(&delegate2_); |
| 676 base::RunLoop().RunUntilIdle(); | 777 base::RunLoop().RunUntilIdle(); |
| 677 EXPECT_EQ(headers_, delegate2_.headers_); | 778 EXPECT_EQ(headers_, delegate2_.headers_); |
| 678 base::RunLoop().RunUntilIdle(); | 779 base::RunLoop().RunUntilIdle(); |
| 679 | 780 |
| 680 // Now explicitly read the data. | 781 // Now explicitly read the data. |
| 681 int data_len = arraysize(data) - 1; | 782 int data_len = arraysize(data) - 1; |
| 682 scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1)); | 783 scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1)); |
| 683 ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); | 784 ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); |
| 684 EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len)); | 785 EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len)); |
| 685 | 786 |
| 686 // Both delegates should be notified that theirs streams are closed. | 787 // Both delegates should be notified that theirs streams are closed. |
| 687 EXPECT_CALL(delegate2_, OnClose()); | 788 EXPECT_CALL(delegate2_, OnClose()); |
| 688 EXPECT_CALL(delegate_, OnClose()); | 789 EXPECT_CALL(delegate_, OnClose()); |
| 689 } | 790 } |
| 690 | 791 |
| 691 } // namespace | 792 } // namespace |
| 692 } // namespace test | 793 } // namespace test |
| 693 } // namespace net | 794 } // namespace net |
| OLD | NEW |