| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 base::MessageLoop::current()->RunUntilIdle(); | 127 base::MessageLoop::current()->RunUntilIdle(); |
| 128 } | 128 } |
| 129 | 129 |
| 130 virtual void TearDown() { | 130 virtual void TearDown() { |
| 131 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 131 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 132 // Empty the current queue. | 132 // Empty the current queue. |
| 133 base::MessageLoop::current()->RunUntilIdle(); | 133 base::MessageLoop::current()->RunUntilIdle(); |
| 134 PlatformTest::TearDown(); | 134 PlatformTest::TearDown(); |
| 135 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 135 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 136 base::MessageLoop::current()->RunUntilIdle(); | 136 base::MessageLoop::current()->RunUntilIdle(); |
| 137 HttpStreamFactory::set_use_alternate_protocols(false); | |
| 138 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); | |
| 139 } | 137 } |
| 140 | 138 |
| 141 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 139 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 142 QuicPacketSequenceNumber num) { | 140 QuicPacketSequenceNumber num) { |
| 143 return maker_.MakeConnectionClosePacket(num); | 141 return maker_.MakeConnectionClosePacket(num); |
| 144 } | 142 } |
| 145 | 143 |
| 146 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 144 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 147 QuicPacketSequenceNumber largest_received, | 145 QuicPacketSequenceNumber largest_received, |
| 148 QuicPacketSequenceNumber least_unacked) { | 146 QuicPacketSequenceNumber least_unacked) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 QuicPacketSequenceNumber sequence_number, | 182 QuicPacketSequenceNumber sequence_number, |
| 185 QuicStreamId stream_id, | 183 QuicStreamId stream_id, |
| 186 bool should_include_version, | 184 bool should_include_version, |
| 187 bool fin, | 185 bool fin, |
| 188 const SpdyHeaderBlock& headers) { | 186 const SpdyHeaderBlock& headers) { |
| 189 return maker_.MakeResponseHeadersPacket( | 187 return maker_.MakeResponseHeadersPacket( |
| 190 sequence_number, stream_id, should_include_version, fin, headers); | 188 sequence_number, stream_id, should_include_version, fin, headers); |
| 191 } | 189 } |
| 192 | 190 |
| 193 void CreateSession() { | 191 void CreateSession() { |
| 194 CreateSessionWithFactory(&socket_factory_); | 192 CreateSessionWithFactory(&socket_factory_, false); |
| 195 } | 193 } |
| 196 | 194 |
| 197 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { | 195 void CreateSessionWithNextProtos() { |
| 196 CreateSessionWithFactory(&socket_factory_, true); |
| 197 } |
| 198 |
| 199 // If |use_next_protos| is true, enables SPDY and QUIC. |
| 200 void CreateSessionWithFactory(ClientSocketFactory* socket_factory, |
| 201 bool use_next_protos) { |
| 198 params_.enable_quic = true; | 202 params_.enable_quic = true; |
| 199 params_.quic_clock = clock_; | 203 params_.quic_clock = clock_; |
| 200 params_.quic_random = &random_generator_; | 204 params_.quic_random = &random_generator_; |
| 201 params_.client_socket_factory = socket_factory; | 205 params_.client_socket_factory = socket_factory; |
| 202 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; | 206 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
| 203 params_.host_resolver = &host_resolver_; | 207 params_.host_resolver = &host_resolver_; |
| 204 params_.cert_verifier = &cert_verifier_; | 208 params_.cert_verifier = &cert_verifier_; |
| 205 params_.transport_security_state = &transport_security_state_; | 209 params_.transport_security_state = &transport_security_state_; |
| 206 params_.proxy_service = proxy_service_.get(); | 210 params_.proxy_service = proxy_service_.get(); |
| 207 params_.ssl_config_service = ssl_config_service_.get(); | 211 params_.ssl_config_service = ssl_config_service_.get(); |
| 208 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 212 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
| 209 params_.http_server_properties = http_server_properties.GetWeakPtr(); | 213 params_.http_server_properties = http_server_properties.GetWeakPtr(); |
| 210 params_.quic_supported_versions = SupportedVersions(GetParam()); | 214 params_.quic_supported_versions = SupportedVersions(GetParam()); |
| 211 | 215 |
| 216 if (use_next_protos) { |
| 217 params_.use_alternate_protocols = true; |
| 218 params_.next_protos = NextProtosSpdy3(); |
| 219 } |
| 220 |
| 212 session_ = new HttpNetworkSession(params_); | 221 session_ = new HttpNetworkSession(params_); |
| 213 session_->quic_stream_factory()->set_require_confirmation(false); | 222 session_->quic_stream_factory()->set_require_confirmation(false); |
| 214 } | 223 } |
| 215 | 224 |
| 216 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { | 225 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { |
| 217 const HttpResponseInfo* response = trans->GetResponseInfo(); | 226 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 218 ASSERT_TRUE(response != NULL); | 227 ASSERT_TRUE(response != NULL); |
| 219 ASSERT_TRUE(response->headers.get() != NULL); | 228 ASSERT_TRUE(response->headers.get() != NULL); |
| 220 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 229 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 221 EXPECT_TRUE(response->was_fetched_via_spdy); | 230 EXPECT_TRUE(response->was_fetched_via_spdy); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 socket_factory_.AddSocketDataProvider(&data); | 450 socket_factory_.AddSocketDataProvider(&data); |
| 442 SSLSocketDataProvider ssl(ASYNC, OK); | 451 SSLSocketDataProvider ssl(ASYNC, OK); |
| 443 socket_factory_.AddSSLSocketDataProvider(&ssl); | 452 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 444 | 453 |
| 445 CreateSession(); | 454 CreateSession(); |
| 446 | 455 |
| 447 SendRequestAndExpectHttpResponse("hello world"); | 456 SendRequestAndExpectHttpResponse("hello world"); |
| 448 } | 457 } |
| 449 | 458 |
| 450 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | 459 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
| 451 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 452 | |
| 453 MockRead http_reads[] = { | 460 MockRead http_reads[] = { |
| 454 MockRead("HTTP/1.1 200 OK\r\n"), | 461 MockRead("HTTP/1.1 200 OK\r\n"), |
| 455 MockRead(kQuicAlternateProtocolHttpHeader), | 462 MockRead(kQuicAlternateProtocolHttpHeader), |
| 456 MockRead("hello world"), | 463 MockRead("hello world"), |
| 457 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 464 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 458 MockRead(ASYNC, OK) | 465 MockRead(ASYNC, OK) |
| 459 }; | 466 }; |
| 460 | 467 |
| 461 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 468 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 462 NULL, 0); | 469 NULL, 0); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 473 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 480 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
| 474 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 481 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 475 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 482 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 476 | 483 |
| 477 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 484 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 478 | 485 |
| 479 // The non-alternate protocol job needs to hang in order to guarantee that | 486 // The non-alternate protocol job needs to hang in order to guarantee that |
| 480 // the alternate-protocol job will "win". | 487 // the alternate-protocol job will "win". |
| 481 AddHangingNonAlternateProtocolSocketData(); | 488 AddHangingNonAlternateProtocolSocketData(); |
| 482 | 489 |
| 483 CreateSession(); | 490 CreateSessionWithNextProtos(); |
| 484 | 491 |
| 485 SendRequestAndExpectHttpResponse("hello world"); | 492 SendRequestAndExpectHttpResponse("hello world"); |
| 486 SendRequestAndExpectQuicResponse("hello!"); | 493 SendRequestAndExpectQuicResponse("hello!"); |
| 487 } | 494 } |
| 488 | 495 |
| 489 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 496 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
| 490 params_.origin_to_force_quic_on = | 497 params_.origin_to_force_quic_on = |
| 491 HostPortPair::FromString("www.google.com:443"); | 498 HostPortPair::FromString("www.google.com:443"); |
| 492 params_.enable_quic_https = true; | 499 params_.enable_quic_https = true; |
| 493 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 494 | 500 |
| 495 MockRead http_reads[] = { | 501 MockRead http_reads[] = { |
| 496 MockRead("HTTP/1.1 200 OK\r\n"), | 502 MockRead("HTTP/1.1 200 OK\r\n"), |
| 497 MockRead(kQuicAlternateProtocolHttpsHeader), | 503 MockRead(kQuicAlternateProtocolHttpsHeader), |
| 498 MockRead("hello world"), | 504 MockRead("hello world"), |
| 499 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 505 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 500 MockRead(ASYNC, OK) | 506 MockRead(ASYNC, OK) |
| 501 }; | 507 }; |
| 502 | 508 |
| 503 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 509 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 515 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 521 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
| 516 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 522 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 517 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 523 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 518 | 524 |
| 519 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 525 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 520 | 526 |
| 521 // The non-alternate protocol job needs to hang in order to guarantee that | 527 // The non-alternate protocol job needs to hang in order to guarantee that |
| 522 // the alternate-protocol job will "win". | 528 // the alternate-protocol job will "win". |
| 523 AddHangingNonAlternateProtocolSocketData(); | 529 AddHangingNonAlternateProtocolSocketData(); |
| 524 | 530 |
| 525 CreateSession(); | 531 CreateSessionWithNextProtos(); |
| 526 | 532 |
| 527 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 533 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 528 SendRequestAndExpectHttpResponse("hello world"); | 534 SendRequestAndExpectHttpResponse("hello world"); |
| 529 } | 535 } |
| 530 | 536 |
| 531 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { | 537 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { |
| 532 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 533 crypto_client_stream_factory_.set_handshake_mode( | 538 crypto_client_stream_factory_.set_handshake_mode( |
| 534 MockCryptoClientStream::COLD_START); | 539 MockCryptoClientStream::COLD_START); |
| 535 | 540 |
| 536 MockWrite http_writes[] = { | 541 MockWrite http_writes[] = { |
| 537 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), | 542 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
| 538 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 543 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
| 539 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") | 544 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") |
| 540 }; | 545 }; |
| 541 | 546 |
| 542 MockRead http_reads[] = { | 547 MockRead http_reads[] = { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 561 }; | 566 }; |
| 562 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), | 567 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads), |
| 563 quic_writes, arraysize(quic_writes)); | 568 quic_writes, arraysize(quic_writes)); |
| 564 socket_factory.AddSocketDataProvider(&quic_data); | 569 socket_factory.AddSocketDataProvider(&quic_data); |
| 565 | 570 |
| 566 // The HTTP transaction will complete. | 571 // The HTTP transaction will complete. |
| 567 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), | 572 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), |
| 568 http_writes, arraysize(http_writes)); | 573 http_writes, arraysize(http_writes)); |
| 569 socket_factory.AddSocketDataProvider(&http_data2); | 574 socket_factory.AddSocketDataProvider(&http_data2); |
| 570 | 575 |
| 571 CreateSessionWithFactory(&socket_factory); | 576 CreateSessionWithFactory(&socket_factory, true); |
| 572 | 577 |
| 573 // Run the first request. | 578 // Run the first request. |
| 574 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 579 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 575 SendRequestAndExpectHttpResponse("hello world"); | 580 SendRequestAndExpectHttpResponse("hello world"); |
| 576 ASSERT_TRUE(http_data.at_read_eof()); | 581 ASSERT_TRUE(http_data.at_read_eof()); |
| 577 ASSERT_TRUE(http_data.at_write_eof()); | 582 ASSERT_TRUE(http_data.at_write_eof()); |
| 578 | 583 |
| 579 // Now run the second request in which the QUIC socket hangs, | 584 // Now run the second request in which the QUIC socket hangs, |
| 580 // and verify the the transaction continues over HTTP. | 585 // and verify the the transaction continues over HTTP. |
| 581 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 586 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 582 SendRequestAndExpectHttpResponse("hello world"); | 587 SendRequestAndExpectHttpResponse("hello world"); |
| 583 | 588 |
| 584 ASSERT_TRUE(http_data2.at_read_eof()); | 589 ASSERT_TRUE(http_data2.at_read_eof()); |
| 585 ASSERT_TRUE(http_data2.at_write_eof()); | 590 ASSERT_TRUE(http_data2.at_write_eof()); |
| 586 ASSERT_TRUE(!quic_data.at_read_eof()); | 591 ASSERT_TRUE(!quic_data.at_read_eof()); |
| 587 ASSERT_TRUE(!quic_data.at_write_eof()); | 592 ASSERT_TRUE(!quic_data.at_write_eof()); |
| 588 } | 593 } |
| 589 | 594 |
| 590 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { | 595 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { |
| 591 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 592 | |
| 593 MockQuicData mock_quic_data; | 596 MockQuicData mock_quic_data; |
| 594 mock_quic_data.AddWrite( | 597 mock_quic_data.AddWrite( |
| 595 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 598 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
| 596 GetRequestHeaders("GET", "http", "/"))); | 599 GetRequestHeaders("GET", "http", "/"))); |
| 597 mock_quic_data.AddRead( | 600 mock_quic_data.AddRead( |
| 598 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 601 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
| 599 GetResponseHeaders("200 OK"))); | 602 GetResponseHeaders("200 OK"))); |
| 600 mock_quic_data.AddRead( | 603 mock_quic_data.AddRead( |
| 601 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 604 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
| 602 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 605 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 603 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 606 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 604 | 607 |
| 605 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 608 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 606 | 609 |
| 607 // The non-alternate protocol job needs to hang in order to guarantee that | 610 // The non-alternate protocol job needs to hang in order to guarantee that |
| 608 // the alternate-protocol job will "win". | 611 // the alternate-protocol job will "win". |
| 609 AddHangingNonAlternateProtocolSocketData(); | 612 AddHangingNonAlternateProtocolSocketData(); |
| 610 | 613 |
| 611 CreateSession(); | 614 CreateSessionWithNextProtos(); |
| 612 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 615 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 613 SendRequestAndExpectQuicResponse("hello!"); | 616 SendRequestAndExpectQuicResponse("hello!"); |
| 614 } | 617 } |
| 615 | 618 |
| 616 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { | 619 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { |
| 617 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 618 | |
| 619 MockQuicData mock_quic_data; | 620 MockQuicData mock_quic_data; |
| 620 mock_quic_data.AddWrite( | 621 mock_quic_data.AddWrite( |
| 621 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 622 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
| 622 GetRequestHeaders("GET", "http", "/"))); | 623 GetRequestHeaders("GET", "http", "/"))); |
| 623 mock_quic_data.AddRead( | 624 mock_quic_data.AddRead( |
| 624 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 625 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
| 625 GetResponseHeaders("200 OK"))); | 626 GetResponseHeaders("200 OK"))); |
| 626 mock_quic_data.AddRead( | 627 mock_quic_data.AddRead( |
| 627 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 628 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
| 628 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 629 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 629 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 630 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 630 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 631 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 631 | 632 |
| 632 // In order for a new QUIC session to be established via alternate-protocol | 633 // In order for a new QUIC session to be established via alternate-protocol |
| 633 // without racing an HTTP connection, we need the host resolution to happen | 634 // without racing an HTTP connection, we need the host resolution to happen |
| 634 // synchronously. | 635 // synchronously. |
| 635 host_resolver_.set_synchronous_mode(true); | 636 host_resolver_.set_synchronous_mode(true); |
| 636 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 637 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 637 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 638 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 638 AddressList address; | 639 AddressList address; |
| 639 host_resolver_.Resolve(info, | 640 host_resolver_.Resolve(info, |
| 640 DEFAULT_PRIORITY, | 641 DEFAULT_PRIORITY, |
| 641 &address, | 642 &address, |
| 642 CompletionCallback(), | 643 CompletionCallback(), |
| 643 NULL, | 644 NULL, |
| 644 net_log_.bound()); | 645 net_log_.bound()); |
| 645 | 646 |
| 646 CreateSession(); | 647 CreateSessionWithNextProtos(); |
| 647 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 648 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 648 SendRequestAndExpectQuicResponse("hello!"); | 649 SendRequestAndExpectQuicResponse("hello!"); |
| 649 } | 650 } |
| 650 | 651 |
| 651 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { | 652 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { |
| 652 proxy_service_.reset( | 653 proxy_service_.reset( |
| 653 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); | 654 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); |
| 654 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 655 | 655 |
| 656 // Since we are using a proxy, the QUIC job will not succeed. | 656 // Since we are using a proxy, the QUIC job will not succeed. |
| 657 MockWrite http_writes[] = { | 657 MockWrite http_writes[] = { |
| 658 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), | 658 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), |
| 659 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 659 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
| 660 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") | 660 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") |
| 661 }; | 661 }; |
| 662 | 662 |
| 663 MockRead http_reads[] = { | 663 MockRead http_reads[] = { |
| 664 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 664 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 678 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 678 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 679 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 679 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 680 AddressList address; | 680 AddressList address; |
| 681 host_resolver_.Resolve(info, | 681 host_resolver_.Resolve(info, |
| 682 DEFAULT_PRIORITY, | 682 DEFAULT_PRIORITY, |
| 683 &address, | 683 &address, |
| 684 CompletionCallback(), | 684 CompletionCallback(), |
| 685 NULL, | 685 NULL, |
| 686 net_log_.bound()); | 686 net_log_.bound()); |
| 687 | 687 |
| 688 CreateSession(); | 688 CreateSessionWithNextProtos(); |
| 689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 690 SendRequestAndExpectHttpResponse("hello world"); | 690 SendRequestAndExpectHttpResponse("hello world"); |
| 691 } | 691 } |
| 692 | 692 |
| 693 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 693 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 694 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 695 | |
| 696 MockQuicData mock_quic_data; | 694 MockQuicData mock_quic_data; |
| 697 mock_quic_data.AddWrite( | 695 mock_quic_data.AddWrite( |
| 698 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 696 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
| 699 GetRequestHeaders("GET", "http", "/"))); | 697 GetRequestHeaders("GET", "http", "/"))); |
| 700 mock_quic_data.AddRead( | 698 mock_quic_data.AddRead( |
| 701 ConstructResponseHeadersPacket(1, kStreamId5, false, false, | 699 ConstructResponseHeadersPacket(1, kStreamId5, false, false, |
| 702 GetResponseHeaders("200 OK"))); | 700 GetResponseHeaders("200 OK"))); |
| 703 mock_quic_data.AddRead( | 701 mock_quic_data.AddRead( |
| 704 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); | 702 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); |
| 705 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 703 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 706 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 704 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 707 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 705 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 708 | 706 |
| 709 // The non-alternate protocol job needs to hang in order to guarantee that | 707 // The non-alternate protocol job needs to hang in order to guarantee that |
| 710 // the alternate-protocol job will "win". | 708 // the alternate-protocol job will "win". |
| 711 AddHangingNonAlternateProtocolSocketData(); | 709 AddHangingNonAlternateProtocolSocketData(); |
| 712 | 710 |
| 713 // In order for a new QUIC session to be established via alternate-protocol | 711 // In order for a new QUIC session to be established via alternate-protocol |
| 714 // without racing an HTTP connection, we need the host resolution to happen | 712 // without racing an HTTP connection, we need the host resolution to happen |
| 715 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 713 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 716 // connection to the the server, in this test we require confirmation | 714 // connection to the the server, in this test we require confirmation |
| 717 // before encrypting so the HTTP job will still start. | 715 // before encrypting so the HTTP job will still start. |
| 718 host_resolver_.set_synchronous_mode(true); | 716 host_resolver_.set_synchronous_mode(true); |
| 719 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 717 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 720 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 718 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 721 AddressList address; | 719 AddressList address; |
| 722 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, | 720 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, |
| 723 CompletionCallback(), NULL, net_log_.bound()); | 721 CompletionCallback(), NULL, net_log_.bound()); |
| 724 | 722 |
| 725 CreateSession(); | 723 CreateSessionWithNextProtos(); |
| 726 session_->quic_stream_factory()->set_require_confirmation(true); | 724 session_->quic_stream_factory()->set_require_confirmation(true); |
| 727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 725 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 728 | 726 |
| 729 scoped_ptr<HttpNetworkTransaction> trans( | 727 scoped_ptr<HttpNetworkTransaction> trans( |
| 730 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 728 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 731 TestCompletionCallback callback; | 729 TestCompletionCallback callback; |
| 732 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 730 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 733 EXPECT_EQ(ERR_IO_PENDING, rv); | 731 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 734 | 732 |
| 735 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 733 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 736 QuicSession::HANDSHAKE_CONFIRMED); | 734 QuicSession::HANDSHAKE_CONFIRMED); |
| 737 EXPECT_EQ(OK, callback.WaitForResult()); | 735 EXPECT_EQ(OK, callback.WaitForResult()); |
| 738 } | 736 } |
| 739 | 737 |
| 740 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 738 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
| 741 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 742 | |
| 743 // Alternate-protocol job | 739 // Alternate-protocol job |
| 744 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 740 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
| 745 MockRead quic_reads[] = { | 741 MockRead quic_reads[] = { |
| 746 MockRead(ASYNC, close->data(), close->length()), | 742 MockRead(ASYNC, close->data(), close->length()), |
| 747 MockRead(ASYNC, OK), // EOF | 743 MockRead(ASYNC, OK), // EOF |
| 748 }; | 744 }; |
| 749 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 745 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 750 NULL, 0); | 746 NULL, 0); |
| 751 socket_factory_.AddSocketDataProvider(&quic_data); | 747 socket_factory_.AddSocketDataProvider(&quic_data); |
| 752 | 748 |
| 753 // Main job which will succeed even though the alternate job fails. | 749 // Main job which will succeed even though the alternate job fails. |
| 754 MockRead http_reads[] = { | 750 MockRead http_reads[] = { |
| 755 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 751 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 756 MockRead("hello from http"), | 752 MockRead("hello from http"), |
| 757 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 753 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 758 MockRead(ASYNC, OK) | 754 MockRead(ASYNC, OK) |
| 759 }; | 755 }; |
| 760 | 756 |
| 761 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 757 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 762 NULL, 0); | 758 NULL, 0); |
| 763 socket_factory_.AddSocketDataProvider(&http_data); | 759 socket_factory_.AddSocketDataProvider(&http_data); |
| 764 | 760 |
| 765 CreateSession(); | 761 CreateSessionWithNextProtos(); |
| 766 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 762 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 767 SendRequestAndExpectHttpResponse("hello from http"); | 763 SendRequestAndExpectHttpResponse("hello from http"); |
| 768 ExpectBrokenAlternateProtocolMapping(); | 764 ExpectBrokenAlternateProtocolMapping(); |
| 769 } | 765 } |
| 770 | 766 |
| 771 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { | 767 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { |
| 772 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 773 | |
| 774 // Alternate-protocol job | 768 // Alternate-protocol job |
| 775 MockRead quic_reads[] = { | 769 MockRead quic_reads[] = { |
| 776 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 770 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 777 }; | 771 }; |
| 778 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 772 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 779 NULL, 0); | 773 NULL, 0); |
| 780 socket_factory_.AddSocketDataProvider(&quic_data); | 774 socket_factory_.AddSocketDataProvider(&quic_data); |
| 781 | 775 |
| 782 // Main job which will succeed even though the alternate job fails. | 776 // Main job which will succeed even though the alternate job fails. |
| 783 MockRead http_reads[] = { | 777 MockRead http_reads[] = { |
| 784 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 778 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 785 MockRead("hello from http"), | 779 MockRead("hello from http"), |
| 786 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 780 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 787 MockRead(ASYNC, OK) | 781 MockRead(ASYNC, OK) |
| 788 }; | 782 }; |
| 789 | 783 |
| 790 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 784 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 791 NULL, 0); | 785 NULL, 0); |
| 792 socket_factory_.AddSocketDataProvider(&http_data); | 786 socket_factory_.AddSocketDataProvider(&http_data); |
| 793 | 787 |
| 794 CreateSession(); | 788 CreateSessionWithNextProtos(); |
| 795 | 789 |
| 796 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 790 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 797 SendRequestAndExpectHttpResponse("hello from http"); | 791 SendRequestAndExpectHttpResponse("hello from http"); |
| 798 ExpectBrokenAlternateProtocolMapping(); | 792 ExpectBrokenAlternateProtocolMapping(); |
| 799 } | 793 } |
| 800 | 794 |
| 801 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { | 795 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
| 802 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 803 | |
| 804 // Alternate-protocol job | 796 // Alternate-protocol job |
| 805 MockRead quic_reads[] = { | 797 MockRead quic_reads[] = { |
| 806 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 798 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 807 }; | 799 }; |
| 808 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 800 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 809 NULL, 0); | 801 NULL, 0); |
| 810 socket_factory_.AddSocketDataProvider(&quic_data); | 802 socket_factory_.AddSocketDataProvider(&quic_data); |
| 811 | 803 |
| 812 AddHangingNonAlternateProtocolSocketData(); | 804 AddHangingNonAlternateProtocolSocketData(); |
| 813 | 805 |
| 814 // Final job that will proceed when the QUIC job fails. | 806 // Final job that will proceed when the QUIC job fails. |
| 815 MockRead http_reads[] = { | 807 MockRead http_reads[] = { |
| 816 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 808 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 817 MockRead("hello from http"), | 809 MockRead("hello from http"), |
| 818 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 810 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 819 MockRead(ASYNC, OK) | 811 MockRead(ASYNC, OK) |
| 820 }; | 812 }; |
| 821 | 813 |
| 822 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 814 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 823 NULL, 0); | 815 NULL, 0); |
| 824 socket_factory_.AddSocketDataProvider(&http_data); | 816 socket_factory_.AddSocketDataProvider(&http_data); |
| 825 | 817 |
| 826 CreateSession(); | 818 CreateSessionWithNextProtos(); |
| 827 | 819 |
| 828 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 820 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 829 | 821 |
| 830 SendRequestAndExpectHttpResponse("hello from http"); | 822 SendRequestAndExpectHttpResponse("hello from http"); |
| 831 | 823 |
| 832 ExpectBrokenAlternateProtocolMapping(); | 824 ExpectBrokenAlternateProtocolMapping(); |
| 833 | 825 |
| 834 EXPECT_TRUE(quic_data.at_read_eof()); | 826 EXPECT_TRUE(quic_data.at_read_eof()); |
| 835 EXPECT_TRUE(quic_data.at_write_eof()); | 827 EXPECT_TRUE(quic_data.at_write_eof()); |
| 836 } | 828 } |
| 837 | 829 |
| 838 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) { | 830 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) { |
| 839 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 840 | |
| 841 // Alternate-protocol job will fail before creating a QUIC session. | 831 // Alternate-protocol job will fail before creating a QUIC session. |
| 842 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); | 832 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); |
| 843 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, | 833 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, |
| 844 ERR_INTERNET_DISCONNECTED)); | 834 ERR_INTERNET_DISCONNECTED)); |
| 845 socket_factory_.AddSocketDataProvider(&quic_data); | 835 socket_factory_.AddSocketDataProvider(&quic_data); |
| 846 | 836 |
| 847 // Main job which will succeed even though the alternate job fails. | 837 // Main job which will succeed even though the alternate job fails. |
| 848 MockRead http_reads[] = { | 838 MockRead http_reads[] = { |
| 849 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 839 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 850 MockRead("hello from http"), | 840 MockRead("hello from http"), |
| 851 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 841 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 852 MockRead(ASYNC, OK) | 842 MockRead(ASYNC, OK) |
| 853 }; | 843 }; |
| 854 | 844 |
| 855 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 845 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 856 NULL, 0); | 846 NULL, 0); |
| 857 socket_factory_.AddSocketDataProvider(&http_data); | 847 socket_factory_.AddSocketDataProvider(&http_data); |
| 858 | 848 |
| 859 CreateSession(); | 849 CreateSessionWithNextProtos(); |
| 860 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 850 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 861 SendRequestAndExpectHttpResponse("hello from http"); | 851 SendRequestAndExpectHttpResponse("hello from http"); |
| 862 ExpectQuicAlternateProtocolMapping(); | 852 ExpectQuicAlternateProtocolMapping(); |
| 863 } | 853 } |
| 864 | 854 |
| 865 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { | 855 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
| 866 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | |
| 867 | |
| 868 MockQuicData mock_quic_data; | 856 MockQuicData mock_quic_data; |
| 869 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); | 857 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); |
| 870 mock_quic_data.AddWrite( | 858 mock_quic_data.AddWrite( |
| 871 ConstructRequestHeadersPacket(1, kStreamId5, true, true, | 859 ConstructRequestHeadersPacket(1, kStreamId5, true, true, |
| 872 GetRequestHeaders("GET", "http", "/"))); | 860 GetRequestHeaders("GET", "http", "/"))); |
| 873 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 861 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 874 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); | 862 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
| 875 | 863 |
| 876 // When the QUIC connection fails, we will try the request again over HTTP. | 864 // When the QUIC connection fails, we will try the request again over HTTP. |
| 877 MockRead http_reads[] = { | 865 MockRead http_reads[] = { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 893 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 881 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 894 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 882 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 895 AddressList address; | 883 AddressList address; |
| 896 host_resolver_.Resolve(info, | 884 host_resolver_.Resolve(info, |
| 897 DEFAULT_PRIORITY, | 885 DEFAULT_PRIORITY, |
| 898 &address, | 886 &address, |
| 899 CompletionCallback(), | 887 CompletionCallback(), |
| 900 NULL, | 888 NULL, |
| 901 net_log_.bound()); | 889 net_log_.bound()); |
| 902 | 890 |
| 903 CreateSession(); | 891 CreateSessionWithNextProtos(); |
| 904 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 892 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 905 SendRequestAndExpectHttpResponse("hello world"); | 893 SendRequestAndExpectHttpResponse("hello world"); |
| 906 } | 894 } |
| 907 | 895 |
| 908 } // namespace test | 896 } // namespace test |
| 909 } // namespace net | 897 } // namespace net |
| OLD | NEW |