| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 } | 80 } |
| 81 | 81 |
| 82 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) { | 82 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) { |
| 83 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(), | 83 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(), |
| 84 sequence_number_++)); | 84 sequence_number_++)); |
| 85 packets_.push_back(packet.release()); | 85 packets_.push_back(packet.release()); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory, | 88 void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory, |
| 89 size_t delay) { | 89 size_t delay) { |
| 90 MockRead* reads = reads_.empty() ? NULL : &reads_[0]; | 90 MockRead* reads = reads_.empty() ? nullptr : &reads_[0]; |
| 91 MockWrite* writes = writes_.empty() ? NULL : &writes_[0]; | 91 MockWrite* writes = writes_.empty() ? nullptr : &writes_[0]; |
| 92 socket_data_.reset(new DelayedSocketData( | 92 socket_data_.reset(new DelayedSocketData( |
| 93 delay, reads, reads_.size(), writes, writes_.size())); | 93 delay, reads, reads_.size(), writes, writes_.size())); |
| 94 factory->AddSocketDataProvider(socket_data_.get()); | 94 factory->AddSocketDataProvider(socket_data_.get()); |
| 95 } | 95 } |
| 96 | 96 |
| 97 private: | 97 private: |
| 98 std::vector<QuicEncryptedPacket*> packets_; | 98 std::vector<QuicEncryptedPacket*> packets_; |
| 99 std::vector<MockWrite> writes_; | 99 std::vector<MockWrite> writes_; |
| 100 std::vector<MockRead> reads_; | 100 std::vector<MockRead> reads_; |
| 101 size_t sequence_number_; | 101 size_t sequence_number_; |
| 102 scoped_ptr<SocketDataProvider> socket_data_; | 102 scoped_ptr<SocketDataProvider> socket_data_; |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 class QuicNetworkTransactionTest | 105 class QuicNetworkTransactionTest |
| 106 : public PlatformTest, | 106 : public PlatformTest, |
| 107 public ::testing::WithParamInterface<QuicVersion> { | 107 public ::testing::WithParamInterface<QuicVersion> { |
| 108 protected: | 108 protected: |
| 109 QuicNetworkTransactionTest() | 109 QuicNetworkTransactionTest() |
| 110 : clock_(new MockClock), | 110 : clock_(new MockClock), |
| 111 maker_(GetParam(), 0, clock_), | 111 maker_(GetParam(), 0, clock_), |
| 112 ssl_config_service_(new SSLConfigServiceDefaults), | 112 ssl_config_service_(new SSLConfigServiceDefaults), |
| 113 proxy_service_(ProxyService::CreateDirect()), | 113 proxy_service_(ProxyService::CreateDirect()), |
| 114 auth_handler_factory_( | 114 auth_handler_factory_( |
| 115 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | 115 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 116 random_generator_(0), | 116 random_generator_(0), |
| 117 hanging_data_(NULL, 0, NULL, 0) { | 117 hanging_data_(nullptr, 0, nullptr, 0) { |
| 118 request_.method = "GET"; | 118 request_.method = "GET"; |
| 119 request_.url = GURL("http://www.google.com/"); | 119 request_.url = GURL("http://www.google.com/"); |
| 120 request_.load_flags = 0; | 120 request_.load_flags = 0; |
| 121 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 121 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 122 } | 122 } |
| 123 | 123 |
| 124 virtual void SetUp() { | 124 virtual void SetUp() { |
| 125 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 125 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 126 base::MessageLoop::current()->RunUntilIdle(); | 126 base::MessageLoop::current()->RunUntilIdle(); |
| 127 } | 127 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 params_.use_alternate_protocols = true; | 216 params_.use_alternate_protocols = true; |
| 217 params_.next_protos = NextProtosSpdy3(); | 217 params_.next_protos = NextProtosSpdy3(); |
| 218 } | 218 } |
| 219 | 219 |
| 220 session_ = new HttpNetworkSession(params_); | 220 session_ = new HttpNetworkSession(params_); |
| 221 session_->quic_stream_factory()->set_require_confirmation(false); | 221 session_->quic_stream_factory()->set_require_confirmation(false); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { | 224 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { |
| 225 const HttpResponseInfo* response = trans->GetResponseInfo(); | 225 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 226 ASSERT_TRUE(response != NULL); | 226 ASSERT_TRUE(response != nullptr); |
| 227 ASSERT_TRUE(response->headers.get() != NULL); | 227 ASSERT_TRUE(response->headers.get() != nullptr); |
| 228 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 228 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 229 EXPECT_TRUE(response->was_fetched_via_spdy); | 229 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 230 EXPECT_TRUE(response->was_npn_negotiated); | 230 EXPECT_TRUE(response->was_npn_negotiated); |
| 231 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3, | 231 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3, |
| 232 response->connection_info); | 232 response->connection_info); |
| 233 } | 233 } |
| 234 | 234 |
| 235 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { | 235 void CheckWasHttpResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { |
| 236 const HttpResponseInfo* response = trans->GetResponseInfo(); | 236 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 237 ASSERT_TRUE(response != NULL); | 237 ASSERT_TRUE(response != nullptr); |
| 238 ASSERT_TRUE(response->headers.get() != NULL); | 238 ASSERT_TRUE(response->headers.get() != nullptr); |
| 239 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 239 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 240 EXPECT_FALSE(response->was_fetched_via_spdy); | 240 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 241 EXPECT_FALSE(response->was_npn_negotiated); | 241 EXPECT_FALSE(response->was_npn_negotiated); |
| 242 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1, | 242 EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1, |
| 243 response->connection_info); | 243 response->connection_info); |
| 244 } | 244 } |
| 245 | 245 |
| 246 void CheckResponseData(HttpNetworkTransaction* trans, | 246 void CheckResponseData(HttpNetworkTransaction* trans, |
| 247 const std::string& expected) { | 247 const std::string& expected) { |
| 248 std::string response_data; | 248 std::string response_data; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 params_.origin_to_force_quic_on = | 438 params_.origin_to_force_quic_on = |
| 439 HostPortPair::FromString("www.google.com:443"); | 439 HostPortPair::FromString("www.google.com:443"); |
| 440 | 440 |
| 441 MockRead http_reads[] = { | 441 MockRead http_reads[] = { |
| 442 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 442 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 443 MockRead("hello world"), | 443 MockRead("hello world"), |
| 444 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 444 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 445 MockRead(ASYNC, OK) | 445 MockRead(ASYNC, OK) |
| 446 }; | 446 }; |
| 447 | 447 |
| 448 StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0); | 448 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0); |
| 449 socket_factory_.AddSocketDataProvider(&data); | 449 socket_factory_.AddSocketDataProvider(&data); |
| 450 SSLSocketDataProvider ssl(ASYNC, OK); | 450 SSLSocketDataProvider ssl(ASYNC, OK); |
| 451 socket_factory_.AddSSLSocketDataProvider(&ssl); | 451 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 452 | 452 |
| 453 CreateSession(); | 453 CreateSession(); |
| 454 | 454 |
| 455 SendRequestAndExpectHttpResponse("hello world"); | 455 SendRequestAndExpectHttpResponse("hello world"); |
| 456 } | 456 } |
| 457 | 457 |
| 458 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | 458 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
| 459 MockRead http_reads[] = { | 459 MockRead http_reads[] = { |
| 460 MockRead("HTTP/1.1 200 OK\r\n"), | 460 MockRead("HTTP/1.1 200 OK\r\n"), |
| 461 MockRead(kQuicAlternateProtocolHttpHeader), | 461 MockRead(kQuicAlternateProtocolHttpHeader), |
| 462 MockRead("hello world"), | 462 MockRead("hello world"), |
| 463 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 463 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 464 MockRead(ASYNC, OK) | 464 MockRead(ASYNC, OK) |
| 465 }; | 465 }; |
| 466 | 466 |
| 467 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 467 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 468 NULL, 0); | 468 nullptr, 0); |
| 469 socket_factory_.AddSocketDataProvider(&http_data); | 469 socket_factory_.AddSocketDataProvider(&http_data); |
| 470 | 470 |
| 471 MockQuicData mock_quic_data; | 471 MockQuicData mock_quic_data; |
| 472 mock_quic_data.AddWrite( | 472 mock_quic_data.AddWrite( |
| 473 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 473 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 474 GetRequestHeaders("GET", "http", "/"))); | 474 GetRequestHeaders("GET", "http", "/"))); |
| 475 mock_quic_data.AddRead( | 475 mock_quic_data.AddRead( |
| 476 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 476 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 477 GetResponseHeaders("200 OK"))); | 477 GetResponseHeaders("200 OK"))); |
| 478 mock_quic_data.AddRead( | 478 mock_quic_data.AddRead( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 495 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { | 495 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { |
| 496 MockRead http_reads[] = { | 496 MockRead http_reads[] = { |
| 497 MockRead("HTTP/1.1 200 OK\r\n"), | 497 MockRead("HTTP/1.1 200 OK\r\n"), |
| 498 MockRead(kQuicAlternateProtocol50pctHttpHeader), | 498 MockRead(kQuicAlternateProtocol50pctHttpHeader), |
| 499 MockRead("hello world"), | 499 MockRead("hello world"), |
| 500 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 500 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 501 MockRead(ASYNC, OK) | 501 MockRead(ASYNC, OK) |
| 502 }; | 502 }; |
| 503 | 503 |
| 504 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 504 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 505 NULL, 0); | 505 nullptr, 0); |
| 506 socket_factory_.AddSocketDataProvider(&http_data); | 506 socket_factory_.AddSocketDataProvider(&http_data); |
| 507 | 507 |
| 508 MockQuicData mock_quic_data; | 508 MockQuicData mock_quic_data; |
| 509 mock_quic_data.AddWrite( | 509 mock_quic_data.AddWrite( |
| 510 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 510 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 511 GetRequestHeaders("GET", "http", "/"))); | 511 GetRequestHeaders("GET", "http", "/"))); |
| 512 mock_quic_data.AddRead( | 512 mock_quic_data.AddRead( |
| 513 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 513 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 514 GetResponseHeaders("200 OK"))); | 514 GetResponseHeaders("200 OK"))); |
| 515 mock_quic_data.AddRead( | 515 mock_quic_data.AddRead( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 533 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { | 533 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { |
| 534 MockRead http_reads[] = { | 534 MockRead http_reads[] = { |
| 535 MockRead("HTTP/1.1 200 OK\r\n"), | 535 MockRead("HTTP/1.1 200 OK\r\n"), |
| 536 MockRead(kQuicAlternateProtocol50pctHttpHeader), | 536 MockRead(kQuicAlternateProtocol50pctHttpHeader), |
| 537 MockRead("hello world"), | 537 MockRead("hello world"), |
| 538 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 538 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 539 MockRead(ASYNC, OK) | 539 MockRead(ASYNC, OK) |
| 540 }; | 540 }; |
| 541 | 541 |
| 542 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 542 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 543 NULL, 0); | 543 nullptr, 0); |
| 544 socket_factory_.AddSocketDataProvider(&http_data); | 544 socket_factory_.AddSocketDataProvider(&http_data); |
| 545 socket_factory_.AddSocketDataProvider(&http_data); | 545 socket_factory_.AddSocketDataProvider(&http_data); |
| 546 | 546 |
| 547 params_.alternate_protocol_probability_threshold = .75; | 547 params_.alternate_protocol_probability_threshold = .75; |
| 548 CreateSessionWithNextProtos(); | 548 CreateSessionWithNextProtos(); |
| 549 | 549 |
| 550 SendRequestAndExpectHttpResponse("hello world"); | 550 SendRequestAndExpectHttpResponse("hello world"); |
| 551 SendRequestAndExpectHttpResponse("hello world"); | 551 SendRequestAndExpectHttpResponse("hello world"); |
| 552 } | 552 } |
| 553 | 553 |
| 554 TEST_P(QuicNetworkTransactionTest, | 554 TEST_P(QuicNetworkTransactionTest, |
| 555 DontUseAlternateProtocolWithBadProbabilityForQuic) { | 555 DontUseAlternateProtocolWithBadProbabilityForQuic) { |
| 556 MockRead http_reads[] = { | 556 MockRead http_reads[] = { |
| 557 MockRead("HTTP/1.1 200 OK\r\n"), | 557 MockRead("HTTP/1.1 200 OK\r\n"), |
| 558 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), | 558 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), |
| 559 MockRead("hello world"), | 559 MockRead("hello world"), |
| 560 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 560 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 561 MockRead(ASYNC, OK) | 561 MockRead(ASYNC, OK) |
| 562 }; | 562 }; |
| 563 | 563 |
| 564 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 564 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 565 NULL, 0); | 565 nullptr, 0); |
| 566 socket_factory_.AddSocketDataProvider(&http_data); | 566 socket_factory_.AddSocketDataProvider(&http_data); |
| 567 socket_factory_.AddSocketDataProvider(&http_data); | 567 socket_factory_.AddSocketDataProvider(&http_data); |
| 568 | 568 |
| 569 params_.alternate_protocol_probability_threshold = .75; | 569 params_.alternate_protocol_probability_threshold = .75; |
| 570 CreateSessionWithNextProtos(); | 570 CreateSessionWithNextProtos(); |
| 571 | 571 |
| 572 SendRequestAndExpectHttpResponse("hello world"); | 572 SendRequestAndExpectHttpResponse("hello world"); |
| 573 SendRequestAndExpectHttpResponse("hello world"); | 573 SendRequestAndExpectHttpResponse("hello world"); |
| 574 } | 574 } |
| 575 | 575 |
| 576 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 576 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
| 577 params_.origin_to_force_quic_on = | 577 params_.origin_to_force_quic_on = |
| 578 HostPortPair::FromString("www.google.com:443"); | 578 HostPortPair::FromString("www.google.com:443"); |
| 579 | 579 |
| 580 MockRead http_reads[] = { | 580 MockRead http_reads[] = { |
| 581 MockRead("HTTP/1.1 200 OK\r\n"), | 581 MockRead("HTTP/1.1 200 OK\r\n"), |
| 582 MockRead(kQuicAlternateProtocolHttpsHeader), | 582 MockRead(kQuicAlternateProtocolHttpsHeader), |
| 583 MockRead("hello world"), | 583 MockRead("hello world"), |
| 584 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 584 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 585 MockRead(ASYNC, OK) | 585 MockRead(ASYNC, OK) |
| 586 }; | 586 }; |
| 587 | 587 |
| 588 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 588 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 589 NULL, 0); | 589 nullptr, 0); |
| 590 socket_factory_.AddSocketDataProvider(&http_data); | 590 socket_factory_.AddSocketDataProvider(&http_data); |
| 591 | 591 |
| 592 MockQuicData mock_quic_data; | 592 MockQuicData mock_quic_data; |
| 593 mock_quic_data.AddWrite( | 593 mock_quic_data.AddWrite( |
| 594 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 594 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 595 GetRequestHeaders("GET", "http", "/"))); | 595 GetRequestHeaders("GET", "http", "/"))); |
| 596 mock_quic_data.AddRead( | 596 mock_quic_data.AddRead( |
| 597 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 597 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 598 GetResponseHeaders("200 OK"))); | 598 GetResponseHeaders("200 OK"))); |
| 599 mock_quic_data.AddRead( | 599 mock_quic_data.AddRead( |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 // without racing an HTTP connection, we need the host resolution to happen | 713 // without racing an HTTP connection, we need the host resolution to happen |
| 714 // synchronously. | 714 // synchronously. |
| 715 host_resolver_.set_synchronous_mode(true); | 715 host_resolver_.set_synchronous_mode(true); |
| 716 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 716 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 717 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 717 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 718 AddressList address; | 718 AddressList address; |
| 719 host_resolver_.Resolve(info, | 719 host_resolver_.Resolve(info, |
| 720 DEFAULT_PRIORITY, | 720 DEFAULT_PRIORITY, |
| 721 &address, | 721 &address, |
| 722 CompletionCallback(), | 722 CompletionCallback(), |
| 723 NULL, | 723 nullptr, |
| 724 net_log_.bound()); | 724 net_log_.bound()); |
| 725 | 725 |
| 726 CreateSessionWithNextProtos(); | 726 CreateSessionWithNextProtos(); |
| 727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 728 SendRequestAndExpectQuicResponse("hello!"); | 728 SendRequestAndExpectQuicResponse("hello!"); |
| 729 } | 729 } |
| 730 | 730 |
| 731 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { | 731 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { |
| 732 proxy_service_.reset( | 732 proxy_service_.reset( |
| 733 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 733 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 754 // without racing an HTTP connection, we need the host resolution to happen | 754 // without racing an HTTP connection, we need the host resolution to happen |
| 755 // synchronously. | 755 // synchronously. |
| 756 host_resolver_.set_synchronous_mode(true); | 756 host_resolver_.set_synchronous_mode(true); |
| 757 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 757 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 758 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 758 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 759 AddressList address; | 759 AddressList address; |
| 760 host_resolver_.Resolve(info, | 760 host_resolver_.Resolve(info, |
| 761 DEFAULT_PRIORITY, | 761 DEFAULT_PRIORITY, |
| 762 &address, | 762 &address, |
| 763 CompletionCallback(), | 763 CompletionCallback(), |
| 764 NULL, | 764 nullptr, |
| 765 net_log_.bound()); | 765 net_log_.bound()); |
| 766 | 766 |
| 767 CreateSessionWithNextProtos(); | 767 CreateSessionWithNextProtos(); |
| 768 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 768 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 769 SendRequestAndExpectHttpResponse("hello world"); | 769 SendRequestAndExpectHttpResponse("hello world"); |
| 770 } | 770 } |
| 771 | 771 |
| 772 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 772 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 773 MockQuicData mock_quic_data; | 773 MockQuicData mock_quic_data; |
| 774 mock_quic_data.AddWrite( | 774 mock_quic_data.AddWrite( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 790 // In order for a new QUIC session to be established via alternate-protocol | 790 // In order for a new QUIC session to be established via alternate-protocol |
| 791 // without racing an HTTP connection, we need the host resolution to happen | 791 // without racing an HTTP connection, we need the host resolution to happen |
| 792 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 792 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 793 // connection to the the server, in this test we require confirmation | 793 // connection to the the server, in this test we require confirmation |
| 794 // before encrypting so the HTTP job will still start. | 794 // before encrypting so the HTTP job will still start. |
| 795 host_resolver_.set_synchronous_mode(true); | 795 host_resolver_.set_synchronous_mode(true); |
| 796 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 796 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 797 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 797 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 798 AddressList address; | 798 AddressList address; |
| 799 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, | 799 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, |
| 800 CompletionCallback(), NULL, net_log_.bound()); | 800 CompletionCallback(), nullptr, net_log_.bound()); |
| 801 | 801 |
| 802 CreateSessionWithNextProtos(); | 802 CreateSessionWithNextProtos(); |
| 803 session_->quic_stream_factory()->set_require_confirmation(true); | 803 session_->quic_stream_factory()->set_require_confirmation(true); |
| 804 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 804 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 805 | 805 |
| 806 scoped_ptr<HttpNetworkTransaction> trans( | 806 scoped_ptr<HttpNetworkTransaction> trans( |
| 807 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 807 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 808 TestCompletionCallback callback; | 808 TestCompletionCallback callback; |
| 809 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 809 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 810 EXPECT_EQ(ERR_IO_PENDING, rv); | 810 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 811 | 811 |
| 812 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 812 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 813 QuicSession::HANDSHAKE_CONFIRMED); | 813 QuicSession::HANDSHAKE_CONFIRMED); |
| 814 EXPECT_EQ(OK, callback.WaitForResult()); | 814 EXPECT_EQ(OK, callback.WaitForResult()); |
| 815 } | 815 } |
| 816 | 816 |
| 817 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 817 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
| 818 // Alternate-protocol job | 818 // Alternate-protocol job |
| 819 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 819 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
| 820 MockRead quic_reads[] = { | 820 MockRead quic_reads[] = { |
| 821 MockRead(ASYNC, close->data(), close->length()), | 821 MockRead(ASYNC, close->data(), close->length()), |
| 822 MockRead(ASYNC, OK), // EOF | 822 MockRead(ASYNC, OK), // EOF |
| 823 }; | 823 }; |
| 824 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 824 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 825 NULL, 0); | 825 nullptr, 0); |
| 826 socket_factory_.AddSocketDataProvider(&quic_data); | 826 socket_factory_.AddSocketDataProvider(&quic_data); |
| 827 | 827 |
| 828 // Main job which will succeed even though the alternate job fails. | 828 // Main job which will succeed even though the alternate job fails. |
| 829 MockRead http_reads[] = { | 829 MockRead http_reads[] = { |
| 830 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 830 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 831 MockRead("hello from http"), | 831 MockRead("hello from http"), |
| 832 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 832 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 833 MockRead(ASYNC, OK) | 833 MockRead(ASYNC, OK) |
| 834 }; | 834 }; |
| 835 | 835 |
| 836 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 836 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 837 NULL, 0); | 837 nullptr, 0); |
| 838 socket_factory_.AddSocketDataProvider(&http_data); | 838 socket_factory_.AddSocketDataProvider(&http_data); |
| 839 | 839 |
| 840 CreateSessionWithNextProtos(); | 840 CreateSessionWithNextProtos(); |
| 841 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 841 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 842 SendRequestAndExpectHttpResponse("hello from http"); | 842 SendRequestAndExpectHttpResponse("hello from http"); |
| 843 ExpectBrokenAlternateProtocolMapping(); | 843 ExpectBrokenAlternateProtocolMapping(); |
| 844 } | 844 } |
| 845 | 845 |
| 846 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { | 846 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { |
| 847 // Alternate-protocol job | 847 // Alternate-protocol job |
| 848 MockRead quic_reads[] = { | 848 MockRead quic_reads[] = { |
| 849 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 849 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 850 }; | 850 }; |
| 851 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 851 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 852 NULL, 0); | 852 nullptr, 0); |
| 853 socket_factory_.AddSocketDataProvider(&quic_data); | 853 socket_factory_.AddSocketDataProvider(&quic_data); |
| 854 | 854 |
| 855 // Main job which will succeed even though the alternate job fails. | 855 // Main job which will succeed even though the alternate job fails. |
| 856 MockRead http_reads[] = { | 856 MockRead http_reads[] = { |
| 857 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 857 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 858 MockRead("hello from http"), | 858 MockRead("hello from http"), |
| 859 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 859 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 860 MockRead(ASYNC, OK) | 860 MockRead(ASYNC, OK) |
| 861 }; | 861 }; |
| 862 | 862 |
| 863 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 863 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 864 NULL, 0); | 864 nullptr, 0); |
| 865 socket_factory_.AddSocketDataProvider(&http_data); | 865 socket_factory_.AddSocketDataProvider(&http_data); |
| 866 | 866 |
| 867 CreateSessionWithNextProtos(); | 867 CreateSessionWithNextProtos(); |
| 868 | 868 |
| 869 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 869 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 870 SendRequestAndExpectHttpResponse("hello from http"); | 870 SendRequestAndExpectHttpResponse("hello from http"); |
| 871 ExpectBrokenAlternateProtocolMapping(); | 871 ExpectBrokenAlternateProtocolMapping(); |
| 872 } | 872 } |
| 873 | 873 |
| 874 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) { | 874 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) { |
| 875 // Alternate-protocol job will fail when the session attempts to read. | 875 // Alternate-protocol job will fail when the session attempts to read. |
| 876 MockRead quic_reads[] = { | 876 MockRead quic_reads[] = { |
| 877 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 877 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 878 }; | 878 }; |
| 879 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 879 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 880 NULL, 0); | 880 nullptr, 0); |
| 881 socket_factory_.AddSocketDataProvider(&quic_data); | 881 socket_factory_.AddSocketDataProvider(&quic_data); |
| 882 | 882 |
| 883 // Main job will also fail. | 883 // Main job will also fail. |
| 884 MockRead http_reads[] = { | 884 MockRead http_reads[] = { |
| 885 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 885 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 886 }; | 886 }; |
| 887 | 887 |
| 888 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 888 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 889 NULL, 0); | 889 nullptr, 0); |
| 890 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED)); | 890 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED)); |
| 891 socket_factory_.AddSocketDataProvider(&http_data); | 891 socket_factory_.AddSocketDataProvider(&http_data); |
| 892 | 892 |
| 893 CreateSessionWithNextProtos(); | 893 CreateSessionWithNextProtos(); |
| 894 | 894 |
| 895 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 895 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 896 scoped_ptr<HttpNetworkTransaction> trans( | 896 scoped_ptr<HttpNetworkTransaction> trans( |
| 897 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 897 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 898 TestCompletionCallback callback; | 898 TestCompletionCallback callback; |
| 899 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 899 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 900 EXPECT_EQ(ERR_IO_PENDING, rv); | 900 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 901 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); | 901 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); |
| 902 ExpectQuicAlternateProtocolMapping(); | 902 ExpectQuicAlternateProtocolMapping(); |
| 903 } | 903 } |
| 904 | 904 |
| 905 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { | 905 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
| 906 // Alternate-protocol job | 906 // Alternate-protocol job |
| 907 MockRead quic_reads[] = { | 907 MockRead quic_reads[] = { |
| 908 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 908 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 909 }; | 909 }; |
| 910 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 910 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 911 NULL, 0); | 911 nullptr, 0); |
| 912 socket_factory_.AddSocketDataProvider(&quic_data); | 912 socket_factory_.AddSocketDataProvider(&quic_data); |
| 913 | 913 |
| 914 AddHangingNonAlternateProtocolSocketData(); | 914 AddHangingNonAlternateProtocolSocketData(); |
| 915 | 915 |
| 916 // Second Alternate-protocol job which will race with the TCP job. | 916 // Second Alternate-protocol job which will race with the TCP job. |
| 917 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads), | 917 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads), |
| 918 NULL, 0); | 918 nullptr, 0); |
| 919 socket_factory_.AddSocketDataProvider(&quic_data2); | 919 socket_factory_.AddSocketDataProvider(&quic_data2); |
| 920 | 920 |
| 921 // Final job that will proceed when the QUIC job fails. | 921 // Final job that will proceed when the QUIC job fails. |
| 922 MockRead http_reads[] = { | 922 MockRead http_reads[] = { |
| 923 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 923 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 924 MockRead("hello from http"), | 924 MockRead("hello from http"), |
| 925 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 925 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 926 MockRead(ASYNC, OK) | 926 MockRead(ASYNC, OK) |
| 927 }; | 927 }; |
| 928 | 928 |
| 929 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 929 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 930 NULL, 0); | 930 nullptr, 0); |
| 931 socket_factory_.AddSocketDataProvider(&http_data); | 931 socket_factory_.AddSocketDataProvider(&http_data); |
| 932 | 932 |
| 933 CreateSessionWithNextProtos(); | 933 CreateSessionWithNextProtos(); |
| 934 | 934 |
| 935 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 935 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 936 | 936 |
| 937 SendRequestAndExpectHttpResponse("hello from http"); | 937 SendRequestAndExpectHttpResponse("hello from http"); |
| 938 | 938 |
| 939 ExpectBrokenAlternateProtocolMapping(); | 939 ExpectBrokenAlternateProtocolMapping(); |
| 940 | 940 |
| 941 EXPECT_TRUE(quic_data.at_read_eof()); | 941 EXPECT_TRUE(quic_data.at_read_eof()); |
| 942 EXPECT_TRUE(quic_data.at_write_eof()); | 942 EXPECT_TRUE(quic_data.at_write_eof()); |
| 943 } | 943 } |
| 944 | 944 |
| 945 TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) { | 945 TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) { |
| 946 // Alternate-protocol job | 946 // Alternate-protocol job |
| 947 MockRead quic_reads[] = { | 947 MockRead quic_reads[] = { |
| 948 MockRead(ASYNC, ERR_IO_PENDING), | 948 MockRead(ASYNC, ERR_IO_PENDING), |
| 949 }; | 949 }; |
| 950 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 950 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 951 NULL, 0); | 951 nullptr, 0); |
| 952 socket_factory_.AddSocketDataProvider(&quic_data); | 952 socket_factory_.AddSocketDataProvider(&quic_data); |
| 953 | 953 |
| 954 // Main job that will proceed when the QUIC job fails. | 954 // Main job that will proceed when the QUIC job fails. |
| 955 MockRead http_reads[] = { | 955 MockRead http_reads[] = { |
| 956 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 956 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 957 MockRead("hello from http"), | 957 MockRead("hello from http"), |
| 958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 959 MockRead(ASYNC, OK) | 959 MockRead(ASYNC, OK) |
| 960 }; | 960 }; |
| 961 | 961 |
| 962 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 962 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 963 NULL, 0); | 963 nullptr, 0); |
| 964 socket_factory_.AddSocketDataProvider(&http_data); | 964 socket_factory_.AddSocketDataProvider(&http_data); |
| 965 | 965 |
| 966 CreateSessionWithNextProtos(); | 966 CreateSessionWithNextProtos(); |
| 967 | 967 |
| 968 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 968 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 969 | 969 |
| 970 SendRequestAndExpectHttpResponse("hello from http"); | 970 SendRequestAndExpectHttpResponse("hello from http"); |
| 971 } | 971 } |
| 972 | 972 |
| 973 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) { | 973 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) { |
| 974 // Alternate-protocol job will fail before creating a QUIC session. | 974 // Alternate-protocol job will fail before creating a QUIC session. |
| 975 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); | 975 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0); |
| 976 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, | 976 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 977 ERR_INTERNET_DISCONNECTED)); | 977 ERR_INTERNET_DISCONNECTED)); |
| 978 socket_factory_.AddSocketDataProvider(&quic_data); | 978 socket_factory_.AddSocketDataProvider(&quic_data); |
| 979 | 979 |
| 980 // Main job which will succeed even though the alternate job fails. | 980 // Main job which will succeed even though the alternate job fails. |
| 981 MockRead http_reads[] = { | 981 MockRead http_reads[] = { |
| 982 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 982 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 983 MockRead("hello from http"), | 983 MockRead("hello from http"), |
| 984 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 984 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 985 MockRead(ASYNC, OK) | 985 MockRead(ASYNC, OK) |
| 986 }; | 986 }; |
| 987 | 987 |
| 988 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 988 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 989 NULL, 0); | 989 nullptr, 0); |
| 990 socket_factory_.AddSocketDataProvider(&http_data); | 990 socket_factory_.AddSocketDataProvider(&http_data); |
| 991 | 991 |
| 992 CreateSessionWithNextProtos(); | 992 CreateSessionWithNextProtos(); |
| 993 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 993 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 994 SendRequestAndExpectHttpResponse("hello from http"); | 994 SendRequestAndExpectHttpResponse("hello from http"); |
| 995 | 995 |
| 996 ExpectBrokenAlternateProtocolMapping(); | 996 ExpectBrokenAlternateProtocolMapping(); |
| 997 } | 997 } |
| 998 | 998 |
| 999 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { | 999 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
| 1000 MockQuicData mock_quic_data; | 1000 MockQuicData mock_quic_data; |
| 1001 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); | 1001 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); |
| 1002 mock_quic_data.AddWrite( | 1002 mock_quic_data.AddWrite( |
| 1003 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1003 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1004 GetRequestHeaders("GET", "http", "/"))); | 1004 GetRequestHeaders("GET", "http", "/"))); |
| 1005 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1005 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1006 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); | 1006 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
| 1007 | 1007 |
| 1008 // When the QUIC connection fails, we will try the request again over HTTP. | 1008 // When the QUIC connection fails, we will try the request again over HTTP. |
| 1009 MockRead http_reads[] = { | 1009 MockRead http_reads[] = { |
| 1010 MockRead("HTTP/1.1 200 OK\r\n"), | 1010 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1011 MockRead(kQuicAlternateProtocolHttpHeader), | 1011 MockRead(kQuicAlternateProtocolHttpHeader), |
| 1012 MockRead("hello world"), | 1012 MockRead("hello world"), |
| 1013 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1013 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1014 MockRead(ASYNC, OK) | 1014 MockRead(ASYNC, OK) |
| 1015 }; | 1015 }; |
| 1016 | 1016 |
| 1017 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1017 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1018 NULL, 0); | 1018 nullptr, 0); |
| 1019 socket_factory_.AddSocketDataProvider(&http_data); | 1019 socket_factory_.AddSocketDataProvider(&http_data); |
| 1020 | 1020 |
| 1021 // In order for a new QUIC session to be established via alternate-protocol | 1021 // In order for a new QUIC session to be established via alternate-protocol |
| 1022 // without racing an HTTP connection, we need the host resolution to happen | 1022 // without racing an HTTP connection, we need the host resolution to happen |
| 1023 // synchronously. | 1023 // synchronously. |
| 1024 host_resolver_.set_synchronous_mode(true); | 1024 host_resolver_.set_synchronous_mode(true); |
| 1025 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 1025 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 1026 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 1026 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 1027 AddressList address; | 1027 AddressList address; |
| 1028 host_resolver_.Resolve(info, | 1028 host_resolver_.Resolve(info, |
| 1029 DEFAULT_PRIORITY, | 1029 DEFAULT_PRIORITY, |
| 1030 &address, | 1030 &address, |
| 1031 CompletionCallback(), | 1031 CompletionCallback(), |
| 1032 NULL, | 1032 nullptr, |
| 1033 net_log_.bound()); | 1033 net_log_.bound()); |
| 1034 | 1034 |
| 1035 CreateSessionWithNextProtos(); | 1035 CreateSessionWithNextProtos(); |
| 1036 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1036 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1037 SendRequestAndExpectHttpResponse("hello world"); | 1037 SendRequestAndExpectHttpResponse("hello world"); |
| 1038 } | 1038 } |
| 1039 | 1039 |
| 1040 } // namespace test | 1040 } // namespace test |
| 1041 } // namespace net | 1041 } // namespace net |
| OLD | NEW |