Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: net/quic/quic_network_transaction_unittest.cc

Issue 1393713003: Remove insecure QUIC support from Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698