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