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

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

Issue 1540463003: Change the interface of GetAlternativeServicesFor, always return the best Alt-Svc entry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: adding comments Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "base/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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698