Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 } | 227 } |
| 228 | 228 |
| 229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 230 QuicPacketNumber num) { | 230 QuicPacketNumber num) { |
| 231 return maker_.MakeConnectionClosePacket(num); | 231 return maker_.MakeConnectionClosePacket(num); |
| 232 } | 232 } |
| 233 | 233 |
| 234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 235 QuicPacketNumber largest_received, | 235 QuicPacketNumber largest_received, |
| 236 QuicPacketNumber least_unacked) { | 236 QuicPacketNumber least_unacked) { |
| 237 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); | 237 return maker_.MakeAckPacket(2, largest_received, least_unacked, |
| 238 least_unacked, true); | |
| 239 } | |
| 240 | |
| 241 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | |
| 242 QuicPacketNumber largest_received, | |
| 243 QuicPacketNumber least_unacked, | |
| 244 QuicTestPacketMaker* maker) { | |
| 245 return maker->MakeAckPacket(2, largest_received, least_unacked, | |
| 246 least_unacked, true); | |
| 238 } | 247 } |
| 239 | 248 |
| 240 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | 249 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( |
| 250 QuicPacketNumber packet_number, | |
| 251 QuicPacketNumber largest_received, | |
| 252 QuicPacketNumber ack_least_unacked, | |
| 253 QuicPacketNumber stop_least_unacked) { | |
| 254 return maker_.MakeAckPacket(packet_number, largest_received, | |
| 255 ack_least_unacked, stop_least_unacked, true); | |
| 256 } | |
| 257 | |
| 258 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | |
| 241 QuicPacketNumber num, | 259 QuicPacketNumber num, |
| 242 QuicTime::Delta delta_time_largest_observed, | 260 QuicTime::Delta delta_time_largest_observed, |
| 243 QuicPacketNumber largest_received, | 261 QuicPacketNumber largest_received, |
| 244 QuicPacketNumber least_unacked, | 262 QuicPacketNumber least_unacked, |
| 245 QuicErrorCode quic_error, | 263 QuicErrorCode quic_error, |
| 246 std::string& quic_error_details) { | 264 std::string& quic_error_details) { |
| 247 return maker_.MakeAckAndConnectionClosePacket( | 265 return maker_.MakeAckAndConnectionClosePacket( |
| 248 num, false, delta_time_largest_observed, largest_received, | 266 num, false, delta_time_largest_observed, largest_received, |
| 249 least_unacked, quic_error, quic_error_details); | 267 least_unacked, quic_error, quic_error_details); |
| 250 } | 268 } |
| 251 | 269 |
| 252 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( | 270 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( |
| 253 QuicPacketNumber num, | 271 QuicPacketNumber num, |
| 254 bool include_version, | 272 bool include_version, |
| 255 QuicStreamId stream_id, | 273 QuicStreamId stream_id, |
| 256 QuicRstStreamErrorCode error_code) { | 274 QuicRstStreamErrorCode error_code) { |
| 257 return maker_.MakeRstPacket(num, include_version, stream_id, error_code); | 275 return maker_.MakeRstPacket(num, include_version, stream_id, error_code); |
| 258 } | 276 } |
| 259 | 277 |
| 260 SpdyHeaderBlock GetRequestHeaders(const std::string& method, | 278 SpdyHeaderBlock GetRequestHeaders(const std::string& method, |
| 261 const std::string& scheme, | 279 const std::string& scheme, |
| 262 const std::string& path) { | 280 const std::string& path) { |
| 263 return maker_.GetRequestHeaders(method, scheme, path); | 281 return maker_.GetRequestHeaders(method, scheme, path); |
| 264 } | 282 } |
| 265 | 283 |
| 266 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { | 284 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { |
| 267 return maker_.GetResponseHeaders(status); | 285 return maker_.GetResponseHeaders(status); |
| 268 } | 286 } |
| 269 | 287 |
| 288 SpdyHeaderBlock GetResponseHeaders(const std::string& status, | |
| 289 const std::string& alt_svc) { | |
| 290 return maker_.GetResponseHeaders(status, alt_svc); | |
| 291 } | |
| 292 | |
| 270 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( | 293 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( |
| 271 QuicPacketNumber packet_number, | 294 QuicPacketNumber packet_number, |
| 272 QuicStreamId stream_id, | 295 QuicStreamId stream_id, |
| 273 bool should_include_version, | 296 bool should_include_version, |
| 274 bool fin, | 297 bool fin, |
| 275 QuicStreamOffset offset, | 298 QuicStreamOffset offset, |
| 276 base::StringPiece data) { | 299 base::StringPiece data) { |
| 277 return maker_.MakeDataPacket(packet_number, stream_id, | 300 return maker_.MakeDataPacket(packet_number, stream_id, |
| 278 should_include_version, fin, offset, data); | 301 should_include_version, fin, offset, data); |
| 279 } | 302 } |
| 280 | 303 |
| 281 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | 304 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 282 QuicPacketNumber packet_number, | 305 QuicPacketNumber packet_number, |
| 283 QuicStreamId stream_id, | 306 QuicStreamId stream_id, |
| 284 bool should_include_version, | 307 bool should_include_version, |
| 285 bool fin, | 308 bool fin, |
| 309 const SpdyHeaderBlock& headers, | |
| 310 QuicStreamOffset* offset) { | |
| 311 SpdyPriority priority = | |
| 312 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | |
| 313 return maker_.MakeRequestHeadersPacketWithOffsetTracking( | |
| 314 packet_number, stream_id, should_include_version, fin, priority, | |
| 315 headers, offset); | |
| 316 } | |
| 317 | |
| 318 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | |
| 319 QuicPacketNumber packet_number, | |
| 320 QuicStreamId stream_id, | |
| 321 bool should_include_version, | |
| 322 bool fin, | |
| 323 const SpdyHeaderBlock& headers, | |
| 324 QuicStreamOffset* offset, | |
| 325 QuicTestPacketMaker* maker) { | |
| 326 SpdyPriority priority = | |
| 327 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | |
| 328 return maker->MakeRequestHeadersPacketWithOffsetTracking( | |
| 329 packet_number, stream_id, should_include_version, fin, priority, | |
| 330 headers, offset); | |
| 331 } | |
| 332 | |
| 333 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | |
| 334 QuicPacketNumber packet_number, | |
| 335 QuicStreamId stream_id, | |
| 336 bool should_include_version, | |
| 337 bool fin, | |
| 286 const SpdyHeaderBlock& headers) { | 338 const SpdyHeaderBlock& headers) { |
| 287 SpdyPriority priority = | 339 return ConstructRequestHeadersPacket(packet_number, stream_id, |
| 288 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | 340 should_include_version, fin, headers, |
| 289 return maker_.MakeRequestHeadersPacket(packet_number, stream_id, | 341 nullptr, &maker_); |
| 290 should_include_version, fin, | 342 } |
| 291 priority, headers); | 343 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 344 QuicPacketNumber packet_number, | |
| 345 QuicStreamId stream_id, | |
| 346 bool should_include_version, | |
| 347 bool fin, | |
| 348 const SpdyHeaderBlock& headers, | |
| 349 QuicTestPacketMaker* maker) { | |
| 350 return ConstructRequestHeadersPacket(packet_number, stream_id, | |
| 351 should_include_version, fin, headers, | |
| 352 nullptr, maker); | |
| 292 } | 353 } |
| 293 | 354 |
| 294 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | 355 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 295 QuicPacketNumber packet_number, | 356 QuicPacketNumber packet_number, |
| 296 QuicStreamId stream_id, | 357 QuicStreamId stream_id, |
| 297 bool should_include_version, | 358 bool should_include_version, |
| 298 bool fin, | 359 bool fin, |
| 299 const SpdyHeaderBlock& headers) { | 360 const SpdyHeaderBlock& headers) { |
| 300 return maker_.MakeResponseHeadersPacket( | 361 return ConstructResponseHeadersPacket(packet_number, stream_id, |
| 301 packet_number, stream_id, should_include_version, fin, headers); | 362 should_include_version, fin, headers, |
| 363 nullptr, &maker_); | |
| 364 } | |
| 365 | |
| 366 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | |
| 367 QuicPacketNumber packet_number, | |
| 368 QuicStreamId stream_id, | |
| 369 bool should_include_version, | |
| 370 bool fin, | |
| 371 const SpdyHeaderBlock& headers, | |
| 372 QuicTestPacketMaker* maker) { | |
| 373 return ConstructResponseHeadersPacket(packet_number, stream_id, | |
| 374 should_include_version, fin, headers, | |
| 375 nullptr, maker); | |
| 376 } | |
| 377 | |
| 378 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | |
| 379 QuicPacketNumber packet_number, | |
| 380 QuicStreamId stream_id, | |
| 381 bool should_include_version, | |
| 382 bool fin, | |
| 383 const SpdyHeaderBlock& headers, | |
| 384 QuicStreamOffset* offset) { | |
| 385 return maker_.MakeResponseHeadersPacketWithOffsetTracking( | |
| 386 packet_number, stream_id, should_include_version, fin, headers, offset); | |
| 387 } | |
| 388 | |
| 389 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | |
| 390 QuicPacketNumber packet_number, | |
| 391 QuicStreamId stream_id, | |
| 392 bool should_include_version, | |
| 393 bool fin, | |
| 394 const SpdyHeaderBlock& headers, | |
| 395 QuicStreamOffset* offset, | |
| 396 QuicTestPacketMaker* maker) { | |
| 397 return maker->MakeResponseHeadersPacketWithOffsetTracking( | |
| 398 packet_number, stream_id, should_include_version, fin, headers, offset); | |
| 302 } | 399 } |
| 303 | 400 |
| 304 void CreateSession() { | 401 void CreateSession() { |
| 305 CreateSessionWithFactory(&socket_factory_, false); | 402 CreateSessionWithFactory(&socket_factory_, false); |
| 306 } | 403 } |
| 307 | 404 |
| 308 void CreateSessionWithNextProtos() { | 405 void CreateSessionWithNextProtos() { |
| 309 CreateSessionWithFactory(&socket_factory_, true); | 406 CreateSessionWithFactory(&socket_factory_, true); |
| 310 } | 407 } |
| 311 | 408 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 435 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); | 532 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); |
| 436 } | 533 } |
| 437 | 534 |
| 438 void AddHangingNonAlternateProtocolSocketData() { | 535 void AddHangingNonAlternateProtocolSocketData() { |
| 439 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 536 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 440 hanging_data_.set_connect_data(hanging_connect); | 537 hanging_data_.set_connect_data(hanging_connect); |
| 441 socket_factory_.AddSocketDataProvider(&hanging_data_); | 538 socket_factory_.AddSocketDataProvider(&hanging_data_); |
| 442 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 539 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 443 } | 540 } |
| 444 | 541 |
| 542 void AddNewHangingNonAlternateProtocolSocketData() { | |
| 543 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | |
| 544 StaticSocketDataProvider* hanging_data = new StaticSocketDataProvider(); | |
|
Ryan Hamilton
2015/12/30 21:51:42
I think this leaks memory, doesn't it?
Zhongyi Shi
2016/01/05 22:54:20
Ahhh, yes. I fix it with passing the hanging_data
Ryan Hamilton
2016/01/05 23:51:58
Instead of requiring the caller to pass in a new D
Zhongyi Shi
2016/01/06 02:31:40
The StaticSocketDataProvider is DISALLOW_COPY_AND_
Ryan Hamilton
2016/01/06 17:06:23
That's true, but you can do
std::vector<scoped_p
| |
| 545 hanging_data->set_connect_data(hanging_connect); | |
| 546 socket_factory_.AddSocketDataProvider(hanging_data); | |
| 547 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 548 } | |
| 549 | |
| 445 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. | 550 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. |
| 446 QuicTestPacketMaker maker_; | 551 QuicTestPacketMaker maker_; |
| 447 scoped_ptr<HttpNetworkSession> session_; | 552 scoped_ptr<HttpNetworkSession> session_; |
| 448 MockClientSocketFactory socket_factory_; | 553 MockClientSocketFactory socket_factory_; |
| 449 ProofVerifyDetailsChromium verify_details_; | 554 ProofVerifyDetailsChromium verify_details_; |
| 450 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 555 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 451 MockHostResolver host_resolver_; | 556 MockHostResolver host_resolver_; |
| 452 MockCertVerifier cert_verifier_; | 557 MockCertVerifier cert_verifier_; |
| 453 TransportSecurityState transport_security_state_; | 558 TransportSecurityState transport_security_state_; |
| 454 scoped_ptr<CTVerifier> cert_transparency_verifier_; | 559 scoped_ptr<CTVerifier> cert_transparency_verifier_; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 socket_factory_.AddSocketDataProvider(&http_data); | 869 socket_factory_.AddSocketDataProvider(&http_data); |
| 765 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 870 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 766 | 871 |
| 767 CreateSessionWithNextProtos(); | 872 CreateSessionWithNextProtos(); |
| 768 | 873 |
| 769 SendRequestAndExpectHttpResponse("hello world"); | 874 SendRequestAndExpectHttpResponse("hello world"); |
| 770 SendRequestAndExpectHttpResponse("hello world"); | 875 SendRequestAndExpectHttpResponse("hello world"); |
| 771 } | 876 } |
| 772 | 877 |
| 773 // When multiple alternative services are advertised, | 878 // When multiple alternative services are advertised, |
| 774 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to | 879 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative |
| 775 // Job. This is what the following test verifies. | 880 // service which uses existing QUIC session if available. If no existing QUIC |
| 776 // TODO(bnc): Update this test when multiple alternative services are handled | 881 // session can be used, use the first alternative service from the list. |
| 777 // properly. | 882 TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) { |
| 778 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) { | |
| 779 MockRead http_reads[] = { | 883 MockRead http_reads[] = { |
| 780 MockRead("HTTP/1.1 200 OK\r\n"), | 884 MockRead("HTTP/1.1 200 OK\r\n"), |
| 781 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), | 885 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"), |
| 782 MockRead("hello world"), | 886 MockRead("hello world"), |
| 783 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 887 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 784 MockRead(ASYNC, OK)}; | 888 MockRead(ASYNC, OK)}; |
| 785 | 889 |
| 786 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 890 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 787 0); | 891 0); |
| 788 socket_factory_.AddSocketDataProvider(&http_data); | 892 socket_factory_.AddSocketDataProvider(&http_data); |
| 789 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 893 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 790 | 894 |
| 895 QuicStreamOffset request_header_offset = 0; | |
| 896 QuicStreamOffset response_header_offset = 0; | |
| 897 // First QUIC request data. | |
| 898 // Open a session to mail.example.org:443 using the first entry of the | |
|
Ryan Hamilton
2015/12/30 21:51:42
This actually opens a QUIC session to foo.example.
Zhongyi Shi
2016/01/05 22:54:20
Yes. Comment updated.
| |
| 899 // alternative service list. | |
| 791 MockQuicData mock_quic_data; | 900 MockQuicData mock_quic_data; |
| 792 mock_quic_data.AddWrite( | 901 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 793 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 902 1, kClientDataStreamId1, true, true, |
| 794 GetRequestHeaders("GET", "https", "/"))); | 903 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 904 | |
| 905 std::string alt_svc_list = | |
| 906 "quic=\"mail.example.com:1234\", quic=\"foo.example.com:443\", " | |
| 907 "quic=\"bar.example.com:8080\""; | |
| 795 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 908 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 796 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 909 1, kClientDataStreamId1, false, false, |
| 910 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); | |
| 797 mock_quic_data.AddRead( | 911 mock_quic_data.AddRead( |
| 798 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 912 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 799 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 913 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 914 | |
| 915 // Second QUIC request data. | |
| 916 // Connection pooling, using existing session, no need to include version | |
| 917 // as version negotiation has been completed. | |
| 918 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | |
| 919 3, kClientDataStreamId2, false, true, | |
| 920 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | |
| 921 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
| 922 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), | |
| 923 &response_header_offset)); | |
| 924 mock_quic_data.AddRead( | |
| 925 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!")); | |
| 926 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); | |
| 800 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 927 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 801 mock_quic_data.AddRead(ASYNC, 0); // EOF | 928 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 802 | 929 |
| 803 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 930 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 804 | 931 |
| 805 AddHangingNonAlternateProtocolSocketData(); | 932 AddHangingNonAlternateProtocolSocketData(); |
| 806 CreateSessionWithNextProtos(); | 933 CreateSessionWithNextProtos(); |
| 807 | 934 |
| 808 SendRequestAndExpectHttpResponse("hello world"); | 935 SendRequestAndExpectHttpResponse("hello world"); |
| 936 | |
| 809 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 937 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 938 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | |
| 939 } | |
| 940 | |
| 941 // When multiple alternative services that has existing QUIC session. | |
| 942 // HttpStreamFactoryImpl::RequestStreamInternal() should select the first | |
| 943 // alternative service which uses existing QUIC session. | |
| 944 TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) { | |
| 945 MockRead http_reads[] = { | |
| 946 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 947 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"), | |
| 948 MockRead("hello world"), | |
| 949 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
| 950 MockRead(ASYNC, OK)}; | |
| 951 | |
| 952 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
| 953 0); | |
| 954 socket_factory_.AddSocketDataProvider(&http_data); | |
| 955 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
| 956 | |
| 957 QuicStreamOffset request_header_offset = 0; | |
| 958 QuicStreamOffset response_header_offset = 0; | |
| 959 | |
| 960 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); | |
| 961 | |
| 962 MockQuicData mock_quic_data; | |
| 963 MockQuicData mock_quic_data2; | |
| 964 // First QUIC request data. | |
| 965 // Open a session to foo.example.com:443. | |
| 966 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | |
| 967 1, kClientDataStreamId1, true, true, | |
| 968 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | |
| 969 | |
| 970 std::string alt_svc_list = | |
| 971 "quic=\"bar.example.com:443\", quic=\"frog.example.com:443\", " | |
|
Ryan Hamilton
2015/12/30 21:51:42
I think each alternative should have a different p
Zhongyi Shi
2016/01/05 22:54:20
Done.
| |
| 972 "quic=\"mail.example.com:8080\""; | |
| 973 // Response header from the server resets the alt_svc list for the origin. | |
| 974 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
| 975 1, kClientDataStreamId1, false, false, | |
| 976 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); | |
| 977 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, | |
| 978 true, 0, "hello from foo!")); | |
| 979 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
| 980 | |
| 981 // Second QUIC request data. | |
| 982 // No connection pooling. Open a new session to bar.example.com:443. | |
|
Ryan Hamilton
2015/12/30 21:51:42
Can you expand on "No connection pooling". I think
Zhongyi Shi
2016/01/05 22:54:20
Done.
| |
| 983 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket( | |
| 984 1, kClientDataStreamId1, true, true, | |
| 985 GetRequestHeaders("GET", "https", "/"), &maker)); | |
| 986 alt_svc_list = | |
| 987 "quic=\"foo.example.com:443\", quic=\"mail.example.com:1234\", " | |
| 988 "quic=\"bar.example.com:443\""; | |
| 989 // Response header from the server resets the alt_svc list for the origin. | |
| 990 mock_quic_data2.AddRead(ConstructResponseHeadersPacket( | |
| 991 1, kClientDataStreamId1, false, false, | |
| 992 GetResponseHeaders("200 OK", alt_svc_list), &maker)); | |
| 993 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, | |
| 994 true, 0, "hello from bar!")); | |
| 995 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker)); | |
| 996 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
| 997 mock_quic_data2.AddRead(ASYNC, 0); // EOF | |
| 998 | |
| 999 // Third QUIC request data. | |
| 1000 // Connection pooling, using the first existing session to foo.example.com | |
| 1001 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | |
| 1002 3, kClientDataStreamId2, false, true, | |
| 1003 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | |
| 1004 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
| 1005 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), | |
| 1006 &response_header_offset)); | |
| 1007 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, | |
| 1008 true, 0, "hello from foo!")); | |
| 1009 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); | |
| 1010 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
| 1011 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
| 1012 | |
| 1013 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
| 1014 AddHangingNonAlternateProtocolSocketData(); | |
| 1015 | |
| 1016 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); | |
| 1017 AddNewHangingNonAlternateProtocolSocketData(); | |
| 1018 | |
| 1019 CreateSessionWithNextProtos(); | |
| 1020 | |
| 1021 SendRequestAndExpectHttpResponse("hello world"); | |
| 1022 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); | |
| 1023 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 443); | |
| 1024 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); | |
|
Ryan Hamilton
2015/12/30 21:51:42
Overall this test look good. I wonder, though, if
| |
| 810 } | 1025 } |
| 811 | 1026 |
| 812 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { | 1027 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { |
| 813 MockRead http_reads[] = { | 1028 MockRead http_reads[] = { |
| 814 MockRead("HTTP/1.1 200 OK\r\n"), | 1029 MockRead("HTTP/1.1 200 OK\r\n"), |
| 815 MockRead(kQuicAlternativeServiceDifferentPortHeader), | 1030 MockRead(kQuicAlternativeServiceDifferentPortHeader), |
| 816 MockRead("hello world"), | 1031 MockRead("hello world"), |
| 817 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1032 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 818 MockRead(ASYNC, OK)}; | 1033 MockRead(ASYNC, OK)}; |
| 819 | 1034 |
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1874 request_.url = GURL("https://www.example.org:443"); | 2089 request_.url = GURL("https://www.example.org:443"); |
| 1875 AddHangingNonAlternateProtocolSocketData(); | 2090 AddHangingNonAlternateProtocolSocketData(); |
| 1876 CreateSessionWithNextProtos(); | 2091 CreateSessionWithNextProtos(); |
| 1877 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 2092 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1878 SendRequestAndExpectQuicResponse("hello!"); | 2093 SendRequestAndExpectQuicResponse("hello!"); |
| 1879 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); | 2094 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); |
| 1880 } | 2095 } |
| 1881 | 2096 |
| 1882 } // namespace test | 2097 } // namespace test |
| 1883 } // namespace net | 2098 } // namespace net |
| OLD | NEW |