OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/http/bidirectional_stream.h" | 5 #include "net/http/bidirectional_stream.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 DISALLOW_COPY_AND_ASSIGN(MockTimer); | 326 DISALLOW_COPY_AND_ASSIGN(MockTimer); |
327 }; | 327 }; |
328 | 328 |
329 } // namespace | 329 } // namespace |
330 | 330 |
331 class BidirectionalStreamTest : public testing::TestWithParam<bool> { | 331 class BidirectionalStreamTest : public testing::TestWithParam<bool> { |
332 public: | 332 public: |
333 BidirectionalStreamTest() | 333 BidirectionalStreamTest() |
334 : spdy_util_(kProtoHTTP2, true), | 334 : spdy_util_(kProtoHTTP2, true), |
335 session_deps_(kProtoHTTP2), | 335 session_deps_(kProtoHTTP2), |
| 336 default_url_(kDefaultUrl), |
| 337 host_port_pair_(HostPortPair::FromURL(default_url_)), |
| 338 key_(host_port_pair_, ProxyServer::Direct(), PRIVACY_MODE_DISABLED), |
336 ssl_data_(SSLSocketDataProvider(ASYNC, OK)) { | 339 ssl_data_(SSLSocketDataProvider(ASYNC, OK)) { |
337 ssl_data_.SetNextProto(kProtoHTTP2); | 340 ssl_data_.SetNextProto(kProtoHTTP2); |
338 ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); | 341 ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); |
339 net_log_.SetCaptureMode(NetLogCaptureMode::IncludeSocketBytes()); | 342 net_log_.SetCaptureMode(NetLogCaptureMode::IncludeSocketBytes()); |
340 } | 343 } |
341 | 344 |
342 protected: | 345 protected: |
343 void TearDown() override { | 346 void TearDown() override { |
344 if (sequenced_data_) { | 347 if (sequenced_data_) { |
345 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); | 348 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); |
346 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); | 349 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); |
347 } | 350 } |
348 } | 351 } |
349 | 352 |
350 // Initializes the session using SequencedSocketData. | 353 // Initializes the session using SequencedSocketData. |
351 void InitSession(MockRead* reads, | 354 void InitSession(MockRead* reads, |
352 size_t reads_count, | 355 size_t reads_count, |
353 MockWrite* writes, | 356 MockWrite* writes, |
354 size_t writes_count, | 357 size_t writes_count) { |
355 const SpdySessionKey& key) { | |
356 ASSERT_TRUE(ssl_data_.cert.get()); | 358 ASSERT_TRUE(ssl_data_.cert.get()); |
357 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_); | 359 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_); |
358 sequenced_data_.reset( | 360 sequenced_data_.reset( |
359 new SequencedSocketData(reads, reads_count, writes, writes_count)); | 361 new SequencedSocketData(reads, reads_count, writes, writes_count)); |
360 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); | 362 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); |
361 session_deps_.net_log = net_log_.bound().net_log(); | 363 session_deps_.net_log = net_log_.bound().net_log(); |
362 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 364 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
363 session_ = | 365 session_ = |
364 CreateSecureSpdySession(http_session_.get(), key, net_log_.bound()); | 366 CreateSecureSpdySession(http_session_.get(), key_, net_log_.bound()); |
365 } | 367 } |
366 | 368 |
367 BoundTestNetLog net_log_; | 369 BoundTestNetLog net_log_; |
368 SpdyTestUtil spdy_util_; | 370 SpdyTestUtil spdy_util_; |
369 SpdySessionDependencies session_deps_; | 371 SpdySessionDependencies session_deps_; |
| 372 const GURL default_url_; |
| 373 const HostPortPair host_port_pair_; |
| 374 const SpdySessionKey key_; |
370 std::unique_ptr<SequencedSocketData> sequenced_data_; | 375 std::unique_ptr<SequencedSocketData> sequenced_data_; |
371 std::unique_ptr<HttpNetworkSession> http_session_; | 376 std::unique_ptr<HttpNetworkSession> http_session_; |
372 | 377 |
373 private: | 378 private: |
374 SSLSocketDataProvider ssl_data_; | 379 SSLSocketDataProvider ssl_data_; |
375 base::WeakPtr<SpdySession> session_; | 380 base::WeakPtr<SpdySession> session_; |
376 }; | 381 }; |
377 | 382 |
378 TEST_F(BidirectionalStreamTest, CreateInsecureStream) { | 383 TEST_F(BidirectionalStreamTest, CreateInsecureStream) { |
379 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 384 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
(...skipping 28 matching lines...) Expand all Loading... |
408 // Reset stream right before the OnFailed task is executed. | 413 // Reset stream right before the OnFailed task is executed. |
409 delegate.reset(); | 414 delegate.reset(); |
410 | 415 |
411 base::RunLoop().RunUntilIdle(); | 416 base::RunLoop().RunUntilIdle(); |
412 } | 417 } |
413 | 418 |
414 // Simulates user calling ReadData after END_STREAM has been received in | 419 // Simulates user calling ReadData after END_STREAM has been received in |
415 // BidirectionalStreamSpdyImpl. | 420 // BidirectionalStreamSpdyImpl. |
416 TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { | 421 TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { |
417 std::unique_ptr<SpdySerializedFrame> req( | 422 std::unique_ptr<SpdySerializedFrame> req( |
418 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 423 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
419 // Empty DATA frame with an END_STREAM flag. | 424 // Empty DATA frame with an END_STREAM flag. |
420 std::unique_ptr<SpdySerializedFrame> end_stream( | 425 std::unique_ptr<SpdySerializedFrame> end_stream( |
421 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 426 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
422 MockWrite writes[] = { | 427 MockWrite writes[] = { |
423 CreateMockWrite(*req.get(), 0), | 428 CreateMockWrite(*req.get(), 0), |
424 }; | 429 }; |
425 | 430 |
426 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 431 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
427 | 432 |
428 std::unique_ptr<SpdySerializedFrame> resp( | 433 std::unique_ptr<SpdySerializedFrame> resp( |
429 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 434 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
430 | 435 |
431 std::unique_ptr<SpdySerializedFrame> body_frame( | 436 std::unique_ptr<SpdySerializedFrame> body_frame( |
432 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 437 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
433 // Last body frame has END_STREAM flag set. | 438 // Last body frame has END_STREAM flag set. |
434 std::unique_ptr<SpdySerializedFrame> last_body_frame( | 439 std::unique_ptr<SpdySerializedFrame> last_body_frame( |
435 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 440 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
436 | 441 |
437 MockRead reads[] = { | 442 MockRead reads[] = { |
438 CreateMockRead(*resp, 1), | 443 CreateMockRead(*resp, 1), |
439 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 444 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
440 CreateMockRead(*body_frame, 3), | 445 CreateMockRead(*body_frame, 3), |
441 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 446 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
442 CreateMockRead(*body_frame, 5), | 447 CreateMockRead(*body_frame, 5), |
443 CreateMockRead(*last_body_frame, 6), | 448 CreateMockRead(*last_body_frame, 6), |
444 MockRead(SYNCHRONOUS, 0, 7), | 449 MockRead(SYNCHRONOUS, 0, 7), |
445 }; | 450 }; |
446 | 451 |
447 HostPortPair host_port_pair("www.example.org", 443); | 452 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
448 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
449 PRIVACY_MODE_DISABLED); | |
450 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
451 | 453 |
452 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 454 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
453 new BidirectionalStreamRequestInfo); | 455 new BidirectionalStreamRequestInfo); |
454 request_info->method = "GET"; | 456 request_info->method = "GET"; |
455 request_info->url = GURL("https://www.example.org/"); | 457 request_info->url = default_url_; |
456 request_info->end_stream_on_headers = true; | 458 request_info->end_stream_on_headers = true; |
457 request_info->priority = LOWEST; | 459 request_info->priority = LOWEST; |
458 | 460 |
459 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 461 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
460 // Create a MockTimer. Retain a raw pointer since the underlying | 462 // Create a MockTimer. Retain a raw pointer since the underlying |
461 // BidirectionalStreamImpl owns it. | 463 // BidirectionalStreamImpl owns it. |
462 MockTimer* timer = new MockTimer(); | 464 MockTimer* timer = new MockTimer(); |
463 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 465 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
464 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 466 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
465 delegate->set_do_not_start_read(true); | 467 delegate->set_do_not_start_read(true); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 delegate->GetTotalSentBytes()); | 502 delegate->GetTotalSentBytes()); |
501 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 503 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
502 delegate->GetTotalReceivedBytes()); | 504 delegate->GetTotalReceivedBytes()); |
503 } | 505 } |
504 | 506 |
505 // Tests that the NetLog contains correct entries. | 507 // Tests that the NetLog contains correct entries. |
506 TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) { | 508 TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) { |
507 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 509 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
508 | 510 |
509 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 511 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
510 "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 512 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
511 std::unique_ptr<SpdySerializedFrame> data_frame( | 513 std::unique_ptr<SpdySerializedFrame> data_frame( |
512 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); | 514 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); |
513 MockWrite writes[] = { | 515 MockWrite writes[] = { |
514 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), | 516 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), |
515 }; | 517 }; |
516 | 518 |
517 std::unique_ptr<SpdySerializedFrame> resp( | 519 std::unique_ptr<SpdySerializedFrame> resp( |
518 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 520 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
519 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 521 std::unique_ptr<SpdySerializedFrame> response_body_frame1( |
520 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 522 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
521 std::unique_ptr<SpdySerializedFrame> response_body_frame2( | 523 std::unique_ptr<SpdySerializedFrame> response_body_frame2( |
522 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 524 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
523 | 525 |
524 SpdyHeaderBlock trailers; | 526 SpdyHeaderBlock trailers; |
525 trailers["foo"] = "bar"; | 527 trailers["foo"] = "bar"; |
526 std::unique_ptr<SpdySerializedFrame> response_trailers( | 528 std::unique_ptr<SpdySerializedFrame> response_trailers( |
527 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); | 529 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); |
528 | 530 |
529 MockRead reads[] = { | 531 MockRead reads[] = { |
530 CreateMockRead(*resp, 1), | 532 CreateMockRead(*resp, 1), |
531 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 533 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
532 CreateMockRead(*response_body_frame1, 4), | 534 CreateMockRead(*response_body_frame1, 4), |
533 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 535 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
534 CreateMockRead(*response_body_frame2, 6), | 536 CreateMockRead(*response_body_frame2, 6), |
535 CreateMockRead(*response_trailers, 7), | 537 CreateMockRead(*response_trailers, 7), |
536 MockRead(ASYNC, 0, 8), | 538 MockRead(ASYNC, 0, 8), |
537 }; | 539 }; |
538 | 540 |
539 HostPortPair host_port_pair("www.example.org", 443); | 541 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
540 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
541 PRIVACY_MODE_DISABLED); | |
542 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
543 | 542 |
544 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 543 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
545 new BidirectionalStreamRequestInfo); | 544 new BidirectionalStreamRequestInfo); |
546 request_info->method = "POST"; | 545 request_info->method = "POST"; |
547 request_info->url = GURL("https://www.example.org/"); | 546 request_info->url = default_url_; |
548 request_info->priority = LOWEST; | 547 request_info->priority = LOWEST; |
549 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 548 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
550 base::SizeTToString(kBodyDataSize * 3)); | 549 base::SizeTToString(kBodyDataSize * 3)); |
551 | 550 |
552 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 551 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
553 MockTimer* timer = new MockTimer(); | 552 MockTimer* timer = new MockTimer(); |
554 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 553 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
555 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 554 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
556 delegate->set_do_not_start_read(true); | 555 delegate->set_do_not_start_read(true); |
557 delegate->Start(std::move(request_info), http_session_.get()); | 556 delegate->Start(std::move(request_info), http_session_.get()); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); | 634 EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); |
636 ExpectLogContainsSomewhere(entries, index, | 635 ExpectLogContainsSomewhere(entries, index, |
637 NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, | 636 NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, |
638 NetLog::PHASE_END); | 637 NetLog::PHASE_END); |
639 } | 638 } |
640 | 639 |
641 TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { | 640 TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { |
642 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 641 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
643 | 642 |
644 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 643 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
645 "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 644 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
646 std::unique_ptr<SpdySerializedFrame> data_frame1( | 645 std::unique_ptr<SpdySerializedFrame> data_frame1( |
647 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 646 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); |
648 std::unique_ptr<SpdySerializedFrame> data_frame2( | 647 std::unique_ptr<SpdySerializedFrame> data_frame2( |
649 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 648 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); |
650 std::unique_ptr<SpdySerializedFrame> data_frame3( | 649 std::unique_ptr<SpdySerializedFrame> data_frame3( |
651 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); | 650 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); |
652 MockWrite writes[] = { | 651 MockWrite writes[] = { |
653 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 3), | 652 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 3), |
654 CreateMockWrite(*data_frame2, 6), CreateMockWrite(*data_frame3, 9), | 653 CreateMockWrite(*data_frame2, 6), CreateMockWrite(*data_frame3, 9), |
655 }; | 654 }; |
656 | 655 |
657 std::unique_ptr<SpdySerializedFrame> resp( | 656 std::unique_ptr<SpdySerializedFrame> resp( |
658 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 657 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
659 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 658 std::unique_ptr<SpdySerializedFrame> response_body_frame1( |
660 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 659 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
661 std::unique_ptr<SpdySerializedFrame> response_body_frame2( | 660 std::unique_ptr<SpdySerializedFrame> response_body_frame2( |
662 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 661 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
663 | 662 |
664 MockRead reads[] = { | 663 MockRead reads[] = { |
665 CreateMockRead(*resp, 1), | 664 CreateMockRead(*resp, 1), |
666 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 665 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
667 CreateMockRead(*response_body_frame1, 4), | 666 CreateMockRead(*response_body_frame1, 4), |
668 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 667 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
669 CreateMockRead(*response_body_frame2, 7), | 668 CreateMockRead(*response_body_frame2, 7), |
670 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause. | 669 MockRead(ASYNC, ERR_IO_PENDING, 8), // Force a pause. |
671 MockRead(ASYNC, 0, 10), | 670 MockRead(ASYNC, 0, 10), |
672 }; | 671 }; |
673 | 672 |
674 HostPortPair host_port_pair("www.example.org", 443); | 673 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
675 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
676 PRIVACY_MODE_DISABLED); | |
677 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
678 | 674 |
679 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 675 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
680 new BidirectionalStreamRequestInfo); | 676 new BidirectionalStreamRequestInfo); |
681 request_info->method = "POST"; | 677 request_info->method = "POST"; |
682 request_info->url = GURL("https://www.example.org/"); | 678 request_info->url = default_url_; |
683 request_info->priority = LOWEST; | 679 request_info->priority = LOWEST; |
684 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 680 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
685 base::SizeTToString(kBodyDataSize * 3)); | 681 base::SizeTToString(kBodyDataSize * 3)); |
686 | 682 |
687 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 683 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
688 MockTimer* timer = new MockTimer(); | 684 MockTimer* timer = new MockTimer(); |
689 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 685 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
690 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 686 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
691 delegate->set_do_not_start_read(true); | 687 delegate->set_do_not_start_read(true); |
692 delegate->Start(std::move(request_info), http_session_.get()); | 688 delegate->Start(std::move(request_info), http_session_.get()); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 738 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
743 delegate->GetTotalSentBytes()); | 739 delegate->GetTotalSentBytes()); |
744 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 740 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
745 delegate->GetTotalReceivedBytes()); | 741 delegate->GetTotalReceivedBytes()); |
746 } | 742 } |
747 | 743 |
748 TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) { | 744 TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) { |
749 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 745 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
750 | 746 |
751 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 747 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
752 "https://www.example.org", 1, kBodyDataSize * 1, LOWEST, nullptr, 0)); | 748 kDefaultUrl, 1, kBodyDataSize * 1, LOWEST, nullptr, 0)); |
753 std::string body_data = "some really long piece of data"; | 749 std::string body_data = "some really long piece of data"; |
754 std::unique_ptr<SpdySerializedFrame> data_frame1(framer.CreateDataFrame( | 750 std::unique_ptr<SpdySerializedFrame> data_frame1(framer.CreateDataFrame( |
755 1, body_data.c_str(), body_data.size(), DATA_FLAG_FIN)); | 751 1, body_data.c_str(), body_data.size(), DATA_FLAG_FIN)); |
756 MockWrite writes[] = { | 752 MockWrite writes[] = { |
757 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 1), | 753 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 1), |
758 }; | 754 }; |
759 | 755 |
760 std::unique_ptr<SpdySerializedFrame> resp( | 756 std::unique_ptr<SpdySerializedFrame> resp( |
761 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 757 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
762 std::unique_ptr<SpdySerializedFrame> response_body_frame1( | 758 std::unique_ptr<SpdySerializedFrame> response_body_frame1( |
763 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 759 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
764 MockRead reads[] = { | 760 MockRead reads[] = { |
765 CreateMockRead(*resp, 2), | 761 CreateMockRead(*resp, 2), |
766 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause. | 762 MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause. |
767 CreateMockRead(*response_body_frame1, 4), MockRead(ASYNC, 0, 5), | 763 CreateMockRead(*response_body_frame1, 4), MockRead(ASYNC, 0, 5), |
768 }; | 764 }; |
769 | 765 |
770 HostPortPair host_port_pair("www.example.org", 443); | 766 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
771 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
772 PRIVACY_MODE_DISABLED); | |
773 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
774 | 767 |
775 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 768 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
776 new BidirectionalStreamRequestInfo); | 769 new BidirectionalStreamRequestInfo); |
777 request_info->method = "POST"; | 770 request_info->method = "POST"; |
778 request_info->url = GURL("https://www.example.org/"); | 771 request_info->url = default_url_; |
779 request_info->priority = LOWEST; | 772 request_info->priority = LOWEST; |
780 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 773 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
781 base::SizeTToString(kBodyDataSize * 1)); | 774 base::SizeTToString(kBodyDataSize * 1)); |
782 | 775 |
783 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 776 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
784 MockTimer* timer = new MockTimer(); | 777 MockTimer* timer = new MockTimer(); |
785 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 778 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
786 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 779 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
787 delegate->set_do_not_start_read(true); | 780 delegate->set_do_not_start_read(true); |
788 TestCompletionCallback callback; | 781 TestCompletionCallback callback; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 | 834 |
842 ExpectLogContainsSomewhere( | 835 ExpectLogContainsSomewhere( |
843 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_SENT_COALESCED, | 836 entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_SENT_COALESCED, |
844 NetLog::PHASE_END); | 837 NetLog::PHASE_END); |
845 } | 838 } |
846 | 839 |
847 // Tests that BidirectionalStreamSpdyImpl::OnClose will complete any remaining | 840 // Tests that BidirectionalStreamSpdyImpl::OnClose will complete any remaining |
848 // read even if the read queue is empty. | 841 // read even if the read queue is empty. |
849 TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { | 842 TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { |
850 std::unique_ptr<SpdySerializedFrame> req( | 843 std::unique_ptr<SpdySerializedFrame> req( |
851 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 844 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
852 // Empty DATA frame with an END_STREAM flag. | 845 // Empty DATA frame with an END_STREAM flag. |
853 std::unique_ptr<SpdySerializedFrame> end_stream( | 846 std::unique_ptr<SpdySerializedFrame> end_stream( |
854 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 847 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
855 | 848 |
856 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 849 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; |
857 | 850 |
858 std::unique_ptr<SpdySerializedFrame> resp( | 851 std::unique_ptr<SpdySerializedFrame> resp( |
859 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 852 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
860 | 853 |
861 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 854 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
862 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 855 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
863 | 856 |
864 MockRead reads[] = { | 857 MockRead reads[] = { |
865 CreateMockRead(*resp, 1), | 858 CreateMockRead(*resp, 1), |
866 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 859 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
867 CreateMockRead(*response_body_frame, 3), MockRead(SYNCHRONOUS, 0, 4), | 860 CreateMockRead(*response_body_frame, 3), MockRead(SYNCHRONOUS, 0, 4), |
868 }; | 861 }; |
869 | 862 |
870 HostPortPair host_port_pair("www.example.org", 443); | 863 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
871 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
872 PRIVACY_MODE_DISABLED); | |
873 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
874 | 864 |
875 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 865 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
876 new BidirectionalStreamRequestInfo); | 866 new BidirectionalStreamRequestInfo); |
877 request_info->method = "GET"; | 867 request_info->method = "GET"; |
878 request_info->url = GURL("https://www.example.org/"); | 868 request_info->url = default_url_; |
879 request_info->priority = LOWEST; | 869 request_info->priority = LOWEST; |
880 request_info->end_stream_on_headers = true; | 870 request_info->end_stream_on_headers = true; |
881 | 871 |
882 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 872 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
883 MockTimer* timer = new MockTimer(); | 873 MockTimer* timer = new MockTimer(); |
884 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 874 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
885 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 875 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
886 delegate->set_do_not_start_read(true); | 876 delegate->set_do_not_start_read(true); |
887 delegate->Start(std::move(request_info), http_session_.get()); | 877 delegate->Start(std::move(request_info), http_session_.get()); |
888 // Write request, and deliver response headers. | 878 // Write request, and deliver response headers. |
(...skipping 14 matching lines...) Expand all Loading... |
903 EXPECT_EQ(0, delegate->on_data_sent_count()); | 893 EXPECT_EQ(0, delegate->on_data_sent_count()); |
904 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 894 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
905 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 895 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
906 delegate->GetTotalSentBytes()); | 896 delegate->GetTotalSentBytes()); |
907 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 897 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
908 delegate->GetTotalReceivedBytes()); | 898 delegate->GetTotalReceivedBytes()); |
909 } | 899 } |
910 | 900 |
911 TEST_F(BidirectionalStreamTest, TestBuffering) { | 901 TEST_F(BidirectionalStreamTest, TestBuffering) { |
912 std::unique_ptr<SpdySerializedFrame> req( | 902 std::unique_ptr<SpdySerializedFrame> req( |
913 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 903 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
914 // Empty DATA frame with an END_STREAM flag. | 904 // Empty DATA frame with an END_STREAM flag. |
915 std::unique_ptr<SpdySerializedFrame> end_stream( | 905 std::unique_ptr<SpdySerializedFrame> end_stream( |
916 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 906 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
917 | 907 |
918 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 908 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; |
919 | 909 |
920 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 910 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
921 | 911 |
922 std::unique_ptr<SpdySerializedFrame> resp( | 912 std::unique_ptr<SpdySerializedFrame> resp( |
923 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 913 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
924 | 914 |
925 std::unique_ptr<SpdySerializedFrame> body_frame( | 915 std::unique_ptr<SpdySerializedFrame> body_frame( |
926 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 916 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
927 // Last body frame has END_STREAM flag set. | 917 // Last body frame has END_STREAM flag set. |
928 std::unique_ptr<SpdySerializedFrame> last_body_frame( | 918 std::unique_ptr<SpdySerializedFrame> last_body_frame( |
929 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 919 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
930 | 920 |
931 MockRead reads[] = { | 921 MockRead reads[] = { |
932 CreateMockRead(*resp, 1), | 922 CreateMockRead(*resp, 1), |
933 CreateMockRead(*body_frame, 2), | 923 CreateMockRead(*body_frame, 2), |
934 CreateMockRead(*body_frame, 3), | 924 CreateMockRead(*body_frame, 3), |
935 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 925 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
936 CreateMockRead(*last_body_frame, 5), | 926 CreateMockRead(*last_body_frame, 5), |
937 MockRead(SYNCHRONOUS, 0, 6), | 927 MockRead(SYNCHRONOUS, 0, 6), |
938 }; | 928 }; |
939 | 929 |
940 HostPortPair host_port_pair("www.example.org", 443); | 930 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
941 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
942 PRIVACY_MODE_DISABLED); | |
943 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
944 | 931 |
945 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 932 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
946 new BidirectionalStreamRequestInfo); | 933 new BidirectionalStreamRequestInfo); |
947 request_info->method = "GET"; | 934 request_info->method = "GET"; |
948 request_info->url = GURL("https://www.example.org/"); | 935 request_info->url = default_url_; |
949 request_info->priority = LOWEST; | 936 request_info->priority = LOWEST; |
950 request_info->end_stream_on_headers = true; | 937 request_info->end_stream_on_headers = true; |
951 | 938 |
952 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 939 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
953 MockTimer* timer = new MockTimer(); | 940 MockTimer* timer = new MockTimer(); |
954 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 941 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
955 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 942 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
956 delegate->Start(std::move(request_info), http_session_.get()); | 943 delegate->Start(std::move(request_info), http_session_.get()); |
957 // Deliver two DATA frames together. | 944 // Deliver two DATA frames together. |
958 sequenced_data_->RunUntilPaused(); | 945 sequenced_data_->RunUntilPaused(); |
(...skipping 28 matching lines...) Expand all Loading... |
987 EXPECT_EQ(0, delegate->on_data_sent_count()); | 974 EXPECT_EQ(0, delegate->on_data_sent_count()); |
988 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 975 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
989 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 976 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
990 delegate->GetTotalSentBytes()); | 977 delegate->GetTotalSentBytes()); |
991 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 978 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
992 delegate->GetTotalReceivedBytes()); | 979 delegate->GetTotalReceivedBytes()); |
993 } | 980 } |
994 | 981 |
995 TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { | 982 TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { |
996 std::unique_ptr<SpdySerializedFrame> req( | 983 std::unique_ptr<SpdySerializedFrame> req( |
997 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 984 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
998 // Empty DATA frame with an END_STREAM flag. | 985 // Empty DATA frame with an END_STREAM flag. |
999 std::unique_ptr<SpdySerializedFrame> end_stream( | 986 std::unique_ptr<SpdySerializedFrame> end_stream( |
1000 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 987 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
1001 | 988 |
1002 MockWrite writes[] = { | 989 MockWrite writes[] = { |
1003 CreateMockWrite(*req.get(), 0), | 990 CreateMockWrite(*req.get(), 0), |
1004 }; | 991 }; |
1005 | 992 |
1006 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 993 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
1007 | 994 |
(...skipping 11 matching lines...) Expand all Loading... |
1019 MockRead reads[] = { | 1006 MockRead reads[] = { |
1020 CreateMockRead(*resp, 1), | 1007 CreateMockRead(*resp, 1), |
1021 CreateMockRead(*body_frame, 2), | 1008 CreateMockRead(*body_frame, 2), |
1022 CreateMockRead(*body_frame, 3), | 1009 CreateMockRead(*body_frame, 3), |
1023 CreateMockRead(*body_frame, 4), | 1010 CreateMockRead(*body_frame, 4), |
1024 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. | 1011 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. |
1025 CreateMockRead(*response_trailers, 6), | 1012 CreateMockRead(*response_trailers, 6), |
1026 MockRead(SYNCHRONOUS, 0, 7), | 1013 MockRead(SYNCHRONOUS, 0, 7), |
1027 }; | 1014 }; |
1028 | 1015 |
1029 HostPortPair host_port_pair("www.example.org", 443); | 1016 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1030 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1031 PRIVACY_MODE_DISABLED); | |
1032 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1033 | 1017 |
1034 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1018 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1035 MockTimer* timer = new MockTimer(); | 1019 MockTimer* timer = new MockTimer(); |
1036 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 1020 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
1037 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 1021 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
1038 | 1022 |
1039 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1023 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1040 new BidirectionalStreamRequestInfo); | 1024 new BidirectionalStreamRequestInfo); |
1041 request_info->method = "GET"; | 1025 request_info->method = "GET"; |
1042 request_info->url = GURL("https://www.example.org/"); | 1026 request_info->url = default_url_; |
1043 request_info->priority = LOWEST; | 1027 request_info->priority = LOWEST; |
1044 request_info->end_stream_on_headers = true; | 1028 request_info->end_stream_on_headers = true; |
1045 | 1029 |
1046 delegate->Start(std::move(request_info), http_session_.get()); | 1030 delegate->Start(std::move(request_info), http_session_.get()); |
1047 // Deliver all three DATA frames together. | 1031 // Deliver all three DATA frames together. |
1048 sequenced_data_->RunUntilPaused(); | 1032 sequenced_data_->RunUntilPaused(); |
1049 EXPECT_TRUE(timer->IsRunning()); | 1033 EXPECT_TRUE(timer->IsRunning()); |
1050 timer->Fire(); | 1034 timer->Fire(); |
1051 base::RunLoop().RunUntilIdle(); | 1035 base::RunLoop().RunUntilIdle(); |
1052 // This should trigger |more_read_data_pending_| to execute the task at a | 1036 // This should trigger |more_read_data_pending_| to execute the task at a |
(...skipping 19 matching lines...) Expand all Loading... |
1072 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 1056 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
1073 delegate->GetTotalSentBytes()); | 1057 delegate->GetTotalSentBytes()); |
1074 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 1058 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
1075 delegate->GetTotalReceivedBytes()); | 1059 delegate->GetTotalReceivedBytes()); |
1076 } | 1060 } |
1077 | 1061 |
1078 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { | 1062 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { |
1079 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 1063 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
1080 | 1064 |
1081 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 1065 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
1082 "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1066 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
1083 std::unique_ptr<SpdySerializedFrame> data_frame( | 1067 std::unique_ptr<SpdySerializedFrame> data_frame( |
1084 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 1068 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); |
1085 std::unique_ptr<SpdySerializedFrame> rst( | 1069 std::unique_ptr<SpdySerializedFrame> rst( |
1086 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1070 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1087 | 1071 |
1088 MockWrite writes[] = { | 1072 MockWrite writes[] = { |
1089 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), | 1073 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), |
1090 CreateMockWrite(*rst, 5), | 1074 CreateMockWrite(*rst, 5), |
1091 }; | 1075 }; |
1092 | 1076 |
1093 std::unique_ptr<SpdySerializedFrame> resp( | 1077 std::unique_ptr<SpdySerializedFrame> resp( |
1094 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1078 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
1095 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1079 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
1096 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1080 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
1097 | 1081 |
1098 MockRead reads[] = { | 1082 MockRead reads[] = { |
1099 CreateMockRead(*resp, 1), | 1083 CreateMockRead(*resp, 1), |
1100 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 1084 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
1101 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 1085 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
1102 MockRead(ASYNC, 0, 6), | 1086 MockRead(ASYNC, 0, 6), |
1103 }; | 1087 }; |
1104 | 1088 |
1105 HostPortPair host_port_pair("www.example.org", 443); | 1089 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1106 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1107 PRIVACY_MODE_DISABLED); | |
1108 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1109 | 1090 |
1110 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1091 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1111 new BidirectionalStreamRequestInfo); | 1092 new BidirectionalStreamRequestInfo); |
1112 request_info->method = "POST"; | 1093 request_info->method = "POST"; |
1113 request_info->url = GURL("https://www.example.org/"); | 1094 request_info->url = default_url_; |
1114 request_info->priority = LOWEST; | 1095 request_info->priority = LOWEST; |
1115 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 1096 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
1116 base::SizeTToString(kBodyDataSize * 3)); | 1097 base::SizeTToString(kBodyDataSize * 3)); |
1117 | 1098 |
1118 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1099 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1119 std::unique_ptr<TestDelegateBase> delegate( | 1100 std::unique_ptr<TestDelegateBase> delegate( |
1120 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1101 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
1121 delegate->set_do_not_start_read(true); | 1102 delegate->set_do_not_start_read(true); |
1122 delegate->Start(std::move(request_info), http_session_.get()); | 1103 delegate->Start(std::move(request_info), http_session_.get()); |
1123 // Send the request and receive response headers. | 1104 // Send the request and receive response headers. |
(...skipping 18 matching lines...) Expand all Loading... |
1142 // Calling after stream is canceled gives kProtoUnknown. | 1123 // Calling after stream is canceled gives kProtoUnknown. |
1143 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1124 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1144 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1125 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1145 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1126 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1146 } | 1127 } |
1147 | 1128 |
1148 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { | 1129 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { |
1149 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 1130 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
1150 | 1131 |
1151 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 1132 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
1152 "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1133 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
1153 std::unique_ptr<SpdySerializedFrame> data_frame( | 1134 std::unique_ptr<SpdySerializedFrame> data_frame( |
1154 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 1135 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); |
1155 std::unique_ptr<SpdySerializedFrame> rst( | 1136 std::unique_ptr<SpdySerializedFrame> rst( |
1156 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1137 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1157 | 1138 |
1158 MockWrite writes[] = { | 1139 MockWrite writes[] = { |
1159 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 1140 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), |
1160 }; | 1141 }; |
1161 | 1142 |
1162 std::unique_ptr<SpdySerializedFrame> resp( | 1143 std::unique_ptr<SpdySerializedFrame> resp( |
1163 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1144 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
1164 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1145 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
1165 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1146 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
1166 | 1147 |
1167 MockRead reads[] = { | 1148 MockRead reads[] = { |
1168 CreateMockRead(*resp, 1), | 1149 CreateMockRead(*resp, 1), |
1169 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 1150 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
1170 CreateMockRead(*response_body_frame, 3), MockRead(ASYNC, 0, 5), | 1151 CreateMockRead(*response_body_frame, 3), MockRead(ASYNC, 0, 5), |
1171 }; | 1152 }; |
1172 | 1153 |
1173 HostPortPair host_port_pair("www.example.org", 443); | 1154 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1174 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1175 PRIVACY_MODE_DISABLED); | |
1176 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1177 | 1155 |
1178 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1156 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1179 new BidirectionalStreamRequestInfo); | 1157 new BidirectionalStreamRequestInfo); |
1180 request_info->method = "POST"; | 1158 request_info->method = "POST"; |
1181 request_info->url = GURL("https://www.example.org/"); | 1159 request_info->url = default_url_; |
1182 request_info->priority = LOWEST; | 1160 request_info->priority = LOWEST; |
1183 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 1161 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
1184 base::SizeTToString(kBodyDataSize * 3)); | 1162 base::SizeTToString(kBodyDataSize * 3)); |
1185 | 1163 |
1186 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1164 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1187 std::unique_ptr<TestDelegateBase> delegate( | 1165 std::unique_ptr<TestDelegateBase> delegate( |
1188 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1166 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
1189 delegate->set_do_not_start_read(true); | 1167 delegate->set_do_not_start_read(true); |
1190 delegate->Start(std::move(request_info), http_session_.get()); | 1168 delegate->Start(std::move(request_info), http_session_.get()); |
1191 // Send the request and receive response headers. | 1169 // Send the request and receive response headers. |
(...skipping 13 matching lines...) Expand all Loading... |
1205 // Calling after stream is canceled gives kProtoUnknown. | 1183 // Calling after stream is canceled gives kProtoUnknown. |
1206 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1184 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1207 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1185 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1208 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1186 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1209 } | 1187 } |
1210 | 1188 |
1211 // Receiving a header with uppercase ASCII will result in a protocol error, | 1189 // Receiving a header with uppercase ASCII will result in a protocol error, |
1212 // which should be propagated via Delegate::OnFailed. | 1190 // which should be propagated via Delegate::OnFailed. |
1213 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { | 1191 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { |
1214 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 1192 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
1215 "https://www.example.org", 1, kBodyDataSize * 3, LOW, nullptr, 0)); | 1193 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); |
1216 std::unique_ptr<SpdySerializedFrame> rst( | 1194 std::unique_ptr<SpdySerializedFrame> rst( |
1217 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1195 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
1218 | 1196 |
1219 MockWrite writes[] = { | 1197 MockWrite writes[] = { |
1220 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1198 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), |
1221 }; | 1199 }; |
1222 | 1200 |
1223 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 1201 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
1224 std::unique_ptr<SpdySerializedFrame> resp( | 1202 std::unique_ptr<SpdySerializedFrame> resp( |
1225 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 1203 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
1226 | 1204 |
1227 MockRead reads[] = { | 1205 MockRead reads[] = { |
1228 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1206 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), |
1229 }; | 1207 }; |
1230 | 1208 |
1231 HostPortPair host_port_pair("www.example.org", 443); | 1209 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1232 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1233 PRIVACY_MODE_DISABLED); | |
1234 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1235 | 1210 |
1236 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1211 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1237 new BidirectionalStreamRequestInfo); | 1212 new BidirectionalStreamRequestInfo); |
1238 request_info->method = "POST"; | 1213 request_info->method = "POST"; |
1239 request_info->url = GURL("https://www.example.org/"); | 1214 request_info->url = default_url_; |
1240 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 1215 request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
1241 base::SizeTToString(kBodyDataSize * 3)); | 1216 base::SizeTToString(kBodyDataSize * 3)); |
1242 | 1217 |
1243 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1218 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1244 std::unique_ptr<TestDelegateBase> delegate( | 1219 std::unique_ptr<TestDelegateBase> delegate( |
1245 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1220 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
1246 delegate->SetRunUntilCompletion(true); | 1221 delegate->SetRunUntilCompletion(true); |
1247 delegate->Start(std::move(request_info), http_session_.get()); | 1222 delegate->Start(std::move(request_info), http_session_.get()); |
1248 | 1223 |
1249 base::RunLoop().RunUntilIdle(); | 1224 base::RunLoop().RunUntilIdle(); |
(...skipping 28 matching lines...) Expand all Loading... |
1278 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); | 1253 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); |
1279 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, net_error); | 1254 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, net_error); |
1280 } | 1255 } |
1281 | 1256 |
1282 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, | 1257 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, |
1283 BidirectionalStreamTest, | 1258 BidirectionalStreamTest, |
1284 ::testing::Values(true, false)); | 1259 ::testing::Values(true, false)); |
1285 | 1260 |
1286 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { | 1261 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { |
1287 std::unique_ptr<SpdySerializedFrame> req( | 1262 std::unique_ptr<SpdySerializedFrame> req( |
1288 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 1263 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
1289 | 1264 |
1290 std::unique_ptr<SpdySerializedFrame> rst( | 1265 std::unique_ptr<SpdySerializedFrame> rst( |
1291 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1266 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1292 MockWrite writes[] = { | 1267 MockWrite writes[] = { |
1293 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1268 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), |
1294 }; | 1269 }; |
1295 | 1270 |
1296 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1271 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
1297 | 1272 |
1298 std::unique_ptr<SpdySerializedFrame> resp( | 1273 std::unique_ptr<SpdySerializedFrame> resp( |
1299 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1274 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
1300 | 1275 |
1301 MockRead reads[] = { | 1276 MockRead reads[] = { |
1302 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1277 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), |
1303 }; | 1278 }; |
1304 | 1279 |
1305 HostPortPair host_port_pair("www.example.org", 443); | 1280 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1306 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1307 PRIVACY_MODE_DISABLED); | |
1308 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1309 | 1281 |
1310 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1282 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1311 new BidirectionalStreamRequestInfo); | 1283 new BidirectionalStreamRequestInfo); |
1312 request_info->method = "GET"; | 1284 request_info->method = "GET"; |
1313 request_info->url = GURL("https://www.example.org/"); | 1285 request_info->url = default_url_; |
1314 request_info->priority = LOWEST; | 1286 request_info->priority = LOWEST; |
1315 request_info->end_stream_on_headers = true; | 1287 request_info->end_stream_on_headers = true; |
1316 | 1288 |
1317 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1289 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1318 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1290 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( |
1319 new CancelOrDeleteStreamDelegate( | 1291 new CancelOrDeleteStreamDelegate( |
1320 read_buffer.get(), kReadBufferSize, | 1292 read_buffer.get(), kReadBufferSize, |
1321 CancelOrDeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED, | 1293 CancelOrDeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED, |
1322 GetParam())); | 1294 GetParam())); |
1323 delegate->SetRunUntilCompletion(true); | 1295 delegate->SetRunUntilCompletion(true); |
(...skipping 10 matching lines...) Expand all Loading... |
1334 // If stream is destroyed, do not call into stream. | 1306 // If stream is destroyed, do not call into stream. |
1335 if (!GetParam()) | 1307 if (!GetParam()) |
1336 return; | 1308 return; |
1337 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1309 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1338 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1310 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1339 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1311 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1340 } | 1312 } |
1341 | 1313 |
1342 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { | 1314 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { |
1343 std::unique_ptr<SpdySerializedFrame> req( | 1315 std::unique_ptr<SpdySerializedFrame> req( |
1344 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 1316 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
1345 | 1317 |
1346 std::unique_ptr<SpdySerializedFrame> rst( | 1318 std::unique_ptr<SpdySerializedFrame> rst( |
1347 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1319 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1348 MockWrite writes[] = { | 1320 MockWrite writes[] = { |
1349 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3), | 1321 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3), |
1350 }; | 1322 }; |
1351 | 1323 |
1352 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1324 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
1353 | 1325 |
1354 std::unique_ptr<SpdySerializedFrame> resp( | 1326 std::unique_ptr<SpdySerializedFrame> resp( |
1355 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1327 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
1356 | 1328 |
1357 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1329 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
1358 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1330 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
1359 | 1331 |
1360 MockRead reads[] = { | 1332 MockRead reads[] = { |
1361 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), | 1333 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), |
1362 MockRead(ASYNC, 0, 4), | 1334 MockRead(ASYNC, 0, 4), |
1363 }; | 1335 }; |
1364 | 1336 |
1365 HostPortPair host_port_pair("www.example.org", 443); | 1337 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1366 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1367 PRIVACY_MODE_DISABLED); | |
1368 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1369 | 1338 |
1370 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1339 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1371 new BidirectionalStreamRequestInfo); | 1340 new BidirectionalStreamRequestInfo); |
1372 request_info->method = "GET"; | 1341 request_info->method = "GET"; |
1373 request_info->url = GURL("https://www.example.org/"); | 1342 request_info->url = default_url_; |
1374 request_info->priority = LOWEST; | 1343 request_info->priority = LOWEST; |
1375 request_info->end_stream_on_headers = true; | 1344 request_info->end_stream_on_headers = true; |
1376 | 1345 |
1377 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1346 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1378 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1347 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( |
1379 new CancelOrDeleteStreamDelegate( | 1348 new CancelOrDeleteStreamDelegate( |
1380 read_buffer.get(), kReadBufferSize, | 1349 read_buffer.get(), kReadBufferSize, |
1381 CancelOrDeleteStreamDelegate::Phase::ON_DATA_READ, GetParam())); | 1350 CancelOrDeleteStreamDelegate::Phase::ON_DATA_READ, GetParam())); |
1382 delegate->SetRunUntilCompletion(true); | 1351 delegate->SetRunUntilCompletion(true); |
1383 delegate->Start(std::move(request_info), http_session_.get()); | 1352 delegate->Start(std::move(request_info), http_session_.get()); |
1384 // Makes sure delegate does not get called. | 1353 // Makes sure delegate does not get called. |
1385 base::RunLoop().RunUntilIdle(); | 1354 base::RunLoop().RunUntilIdle(); |
1386 const SpdyHeaderBlock& response_headers = delegate->response_headers(); | 1355 const SpdyHeaderBlock& response_headers = delegate->response_headers(); |
1387 EXPECT_EQ("200", response_headers.find(":status")->second); | 1356 EXPECT_EQ("200", response_headers.find(":status")->second); |
1388 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 1357 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
1389 EXPECT_EQ(kUploadDataSize * 1, | 1358 EXPECT_EQ(kUploadDataSize * 1, |
1390 static_cast<int>(delegate->data_received().size())); | 1359 static_cast<int>(delegate->data_received().size())); |
1391 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1360 EXPECT_EQ(0, delegate->on_data_sent_count()); |
1392 | 1361 |
1393 // If stream is destroyed, do not call into stream. | 1362 // If stream is destroyed, do not call into stream. |
1394 if (!GetParam()) | 1363 if (!GetParam()) |
1395 return; | 1364 return; |
1396 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1365 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1397 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1366 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1398 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1367 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1399 } | 1368 } |
1400 | 1369 |
1401 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { | 1370 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { |
1402 std::unique_ptr<SpdySerializedFrame> req( | 1371 std::unique_ptr<SpdySerializedFrame> req( |
1403 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 1372 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
1404 | 1373 |
1405 std::unique_ptr<SpdySerializedFrame> rst( | 1374 std::unique_ptr<SpdySerializedFrame> rst( |
1406 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1375 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
1407 MockWrite writes[] = { | 1376 MockWrite writes[] = { |
1408 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 1377 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), |
1409 }; | 1378 }; |
1410 | 1379 |
1411 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1380 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
1412 | 1381 |
1413 std::unique_ptr<SpdySerializedFrame> resp( | 1382 std::unique_ptr<SpdySerializedFrame> resp( |
1414 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1383 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
1415 | 1384 |
1416 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 1385 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
1417 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 1386 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
1418 | 1387 |
1419 SpdyHeaderBlock trailers; | 1388 SpdyHeaderBlock trailers; |
1420 trailers["foo"] = "bar"; | 1389 trailers["foo"] = "bar"; |
1421 std::unique_ptr<SpdySerializedFrame> response_trailers( | 1390 std::unique_ptr<SpdySerializedFrame> response_trailers( |
1422 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); | 1391 spdy_util_.ConstructSpdyResponseHeaders(1, std::move(trailers), true)); |
1423 | 1392 |
1424 MockRead reads[] = { | 1393 MockRead reads[] = { |
1425 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), | 1394 CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), |
1426 CreateMockRead(*response_trailers, 3), MockRead(ASYNC, 0, 5), | 1395 CreateMockRead(*response_trailers, 3), MockRead(ASYNC, 0, 5), |
1427 }; | 1396 }; |
1428 | 1397 |
1429 HostPortPair host_port_pair("www.example.org", 443); | 1398 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1430 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1431 PRIVACY_MODE_DISABLED); | |
1432 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1433 | 1399 |
1434 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1400 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1435 new BidirectionalStreamRequestInfo); | 1401 new BidirectionalStreamRequestInfo); |
1436 request_info->method = "GET"; | 1402 request_info->method = "GET"; |
1437 request_info->url = GURL("https://www.example.org/"); | 1403 request_info->url = default_url_; |
1438 request_info->priority = LOWEST; | 1404 request_info->priority = LOWEST; |
1439 request_info->end_stream_on_headers = true; | 1405 request_info->end_stream_on_headers = true; |
1440 | 1406 |
1441 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1407 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1442 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1408 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( |
1443 new CancelOrDeleteStreamDelegate( | 1409 new CancelOrDeleteStreamDelegate( |
1444 read_buffer.get(), kReadBufferSize, | 1410 read_buffer.get(), kReadBufferSize, |
1445 CancelOrDeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED, | 1411 CancelOrDeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED, |
1446 GetParam())); | 1412 GetParam())); |
1447 delegate->SetRunUntilCompletion(true); | 1413 delegate->SetRunUntilCompletion(true); |
(...skipping 11 matching lines...) Expand all Loading... |
1459 // If stream is destroyed, do not call into stream. | 1425 // If stream is destroyed, do not call into stream. |
1460 if (!GetParam()) | 1426 if (!GetParam()) |
1461 return; | 1427 return; |
1462 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1428 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1463 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1429 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1464 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1430 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1465 } | 1431 } |
1466 | 1432 |
1467 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { | 1433 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { |
1468 std::unique_ptr<SpdySerializedFrame> req( | 1434 std::unique_ptr<SpdySerializedFrame> req( |
1469 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 1435 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
1470 | 1436 |
1471 std::unique_ptr<SpdySerializedFrame> rst( | 1437 std::unique_ptr<SpdySerializedFrame> rst( |
1472 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1438 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
1473 | 1439 |
1474 MockWrite writes[] = { | 1440 MockWrite writes[] = { |
1475 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 1441 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), |
1476 }; | 1442 }; |
1477 | 1443 |
1478 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 1444 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
1479 std::unique_ptr<SpdySerializedFrame> resp( | 1445 std::unique_ptr<SpdySerializedFrame> resp( |
1480 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 1446 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
1481 | 1447 |
1482 MockRead reads[] = { | 1448 MockRead reads[] = { |
1483 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 1449 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), |
1484 }; | 1450 }; |
1485 | 1451 |
1486 HostPortPair host_port_pair("www.example.org", 443); | 1452 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1487 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1488 PRIVACY_MODE_DISABLED); | |
1489 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
1490 | 1453 |
1491 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1454 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1492 new BidirectionalStreamRequestInfo); | 1455 new BidirectionalStreamRequestInfo); |
1493 request_info->method = "GET"; | 1456 request_info->method = "GET"; |
1494 request_info->url = GURL("https://www.example.org/"); | 1457 request_info->url = default_url_; |
1495 request_info->priority = LOWEST; | 1458 request_info->priority = LOWEST; |
1496 request_info->end_stream_on_headers = true; | 1459 request_info->end_stream_on_headers = true; |
1497 | 1460 |
1498 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1461 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1499 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1462 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( |
1500 new CancelOrDeleteStreamDelegate( | 1463 new CancelOrDeleteStreamDelegate( |
1501 read_buffer.get(), kReadBufferSize, | 1464 read_buffer.get(), kReadBufferSize, |
1502 CancelOrDeleteStreamDelegate::Phase::ON_FAILED, GetParam())); | 1465 CancelOrDeleteStreamDelegate::Phase::ON_FAILED, GetParam())); |
1503 delegate->SetRunUntilCompletion(true); | 1466 delegate->SetRunUntilCompletion(true); |
1504 delegate->Start(std::move(request_info), http_session_.get()); | 1467 delegate->Start(std::move(request_info), http_session_.get()); |
1505 // Makes sure delegate does not get called. | 1468 // Makes sure delegate does not get called. |
1506 base::RunLoop().RunUntilIdle(); | 1469 base::RunLoop().RunUntilIdle(); |
1507 EXPECT_EQ(delegate->response_headers().end(), | 1470 EXPECT_EQ(delegate->response_headers().end(), |
1508 delegate->response_headers().find(":status")); | 1471 delegate->response_headers().find(":status")); |
1509 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1472 EXPECT_EQ(0, delegate->on_data_sent_count()); |
1510 EXPECT_EQ(0, delegate->on_data_read_count()); | 1473 EXPECT_EQ(0, delegate->on_data_read_count()); |
1511 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate->error()); | 1474 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate->error()); |
1512 | 1475 |
1513 // If stream is destroyed, do not call into stream. | 1476 // If stream is destroyed, do not call into stream. |
1514 if (!GetParam()) | 1477 if (!GetParam()) |
1515 return; | 1478 return; |
1516 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1479 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
1517 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1480 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
1518 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1481 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); |
1519 } | 1482 } |
1520 | 1483 |
1521 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { | 1484 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { |
1522 std::unique_ptr<SpdySerializedFrame> req( | 1485 std::unique_ptr<SpdySerializedFrame> req( |
1523 spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); | 1486 spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
1524 // Empty DATA frame with an END_STREAM flag. | 1487 // Empty DATA frame with an END_STREAM flag. |
1525 std::unique_ptr<SpdySerializedFrame> end_stream( | 1488 std::unique_ptr<SpdySerializedFrame> end_stream( |
1526 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); | 1489 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); |
1527 | 1490 |
1528 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; | 1491 MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; |
1529 | 1492 |
1530 std::string alt_svc_header_value = AlternateProtocolToString(QUIC); | 1493 std::string alt_svc_header_value = AlternateProtocolToString(QUIC); |
1531 alt_svc_header_value.append("=\"www.example.org:443\""); | 1494 alt_svc_header_value.append("=\"www.example.org:443\""); |
1532 const char* const kExtraResponseHeaders[] = {"alt-svc", | 1495 const char* const kExtraResponseHeaders[] = {"alt-svc", |
1533 alt_svc_header_value.c_str()}; | 1496 alt_svc_header_value.c_str()}; |
1534 | 1497 |
1535 std::unique_ptr<SpdySerializedFrame> resp( | 1498 std::unique_ptr<SpdySerializedFrame> resp( |
1536 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); | 1499 spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); |
1537 std::unique_ptr<SpdySerializedFrame> body_frame( | 1500 std::unique_ptr<SpdySerializedFrame> body_frame( |
1538 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1501 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
1539 | 1502 |
1540 MockRead reads[] = { | 1503 MockRead reads[] = { |
1541 CreateMockRead(*resp, 1), CreateMockRead(*body_frame, 2), | 1504 CreateMockRead(*resp, 1), CreateMockRead(*body_frame, 2), |
1542 MockRead(SYNCHRONOUS, 0, 3), | 1505 MockRead(SYNCHRONOUS, 0, 3), |
1543 }; | 1506 }; |
1544 | 1507 |
1545 HostPortPair host_port_pair("www.example.org", 443); | |
1546 url::SchemeHostPort server("https", "www.example.org", 443); | |
1547 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
1548 PRIVACY_MODE_DISABLED); | |
1549 // Enable QUIC so that the alternative service header can be added to | 1508 // Enable QUIC so that the alternative service header can be added to |
1550 // HttpServerProperties. | 1509 // HttpServerProperties. |
1551 session_deps_.enable_quic = true; | 1510 session_deps_.enable_quic = true; |
1552 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | 1511 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1553 | 1512 |
1554 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1513 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
1555 new BidirectionalStreamRequestInfo); | 1514 new BidirectionalStreamRequestInfo); |
1556 request_info->method = "GET"; | 1515 request_info->method = "GET"; |
1557 request_info->url = GURL("https://www.example.org/"); | 1516 request_info->url = default_url_; |
1558 request_info->priority = LOWEST; | 1517 request_info->priority = LOWEST; |
1559 request_info->end_stream_on_headers = true; | 1518 request_info->end_stream_on_headers = true; |
1560 | 1519 |
1561 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1520 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1562 MockTimer* timer = new MockTimer(); | 1521 MockTimer* timer = new MockTimer(); |
1563 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( | 1522 std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( |
1564 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); | 1523 read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); |
1565 delegate->SetRunUntilCompletion(true); | 1524 delegate->SetRunUntilCompletion(true); |
1566 delegate->Start(std::move(request_info), http_session_.get()); | 1525 delegate->Start(std::move(request_info), http_session_.get()); |
1567 | 1526 |
1568 const SpdyHeaderBlock& response_headers = delegate->response_headers(); | 1527 const SpdyHeaderBlock& response_headers = delegate->response_headers(); |
1569 EXPECT_EQ("200", response_headers.find(":status")->second); | 1528 EXPECT_EQ("200", response_headers.find(":status")->second); |
1570 EXPECT_EQ(alt_svc_header_value, response_headers.find("alt-svc")->second); | 1529 EXPECT_EQ(alt_svc_header_value, response_headers.find("alt-svc")->second); |
1571 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1530 EXPECT_EQ(0, delegate->on_data_sent_count()); |
1572 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 1531 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
1573 EXPECT_EQ(kUploadData, delegate->data_received()); | 1532 EXPECT_EQ(kUploadData, delegate->data_received()); |
1574 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 1533 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
1575 delegate->GetTotalSentBytes()); | 1534 delegate->GetTotalSentBytes()); |
1576 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 1535 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
1577 delegate->GetTotalReceivedBytes()); | 1536 delegate->GetTotalReceivedBytes()); |
1578 | 1537 |
1579 AlternativeServiceVector alternative_service_vector = | 1538 AlternativeServiceVector alternative_service_vector = |
1580 http_session_->http_server_properties()->GetAlternativeServices(server); | 1539 http_session_->http_server_properties()->GetAlternativeServices( |
| 1540 url::SchemeHostPort(default_url_)); |
1581 ASSERT_EQ(1u, alternative_service_vector.size()); | 1541 ASSERT_EQ(1u, alternative_service_vector.size()); |
1582 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), | 1542 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), |
1583 alternative_service_vector[0].protocol); | 1543 alternative_service_vector[0].protocol); |
1584 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); | 1544 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
1585 EXPECT_EQ(443, alternative_service_vector[0].port); | 1545 EXPECT_EQ(443, alternative_service_vector[0].port); |
1586 } | 1546 } |
1587 | 1547 |
1588 } // namespace net | 1548 } // namespace net |
OLD | NEW |