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

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

Powered by Google App Engine
This is Rietveld 408576698