Chromium Code Reviews| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 48 #include "net/ssl/ssl_config_service_defaults.h" | 48 #include "net/ssl/ssl_config_service_defaults.h" |
| 49 #include "net/test/cert_test_util.h" | 49 #include "net/test/cert_test_util.h" |
| 50 #include "testing/gtest/include/gtest/gtest.h" | 50 #include "testing/gtest/include/gtest/gtest.h" |
| 51 #include "testing/platform_test.h" | 51 #include "testing/platform_test.h" |
| 52 | 52 |
| 53 namespace net { | 53 namespace net { |
| 54 namespace test { | 54 namespace test { |
| 55 | 55 |
| 56 namespace { | 56 namespace { |
| 57 | 57 |
| 58 static const char kQuicAlternateProtocolHttpHeader[] = | 58 static const char kQuicAlternateProtocolHeader[] = |
| 59 "Alternate-Protocol: 80:quic\r\n\r\n"; | 59 "Alternate-Protocol: 443:quic\r\n\r\n"; |
| 60 static const char kQuicAlternateProtocol50pctHttpHeader[] = | 60 static const char kQuicAlternateProtocol50pctHeader[] = |
| 61 "Alternate-Protocol: 80:quic,p=.5\r\n\r\n"; | 61 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; |
| 62 static const char kQuicAlternateProtocolDifferentPortHttpHeader[] = | 62 static const char kQuicAlternateProtocolDifferentPortHeader[] = |
| 63 "Alternate-Protocol: 137:quic\r\n\r\n"; | 63 "Alternate-Protocol: 137:quic\r\n\r\n"; |
| 64 static const char kQuicAlternateProtocolHttpsHeader[] = | 64 static const char kQuicAlternativeServiceHeader[] = |
| 65 "Alternate-Protocol: 443:quic\r\n\r\n"; | 65 "Alt-Svc: quic=\":443\"\r\n\r\n"; |
| 66 static const char kQuicAlternativeServiceHttpHeader[] = | 66 static const char kQuicAlternativeService50pctHeader[] = |
| 67 "Alt-Svc: quic=\":80\"\r\n\r\n"; | 67 "Alt-Svc: quic=\":443\";p=.5\r\n\r\n"; |
| 68 static const char kQuicAlternativeService50pctHttpHeader[] = | 68 static const char kQuicAlternativeServiceDifferentPortHeader[] = |
| 69 "Alt-Svc: quic=\":80\";p=.5\r\n\r\n"; | |
| 70 static const char kQuicAlternativeServiceDifferentPortHttpHeader[] = | |
| 71 "Alt-Svc: quic=\":137\"\r\n\r\n"; | 69 "Alt-Svc: quic=\":137\"\r\n\r\n"; |
| 72 static const char kQuicAlternativeServiceHttpsHeader[] = | |
| 73 "Alt-Svc: quic=\":443\"\r\n\r\n"; | |
| 74 | 70 |
| 75 const char kDefaultServerHostName[] = "www.google.com"; | 71 const char kDefaultServerHostName[] = "mail.example.com"; |
| 76 | 72 |
| 77 } // namespace | 73 } // namespace |
| 78 | 74 |
| 79 // Helper class to encapsulate MockReads and MockWrites for QUIC. | 75 // Helper class to encapsulate MockReads and MockWrites for QUIC. |
| 80 // Simplify ownership issues and the interaction with the MockSocketFactory. | 76 // Simplify ownership issues and the interaction with the MockSocketFactory. |
| 81 class MockQuicData { | 77 class MockQuicData { |
| 82 public: | 78 public: |
| 83 MockQuicData() : packet_number_(0) {} | 79 MockQuicData() : packet_number_(0) {} |
| 84 | 80 |
| 85 ~MockQuicData() { | 81 ~MockQuicData() { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 202 protected: | 198 protected: |
| 203 QuicNetworkTransactionTest() | 199 QuicNetworkTransactionTest() |
| 204 : clock_(new MockClock), | 200 : clock_(new MockClock), |
| 205 maker_(GetParam(), 0, clock_, kDefaultServerHostName), | 201 maker_(GetParam(), 0, clock_, kDefaultServerHostName), |
| 206 test_network_quality_estimator_(new TestNetworkQualityEstimator()), | 202 test_network_quality_estimator_(new TestNetworkQualityEstimator()), |
| 207 ssl_config_service_(new SSLConfigServiceDefaults), | 203 ssl_config_service_(new SSLConfigServiceDefaults), |
| 208 proxy_service_(ProxyService::CreateDirect()), | 204 proxy_service_(ProxyService::CreateDirect()), |
| 209 auth_handler_factory_( | 205 auth_handler_factory_( |
| 210 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | 206 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 211 random_generator_(0), | 207 random_generator_(0), |
| 212 hanging_data_(nullptr, 0, nullptr, 0) { | 208 hanging_data_(nullptr, 0, nullptr, 0), |
| 209 ssl_data_(ASYNC, OK) { | |
| 213 request_.method = "GET"; | 210 request_.method = "GET"; |
| 214 std::string url("http://"); | 211 std::string url("https://"); |
| 215 url.append(kDefaultServerHostName); | 212 url.append(kDefaultServerHostName); |
| 216 request_.url = GURL(url); | 213 request_.url = GURL(url); |
| 217 request_.load_flags = 0; | 214 request_.load_flags = 0; |
| 218 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 215 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 216 | |
| 217 scoped_refptr<X509Certificate> cert( | |
| 218 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | |
| 219 verify_details_.cert_verify_result.verified_cert = cert; | |
| 220 verify_details_.cert_verify_result.is_issued_by_known_root = true; | |
| 221 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | |
| 219 } | 222 } |
| 220 | 223 |
| 221 void SetUp() override { | 224 void SetUp() override { |
| 222 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 225 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 223 base::MessageLoop::current()->RunUntilIdle(); | 226 base::MessageLoop::current()->RunUntilIdle(); |
| 224 } | 227 } |
| 225 | 228 |
| 226 void TearDown() override { | 229 void TearDown() override { |
| 227 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 230 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 228 // Empty the current queue. | 231 // Empty the current queue. |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 | 373 |
| 371 void SendRequestAndExpectHttpResponse(const std::string& expected) { | 374 void SendRequestAndExpectHttpResponse(const std::string& expected) { |
| 372 scoped_ptr<HttpNetworkTransaction> trans( | 375 scoped_ptr<HttpNetworkTransaction> trans( |
| 373 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 376 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 374 RunTransaction(trans); | 377 RunTransaction(trans); |
| 375 CheckWasHttpResponse(trans); | 378 CheckWasHttpResponse(trans); |
| 376 CheckResponseData(trans, expected); | 379 CheckResponseData(trans, expected); |
| 377 } | 380 } |
| 378 | 381 |
| 379 void SendRequestAndExpectQuicResponse(const std::string& expected) { | 382 void SendRequestAndExpectQuicResponse(const std::string& expected) { |
| 380 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 80); | 383 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, 443); |
| 381 } | 384 } |
| 382 | 385 |
| 383 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected, | 386 void SendRequestAndExpectQuicResponseOnPort(const std::string& expected, |
| 384 uint16 port) { | 387 uint16 port) { |
| 385 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port); | 388 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, false, port); |
| 386 } | 389 } |
| 387 | 390 |
| 388 void SendRequestAndExpectQuicResponseFromProxyOnPort( | 391 void SendRequestAndExpectQuicResponseFromProxyOnPort( |
| 389 const std::string& expected, | 392 const std::string& expected, |
| 390 uint16 port) { | 393 uint16 port) { |
| 391 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); | 394 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); |
| 392 } | 395 } |
| 393 | 396 |
| 394 void AddQuicAlternateProtocolMapping( | 397 void AddQuicAlternateProtocolMapping( |
| 395 MockCryptoClientStream::HandshakeMode handshake_mode) { | 398 MockCryptoClientStream::HandshakeMode handshake_mode) { |
| 396 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 399 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
| 397 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 400 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
| 398 AlternativeService alternative_service(QUIC, host_port_pair.host(), 80); | 401 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); |
| 399 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 402 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 400 http_server_properties_.SetAlternativeService( | 403 http_server_properties_.SetAlternativeService( |
| 401 host_port_pair, alternative_service, 1.0, expiration); | 404 host_port_pair, alternative_service, 1.0, expiration); |
| 402 } | 405 } |
| 403 | 406 |
| 404 void ExpectBrokenAlternateProtocolMapping() { | 407 void ExpectBrokenAlternateProtocolMapping() { |
| 405 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 408 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
| 406 const AlternativeServiceVector alternative_service_vector = | 409 const AlternativeServiceVector alternative_service_vector = |
| 407 http_server_properties_.GetAlternativeServices(origin); | 410 http_server_properties_.GetAlternativeServices(origin); |
| 408 EXPECT_EQ(1u, alternative_service_vector.size()); | 411 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 409 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( | 412 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( |
| 410 alternative_service_vector[0])); | 413 alternative_service_vector[0])); |
| 411 } | 414 } |
| 412 | 415 |
| 413 void ExpectQuicAlternateProtocolMapping() { | 416 void ExpectQuicAlternateProtocolMapping() { |
| 414 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 417 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
| 415 const AlternativeServiceVector alternative_service_vector = | 418 const AlternativeServiceVector alternative_service_vector = |
| 416 http_server_properties_.GetAlternativeServices(origin); | 419 http_server_properties_.GetAlternativeServices(origin); |
| 417 EXPECT_EQ(1u, alternative_service_vector.size()); | 420 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 418 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); | 421 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); |
| 419 } | 422 } |
| 420 | 423 |
| 421 void AddHangingNonAlternateProtocolSocketData() { | 424 void AddHangingNonAlternateProtocolSocketData() { |
| 422 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 425 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 423 hanging_data_.set_connect_data(hanging_connect); | 426 hanging_data_.set_connect_data(hanging_connect); |
| 424 socket_factory_.AddSocketDataProvider(&hanging_data_); | 427 socket_factory_.AddSocketDataProvider(&hanging_data_); |
| 428 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 425 } | 429 } |
| 426 | 430 |
| 427 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. | 431 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. |
| 428 QuicTestPacketMaker maker_; | 432 QuicTestPacketMaker maker_; |
| 429 scoped_refptr<HttpNetworkSession> session_; | 433 scoped_refptr<HttpNetworkSession> session_; |
| 430 MockClientSocketFactory socket_factory_; | 434 MockClientSocketFactory socket_factory_; |
| 435 ProofVerifyDetailsChromium verify_details_; | |
| 431 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 436 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 432 MockHostResolver host_resolver_; | 437 MockHostResolver host_resolver_; |
| 433 MockCertVerifier cert_verifier_; | 438 MockCertVerifier cert_verifier_; |
| 434 TransportSecurityState transport_security_state_; | 439 TransportSecurityState transport_security_state_; |
| 435 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_; | 440 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_; |
| 436 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 441 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| 437 scoped_ptr<ProxyService> proxy_service_; | 442 scoped_ptr<ProxyService> proxy_service_; |
| 438 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; | 443 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
| 439 MockRandom random_generator_; | 444 MockRandom random_generator_; |
| 440 HttpServerPropertiesImpl http_server_properties_; | 445 HttpServerPropertiesImpl http_server_properties_; |
| 441 HttpNetworkSession::Params params_; | 446 HttpNetworkSession::Params params_; |
| 442 HttpRequestInfo request_; | 447 HttpRequestInfo request_; |
| 443 BoundTestNetLog net_log_; | 448 BoundTestNetLog net_log_; |
| 444 StaticSocketDataProvider hanging_data_; | 449 StaticSocketDataProvider hanging_data_; |
| 450 SSLSocketDataProvider ssl_data_; | |
| 445 | 451 |
| 446 private: | 452 private: |
| 447 void SendRequestAndExpectQuicResponseMaybeFromProxy( | 453 void SendRequestAndExpectQuicResponseMaybeFromProxy( |
| 448 const std::string& expected, | 454 const std::string& expected, |
| 449 bool used_proxy, | 455 bool used_proxy, |
| 450 uint16 port) { | 456 uint16 port) { |
| 451 scoped_ptr<HttpNetworkTransaction> trans( | 457 scoped_ptr<HttpNetworkTransaction> trans( |
| 452 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 458 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 453 ProxyHeadersHandler proxy_headers_handler; | 459 ProxyHeadersHandler proxy_headers_handler; |
| 454 trans->SetBeforeProxyHeadersSentCallback( | 460 trans->SetBeforeProxyHeadersSentCallback( |
| 455 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent, | 461 base::Bind(&ProxyHeadersHandler::OnBeforeProxyHeadersSent, |
| 456 base::Unretained(&proxy_headers_handler))); | 462 base::Unretained(&proxy_headers_handler))); |
| 457 RunTransaction(trans); | 463 RunTransaction(trans); |
| 458 CheckWasQuicResponse(trans); | 464 CheckWasQuicResponse(trans); |
| 459 CheckResponsePort(trans, port); | 465 CheckResponsePort(trans, port); |
| 460 CheckResponseData(trans, expected); | 466 CheckResponseData(trans, expected); |
| 461 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called()); | 467 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called()); |
| 462 } | 468 } |
| 463 }; | 469 }; |
| 464 | 470 |
| 465 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, | 471 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, |
| 466 ::testing::ValuesIn(QuicSupportedVersions())); | 472 ::testing::ValuesIn(QuicSupportedVersions())); |
| 467 | 473 |
| 468 TEST_P(QuicNetworkTransactionTest, ForceQuic) { | 474 TEST_P(QuicNetworkTransactionTest, ForceQuic) { |
| 469 // TODO(rch): switch these tests to use secure QUIC. | |
| 470 params_.enable_insecure_quic = true; | |
| 471 params_.origin_to_force_quic_on = | 475 params_.origin_to_force_quic_on = |
| 472 HostPortPair::FromString("www.google.com:80"); | 476 HostPortPair::FromString("mail.example.com:443"); |
| 473 | 477 |
| 474 MockQuicData mock_quic_data; | 478 MockQuicData mock_quic_data; |
| 475 mock_quic_data.AddWrite( | 479 mock_quic_data.AddWrite( |
| 476 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 480 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 477 GetRequestHeaders("GET", "http", "/"))); | 481 GetRequestHeaders("GET", "https", "/"))); |
| 478 mock_quic_data.AddRead( | 482 mock_quic_data.AddRead( |
| 479 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 483 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 480 GetResponseHeaders("200 OK"))); | 484 GetResponseHeaders("200 OK"))); |
| 481 mock_quic_data.AddRead( | 485 mock_quic_data.AddRead( |
| 482 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 486 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 483 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 487 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 484 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 488 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 485 | 489 |
| 486 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 490 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 487 | 491 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 530 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, | 534 entries, 0, NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, |
| 531 NetLog::PHASE_NONE); | 535 NetLog::PHASE_NONE); |
| 532 EXPECT_LT(0, pos); | 536 EXPECT_LT(0, pos); |
| 533 | 537 |
| 534 int log_stream_id; | 538 int log_stream_id; |
| 535 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); | 539 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); |
| 536 EXPECT_EQ(3, log_stream_id); | 540 EXPECT_EQ(3, log_stream_id); |
| 537 } | 541 } |
| 538 | 542 |
| 539 TEST_P(QuicNetworkTransactionTest, QuicProxy) { | 543 TEST_P(QuicNetworkTransactionTest, QuicProxy) { |
| 540 params_.enable_insecure_quic = true; | |
| 541 params_.enable_quic_for_proxies = true; | 544 params_.enable_quic_for_proxies = true; |
| 542 proxy_service_ = ProxyService::CreateFixedFromPacResult("QUIC myproxy:70"); | 545 proxy_service_ = |
| 546 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70"); | |
| 543 | 547 |
| 544 MockQuicData mock_quic_data; | 548 MockQuicData mock_quic_data; |
| 545 mock_quic_data.AddWrite( | 549 mock_quic_data.AddWrite( |
| 546 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 550 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 547 GetRequestHeaders("GET", "http", "/"))); | 551 GetRequestHeaders("GET", "http", "/"))); |
| 548 mock_quic_data.AddRead( | 552 mock_quic_data.AddRead( |
| 549 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 553 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 550 GetResponseHeaders("200 OK"))); | 554 GetResponseHeaders("200 OK"))); |
| 551 mock_quic_data.AddRead( | 555 mock_quic_data.AddRead( |
| 552 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 556 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 553 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 557 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 554 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 558 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 555 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 559 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 556 | 560 |
| 557 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 561 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 558 | 562 |
| 559 EXPECT_FALSE( | 563 EXPECT_FALSE( |
| 560 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); | 564 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); |
| 561 // There is no need to set up an alternate protocol job, because | 565 // There is no need to set up an alternate protocol job, because |
| 562 // no attempt will be made to speak to the proxy over TCP. | 566 // no attempt will be made to speak to the proxy over TCP. |
| 563 | 567 |
| 568 request_.url = GURL("http://mail.example.com/"); | |
| 564 CreateSession(); | 569 CreateSession(); |
| 565 | 570 |
| 566 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); | 571 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); |
| 567 EXPECT_TRUE( | 572 EXPECT_TRUE( |
| 568 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); | 573 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); |
| 569 } | 574 } |
| 570 | 575 |
| 571 // Regression test for https://crbug.com/492458. Test that for an HTTP | 576 // Regression test for https://crbug.com/492458. Test that for an HTTP |
| 572 // connection through a QUIC proxy, the certificate exhibited by the proxy is | 577 // connection through a QUIC proxy, the certificate exhibited by the proxy is |
| 573 // checked against the proxy hostname, not the origin hostname. | 578 // checked against the proxy hostname, not the origin hostname. |
| 574 TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) { | 579 TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) { |
| 575 const std::string origin_host = "news.example.com"; | 580 const std::string origin_host = "news.example.com"; |
| 576 const std::string proxy_host = "www.example.org"; | 581 const std::string proxy_host = "www.example.org"; |
| 577 | 582 |
| 578 params_.enable_insecure_quic = true; | |
| 579 params_.enable_quic_for_proxies = true; | 583 params_.enable_quic_for_proxies = true; |
| 580 proxy_service_ = | 584 proxy_service_ = |
| 581 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70"); | 585 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70"); |
| 582 | 586 |
| 583 maker_.set_hostname(origin_host); | 587 maker_.set_hostname(origin_host); |
| 584 MockQuicData mock_quic_data; | 588 MockQuicData mock_quic_data; |
| 585 mock_quic_data.AddWrite( | 589 mock_quic_data.AddWrite( |
| 586 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 590 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 587 GetRequestHeaders("GET", "http", "/"))); | 591 GetRequestHeaders("GET", "http", "/"))); |
| 588 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 592 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 589 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 593 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 590 mock_quic_data.AddRead( | 594 mock_quic_data.AddRead( |
| 591 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 595 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 592 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 596 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 593 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 597 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 594 mock_quic_data.AddRead(SYNCHRONOUS, 0); | 598 mock_quic_data.AddRead(SYNCHRONOUS, 0); |
| 595 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 599 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 596 | 600 |
| 597 scoped_refptr<X509Certificate> cert( | 601 scoped_refptr<X509Certificate> cert( |
| 598 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 602 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); |
| 599 ASSERT_TRUE(cert.get()); | 603 ASSERT_TRUE(cert.get()); |
| 600 // This certificate is valid for the proxy, but not for the origin. | 604 // This certificate is valid for the proxy, but not for the origin. |
| 601 bool common_name_fallback_used; | 605 bool common_name_fallback_used; |
| 602 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used)); | 606 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used)); |
| 603 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used)); | 607 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used)); |
| 604 ProofVerifyDetailsChromium verify_details; | 608 ProofVerifyDetailsChromium verify_details; |
| 605 verify_details.cert_verify_result.verified_cert = cert; | 609 verify_details.cert_verify_result.verified_cert = cert; |
| 606 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 610 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 611 ProofVerifyDetailsChromium verify_details2; | |
| 612 verify_details2.cert_verify_result.verified_cert = cert; | |
| 613 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2); | |
| 607 | 614 |
| 608 request_.url = GURL("http://" + origin_host); | 615 request_.url = GURL("http://" + origin_host); |
| 609 AddHangingNonAlternateProtocolSocketData(); | 616 AddHangingNonAlternateProtocolSocketData(); |
| 610 CreateSessionWithNextProtos(); | 617 CreateSessionWithNextProtos(); |
| 611 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 618 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 612 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); | 619 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); |
| 613 } | 620 } |
| 614 | 621 |
| 615 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { | 622 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { |
| 616 params_.enable_insecure_quic = true; | |
| 617 params_.origin_to_force_quic_on = | 623 params_.origin_to_force_quic_on = |
| 618 HostPortPair::FromString("www.google.com:80"); | 624 HostPortPair::FromString("mail.example.com:443"); |
| 619 | 625 |
| 620 MockQuicData mock_quic_data1; | 626 MockQuicData mock_quic_data1; |
| 621 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 627 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 622 | 628 |
| 623 MockQuicData mock_quic_data2; | 629 MockQuicData mock_quic_data2; |
| 624 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 630 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 625 | 631 |
| 626 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); | 632 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); |
| 627 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); | 633 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); |
| 628 | 634 |
| 629 CreateSession(); | 635 CreateSession(); |
| 630 | 636 |
| 631 EXPECT_EQ(0U, test_network_quality_estimator_->GetWatchersCreated()); | 637 EXPECT_EQ(0U, test_network_quality_estimator_->GetWatchersCreated()); |
| 632 for (size_t i = 0; i < 2; ++i) { | 638 for (size_t i = 0; i < 2; ++i) { |
| 633 scoped_ptr<HttpNetworkTransaction> trans( | 639 scoped_ptr<HttpNetworkTransaction> trans( |
| 634 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 640 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 635 TestCompletionCallback callback; | 641 TestCompletionCallback callback; |
| 636 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 642 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 637 EXPECT_EQ(ERR_IO_PENDING, rv); | 643 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 638 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 644 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); |
| 639 EXPECT_EQ(1 + i, test_network_quality_estimator_->GetWatchersCreated()); | 645 EXPECT_EQ(1 + i, test_network_quality_estimator_->GetWatchersCreated()); |
| 640 } | 646 } |
| 641 } | 647 } |
| 642 | 648 |
| 643 TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) { | 649 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) { |
| 644 // Attempt to "force" quic on 443, which will not be honored. | |
| 645 params_.origin_to_force_quic_on = | |
| 646 HostPortPair::FromString("www.google.com:443"); | |
| 647 | |
| 648 MockRead http_reads[] = { | 650 MockRead http_reads[] = { |
| 649 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 651 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
| 650 MockRead("hello world"), | 652 MockRead("hello world"), |
| 651 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 653 // MockRead(kQuicAlternateProtocolHeader), MockRead("hello world"), |
|
ramant (doing other things)
2015/10/07 16:57:06
nit: consider deleting line#653
Ryan Hamilton
2015/10/07 22:14:14
Done.
| |
| 652 MockRead(ASYNC, OK) | |
| 653 }; | |
| 654 | |
| 655 StaticSocketDataProvider data(http_reads, arraysize(http_reads), nullptr, 0); | |
| 656 socket_factory_.AddSocketDataProvider(&data); | |
| 657 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 658 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 659 | |
| 660 CreateSession(); | |
| 661 | |
| 662 SendRequestAndExpectHttpResponse("hello world"); | |
| 663 EXPECT_EQ(0U, test_network_quality_estimator_->GetWatchersCreated()); | |
| 664 } | |
| 665 | |
| 666 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuic) { | |
| 667 params_.enable_insecure_quic = true; | |
| 668 | |
| 669 MockRead http_reads[] = { | |
| 670 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 671 MockRead(kQuicAlternativeServiceHttpHeader), MockRead("hello world"), | |
| 672 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 654 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 673 MockRead(ASYNC, OK)}; | 655 MockRead(ASYNC, OK)}; |
| 674 | 656 |
| 675 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 657 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 676 0); | 658 0); |
| 677 socket_factory_.AddSocketDataProvider(&http_data); | 659 socket_factory_.AddSocketDataProvider(&http_data); |
| 660 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 678 | 661 |
| 679 MockQuicData mock_quic_data; | 662 MockQuicData mock_quic_data; |
| 680 mock_quic_data.AddWrite( | 663 mock_quic_data.AddWrite( |
| 681 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 664 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 682 GetRequestHeaders("GET", "http", "/"))); | 665 GetRequestHeaders("GET", "https", "/"))); |
| 683 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 666 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 684 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 667 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 685 mock_quic_data.AddRead( | 668 mock_quic_data.AddRead( |
| 686 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 669 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 687 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 670 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 688 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 671 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 689 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 672 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 690 | 673 |
| 691 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 674 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 692 | 675 |
| 693 AddHangingNonAlternateProtocolSocketData(); | 676 AddHangingNonAlternateProtocolSocketData(); |
| 694 CreateSessionWithNextProtos(); | 677 CreateSessionWithNextProtos(); |
| 695 | 678 |
| 696 SendRequestAndExpectHttpResponse("hello world"); | 679 SendRequestAndExpectHttpResponse("hello world"); |
| 697 SendRequestAndExpectQuicResponse("hello!"); | 680 SendRequestAndExpectQuicResponse("hello!"); |
| 698 } | 681 } |
| 699 | 682 |
| 700 // When multiple alternative services are advertised, | 683 // When multiple alternative services are advertised, |
| 701 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to | 684 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to |
| 702 // Job. This is what the following test verifies. | 685 // Job. This is what the following test verifies. |
| 703 // TODO(bnc): Update this test when multiple alternative services are handled | 686 // TODO(bnc): Update this test when multiple alternative services are handled |
| 704 // properly. | 687 // properly. |
| 705 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) { | 688 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) { |
| 706 params_.enable_insecure_quic = true; | |
| 707 | |
| 708 MockRead http_reads[] = { | 689 MockRead http_reads[] = { |
| 709 MockRead("HTTP/1.1 200 OK\r\n"), | 690 MockRead("HTTP/1.1 200 OK\r\n"), |
| 710 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), | 691 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), |
| 711 MockRead("hello world"), | 692 MockRead("hello world"), |
| 712 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 693 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 713 MockRead(ASYNC, OK)}; | 694 MockRead(ASYNC, OK)}; |
| 714 | 695 |
| 715 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 696 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 716 0); | 697 0); |
| 717 socket_factory_.AddSocketDataProvider(&http_data); | 698 socket_factory_.AddSocketDataProvider(&http_data); |
| 699 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 718 | 700 |
| 719 MockQuicData mock_quic_data; | 701 MockQuicData mock_quic_data; |
| 720 mock_quic_data.AddWrite( | 702 mock_quic_data.AddWrite( |
| 721 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 703 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 722 GetRequestHeaders("GET", "http", "/"))); | 704 GetRequestHeaders("GET", "https", "/"))); |
| 723 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 705 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 724 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 706 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 725 mock_quic_data.AddRead( | 707 mock_quic_data.AddRead( |
| 726 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 708 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 727 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 709 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 728 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 710 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 729 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 711 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 730 | 712 |
| 731 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 713 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 732 | 714 |
| 733 AddHangingNonAlternateProtocolSocketData(); | 715 AddHangingNonAlternateProtocolSocketData(); |
| 734 CreateSessionWithNextProtos(); | 716 CreateSessionWithNextProtos(); |
| 735 | 717 |
| 736 SendRequestAndExpectHttpResponse("hello world"); | 718 SendRequestAndExpectHttpResponse("hello world"); |
| 737 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 719 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 738 } | 720 } |
| 739 | 721 |
| 740 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { | 722 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { |
| 741 params_.enable_insecure_quic = true; | |
| 742 | |
| 743 MockRead http_reads[] = { | 723 MockRead http_reads[] = { |
| 744 MockRead("HTTP/1.1 200 OK\r\n"), | 724 MockRead("HTTP/1.1 200 OK\r\n"), |
| 745 MockRead(kQuicAlternativeServiceDifferentPortHttpHeader), | 725 MockRead(kQuicAlternativeServiceDifferentPortHeader), |
| 746 MockRead("hello world"), | 726 MockRead("hello world"), |
| 747 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 727 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 748 MockRead(ASYNC, OK)}; | 728 MockRead(ASYNC, OK)}; |
| 749 | 729 |
| 750 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 730 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 751 0); | 731 0); |
| 752 socket_factory_.AddSocketDataProvider(&http_data); | 732 socket_factory_.AddSocketDataProvider(&http_data); |
| 733 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 753 | 734 |
| 754 MockQuicData mock_quic_data; | 735 MockQuicData mock_quic_data; |
| 755 mock_quic_data.AddWrite( | 736 mock_quic_data.AddWrite( |
| 756 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 737 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 757 GetRequestHeaders("GET", "http", "/"))); | 738 GetRequestHeaders("GET", "https", "/"))); |
| 758 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 739 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 759 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 740 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 760 mock_quic_data.AddRead( | 741 mock_quic_data.AddRead( |
| 761 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 742 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 762 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 743 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 763 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 744 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 764 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 745 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 765 | 746 |
| 766 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 747 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 767 | 748 |
| 768 AddHangingNonAlternateProtocolSocketData(); | 749 AddHangingNonAlternateProtocolSocketData(); |
| 769 CreateSessionWithNextProtos(); | 750 CreateSessionWithNextProtos(); |
| 770 | 751 |
| 771 SendRequestAndExpectHttpResponse("hello world"); | 752 SendRequestAndExpectHttpResponse("hello world"); |
| 772 SendRequestAndExpectQuicResponseOnPort("hello!", 137); | 753 SendRequestAndExpectQuicResponseOnPort("hello!", 137); |
| 773 } | 754 } |
| 774 | 755 |
| 775 TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) { | 756 TEST_P(QuicNetworkTransactionTest, ConfirmAlternativeService) { |
| 776 params_.enable_insecure_quic = true; | |
| 777 | |
| 778 MockRead http_reads[] = { | 757 MockRead http_reads[] = { |
| 779 MockRead("HTTP/1.1 200 OK\r\n"), | 758 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
| 780 MockRead(kQuicAlternativeServiceHttpHeader), MockRead("hello world"), | 759 MockRead("hello world"), |
| 781 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 760 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 782 MockRead(ASYNC, OK)}; | 761 MockRead(ASYNC, OK)}; |
| 783 | 762 |
| 784 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 763 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 785 0); | 764 0); |
| 786 socket_factory_.AddSocketDataProvider(&http_data); | 765 socket_factory_.AddSocketDataProvider(&http_data); |
| 766 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 787 | 767 |
| 788 MockQuicData mock_quic_data; | 768 MockQuicData mock_quic_data; |
| 789 mock_quic_data.AddWrite( | 769 mock_quic_data.AddWrite( |
| 790 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 770 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 791 GetRequestHeaders("GET", "http", "/"))); | 771 GetRequestHeaders("GET", "https", "/"))); |
| 792 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 772 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 793 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 773 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 794 mock_quic_data.AddRead( | 774 mock_quic_data.AddRead( |
| 795 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 775 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 796 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 776 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 797 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 777 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 798 mock_quic_data.AddRead(ASYNC, 0); // EOF | 778 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 799 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 779 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 800 | 780 |
| 801 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 781 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 813 SendRequestAndExpectHttpResponse("hello world"); | 793 SendRequestAndExpectHttpResponse("hello world"); |
| 814 SendRequestAndExpectQuicResponse("hello!"); | 794 SendRequestAndExpectQuicResponse("hello!"); |
| 815 | 795 |
| 816 mock_quic_data.CompleteRead(); | 796 mock_quic_data.CompleteRead(); |
| 817 | 797 |
| 818 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 798 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
| 819 alternative_service)); | 799 alternative_service)); |
| 820 } | 800 } |
| 821 | 801 |
| 822 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) { | 802 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) { |
| 823 params_.enable_insecure_quic = true; | |
| 824 | |
| 825 MockRead http_reads[] = { | 803 MockRead http_reads[] = { |
| 826 MockRead("HTTP/1.1 200 OK\r\n"), | 804 MockRead("HTTP/1.1 200 OK\r\n"), |
| 827 MockRead(kQuicAlternativeService50pctHttpHeader), MockRead("hello world"), | 805 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), |
| 828 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 806 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 829 MockRead(ASYNC, OK)}; | 807 MockRead(ASYNC, OK)}; |
| 830 | 808 |
| 831 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 809 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 832 0); | 810 0); |
| 833 socket_factory_.AddSocketDataProvider(&http_data); | 811 socket_factory_.AddSocketDataProvider(&http_data); |
| 812 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 834 | 813 |
| 835 MockQuicData mock_quic_data; | 814 MockQuicData mock_quic_data; |
| 836 mock_quic_data.AddWrite( | 815 mock_quic_data.AddWrite( |
| 837 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 816 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 838 GetRequestHeaders("GET", "http", "/"))); | 817 GetRequestHeaders("GET", "https", "/"))); |
| 839 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 818 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 840 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 819 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 841 mock_quic_data.AddRead( | 820 mock_quic_data.AddRead( |
| 842 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 821 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 843 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 822 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 844 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 823 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 845 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 824 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 846 | 825 |
| 847 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 826 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 848 | 827 |
| 849 AddHangingNonAlternateProtocolSocketData(); | 828 AddHangingNonAlternateProtocolSocketData(); |
| 850 params_.alternative_service_probability_threshold = 0.25; | 829 params_.alternative_service_probability_threshold = 0.25; |
| 851 CreateSessionWithNextProtos(); | 830 CreateSessionWithNextProtos(); |
| 852 | 831 |
| 853 SendRequestAndExpectHttpResponse("hello world"); | 832 SendRequestAndExpectHttpResponse("hello world"); |
| 854 SendRequestAndExpectQuicResponse("hello!"); | 833 SendRequestAndExpectQuicResponse("hello!"); |
| 855 } | 834 } |
| 856 | 835 |
| 857 TEST_P(QuicNetworkTransactionTest, | 836 TEST_P(QuicNetworkTransactionTest, |
| 858 DontUseAlternativeServiceProbabilityForQuic) { | 837 DontUseAlternativeServiceProbabilityForQuic) { |
| 859 params_.enable_insecure_quic = true; | |
| 860 | |
| 861 MockRead http_reads[] = { | 838 MockRead http_reads[] = { |
| 862 MockRead("HTTP/1.1 200 OK\r\n"), | 839 MockRead("HTTP/1.1 200 OK\r\n"), |
| 863 MockRead(kQuicAlternativeService50pctHttpHeader), MockRead("hello world"), | 840 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), |
| 864 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 841 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 865 MockRead(ASYNC, OK)}; | 842 MockRead(ASYNC, OK)}; |
| 866 | 843 |
| 867 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 844 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 868 0); | 845 0); |
| 869 socket_factory_.AddSocketDataProvider(&http_data); | 846 socket_factory_.AddSocketDataProvider(&http_data); |
| 847 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 870 socket_factory_.AddSocketDataProvider(&http_data); | 848 socket_factory_.AddSocketDataProvider(&http_data); |
| 849 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 871 | 850 |
| 872 params_.alternative_service_probability_threshold = 0.75; | 851 params_.alternative_service_probability_threshold = 0.75; |
| 873 CreateSessionWithNextProtos(); | 852 CreateSessionWithNextProtos(); |
| 874 | 853 |
| 875 SendRequestAndExpectHttpResponse("hello world"); | 854 SendRequestAndExpectHttpResponse("hello world"); |
| 876 SendRequestAndExpectHttpResponse("hello world"); | 855 SendRequestAndExpectHttpResponse("hello world"); |
| 877 } | 856 } |
| 878 | 857 |
| 879 TEST_P(QuicNetworkTransactionTest, DontUseAlternativeServiceForInsecureQuic) { | |
| 880 params_.enable_insecure_quic = true; | |
| 881 | |
| 882 MockRead http_reads[] = {MockRead("HTTP/1.1 200 OK\r\n"), | |
| 883 MockRead("Content-length: 11\r\n"), | |
| 884 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), | |
| 885 MockRead("hello world"), | |
| 886 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 887 MockRead("Content-length: 11\r\n"), | |
| 888 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), | |
| 889 MockRead("hello world"), | |
| 890 MockRead(ASYNC, OK)}; | |
| 891 | |
| 892 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
| 893 0); | |
| 894 socket_factory_.AddSocketDataProvider(&http_data); | |
| 895 socket_factory_.AddSocketDataProvider(&http_data); | |
| 896 | |
| 897 params_.enable_insecure_quic = false; | |
| 898 CreateSessionWithNextProtos(); | |
| 899 | |
| 900 SendRequestAndExpectHttpResponse("hello world"); | |
| 901 SendRequestAndExpectHttpResponse("hello world"); | |
| 902 } | |
| 903 | |
| 904 TEST_P(QuicNetworkTransactionTest, | 858 TEST_P(QuicNetworkTransactionTest, |
| 905 DontUseAlternativeServiceWithBadProbabilityForQuic) { | 859 DontUseAlternativeServiceWithBadProbabilityForQuic) { |
| 906 params_.enable_insecure_quic = true; | |
| 907 | |
| 908 MockRead http_reads[] = { | 860 MockRead http_reads[] = { |
| 909 MockRead("HTTP/1.1 200 OK\r\n"), | 861 MockRead("HTTP/1.1 200 OK\r\n"), |
| 910 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"), | 862 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"), |
| 911 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 863 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 912 MockRead(ASYNC, OK)}; | 864 MockRead(ASYNC, OK)}; |
| 913 | 865 |
| 914 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 866 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 915 0); | 867 0); |
| 916 socket_factory_.AddSocketDataProvider(&http_data); | 868 socket_factory_.AddSocketDataProvider(&http_data); |
| 869 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 917 socket_factory_.AddSocketDataProvider(&http_data); | 870 socket_factory_.AddSocketDataProvider(&http_data); |
| 871 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 918 | 872 |
| 919 params_.alternative_service_probability_threshold = 0.75; | 873 params_.alternative_service_probability_threshold = 0.75; |
| 920 CreateSessionWithNextProtos(); | 874 CreateSessionWithNextProtos(); |
| 921 | 875 |
| 922 SendRequestAndExpectHttpResponse("hello world"); | 876 SendRequestAndExpectHttpResponse("hello world"); |
| 923 SendRequestAndExpectHttpResponse("hello world"); | 877 SendRequestAndExpectHttpResponse("hello world"); |
| 924 } | 878 } |
| 925 | 879 |
| 926 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { | 880 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { |
| 927 params_.enable_insecure_quic = true; | |
| 928 params_.origin_to_force_quic_on = | |
| 929 HostPortPair::FromString("www.google.com:443"); | |
| 930 | |
| 931 MockRead http_reads[] = { | 881 MockRead http_reads[] = { |
| 932 MockRead("HTTP/1.1 200 OK\r\n"), | 882 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
| 933 MockRead(kQuicAlternativeServiceHttpsHeader), MockRead("hello world"), | 883 MockRead("hello world"), |
| 934 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 884 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 935 MockRead(ASYNC, OK)}; | 885 MockRead(ASYNC, OK)}; |
| 936 | 886 |
| 937 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 887 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 938 0); | 888 0); |
| 939 socket_factory_.AddSocketDataProvider(&http_data); | 889 socket_factory_.AddSocketDataProvider(&http_data); |
| 890 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 940 | 891 |
| 941 MockQuicData mock_quic_data; | 892 MockQuicData mock_quic_data; |
| 942 mock_quic_data.AddWrite( | 893 mock_quic_data.AddWrite( |
| 943 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 894 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 944 GetRequestHeaders("GET", "http", "/"))); | 895 GetRequestHeaders("GET", "https", "/"))); |
| 945 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 896 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 946 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 897 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 947 mock_quic_data.AddRead( | 898 mock_quic_data.AddRead( |
| 948 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 899 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 949 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 900 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 950 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 901 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 951 | 902 |
| 952 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 903 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 953 | 904 |
| 954 AddHangingNonAlternateProtocolSocketData(); | 905 AddHangingNonAlternateProtocolSocketData(); |
| 955 CreateSessionWithNextProtos(); | 906 CreateSessionWithNextProtos(); |
| 956 | 907 |
| 957 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 908 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 958 SendRequestAndExpectHttpResponse("hello world"); | 909 SendRequestAndExpectHttpResponse("hello world"); |
| 959 } | 910 } |
| 960 | 911 |
| 961 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | 912 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
| 962 params_.enable_insecure_quic = true; | |
| 963 | |
| 964 MockRead http_reads[] = { | 913 MockRead http_reads[] = { |
| 965 MockRead("HTTP/1.1 200 OK\r\n"), | 914 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 966 MockRead(kQuicAlternateProtocolHttpHeader), | 915 MockRead("hello world"), |
| 967 MockRead("hello world"), | 916 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 968 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 917 MockRead(ASYNC, OK)}; |
| 969 MockRead(ASYNC, OK) | |
| 970 }; | |
| 971 | 918 |
| 972 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 919 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 973 nullptr, 0); | 920 nullptr, 0); |
| 974 socket_factory_.AddSocketDataProvider(&http_data); | 921 socket_factory_.AddSocketDataProvider(&http_data); |
| 922 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 975 | 923 |
| 976 MockQuicData mock_quic_data; | 924 MockQuicData mock_quic_data; |
| 977 mock_quic_data.AddWrite( | 925 mock_quic_data.AddWrite( |
| 978 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 926 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 979 GetRequestHeaders("GET", "http", "/"))); | 927 GetRequestHeaders("GET", "https", "/"))); |
| 980 mock_quic_data.AddRead( | 928 mock_quic_data.AddRead( |
| 981 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 929 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 982 GetResponseHeaders("200 OK"))); | 930 GetResponseHeaders("200 OK"))); |
| 983 mock_quic_data.AddRead( | 931 mock_quic_data.AddRead( |
| 984 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 932 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 985 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 933 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 986 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 934 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 987 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 935 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 988 | 936 |
| 989 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 937 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 990 | 938 |
| 991 // The non-alternate protocol job needs to hang in order to guarantee that | 939 // The non-alternate protocol job needs to hang in order to guarantee that |
| 992 // the alternate-protocol job will "win". | 940 // the alternate-protocol job will "win". |
| 993 AddHangingNonAlternateProtocolSocketData(); | 941 AddHangingNonAlternateProtocolSocketData(); |
| 994 | 942 |
| 995 CreateSessionWithNextProtos(); | 943 CreateSessionWithNextProtos(); |
| 996 | 944 |
| 997 SendRequestAndExpectHttpResponse("hello world"); | 945 SendRequestAndExpectHttpResponse("hello world"); |
| 998 SendRequestAndExpectQuicResponse("hello!"); | 946 SendRequestAndExpectQuicResponse("hello!"); |
| 999 } | 947 } |
| 1000 | 948 |
| 1001 TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) { | 949 TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) { |
| 1002 params_.enable_insecure_quic = true; | |
| 1003 | |
| 1004 MockRead http_reads[] = { | 950 MockRead http_reads[] = { |
| 1005 MockRead("HTTP/1.1 200 OK\r\n"), | 951 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1006 MockRead(kQuicAlternateProtocolDifferentPortHttpHeader), | 952 MockRead(kQuicAlternateProtocolDifferentPortHeader), |
| 1007 MockRead("hello world"), | 953 MockRead("hello world"), |
| 1008 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 954 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1009 MockRead(ASYNC, OK)}; | 955 MockRead(ASYNC, OK)}; |
| 1010 | 956 |
| 1011 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 957 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1012 0); | 958 0); |
| 1013 socket_factory_.AddSocketDataProvider(&http_data); | 959 socket_factory_.AddSocketDataProvider(&http_data); |
| 960 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1014 | 961 |
| 1015 MockQuicData mock_quic_data; | 962 MockQuicData mock_quic_data; |
| 1016 mock_quic_data.AddWrite( | 963 mock_quic_data.AddWrite( |
| 1017 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 964 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1018 GetRequestHeaders("GET", "http", "/"))); | 965 GetRequestHeaders("GET", "https", "/"))); |
| 1019 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 966 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1020 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 967 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1021 mock_quic_data.AddRead( | 968 mock_quic_data.AddRead( |
| 1022 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 969 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1023 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 970 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1024 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 971 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1025 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 972 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1026 | 973 |
| 1027 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 974 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1028 | 975 |
| 1029 // The non-alternate protocol job needs to hang in order to guarantee that | 976 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1030 // the alternate-protocol job will "win". | 977 // the alternate-protocol job will "win". |
| 1031 AddHangingNonAlternateProtocolSocketData(); | 978 AddHangingNonAlternateProtocolSocketData(); |
| 1032 | 979 |
| 1033 CreateSessionWithNextProtos(); | 980 CreateSessionWithNextProtos(); |
| 1034 | 981 |
| 1035 SendRequestAndExpectHttpResponse("hello world"); | 982 SendRequestAndExpectHttpResponse("hello world"); |
| 1036 SendRequestAndExpectQuicResponseOnPort("hello!", 137); | 983 SendRequestAndExpectQuicResponseOnPort("hello!", 137); |
| 1037 } | 984 } |
| 1038 | 985 |
| 1039 TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) { | 986 TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) { |
| 1040 params_.enable_insecure_quic = true; | |
| 1041 | |
| 1042 MockRead http_reads[] = { | 987 MockRead http_reads[] = { |
| 1043 MockRead("HTTP/1.1 200 OK\r\n"), | 988 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 1044 MockRead(kQuicAlternateProtocolHttpHeader), | |
| 1045 MockRead("hello world"), | 989 MockRead("hello world"), |
| 1046 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 990 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1047 MockRead(ASYNC, OK)}; | 991 MockRead(ASYNC, OK)}; |
| 1048 | 992 |
| 1049 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 993 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1050 0); | 994 0); |
| 1051 socket_factory_.AddSocketDataProvider(&http_data); | 995 socket_factory_.AddSocketDataProvider(&http_data); |
| 996 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1052 | 997 |
| 1053 MockQuicData mock_quic_data; | 998 MockQuicData mock_quic_data; |
| 1054 mock_quic_data.AddWrite( | 999 mock_quic_data.AddWrite( |
| 1055 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1000 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1056 GetRequestHeaders("GET", "http", "/"))); | 1001 GetRequestHeaders("GET", "https", "/"))); |
| 1057 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1002 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1058 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1003 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1059 mock_quic_data.AddRead( | 1004 mock_quic_data.AddRead( |
| 1060 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1005 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1061 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1006 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1062 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1007 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1063 mock_quic_data.AddRead(ASYNC, 0); // EOF | 1008 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1064 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 1009 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1065 | 1010 |
| 1066 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1011 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1081 SendRequestAndExpectHttpResponse("hello world"); | 1026 SendRequestAndExpectHttpResponse("hello world"); |
| 1082 SendRequestAndExpectQuicResponse("hello!"); | 1027 SendRequestAndExpectQuicResponse("hello!"); |
| 1083 | 1028 |
| 1084 mock_quic_data.CompleteRead(); | 1029 mock_quic_data.CompleteRead(); |
| 1085 | 1030 |
| 1086 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1031 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
| 1087 alternative_service)); | 1032 alternative_service)); |
| 1088 } | 1033 } |
| 1089 | 1034 |
| 1090 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { | 1035 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { |
| 1091 params_.enable_insecure_quic = true; | |
| 1092 | |
| 1093 MockRead http_reads[] = { | 1036 MockRead http_reads[] = { |
| 1094 MockRead("HTTP/1.1 200 OK\r\n"), | 1037 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1095 MockRead(kQuicAlternateProtocol50pctHttpHeader), | 1038 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), |
| 1096 MockRead("hello world"), | 1039 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1097 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1040 MockRead(ASYNC, OK)}; |
| 1098 MockRead(ASYNC, OK) | |
| 1099 }; | |
| 1100 | 1041 |
| 1101 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1042 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1102 nullptr, 0); | 1043 nullptr, 0); |
| 1103 socket_factory_.AddSocketDataProvider(&http_data); | 1044 socket_factory_.AddSocketDataProvider(&http_data); |
| 1104 | 1045 |
| 1105 MockQuicData mock_quic_data; | 1046 MockQuicData mock_quic_data; |
| 1106 mock_quic_data.AddWrite( | 1047 mock_quic_data.AddWrite( |
| 1107 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1048 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1108 GetRequestHeaders("GET", "http", "/"))); | 1049 GetRequestHeaders("GET", "https", "/"))); |
| 1109 mock_quic_data.AddRead( | 1050 mock_quic_data.AddRead( |
| 1110 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 1051 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1111 GetResponseHeaders("200 OK"))); | 1052 GetResponseHeaders("200 OK"))); |
| 1112 mock_quic_data.AddRead( | 1053 mock_quic_data.AddRead( |
| 1113 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1054 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1114 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1055 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1115 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1056 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1116 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 1057 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1117 | 1058 |
| 1118 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1059 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1119 | 1060 |
| 1120 // The non-alternate protocol job needs to hang in order to guarantee that | 1061 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1121 // the alternate-protocol job will "win". | 1062 // the alternate-protocol job will "win". |
| 1122 AddHangingNonAlternateProtocolSocketData(); | 1063 AddHangingNonAlternateProtocolSocketData(); |
| 1123 | 1064 |
| 1124 params_.alternative_service_probability_threshold = .25; | 1065 params_.alternative_service_probability_threshold = .25; |
| 1125 CreateSessionWithNextProtos(); | 1066 CreateSessionWithNextProtos(); |
| 1126 | 1067 |
| 1127 SendRequestAndExpectHttpResponse("hello world"); | 1068 SendRequestAndExpectHttpResponse("hello world"); |
| 1128 SendRequestAndExpectQuicResponse("hello!"); | 1069 SendRequestAndExpectQuicResponse("hello!"); |
| 1129 } | 1070 } |
| 1130 | 1071 |
| 1131 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { | 1072 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { |
| 1132 params_.enable_insecure_quic = true; | |
| 1133 | |
| 1134 MockRead http_reads[] = { | 1073 MockRead http_reads[] = { |
| 1135 MockRead("HTTP/1.1 200 OK\r\n"), | 1074 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1136 MockRead(kQuicAlternateProtocol50pctHttpHeader), | 1075 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), |
| 1137 MockRead("hello world"), | 1076 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1138 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1077 MockRead(ASYNC, OK)}; |
| 1139 MockRead(ASYNC, OK) | |
| 1140 }; | |
| 1141 | 1078 |
| 1142 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1079 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1143 nullptr, 0); | 1080 nullptr, 0); |
| 1144 socket_factory_.AddSocketDataProvider(&http_data); | 1081 socket_factory_.AddSocketDataProvider(&http_data); |
| 1082 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1145 socket_factory_.AddSocketDataProvider(&http_data); | 1083 socket_factory_.AddSocketDataProvider(&http_data); |
| 1084 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1146 | 1085 |
| 1147 params_.alternative_service_probability_threshold = .75; | 1086 params_.alternative_service_probability_threshold = .75; |
| 1148 CreateSessionWithNextProtos(); | 1087 CreateSessionWithNextProtos(); |
| 1149 | 1088 |
| 1150 SendRequestAndExpectHttpResponse("hello world"); | 1089 SendRequestAndExpectHttpResponse("hello world"); |
| 1151 SendRequestAndExpectHttpResponse("hello world"); | 1090 SendRequestAndExpectHttpResponse("hello world"); |
| 1152 } | 1091 } |
| 1153 | 1092 |
| 1154 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolForInsecureQuic) { | |
| 1155 params_.enable_insecure_quic = true; | |
| 1156 | |
| 1157 MockRead http_reads[] = {MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1158 MockRead("Content-length: 11\r\n"), | |
| 1159 MockRead("Alternate-Protocol: 443:quic\r\n\r\n"), | |
| 1160 MockRead("hello world"), | |
| 1161 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1162 MockRead("Content-length: 11\r\n"), | |
| 1163 MockRead("Alternate-Protocol: 443:quic\r\n\r\n"), | |
| 1164 MockRead("hello world"), | |
| 1165 MockRead(ASYNC, OK)}; | |
| 1166 | |
| 1167 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
| 1168 0); | |
| 1169 socket_factory_.AddSocketDataProvider(&http_data); | |
| 1170 socket_factory_.AddSocketDataProvider(&http_data); | |
| 1171 | |
| 1172 params_.enable_insecure_quic = false; | |
| 1173 CreateSessionWithNextProtos(); | |
| 1174 | |
| 1175 SendRequestAndExpectHttpResponse("hello world"); | |
| 1176 SendRequestAndExpectHttpResponse("hello world"); | |
| 1177 } | |
| 1178 | |
| 1179 TEST_P(QuicNetworkTransactionTest, | 1093 TEST_P(QuicNetworkTransactionTest, |
| 1180 DontUseAlternateProtocolWithBadProbabilityForQuic) { | 1094 DontUseAlternateProtocolWithBadProbabilityForQuic) { |
| 1181 params_.enable_insecure_quic = true; | |
| 1182 | |
| 1183 MockRead http_reads[] = { | 1095 MockRead http_reads[] = { |
| 1184 MockRead("HTTP/1.1 200 OK\r\n"), | 1096 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1185 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), | 1097 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), |
| 1186 MockRead("hello world"), | 1098 MockRead("hello world"), |
| 1187 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1099 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1188 MockRead(ASYNC, OK) | 1100 MockRead(ASYNC, OK) |
| 1189 }; | 1101 }; |
| 1190 | 1102 |
| 1191 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1103 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1192 nullptr, 0); | 1104 nullptr, 0); |
| 1193 socket_factory_.AddSocketDataProvider(&http_data); | 1105 socket_factory_.AddSocketDataProvider(&http_data); |
| 1106 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1194 socket_factory_.AddSocketDataProvider(&http_data); | 1107 socket_factory_.AddSocketDataProvider(&http_data); |
| 1108 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1195 | 1109 |
| 1196 params_.alternative_service_probability_threshold = .75; | 1110 params_.alternative_service_probability_threshold = .75; |
| 1197 CreateSessionWithNextProtos(); | 1111 CreateSessionWithNextProtos(); |
| 1198 | 1112 |
| 1199 SendRequestAndExpectHttpResponse("hello world"); | 1113 SendRequestAndExpectHttpResponse("hello world"); |
| 1200 SendRequestAndExpectHttpResponse("hello world"); | 1114 SendRequestAndExpectHttpResponse("hello world"); |
| 1201 } | 1115 } |
| 1202 | 1116 |
| 1203 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 1117 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
| 1204 params_.enable_insecure_quic = true; | |
| 1205 params_.origin_to_force_quic_on = | |
| 1206 HostPortPair::FromString("www.google.com:443"); | |
| 1207 | |
| 1208 MockRead http_reads[] = { | 1118 MockRead http_reads[] = { |
| 1209 MockRead("HTTP/1.1 200 OK\r\n"), | 1119 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 1210 MockRead(kQuicAlternateProtocolHttpsHeader), | 1120 MockRead("hello world"), |
| 1211 MockRead("hello world"), | 1121 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1212 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1122 MockRead(ASYNC, OK)}; |
| 1213 MockRead(ASYNC, OK) | |
| 1214 }; | |
| 1215 | 1123 |
| 1216 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1124 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1217 nullptr, 0); | 1125 nullptr, 0); |
| 1218 socket_factory_.AddSocketDataProvider(&http_data); | 1126 socket_factory_.AddSocketDataProvider(&http_data); |
| 1219 | 1127 |
| 1220 MockQuicData mock_quic_data; | 1128 MockQuicData mock_quic_data; |
| 1221 mock_quic_data.AddWrite( | 1129 mock_quic_data.AddWrite( |
| 1222 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1130 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1223 GetRequestHeaders("GET", "http", "/"))); | 1131 GetRequestHeaders("GET", "https", "/"))); |
| 1224 mock_quic_data.AddRead( | 1132 mock_quic_data.AddRead( |
| 1225 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 1133 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1226 GetResponseHeaders("200 OK"))); | 1134 GetResponseHeaders("200 OK"))); |
| 1227 mock_quic_data.AddRead( | 1135 mock_quic_data.AddRead( |
| 1228 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1136 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1229 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1137 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1230 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1138 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1231 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 1139 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1232 | 1140 |
| 1233 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1141 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1319 RequestSucceedsWithValidCertificate) { | 1227 RequestSucceedsWithValidCertificate) { |
| 1320 Run(true); | 1228 Run(true); |
| 1321 } | 1229 } |
| 1322 | 1230 |
| 1323 TEST_P(QuicAltSvcCertificateVerificationTest, | 1231 TEST_P(QuicAltSvcCertificateVerificationTest, |
| 1324 RequestFailsWithInvalidCertificate) { | 1232 RequestFailsWithInvalidCertificate) { |
| 1325 Run(false); | 1233 Run(false); |
| 1326 } | 1234 } |
| 1327 | 1235 |
| 1328 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { | 1236 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { |
| 1329 params_.enable_insecure_quic = true; | |
| 1330 crypto_client_stream_factory_.set_handshake_mode( | 1237 crypto_client_stream_factory_.set_handshake_mode( |
| 1331 MockCryptoClientStream::COLD_START); | 1238 MockCryptoClientStream::COLD_START); |
| 1332 | 1239 |
| 1333 MockWrite http_writes[] = { | 1240 MockWrite http_writes[] = { |
| 1334 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), | 1241 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
| 1335 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 1242 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"), |
| 1336 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") | 1243 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")}; |
| 1337 }; | |
| 1338 | 1244 |
| 1339 MockRead http_reads[] = { | 1245 MockRead http_reads[] = { |
| 1340 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 1246 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| 1341 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader), | 1247 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), |
| 1342 MockRead(SYNCHRONOUS, 5, "hello world"), | 1248 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; |
| 1343 MockRead(SYNCHRONOUS, OK, 6) | |
| 1344 }; | |
| 1345 | 1249 |
| 1346 DeterministicMockClientSocketFactory socket_factory; | 1250 DeterministicMockClientSocketFactory socket_factory; |
| 1347 | 1251 |
| 1348 DeterministicSocketData http_data(http_reads, arraysize(http_reads), | 1252 DeterministicSocketData http_data(http_reads, arraysize(http_reads), |
| 1349 http_writes, arraysize(http_writes)); | 1253 http_writes, arraysize(http_writes)); |
| 1350 socket_factory.AddSocketDataProvider(&http_data); | 1254 socket_factory.AddSocketDataProvider(&http_data); |
| 1255 socket_factory.AddSSLSocketDataProvider(&ssl_data_); | |
| 1351 | 1256 |
| 1352 // The QUIC transaction will not be allowed to complete. | 1257 // The QUIC transaction will not be allowed to complete. |
| 1353 MockWrite quic_writes[] = { | 1258 MockWrite quic_writes[] = { |
| 1354 MockWrite(ASYNC, ERR_IO_PENDING, 0) | 1259 MockWrite(ASYNC, ERR_IO_PENDING, 0) |
| 1355 }; | 1260 }; |
| 1356 MockRead quic_reads[] = { | 1261 MockRead quic_reads[] = { |
| 1357 MockRead(ASYNC, ERR_IO_PENDING, 1), | 1262 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 1358 }; | 1263 }; |
| 1359 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), | 1264 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), |
| 1360 quic_writes, arraysize(quic_writes)); | 1265 quic_writes, arraysize(quic_writes)); |
| 1361 socket_factory.AddSocketDataProvider(&quic_data); | 1266 socket_factory.AddSocketDataProvider(&quic_data); |
| 1362 | 1267 |
| 1363 // The HTTP transaction will complete. | 1268 // The HTTP transaction will complete. |
| 1364 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), | 1269 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), |
| 1365 http_writes, arraysize(http_writes)); | 1270 http_writes, arraysize(http_writes)); |
| 1366 socket_factory.AddSocketDataProvider(&http_data2); | 1271 socket_factory.AddSocketDataProvider(&http_data2); |
| 1272 socket_factory.AddSSLSocketDataProvider(&ssl_data_); | |
| 1367 | 1273 |
| 1368 CreateSessionWithFactory(&socket_factory, true); | 1274 CreateSessionWithFactory(&socket_factory, true); |
| 1369 | 1275 |
| 1370 // Run the first request. | 1276 // Run the first request. |
| 1371 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 1277 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 1372 SendRequestAndExpectHttpResponse("hello world"); | 1278 SendRequestAndExpectHttpResponse("hello world"); |
| 1373 ASSERT_TRUE(http_data.AllReadDataConsumed()); | 1279 ASSERT_TRUE(http_data.AllReadDataConsumed()); |
| 1374 ASSERT_TRUE(http_data.AllWriteDataConsumed()); | 1280 ASSERT_TRUE(http_data.AllWriteDataConsumed()); |
| 1375 | 1281 |
| 1376 // Now run the second request in which the QUIC socket hangs, | 1282 // Now run the second request in which the QUIC socket hangs, |
| 1377 // and verify the the transaction continues over HTTP. | 1283 // and verify the the transaction continues over HTTP. |
| 1378 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 1284 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 1379 SendRequestAndExpectHttpResponse("hello world"); | 1285 SendRequestAndExpectHttpResponse("hello world"); |
| 1380 | 1286 |
| 1381 ASSERT_TRUE(http_data2.AllReadDataConsumed()); | 1287 ASSERT_TRUE(http_data2.AllReadDataConsumed()); |
| 1382 ASSERT_TRUE(http_data2.AllWriteDataConsumed()); | 1288 ASSERT_TRUE(http_data2.AllWriteDataConsumed()); |
| 1383 ASSERT_TRUE(!quic_data.AllReadDataConsumed()); | 1289 ASSERT_TRUE(!quic_data.AllReadDataConsumed()); |
| 1384 ASSERT_TRUE(!quic_data.AllWriteDataConsumed()); | 1290 ASSERT_TRUE(!quic_data.AllWriteDataConsumed()); |
| 1385 } | 1291 } |
| 1386 | 1292 |
| 1387 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { | 1293 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { |
| 1388 params_.enable_insecure_quic = true; | |
| 1389 MockQuicData mock_quic_data; | 1294 MockQuicData mock_quic_data; |
| 1390 mock_quic_data.AddWrite( | 1295 mock_quic_data.AddWrite( |
| 1391 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1296 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1392 GetRequestHeaders("GET", "http", "/"))); | 1297 GetRequestHeaders("GET", "https", "/"))); |
| 1393 mock_quic_data.AddRead( | 1298 mock_quic_data.AddRead( |
| 1394 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 1299 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1395 GetResponseHeaders("200 OK"))); | 1300 GetResponseHeaders("200 OK"))); |
| 1396 mock_quic_data.AddRead( | 1301 mock_quic_data.AddRead( |
| 1397 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1302 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1398 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1303 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1399 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1304 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1400 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 1305 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1401 | 1306 |
| 1402 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1307 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1403 | 1308 |
| 1404 // The non-alternate protocol job needs to hang in order to guarantee that | 1309 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1405 // the alternate-protocol job will "win". | 1310 // the alternate-protocol job will "win". |
| 1406 AddHangingNonAlternateProtocolSocketData(); | 1311 AddHangingNonAlternateProtocolSocketData(); |
| 1407 | 1312 |
| 1408 CreateSessionWithNextProtos(); | 1313 CreateSessionWithNextProtos(); |
| 1409 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1314 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1410 SendRequestAndExpectQuicResponse("hello!"); | 1315 SendRequestAndExpectQuicResponse("hello!"); |
| 1411 } | 1316 } |
| 1412 | 1317 |
| 1413 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { | 1318 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { |
| 1414 params_.enable_insecure_quic = true; | |
| 1415 MockQuicData mock_quic_data; | 1319 MockQuicData mock_quic_data; |
| 1416 mock_quic_data.AddWrite( | 1320 mock_quic_data.AddWrite( |
| 1417 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1321 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1418 GetRequestHeaders("GET", "http", "/"))); | 1322 GetRequestHeaders("GET", "https", "/"))); |
| 1419 mock_quic_data.AddRead( | 1323 mock_quic_data.AddRead( |
| 1420 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 1324 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1421 GetResponseHeaders("200 OK"))); | 1325 GetResponseHeaders("200 OK"))); |
| 1422 mock_quic_data.AddRead( | 1326 mock_quic_data.AddRead( |
| 1423 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1327 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1424 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1328 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1425 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1329 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1426 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 1330 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1427 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1331 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1428 | 1332 |
| 1429 // In order for a new QUIC session to be established via alternate-protocol | 1333 // In order for a new QUIC session to be established via alternate-protocol |
| 1430 // without racing an HTTP connection, we need the host resolution to happen | 1334 // without racing an HTTP connection, we need the host resolution to happen |
| 1431 // synchronously. | 1335 // synchronously. |
| 1432 host_resolver_.set_synchronous_mode(true); | 1336 host_resolver_.set_synchronous_mode(true); |
| 1433 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 1337 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", |
| 1434 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 1338 ""); |
| 1339 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | |
| 1435 AddressList address; | 1340 AddressList address; |
| 1436 host_resolver_.Resolve(info, | 1341 host_resolver_.Resolve(info, |
| 1437 DEFAULT_PRIORITY, | 1342 DEFAULT_PRIORITY, |
| 1438 &address, | 1343 &address, |
| 1439 CompletionCallback(), | 1344 CompletionCallback(), |
| 1440 nullptr, | 1345 nullptr, |
| 1441 net_log_.bound()); | 1346 net_log_.bound()); |
| 1442 | 1347 |
| 1443 CreateSessionWithNextProtos(); | 1348 CreateSessionWithNextProtos(); |
| 1444 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1349 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1445 SendRequestAndExpectQuicResponse("hello!"); | 1350 SendRequestAndExpectQuicResponse("hello!"); |
| 1446 } | 1351 } |
| 1447 | 1352 |
| 1448 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { | 1353 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { |
| 1449 params_.enable_insecure_quic = true; | |
| 1450 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); | 1354 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); |
| 1451 | 1355 |
| 1452 // Since we are using a proxy, the QUIC job will not succeed. | 1356 // Since we are using a proxy, the QUIC job will not succeed. |
| 1453 MockWrite http_writes[] = { | 1357 MockWrite http_writes[] = { |
| 1454 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), | 1358 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"), |
| 1455 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 1359 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"), |
| 1456 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") | 1360 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")}; |
| 1457 }; | |
| 1458 | 1361 |
| 1459 MockRead http_reads[] = { | 1362 MockRead http_reads[] = { |
| 1460 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 1363 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| 1461 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader), | 1364 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), |
| 1462 MockRead(SYNCHRONOUS, 5, "hello world"), | 1365 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; |
| 1463 MockRead(SYNCHRONOUS, OK, 6) | |
| 1464 }; | |
| 1465 | 1366 |
| 1466 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1367 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1467 http_writes, arraysize(http_writes)); | 1368 http_writes, arraysize(http_writes)); |
| 1468 socket_factory_.AddSocketDataProvider(&http_data); | 1369 socket_factory_.AddSocketDataProvider(&http_data); |
| 1469 | 1370 |
| 1470 // In order for a new QUIC session to be established via alternate-protocol | 1371 // In order for a new QUIC session to be established via alternate-protocol |
| 1471 // without racing an HTTP connection, we need the host resolution to happen | 1372 // without racing an HTTP connection, we need the host resolution to happen |
| 1472 // synchronously. | 1373 // synchronously. |
| 1473 host_resolver_.set_synchronous_mode(true); | 1374 host_resolver_.set_synchronous_mode(true); |
| 1474 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 1375 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", |
| 1475 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 1376 ""); |
| 1377 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | |
| 1476 AddressList address; | 1378 AddressList address; |
| 1477 host_resolver_.Resolve(info, | 1379 host_resolver_.Resolve(info, |
| 1478 DEFAULT_PRIORITY, | 1380 DEFAULT_PRIORITY, |
| 1479 &address, | 1381 &address, |
| 1480 CompletionCallback(), | 1382 CompletionCallback(), |
| 1481 nullptr, | 1383 nullptr, |
| 1482 net_log_.bound()); | 1384 net_log_.bound()); |
| 1483 | 1385 |
| 1386 request_.url = GURL("http://mail.example.com/"); | |
| 1484 CreateSessionWithNextProtos(); | 1387 CreateSessionWithNextProtos(); |
| 1485 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1388 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1486 SendRequestAndExpectHttpResponse("hello world"); | 1389 SendRequestAndExpectHttpResponse("hello world"); |
| 1487 } | 1390 } |
| 1488 | 1391 |
| 1489 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 1392 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 1490 params_.enable_insecure_quic = true; | |
| 1491 MockQuicData mock_quic_data; | 1393 MockQuicData mock_quic_data; |
| 1492 mock_quic_data.AddWrite( | 1394 mock_quic_data.AddWrite( |
| 1493 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1395 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1494 GetRequestHeaders("GET", "http", "/"))); | 1396 GetRequestHeaders("GET", "https", "/"))); |
| 1495 mock_quic_data.AddRead( | 1397 mock_quic_data.AddRead( |
| 1496 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 1398 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1497 GetResponseHeaders("200 OK"))); | 1399 GetResponseHeaders("200 OK"))); |
| 1498 mock_quic_data.AddRead( | 1400 mock_quic_data.AddRead( |
| 1499 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1401 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1500 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1402 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1501 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1403 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1502 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1404 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1503 | 1405 |
| 1504 // The non-alternate protocol job needs to hang in order to guarantee that | 1406 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1505 // the alternate-protocol job will "win". | 1407 // the alternate-protocol job will "win". |
| 1506 AddHangingNonAlternateProtocolSocketData(); | 1408 AddHangingNonAlternateProtocolSocketData(); |
| 1507 | 1409 |
| 1508 // In order for a new QUIC session to be established via alternate-protocol | 1410 // In order for a new QUIC session to be established via alternate-protocol |
| 1509 // without racing an HTTP connection, we need the host resolution to happen | 1411 // without racing an HTTP connection, we need the host resolution to happen |
| 1510 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 1412 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 1511 // connection to the the server, in this test we require confirmation | 1413 // connection to the the server, in this test we require confirmation |
| 1512 // before encrypting so the HTTP job will still start. | 1414 // before encrypting so the HTTP job will still start. |
| 1513 host_resolver_.set_synchronous_mode(true); | 1415 host_resolver_.set_synchronous_mode(true); |
| 1514 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 1416 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", |
| 1515 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 1417 ""); |
| 1418 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | |
| 1516 AddressList address; | 1419 AddressList address; |
| 1517 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, | 1420 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, |
| 1518 CompletionCallback(), nullptr, net_log_.bound()); | 1421 CompletionCallback(), nullptr, net_log_.bound()); |
| 1519 | 1422 |
| 1520 CreateSessionWithNextProtos(); | 1423 CreateSessionWithNextProtos(); |
| 1521 session_->quic_stream_factory()->set_require_confirmation(true); | 1424 session_->quic_stream_factory()->set_require_confirmation(true); |
| 1522 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1425 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1523 | 1426 |
| 1524 scoped_ptr<HttpNetworkTransaction> trans( | 1427 scoped_ptr<HttpNetworkTransaction> trans( |
| 1525 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1428 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 1526 TestCompletionCallback callback; | 1429 TestCompletionCallback callback; |
| 1527 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1430 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 1528 EXPECT_EQ(ERR_IO_PENDING, rv); | 1431 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1529 | 1432 |
| 1530 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 1433 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 1531 QuicSession::HANDSHAKE_CONFIRMED); | 1434 QuicSession::HANDSHAKE_CONFIRMED); |
| 1532 EXPECT_EQ(OK, callback.WaitForResult()); | 1435 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1533 | 1436 |
| 1534 CheckWasQuicResponse(trans); | 1437 CheckWasQuicResponse(trans); |
| 1535 CheckResponseData(trans, "hello!"); | 1438 CheckResponseData(trans, "hello!"); |
| 1536 } | 1439 } |
| 1537 | 1440 |
| 1538 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 1441 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
| 1539 params_.enable_insecure_quic = true; | |
| 1540 // Alternate-protocol job | 1442 // Alternate-protocol job |
| 1541 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 1443 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
| 1542 MockRead quic_reads[] = { | 1444 MockRead quic_reads[] = { |
| 1543 MockRead(ASYNC, close->data(), close->length()), | 1445 MockRead(ASYNC, close->data(), close->length()), |
| 1544 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read | 1446 MockRead(ASYNC, ERR_IO_PENDING), // No more data to read |
| 1545 MockRead(ASYNC, OK), // EOF | 1447 MockRead(ASYNC, OK), // EOF |
| 1546 }; | 1448 }; |
| 1547 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 1449 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 1548 nullptr, 0); | 1450 nullptr, 0); |
| 1549 socket_factory_.AddSocketDataProvider(&quic_data); | 1451 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1550 | 1452 |
| 1551 // Main job which will succeed even though the alternate job fails. | 1453 // Main job which will succeed even though the alternate job fails. |
| 1552 MockRead http_reads[] = { | 1454 MockRead http_reads[] = { |
| 1553 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 1455 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 1554 MockRead("hello from http"), | 1456 MockRead("hello from http"), |
| 1555 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1457 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1556 MockRead(ASYNC, OK) | 1458 MockRead(ASYNC, OK) |
| 1557 }; | 1459 }; |
| 1558 | 1460 |
| 1559 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1461 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1560 nullptr, 0); | 1462 nullptr, 0); |
| 1561 socket_factory_.AddSocketDataProvider(&http_data); | 1463 socket_factory_.AddSocketDataProvider(&http_data); |
| 1464 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1562 | 1465 |
| 1563 CreateSessionWithNextProtos(); | 1466 CreateSessionWithNextProtos(); |
| 1564 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 1467 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 1565 SendRequestAndExpectHttpResponse("hello from http"); | 1468 SendRequestAndExpectHttpResponse("hello from http"); |
| 1566 ExpectBrokenAlternateProtocolMapping(); | 1469 ExpectBrokenAlternateProtocolMapping(); |
| 1567 } | 1470 } |
| 1568 | 1471 |
| 1569 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { | 1472 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { |
| 1570 params_.enable_insecure_quic = true; | |
| 1571 // Alternate-protocol job | 1473 // Alternate-protocol job |
| 1572 MockRead quic_reads[] = { | 1474 MockRead quic_reads[] = { |
| 1573 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 1475 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 1574 }; | 1476 }; |
| 1575 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 1477 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 1576 nullptr, 0); | 1478 nullptr, 0); |
| 1577 socket_factory_.AddSocketDataProvider(&quic_data); | 1479 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1578 | 1480 |
| 1579 // Main job which will succeed even though the alternate job fails. | 1481 // Main job which will succeed even though the alternate job fails. |
| 1580 MockRead http_reads[] = { | 1482 MockRead http_reads[] = { |
| 1581 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 1483 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 1582 MockRead("hello from http"), | 1484 MockRead("hello from http"), |
| 1583 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1485 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1584 MockRead(ASYNC, OK) | 1486 MockRead(ASYNC, OK) |
| 1585 }; | 1487 }; |
| 1586 | 1488 |
| 1587 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1489 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1588 nullptr, 0); | 1490 nullptr, 0); |
| 1589 socket_factory_.AddSocketDataProvider(&http_data); | 1491 socket_factory_.AddSocketDataProvider(&http_data); |
| 1492 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1590 | 1493 |
| 1591 CreateSessionWithNextProtos(); | 1494 CreateSessionWithNextProtos(); |
| 1592 | 1495 |
| 1593 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 1496 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 1594 SendRequestAndExpectHttpResponse("hello from http"); | 1497 SendRequestAndExpectHttpResponse("hello from http"); |
| 1595 ExpectBrokenAlternateProtocolMapping(); | 1498 ExpectBrokenAlternateProtocolMapping(); |
| 1596 } | 1499 } |
| 1597 | 1500 |
| 1598 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) { | 1501 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolIfTcpFails) { |
| 1599 params_.enable_insecure_quic = true; | |
| 1600 // Alternate-protocol job will fail when the session attempts to read. | 1502 // Alternate-protocol job will fail when the session attempts to read. |
| 1601 MockRead quic_reads[] = { | 1503 MockRead quic_reads[] = { |
| 1602 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 1504 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 1603 }; | 1505 }; |
| 1604 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 1506 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 1605 nullptr, 0); | 1507 nullptr, 0); |
| 1606 socket_factory_.AddSocketDataProvider(&quic_data); | 1508 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1607 | 1509 |
| 1608 // Main job will also fail. | 1510 // Main job will also fail. |
| 1609 MockRead http_reads[] = { | 1511 MockRead http_reads[] = { |
| 1610 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 1512 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 1611 }; | 1513 }; |
| 1612 | 1514 |
| 1613 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1515 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1614 nullptr, 0); | 1516 nullptr, 0); |
| 1615 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED)); | 1517 http_data.set_connect_data(MockConnect(ASYNC, ERR_SOCKET_NOT_CONNECTED)); |
| 1616 socket_factory_.AddSocketDataProvider(&http_data); | 1518 socket_factory_.AddSocketDataProvider(&http_data); |
| 1519 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1617 | 1520 |
| 1618 CreateSessionWithNextProtos(); | 1521 CreateSessionWithNextProtos(); |
| 1619 | 1522 |
| 1620 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 1523 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 1621 scoped_ptr<HttpNetworkTransaction> trans( | 1524 scoped_ptr<HttpNetworkTransaction> trans( |
| 1622 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1525 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 1623 TestCompletionCallback callback; | 1526 TestCompletionCallback callback; |
| 1624 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1527 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 1625 EXPECT_EQ(ERR_IO_PENDING, rv); | 1528 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1626 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); | 1529 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, callback.WaitForResult()); |
| 1627 ExpectQuicAlternateProtocolMapping(); | 1530 ExpectQuicAlternateProtocolMapping(); |
| 1628 } | 1531 } |
| 1629 | 1532 |
| 1630 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { | 1533 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
| 1631 params_.enable_insecure_quic = true; | |
| 1632 // Alternate-protocol job | 1534 // Alternate-protocol job |
| 1633 MockRead quic_reads[] = { | 1535 MockRead quic_reads[] = { |
| 1634 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 1536 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 1635 }; | 1537 }; |
| 1636 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 1538 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 1637 nullptr, 0); | 1539 nullptr, 0); |
| 1638 socket_factory_.AddSocketDataProvider(&quic_data); | 1540 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1639 | 1541 |
| 1640 AddHangingNonAlternateProtocolSocketData(); | 1542 AddHangingNonAlternateProtocolSocketData(); |
| 1641 | 1543 |
| 1642 // Second Alternate-protocol job which will race with the TCP job. | 1544 // Second Alternate-protocol job which will race with the TCP job. |
| 1643 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads), | 1545 StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads), |
| 1644 nullptr, 0); | 1546 nullptr, 0); |
| 1645 socket_factory_.AddSocketDataProvider(&quic_data2); | 1547 socket_factory_.AddSocketDataProvider(&quic_data2); |
| 1646 | 1548 |
| 1647 // Final job that will proceed when the QUIC job fails. | 1549 // Final job that will proceed when the QUIC job fails. |
| 1648 MockRead http_reads[] = { | 1550 MockRead http_reads[] = { |
| 1649 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 1551 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 1650 MockRead("hello from http"), | 1552 MockRead("hello from http"), |
| 1651 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1553 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1652 MockRead(ASYNC, OK) | 1554 MockRead(ASYNC, OK) |
| 1653 }; | 1555 }; |
| 1654 | 1556 |
| 1655 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1557 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1656 nullptr, 0); | 1558 nullptr, 0); |
| 1657 socket_factory_.AddSocketDataProvider(&http_data); | 1559 socket_factory_.AddSocketDataProvider(&http_data); |
| 1560 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1658 | 1561 |
| 1659 CreateSessionWithNextProtos(); | 1562 CreateSessionWithNextProtos(); |
| 1660 | 1563 |
| 1661 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1564 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1662 | 1565 |
| 1663 SendRequestAndExpectHttpResponse("hello from http"); | 1566 SendRequestAndExpectHttpResponse("hello from http"); |
| 1664 | 1567 |
| 1665 ExpectBrokenAlternateProtocolMapping(); | 1568 ExpectBrokenAlternateProtocolMapping(); |
| 1666 | 1569 |
| 1667 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 1570 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 1668 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 1571 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 1669 } | 1572 } |
| 1670 | 1573 |
| 1671 TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) { | 1574 TEST_P(QuicNetworkTransactionTest, DISABLED_HangingZeroRttFallback) { |
| 1672 params_.enable_insecure_quic = true; | |
| 1673 // Alternate-protocol job | 1575 // Alternate-protocol job |
| 1674 MockRead quic_reads[] = { | 1576 MockRead quic_reads[] = { |
| 1675 MockRead(ASYNC, ERR_IO_PENDING), | 1577 MockRead(ASYNC, ERR_IO_PENDING), |
| 1676 }; | 1578 }; |
| 1677 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 1579 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 1678 nullptr, 0); | 1580 nullptr, 0); |
| 1679 socket_factory_.AddSocketDataProvider(&quic_data); | 1581 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1680 | 1582 |
| 1681 // Main job that will proceed when the QUIC job fails. | 1583 // Main job that will proceed when the QUIC job fails. |
| 1682 MockRead http_reads[] = { | 1584 MockRead http_reads[] = { |
| 1683 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 1585 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 1684 MockRead("hello from http"), | 1586 MockRead("hello from http"), |
| 1685 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1587 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1686 MockRead(ASYNC, OK) | 1588 MockRead(ASYNC, OK) |
| 1687 }; | 1589 }; |
| 1688 | 1590 |
| 1689 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1591 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1690 nullptr, 0); | 1592 nullptr, 0); |
| 1691 socket_factory_.AddSocketDataProvider(&http_data); | 1593 socket_factory_.AddSocketDataProvider(&http_data); |
| 1692 | 1594 |
| 1693 CreateSessionWithNextProtos(); | 1595 CreateSessionWithNextProtos(); |
| 1694 | 1596 |
| 1695 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1597 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1696 | 1598 |
| 1697 SendRequestAndExpectHttpResponse("hello from http"); | 1599 SendRequestAndExpectHttpResponse("hello from http"); |
| 1698 } | 1600 } |
| 1699 | 1601 |
| 1700 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) { | 1602 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) { |
| 1701 params_.enable_insecure_quic = true; | |
| 1702 // Alternate-protocol job will fail before creating a QUIC session. | 1603 // Alternate-protocol job will fail before creating a QUIC session. |
| 1703 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0); | 1604 StaticSocketDataProvider quic_data(nullptr, 0, nullptr, 0); |
| 1704 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, | 1605 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 1705 ERR_INTERNET_DISCONNECTED)); | 1606 ERR_INTERNET_DISCONNECTED)); |
| 1706 socket_factory_.AddSocketDataProvider(&quic_data); | 1607 socket_factory_.AddSocketDataProvider(&quic_data); |
| 1707 | 1608 |
| 1708 // Main job which will succeed even though the alternate job fails. | 1609 // Main job which will succeed even though the alternate job fails. |
| 1709 MockRead http_reads[] = { | 1610 MockRead http_reads[] = { |
| 1710 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 1611 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 1711 MockRead("hello from http"), | 1612 MockRead("hello from http"), |
| 1712 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1613 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1713 MockRead(ASYNC, OK) | 1614 MockRead(ASYNC, OK) |
| 1714 }; | 1615 }; |
| 1715 | 1616 |
| 1716 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1617 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1717 nullptr, 0); | 1618 nullptr, 0); |
| 1718 socket_factory_.AddSocketDataProvider(&http_data); | 1619 socket_factory_.AddSocketDataProvider(&http_data); |
| 1620 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1719 | 1621 |
| 1720 CreateSessionWithNextProtos(); | 1622 CreateSessionWithNextProtos(); |
| 1721 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 1623 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 1722 SendRequestAndExpectHttpResponse("hello from http"); | 1624 SendRequestAndExpectHttpResponse("hello from http"); |
| 1723 | 1625 |
| 1724 ExpectBrokenAlternateProtocolMapping(); | 1626 ExpectBrokenAlternateProtocolMapping(); |
| 1725 } | 1627 } |
| 1726 | 1628 |
| 1727 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { | 1629 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
| 1728 params_.enable_insecure_quic = true; | |
| 1729 MockQuicData mock_quic_data; | 1630 MockQuicData mock_quic_data; |
| 1730 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1)); | 1631 mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1)); |
| 1731 mock_quic_data.AddWrite( | 1632 mock_quic_data.AddWrite( |
| 1732 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1633 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1733 GetRequestHeaders("GET", "http", "/"))); | 1634 GetRequestHeaders("GET", "https", "/"))); |
| 1734 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1635 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1735 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1636 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1736 | 1637 |
| 1737 // When the QUIC connection fails, we will try the request again over HTTP. | 1638 // When the QUIC connection fails, we will try the request again over HTTP. |
| 1738 MockRead http_reads[] = { | 1639 MockRead http_reads[] = { |
| 1739 MockRead("HTTP/1.1 200 OK\r\n"), | 1640 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 1740 MockRead(kQuicAlternateProtocolHttpHeader), | 1641 MockRead("hello world"), |
| 1741 MockRead("hello world"), | 1642 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1742 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1643 MockRead(ASYNC, OK)}; |
| 1743 MockRead(ASYNC, OK) | |
| 1744 }; | |
| 1745 | 1644 |
| 1746 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1645 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1747 nullptr, 0); | 1646 nullptr, 0); |
| 1748 socket_factory_.AddSocketDataProvider(&http_data); | 1647 socket_factory_.AddSocketDataProvider(&http_data); |
| 1648 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 1749 | 1649 |
| 1750 // In order for a new QUIC session to be established via alternate-protocol | 1650 // In order for a new QUIC session to be established via alternate-protocol |
| 1751 // without racing an HTTP connection, we need the host resolution to happen | 1651 // without racing an HTTP connection, we need the host resolution to happen |
| 1752 // synchronously. | 1652 // synchronously. |
| 1753 host_resolver_.set_synchronous_mode(true); | 1653 host_resolver_.set_synchronous_mode(true); |
| 1754 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 1654 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", |
| 1755 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 1655 ""); |
| 1656 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | |
| 1756 AddressList address; | 1657 AddressList address; |
| 1757 host_resolver_.Resolve(info, | 1658 host_resolver_.Resolve(info, |
| 1758 DEFAULT_PRIORITY, | 1659 DEFAULT_PRIORITY, |
| 1759 &address, | 1660 &address, |
| 1760 CompletionCallback(), | 1661 CompletionCallback(), |
| 1761 nullptr, | 1662 nullptr, |
| 1762 net_log_.bound()); | 1663 net_log_.bound()); |
| 1763 | 1664 |
| 1764 CreateSessionWithNextProtos(); | 1665 CreateSessionWithNextProtos(); |
| 1765 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1666 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1766 SendRequestAndExpectHttpResponse("hello world"); | 1667 SendRequestAndExpectHttpResponse("hello world"); |
| 1767 } | 1668 } |
| 1768 | 1669 |
| 1769 // Test that a secure request over an insecure QUIC connection fails with | |
| 1770 // the appropriate error code. Note that this never happens in production, | |
| 1771 // because the handshake (which this test mocks) would fail in this scenario. | |
| 1772 TEST_P(QuicNetworkTransactionTest, SecureResourceOverInsecureQuic) { | |
| 1773 params_.enable_insecure_quic = true; | |
| 1774 maker_.set_hostname("www.example.org"); | |
| 1775 MockQuicData mock_quic_data; | |
| 1776 mock_quic_data.AddWrite( | |
| 1777 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
| 1778 GetRequestHeaders("GET", "https", "/"))); | |
| 1779 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
| 1780 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
| 1781 mock_quic_data.AddRead( | |
| 1782 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
| 1783 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
| 1784 mock_quic_data.AddRead(SYNCHRONOUS, 0); | |
| 1785 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
| 1786 | |
| 1787 request_.url = GURL("https://www.example.org:443"); | |
| 1788 AddHangingNonAlternateProtocolSocketData(); | |
| 1789 CreateSessionWithNextProtos(); | |
| 1790 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | |
| 1791 scoped_ptr<HttpNetworkTransaction> trans( | |
| 1792 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | |
| 1793 TestCompletionCallback callback; | |
| 1794 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | |
| 1795 EXPECT_EQ(ERR_REQUEST_FOR_SECURE_RESOURCE_OVER_INSECURE_QUIC, | |
| 1796 callback.GetResult(rv)); | |
| 1797 } | |
| 1798 | |
| 1799 TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { | 1670 TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { |
| 1800 params_.enable_insecure_quic = true; | |
| 1801 maker_.set_hostname("www.example.org"); | 1671 maker_.set_hostname("www.example.org"); |
| 1802 EXPECT_FALSE( | 1672 EXPECT_FALSE( |
| 1803 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); | 1673 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); |
| 1804 MockQuicData mock_quic_data; | 1674 MockQuicData mock_quic_data; |
| 1805 mock_quic_data.AddWrite( | 1675 mock_quic_data.AddWrite( |
| 1806 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1676 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1807 GetRequestHeaders("GET", "https", "/"))); | 1677 GetRequestHeaders("GET", "https", "/"))); |
| 1808 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1678 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1809 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1679 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1810 mock_quic_data.AddRead( | 1680 mock_quic_data.AddRead( |
| 1811 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1681 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1812 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1682 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1813 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data. | 1683 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data. |
| 1814 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1684 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1815 | 1685 |
| 1816 scoped_refptr<X509Certificate> cert( | |
| 1817 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | |
| 1818 ASSERT_TRUE(cert.get()); | |
| 1819 bool common_name_fallback_used; | |
| 1820 EXPECT_TRUE( | |
| 1821 cert->VerifyNameMatch("www.example.org", &common_name_fallback_used)); | |
| 1822 ProofVerifyDetailsChromium verify_details; | |
| 1823 verify_details.cert_verify_result.verified_cert = cert; | |
| 1824 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
| 1825 | |
| 1826 request_.url = GURL("https://www.example.org:443"); | 1686 request_.url = GURL("https://www.example.org:443"); |
| 1827 AddHangingNonAlternateProtocolSocketData(); | 1687 AddHangingNonAlternateProtocolSocketData(); |
| 1828 CreateSessionWithNextProtos(); | 1688 CreateSessionWithNextProtos(); |
| 1829 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 1689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1830 SendRequestAndExpectQuicResponse("hello!"); | 1690 SendRequestAndExpectQuicResponse("hello!"); |
| 1831 EXPECT_TRUE( | 1691 EXPECT_TRUE( |
| 1832 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); | 1692 test_network_quality_estimator_->IsRTTAvailableNotificationReceived()); |
| 1833 } | 1693 } |
| 1834 | 1694 |
| 1835 } // namespace test | 1695 } // namespace test |
| 1836 } // namespace net | 1696 } // namespace net |
| OLD | NEW |