| 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/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 QuicNetworkTransactionTest() | 188 QuicNetworkTransactionTest() |
| 189 : clock_(new MockClock), | 189 : clock_(new MockClock), |
| 190 maker_(GetParam(), 0, clock_, kDefaultServerHostName), | 190 maker_(GetParam(), 0, clock_, kDefaultServerHostName), |
| 191 cert_transparency_verifier_(new MultiLogCTVerifier()), | 191 cert_transparency_verifier_(new MultiLogCTVerifier()), |
| 192 test_network_quality_estimator_(new TestNetworkQualityEstimator()), | 192 test_network_quality_estimator_(new TestNetworkQualityEstimator()), |
| 193 ssl_config_service_(new SSLConfigServiceDefaults), | 193 ssl_config_service_(new SSLConfigServiceDefaults), |
| 194 proxy_service_(ProxyService::CreateDirect()), | 194 proxy_service_(ProxyService::CreateDirect()), |
| 195 auth_handler_factory_( | 195 auth_handler_factory_( |
| 196 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | 196 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 197 random_generator_(0), | 197 random_generator_(0), |
| 198 hanging_data_(nullptr, 0, nullptr, 0), | |
| 199 ssl_data_(ASYNC, OK) { | 198 ssl_data_(ASYNC, OK) { |
| 200 request_.method = "GET"; | 199 request_.method = "GET"; |
| 201 std::string url("https://"); | 200 std::string url("https://"); |
| 202 url.append(kDefaultServerHostName); | 201 url.append(kDefaultServerHostName); |
| 203 request_.url = GURL(url); | 202 request_.url = GURL(url); |
| 204 request_.load_flags = 0; | 203 request_.load_flags = 0; |
| 205 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 204 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 206 | 205 |
| 207 scoped_refptr<X509Certificate> cert( | 206 scoped_refptr<X509Certificate> cert( |
| 208 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 207 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 226 } | 225 } |
| 227 | 226 |
| 228 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 227 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 229 QuicPacketNumber num) { | 228 QuicPacketNumber num) { |
| 230 return maker_.MakeConnectionClosePacket(num); | 229 return maker_.MakeConnectionClosePacket(num); |
| 231 } | 230 } |
| 232 | 231 |
| 233 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 232 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 234 QuicPacketNumber largest_received, | 233 QuicPacketNumber largest_received, |
| 235 QuicPacketNumber least_unacked) { | 234 QuicPacketNumber least_unacked) { |
| 236 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); | 235 return maker_.MakeAckPacket(2, largest_received, least_unacked, |
| 236 least_unacked, true); |
| 237 } |
| 238 |
| 239 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 240 QuicPacketNumber largest_received, |
| 241 QuicPacketNumber least_unacked, |
| 242 QuicTestPacketMaker* maker) { |
| 243 return maker->MakeAckPacket(2, largest_received, least_unacked, |
| 244 least_unacked, true); |
| 237 } | 245 } |
| 238 | 246 |
| 239 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | 247 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( |
| 248 QuicPacketNumber packet_number, |
| 249 QuicPacketNumber largest_received, |
| 250 QuicPacketNumber ack_least_unacked, |
| 251 QuicPacketNumber stop_least_unacked) { |
| 252 return maker_.MakeAckPacket(packet_number, largest_received, |
| 253 ack_least_unacked, stop_least_unacked, true); |
| 254 } |
| 255 |
| 256 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( |
| 240 QuicPacketNumber num, | 257 QuicPacketNumber num, |
| 241 QuicTime::Delta delta_time_largest_observed, | 258 QuicTime::Delta delta_time_largest_observed, |
| 242 QuicPacketNumber largest_received, | 259 QuicPacketNumber largest_received, |
| 243 QuicPacketNumber least_unacked, | 260 QuicPacketNumber least_unacked, |
| 244 QuicErrorCode quic_error, | 261 QuicErrorCode quic_error, |
| 245 std::string& quic_error_details) { | 262 std::string& quic_error_details) { |
| 246 return maker_.MakeAckAndConnectionClosePacket( | 263 return maker_.MakeAckAndConnectionClosePacket( |
| 247 num, false, delta_time_largest_observed, largest_received, | 264 num, false, delta_time_largest_observed, largest_received, |
| 248 least_unacked, quic_error, quic_error_details); | 265 least_unacked, quic_error, quic_error_details); |
| 249 } | 266 } |
| 250 | 267 |
| 251 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( | 268 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( |
| 252 QuicPacketNumber num, | 269 QuicPacketNumber num, |
| 253 bool include_version, | 270 bool include_version, |
| 254 QuicStreamId stream_id, | 271 QuicStreamId stream_id, |
| 255 QuicRstStreamErrorCode error_code) { | 272 QuicRstStreamErrorCode error_code) { |
| 256 return maker_.MakeRstPacket(num, include_version, stream_id, error_code); | 273 return maker_.MakeRstPacket(num, include_version, stream_id, error_code); |
| 257 } | 274 } |
| 258 | 275 |
| 276 // Uses default QuicTestPacketMaker. |
| 259 SpdyHeaderBlock GetRequestHeaders(const std::string& method, | 277 SpdyHeaderBlock GetRequestHeaders(const std::string& method, |
| 260 const std::string& scheme, | 278 const std::string& scheme, |
| 261 const std::string& path) { | 279 const std::string& path) { |
| 262 return maker_.GetRequestHeaders(method, scheme, path); | 280 return GetRequestHeaders(method, scheme, path, maker_); |
| 281 } |
| 282 |
| 283 // Uses customized QuicTestPacketMaker. |
| 284 SpdyHeaderBlock GetRequestHeaders(const std::string& method, |
| 285 const std::string& scheme, |
| 286 const std::string& path, |
| 287 QuicTestPacketMaker& maker) { |
| 288 return maker.GetRequestHeaders(method, scheme, path); |
| 263 } | 289 } |
| 264 | 290 |
| 265 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { | 291 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { |
| 266 return maker_.GetResponseHeaders(status); | 292 return maker_.GetResponseHeaders(status); |
| 267 } | 293 } |
| 268 | 294 |
| 295 // Appends alt_svc headers in the response headers. |
| 296 SpdyHeaderBlock GetResponseHeaders(const std::string& status, |
| 297 const std::string& alt_svc) { |
| 298 return maker_.GetResponseHeaders(status, alt_svc); |
| 299 } |
| 300 |
| 269 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( | 301 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( |
| 270 QuicPacketNumber packet_number, | 302 QuicPacketNumber packet_number, |
| 271 QuicStreamId stream_id, | 303 QuicStreamId stream_id, |
| 272 bool should_include_version, | 304 bool should_include_version, |
| 273 bool fin, | 305 bool fin, |
| 274 QuicStreamOffset offset, | 306 QuicStreamOffset offset, |
| 275 base::StringPiece data) { | 307 base::StringPiece data) { |
| 276 return maker_.MakeDataPacket(packet_number, stream_id, | 308 return maker_.MakeDataPacket(packet_number, stream_id, |
| 277 should_include_version, fin, offset, data); | 309 should_include_version, fin, offset, data); |
| 278 } | 310 } |
| 279 | 311 |
| 280 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | 312 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 281 QuicPacketNumber packet_number, | 313 QuicPacketNumber packet_number, |
| 282 QuicStreamId stream_id, | 314 QuicStreamId stream_id, |
| 283 bool should_include_version, | 315 bool should_include_version, |
| 284 bool fin, | 316 bool fin, |
| 317 const SpdyHeaderBlock& headers, |
| 318 QuicStreamOffset* offset) { |
| 319 SpdyPriority priority = |
| 320 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); |
| 321 return maker_.MakeRequestHeadersPacketWithOffsetTracking( |
| 322 packet_number, stream_id, should_include_version, fin, priority, |
| 323 headers, offset); |
| 324 } |
| 325 |
| 326 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 327 QuicPacketNumber packet_number, |
| 328 QuicStreamId stream_id, |
| 329 bool should_include_version, |
| 330 bool fin, |
| 331 const SpdyHeaderBlock& headers, |
| 332 QuicStreamOffset* offset, |
| 333 QuicTestPacketMaker* maker) { |
| 334 SpdyPriority priority = |
| 335 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); |
| 336 return maker->MakeRequestHeadersPacketWithOffsetTracking( |
| 337 packet_number, stream_id, should_include_version, fin, priority, |
| 338 headers, offset); |
| 339 } |
| 340 |
| 341 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 342 QuicPacketNumber packet_number, |
| 343 QuicStreamId stream_id, |
| 344 bool should_include_version, |
| 345 bool fin, |
| 285 const SpdyHeaderBlock& headers) { | 346 const SpdyHeaderBlock& headers) { |
| 286 SpdyPriority priority = | 347 return ConstructRequestHeadersPacket(packet_number, stream_id, |
| 287 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | 348 should_include_version, fin, headers, |
| 288 return maker_.MakeRequestHeadersPacket(packet_number, stream_id, | 349 nullptr, &maker_); |
| 289 should_include_version, fin, | 350 } |
| 290 priority, headers); | 351 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 352 QuicPacketNumber packet_number, |
| 353 QuicStreamId stream_id, |
| 354 bool should_include_version, |
| 355 bool fin, |
| 356 const SpdyHeaderBlock& headers, |
| 357 QuicTestPacketMaker* maker) { |
| 358 return ConstructRequestHeadersPacket(packet_number, stream_id, |
| 359 should_include_version, fin, headers, |
| 360 nullptr, maker); |
| 291 } | 361 } |
| 292 | 362 |
| 293 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | 363 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 294 QuicPacketNumber packet_number, | 364 QuicPacketNumber packet_number, |
| 295 QuicStreamId stream_id, | 365 QuicStreamId stream_id, |
| 296 bool should_include_version, | 366 bool should_include_version, |
| 297 bool fin, | 367 bool fin, |
| 298 const SpdyHeaderBlock& headers) { | 368 const SpdyHeaderBlock& headers) { |
| 299 return maker_.MakeResponseHeadersPacket( | 369 return ConstructResponseHeadersPacket(packet_number, stream_id, |
| 300 packet_number, stream_id, should_include_version, fin, headers); | 370 should_include_version, fin, headers, |
| 371 nullptr, &maker_); |
| 372 } |
| 373 |
| 374 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 375 QuicPacketNumber packet_number, |
| 376 QuicStreamId stream_id, |
| 377 bool should_include_version, |
| 378 bool fin, |
| 379 const SpdyHeaderBlock& headers, |
| 380 QuicTestPacketMaker* maker) { |
| 381 return ConstructResponseHeadersPacket(packet_number, stream_id, |
| 382 should_include_version, fin, headers, |
| 383 nullptr, maker); |
| 384 } |
| 385 |
| 386 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 387 QuicPacketNumber packet_number, |
| 388 QuicStreamId stream_id, |
| 389 bool should_include_version, |
| 390 bool fin, |
| 391 const SpdyHeaderBlock& headers, |
| 392 QuicStreamOffset* offset) { |
| 393 return maker_.MakeResponseHeadersPacketWithOffsetTracking( |
| 394 packet_number, stream_id, should_include_version, fin, headers, offset); |
| 395 } |
| 396 |
| 397 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 398 QuicPacketNumber packet_number, |
| 399 QuicStreamId stream_id, |
| 400 bool should_include_version, |
| 401 bool fin, |
| 402 const SpdyHeaderBlock& headers, |
| 403 QuicStreamOffset* offset, |
| 404 QuicTestPacketMaker* maker) { |
| 405 return maker->MakeResponseHeadersPacketWithOffsetTracking( |
| 406 packet_number, stream_id, should_include_version, fin, headers, offset); |
| 301 } | 407 } |
| 302 | 408 |
| 303 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); } | 409 void CreateSession() { CreateSessionWithFactory(&socket_factory_, false); } |
| 304 | 410 |
| 305 void CreateSessionWithNextProtos() { | 411 void CreateSessionWithNextProtos() { |
| 306 CreateSessionWithFactory(&socket_factory_, true); | 412 CreateSessionWithFactory(&socket_factory_, true); |
| 307 } | 413 } |
| 308 | 414 |
| 309 // If |use_next_protos| is true, enables SPDY and QUIC. | 415 // If |use_next_protos| is true, enables SPDY and QUIC. |
| 310 void CreateSessionWithFactory(ClientSocketFactory* socket_factory, | 416 void CreateSessionWithFactory(ClientSocketFactory* socket_factory, |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 | 532 |
| 427 void ExpectQuicAlternateProtocolMapping() { | 533 void ExpectQuicAlternateProtocolMapping() { |
| 428 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 534 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
| 429 const AlternativeServiceVector alternative_service_vector = | 535 const AlternativeServiceVector alternative_service_vector = |
| 430 http_server_properties_.GetAlternativeServices(origin); | 536 http_server_properties_.GetAlternativeServices(origin); |
| 431 EXPECT_EQ(1u, alternative_service_vector.size()); | 537 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 432 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); | 538 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); |
| 433 } | 539 } |
| 434 | 540 |
| 435 void AddHangingNonAlternateProtocolSocketData() { | 541 void AddHangingNonAlternateProtocolSocketData() { |
| 542 scoped_ptr<StaticSocketDataProvider> hanging_data; |
| 543 hanging_data.reset(new StaticSocketDataProvider()); |
| 436 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 544 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 437 hanging_data_.set_connect_data(hanging_connect); | 545 hanging_data->set_connect_data(hanging_connect); |
| 438 socket_factory_.AddSocketDataProvider(&hanging_data_); | 546 hanging_data_.push_back(std::move(hanging_data)); |
| 547 socket_factory_.AddSocketDataProvider(hanging_data_.back().get()); |
| 439 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 548 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 440 } | 549 } |
| 441 | 550 |
| 442 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. | 551 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. |
| 443 QuicTestPacketMaker maker_; | 552 QuicTestPacketMaker maker_; |
| 444 scoped_ptr<HttpNetworkSession> session_; | 553 scoped_ptr<HttpNetworkSession> session_; |
| 445 MockClientSocketFactory socket_factory_; | 554 MockClientSocketFactory socket_factory_; |
| 446 ProofVerifyDetailsChromium verify_details_; | 555 ProofVerifyDetailsChromium verify_details_; |
| 447 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 556 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 448 MockHostResolver host_resolver_; | 557 MockHostResolver host_resolver_; |
| 449 MockCertVerifier cert_verifier_; | 558 MockCertVerifier cert_verifier_; |
| 450 TransportSecurityState transport_security_state_; | 559 TransportSecurityState transport_security_state_; |
| 451 scoped_ptr<CTVerifier> cert_transparency_verifier_; | 560 scoped_ptr<CTVerifier> cert_transparency_verifier_; |
| 452 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_; | 561 scoped_ptr<TestNetworkQualityEstimator> test_network_quality_estimator_; |
| 453 TestRTTObserver rtt_observer_; | 562 TestRTTObserver rtt_observer_; |
| 454 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 563 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| 455 scoped_ptr<ProxyService> proxy_service_; | 564 scoped_ptr<ProxyService> proxy_service_; |
| 456 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; | 565 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
| 457 MockRandom random_generator_; | 566 MockRandom random_generator_; |
| 458 HttpServerPropertiesImpl http_server_properties_; | 567 HttpServerPropertiesImpl http_server_properties_; |
| 459 HttpNetworkSession::Params params_; | 568 HttpNetworkSession::Params params_; |
| 460 HttpRequestInfo request_; | 569 HttpRequestInfo request_; |
| 461 BoundTestNetLog net_log_; | 570 BoundTestNetLog net_log_; |
| 462 StaticSocketDataProvider hanging_data_; | 571 std::vector<scoped_ptr<StaticSocketDataProvider>> hanging_data_; |
| 463 SSLSocketDataProvider ssl_data_; | 572 SSLSocketDataProvider ssl_data_; |
| 464 | 573 |
| 465 private: | 574 private: |
| 466 void SendRequestAndExpectQuicResponseMaybeFromProxy( | 575 void SendRequestAndExpectQuicResponseMaybeFromProxy( |
| 467 const std::string& expected, | 576 const std::string& expected, |
| 468 bool used_proxy, | 577 bool used_proxy, |
| 469 uint16_t port) { | 578 uint16_t port) { |
| 470 scoped_ptr<HttpNetworkTransaction> trans( | 579 scoped_ptr<HttpNetworkTransaction> trans( |
| 471 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 580 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 472 ProxyHeadersHandler proxy_headers_handler; | 581 ProxyHeadersHandler proxy_headers_handler; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 } | 737 } |
| 629 | 738 |
| 630 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { | 739 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { |
| 631 params_.origin_to_force_quic_on = | 740 params_.origin_to_force_quic_on = |
| 632 HostPortPair::FromString("mail.example.com:443"); | 741 HostPortPair::FromString("mail.example.com:443"); |
| 633 | 742 |
| 634 MockQuicData mock_quic_data1; | 743 MockQuicData mock_quic_data1; |
| 635 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 744 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 636 | 745 |
| 637 MockQuicData mock_quic_data2; | 746 MockQuicData mock_quic_data2; |
| 747 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 638 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 748 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 639 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 749 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 640 | 750 |
| 641 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); | 751 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); |
| 642 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); | 752 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); |
| 643 | 753 |
| 644 CreateSession(); | 754 CreateSession(); |
| 645 | 755 |
| 646 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count()); | 756 EXPECT_EQ(0U, test_network_quality_estimator_->watcher_count()); |
| 647 for (size_t i = 0; i < 2; ++i) { | 757 for (size_t i = 0; i < 2; ++i) { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 socket_factory_.AddSocketDataProvider(&http_data); | 871 socket_factory_.AddSocketDataProvider(&http_data); |
| 762 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 872 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 763 | 873 |
| 764 CreateSessionWithNextProtos(); | 874 CreateSessionWithNextProtos(); |
| 765 | 875 |
| 766 SendRequestAndExpectHttpResponse("hello world"); | 876 SendRequestAndExpectHttpResponse("hello world"); |
| 767 SendRequestAndExpectHttpResponse("hello world"); | 877 SendRequestAndExpectHttpResponse("hello world"); |
| 768 } | 878 } |
| 769 | 879 |
| 770 // When multiple alternative services are advertised, | 880 // When multiple alternative services are advertised, |
| 771 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to | 881 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative |
| 772 // Job. This is what the following test verifies. | 882 // service which uses existing QUIC session if available. If no existing QUIC |
| 773 // TODO(bnc): Update this test when multiple alternative services are handled | 883 // session can be used, use the first alternative service from the list. |
| 774 // properly. | 884 TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) { |
| 775 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) { | |
| 776 MockRead http_reads[] = { | 885 MockRead http_reads[] = { |
| 777 MockRead("HTTP/1.1 200 OK\r\n"), | 886 MockRead("HTTP/1.1 200 OK\r\n"), |
| 778 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), | 887 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":444\"\r\n\r\n"), |
| 779 MockRead("hello world"), | 888 MockRead("hello world"), |
| 780 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 889 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 781 MockRead(ASYNC, OK)}; | 890 MockRead(ASYNC, OK)}; |
| 782 | 891 |
| 783 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 892 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 784 0); | 893 0); |
| 785 socket_factory_.AddSocketDataProvider(&http_data); | 894 socket_factory_.AddSocketDataProvider(&http_data); |
| 786 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 895 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 787 | 896 |
| 897 QuicStreamOffset request_header_offset = 0; |
| 898 QuicStreamOffset response_header_offset = 0; |
| 899 // First QUIC request data. |
| 900 // Open a session to foo.example.com:443 using the first entry of the |
| 901 // alternative service list. |
| 788 MockQuicData mock_quic_data; | 902 MockQuicData mock_quic_data; |
| 789 mock_quic_data.AddWrite( | 903 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 790 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 904 1, kClientDataStreamId1, true, true, |
| 791 GetRequestHeaders("GET", "https", "/"))); | 905 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 906 |
| 907 std::string alt_svc_list = |
| 908 "quic=\"mail.example.com:444\", quic=\"foo.example.com:443\", " |
| 909 "quic=\"bar.example.com:445\""; |
| 792 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 910 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 793 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 911 1, kClientDataStreamId1, false, false, |
| 912 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); |
| 794 mock_quic_data.AddRead( | 913 mock_quic_data.AddRead( |
| 795 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 914 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 796 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 915 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 916 |
| 917 // Second QUIC request data. |
| 918 // Connection pooling, using existing session, no need to include version |
| 919 // as version negotiation has been completed. |
| 920 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 921 3, kClientDataStreamId2, false, true, |
| 922 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 923 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 924 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), |
| 925 &response_header_offset)); |
| 926 mock_quic_data.AddRead( |
| 927 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!")); |
| 928 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); |
| 797 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 929 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 798 mock_quic_data.AddRead(ASYNC, 0); // EOF | 930 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 799 | 931 |
| 800 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 932 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 801 | 933 |
| 802 AddHangingNonAlternateProtocolSocketData(); | 934 AddHangingNonAlternateProtocolSocketData(); |
| 803 CreateSessionWithNextProtos(); | 935 CreateSessionWithNextProtos(); |
| 804 | 936 |
| 805 SendRequestAndExpectHttpResponse("hello world"); | 937 SendRequestAndExpectHttpResponse("hello world"); |
| 938 |
| 806 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 939 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 940 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 941 } |
| 942 |
| 943 // When multiple alternative services that has existing QUIC session. |
| 944 // HttpStreamFactoryImpl::RequestStreamInternal() should select the first |
| 945 // alternative service which uses existing QUIC session. |
| 946 TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) { |
| 947 MockRead http_reads[] = { |
| 948 MockRead("HTTP/1.1 200 OK\r\n"), |
| 949 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":446\"\r\n\r\n"), |
| 950 MockRead("hello world"), |
| 951 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 952 MockRead(ASYNC, OK)}; |
| 953 |
| 954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 955 0); |
| 956 socket_factory_.AddSocketDataProvider(&http_data); |
| 957 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 958 |
| 959 QuicStreamOffset request_header_offset = 0; |
| 960 QuicStreamOffset response_header_offset = 0; |
| 961 |
| 962 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); |
| 963 |
| 964 MockQuicData mock_quic_data; |
| 965 MockQuicData mock_quic_data2; |
| 966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 967 // First QUIC request data. |
| 968 // Open a QUIC session to foo.example.com:443. |
| 969 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 970 1, kClientDataStreamId1, true, true, |
| 971 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 972 |
| 973 std::string alt_svc_list = |
| 974 "quic=\"bar.example.com:444\", quic=\"frog.example.com:445\", " |
| 975 "quic=\"mail.example.com:446\""; |
| 976 // Response header from the server resets the alt_svc list for the origin. |
| 977 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 978 1, kClientDataStreamId1, false, false, |
| 979 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); |
| 980 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 981 true, 0, "hello from foo!")); |
| 982 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 983 |
| 984 // Second QUIC request data. |
| 985 // Existing QUIC session to foo.example.com is not viable from the updated |
| 986 // alt_svc. Unable to pool the existing QUIC session. |
| 987 // Open a new QUIC session to bar.example.com:443. |
| 988 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket( |
| 989 1, kClientDataStreamId1, true, true, |
| 990 GetRequestHeaders("GET", "https", "/"), &maker)); |
| 991 alt_svc_list = |
| 992 "quic=\"foo.example.com:443\", quic=\"mail.example.com:446\", " |
| 993 "quic=\"bar.example.com:444\""; |
| 994 // Response header from the server resets the alt_svc list for the origin. |
| 995 mock_quic_data2.AddRead(ConstructResponseHeadersPacket( |
| 996 1, kClientDataStreamId1, false, false, |
| 997 GetResponseHeaders("200 OK", alt_svc_list), &maker)); |
| 998 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 999 true, 0, "hello from bar!")); |
| 1000 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker)); |
| 1001 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1002 mock_quic_data2.AddRead(ASYNC, 0); // EOF |
| 1003 |
| 1004 // Third QUIC request data. |
| 1005 // Connection pooling, using the first existing session to foo.example.com |
| 1006 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1007 3, kClientDataStreamId2, false, true, |
| 1008 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 1009 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1010 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), |
| 1011 &response_header_offset)); |
| 1012 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, |
| 1013 true, 0, "hello from foo!")); |
| 1014 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); |
| 1015 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1016 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1017 |
| 1018 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1019 AddHangingNonAlternateProtocolSocketData(); |
| 1020 |
| 1021 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); |
| 1022 |
| 1023 AddHangingNonAlternateProtocolSocketData(); |
| 1024 |
| 1025 CreateSessionWithNextProtos(); |
| 1026 |
| 1027 SendRequestAndExpectHttpResponse("hello world"); |
| 1028 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); |
| 1029 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444); |
| 1030 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); |
| 1031 } |
| 1032 |
| 1033 // Multiple origins have listed the same alternative services. When there's a |
| 1034 // existing QUIC session opened by a request to other origin, |
| 1035 // if the cert is valid, should select this QUIC session to make the request |
| 1036 // if this is also the first existing QUIC session. |
| 1037 TEST_P(QuicNetworkTransactionTest, |
| 1038 UseSharedExistingAlternativeServiceForQuicWithValidCert) { |
| 1039 // Default cert is valid for the following origins: |
| 1040 // mail.example.com, mail.example.org, and www.example.org. |
| 1041 |
| 1042 // HTTP data for request to mail.example.com. |
| 1043 MockRead http_reads[] = { |
| 1044 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1045 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), |
| 1046 MockRead("hello world from mail.example.com"), |
| 1047 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1048 MockRead(ASYNC, OK)}; |
| 1049 |
| 1050 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1051 0); |
| 1052 socket_factory_.AddSocketDataProvider(&http_data); |
| 1053 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1054 |
| 1055 // HTTP data for request to mail.example.org. |
| 1056 MockRead http_reads2[] = { |
| 1057 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1058 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"), |
| 1059 MockRead("hello world from mail.example.org"), |
| 1060 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1061 MockRead(ASYNC, OK)}; |
| 1062 |
| 1063 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), |
| 1064 nullptr, 0); |
| 1065 socket_factory_.AddSocketDataProvider(&http_data2); |
| 1066 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1067 |
| 1068 QuicStreamOffset request_header_offset = 0; |
| 1069 QuicStreamOffset response_header_offset = 0; |
| 1070 |
| 1071 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); |
| 1072 maker.set_hostname("mail.example.org"); |
| 1073 MockQuicData mock_quic_data; |
| 1074 |
| 1075 // First QUIC request data. |
| 1076 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1077 1, kClientDataStreamId1, true, true, |
| 1078 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 1079 |
| 1080 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1081 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"), |
| 1082 &response_header_offset)); |
| 1083 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 1084 true, 0, "hello from mail QUIC!")); |
| 1085 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1086 |
| 1087 // Second QUIC request data. |
| 1088 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1089 3, kClientDataStreamId2, false, true, |
| 1090 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset, |
| 1091 &maker)); |
| 1092 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1093 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), |
| 1094 &response_header_offset)); |
| 1095 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, |
| 1096 true, 0, "hello from mail QUIC!")); |
| 1097 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); |
| 1098 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1099 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1100 |
| 1101 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1102 AddHangingNonAlternateProtocolSocketData(); |
| 1103 |
| 1104 CreateSessionWithNextProtos(); |
| 1105 |
| 1106 // Send two HTTP requests, responses set up alt-svc lists for the origins. |
| 1107 SendRequestAndExpectHttpResponse("hello world from mail.example.com"); |
| 1108 request_.url = GURL("https://mail.example.org/"); |
| 1109 SendRequestAndExpectHttpResponse("hello world from mail.example.org"); |
| 1110 |
| 1111 // Open a QUIC session to mail.example.com:443 when making request |
| 1112 // to mail.example.com. |
| 1113 request_.url = GURL("https://mail.example.com/"); |
| 1114 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1115 |
| 1116 // Uses the existing QUIC session when making request to mail.example.org. |
| 1117 request_.url = GURL("https://mail.example.org/"); |
| 1118 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1119 } |
| 1120 |
| 1121 // Multiple origins have listed the same alternative services. When there's a |
| 1122 // existing QUIC session opened by a request to other origin, |
| 1123 // if the cert is NOT valid, should ignore this QUIC session. |
| 1124 TEST_P(QuicNetworkTransactionTest, |
| 1125 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) { |
| 1126 // Default cert is only valid for the following origins: |
| 1127 // mail.example.com, mail.example.org, and www.example.org. |
| 1128 // NOT valid for docs.example.org. |
| 1129 |
| 1130 // HTTP data for request to mail.example.com. |
| 1131 MockRead http_reads[] = { |
| 1132 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1133 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), |
| 1134 MockRead("hello world from mail.example.com"), |
| 1135 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1136 MockRead(ASYNC, OK)}; |
| 1137 |
| 1138 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1139 0); |
| 1140 socket_factory_.AddSocketDataProvider(&http_data); |
| 1141 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1142 |
| 1143 // HTTP data for request to docs.example.org. |
| 1144 MockRead http_reads2[] = { |
| 1145 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1146 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"), |
| 1147 MockRead("hello world from docs.example.org"), |
| 1148 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1149 MockRead(ASYNC, OK)}; |
| 1150 |
| 1151 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), |
| 1152 nullptr, 0); |
| 1153 socket_factory_.AddSocketDataProvider(&http_data2); |
| 1154 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1155 |
| 1156 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); |
| 1157 maker.set_hostname("docs.example.org"); |
| 1158 MockQuicData mock_quic_data; |
| 1159 MockQuicData mock_quic_data2; |
| 1160 |
| 1161 // Adding a valid cert for *.example.org but not mail.example.com. |
| 1162 ProofVerifyDetailsChromium verify_details; |
| 1163 scoped_refptr<X509Certificate> cert( |
| 1164 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 1165 verify_details.cert_verify_result.verified_cert = cert; |
| 1166 verify_details.cert_verify_result.is_issued_by_known_root = true; |
| 1167 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1168 |
| 1169 // First QUIC request data. |
| 1170 mock_quic_data.AddWrite( |
| 1171 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1172 GetRequestHeaders("GET", "https", "/"))); |
| 1173 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1174 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1175 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 1176 true, 0, "hello from mail QUIC!")); |
| 1177 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1178 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1179 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1180 |
| 1181 // First QUIC request data. |
| 1182 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket( |
| 1183 1, kClientDataStreamId1, true, true, |
| 1184 GetRequestHeaders("GET", "https", "/", maker), &maker)); |
| 1185 mock_quic_data2.AddRead( |
| 1186 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, |
| 1187 GetResponseHeaders("200 OK"), &maker)); |
| 1188 mock_quic_data2.AddRead(ConstructDataPacket( |
| 1189 2, kClientDataStreamId1, false, true, 0, "hello from docs QUIC!")); |
| 1190 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker)); |
| 1191 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1192 mock_quic_data2.AddRead(ASYNC, 0); // EOF |
| 1193 |
| 1194 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1195 AddHangingNonAlternateProtocolSocketData(); |
| 1196 |
| 1197 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); |
| 1198 AddHangingNonAlternateProtocolSocketData(); |
| 1199 |
| 1200 CreateSessionWithNextProtos(); |
| 1201 |
| 1202 // Send HTTP requests, responses set up the alt-svc lists for the origins. |
| 1203 SendRequestAndExpectHttpResponse("hello world from mail.example.com"); |
| 1204 request_.url = GURL("https://docs.example.org/"); |
| 1205 SendRequestAndExpectHttpResponse("hello world from docs.example.org"); |
| 1206 |
| 1207 // Open a QUIC session to mail.example.com:443 when making request |
| 1208 // to mail.example.com. |
| 1209 request_.url = GURL("https://mail.example.com/"); |
| 1210 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1211 |
| 1212 // Open another new QUIC session to docs.example.org:444. |
| 1213 request_.url = GURL("https://docs.example.org/"); |
| 1214 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444); |
| 807 } | 1215 } |
| 808 | 1216 |
| 809 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { | 1217 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { |
| 810 MockRead http_reads[] = { | 1218 MockRead http_reads[] = { |
| 811 MockRead("HTTP/1.1 200 OK\r\n"), | 1219 MockRead("HTTP/1.1 200 OK\r\n"), |
| 812 MockRead(kQuicAlternativeServiceDifferentPortHeader), | 1220 MockRead(kQuicAlternativeServiceDifferentPortHeader), |
| 813 MockRead("hello world"), | 1221 MockRead("hello world"), |
| 814 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1222 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 815 MockRead(ASYNC, OK)}; | 1223 MockRead(ASYNC, OK)}; |
| 816 | 1224 |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1840 request_.url = GURL("https://www.example.org:443"); | 2248 request_.url = GURL("https://www.example.org:443"); |
| 1841 AddHangingNonAlternateProtocolSocketData(); | 2249 AddHangingNonAlternateProtocolSocketData(); |
| 1842 CreateSessionWithNextProtos(); | 2250 CreateSessionWithNextProtos(); |
| 1843 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 2251 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1844 SendRequestAndExpectQuicResponse("hello!"); | 2252 SendRequestAndExpectQuicResponse("hello!"); |
| 1845 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); | 2253 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); |
| 1846 } | 2254 } |
| 1847 | 2255 |
| 1848 } // namespace test | 2256 } // namespace test |
| 1849 } // namespace net | 2257 } // namespace net |
| OLD | NEW |