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

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

Issue 17247006: Fix QUIC alternate protocol behavior so that that main job does not wait (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_client_session.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/compiler_specific.h" 6 #include "base/compiler_specific.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/base/capturing_net_log.h" 9 #include "net/base/capturing_net_log.h"
10 #include "net/base/net_log_unittest.h" 10 #include "net/base/net_log_unittest.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 namespace test { 54 namespace test {
55 55
56 class QuicNetworkTransactionTest : public PlatformTest { 56 class QuicNetworkTransactionTest : public PlatformTest {
57 protected: 57 protected:
58 QuicNetworkTransactionTest() 58 QuicNetworkTransactionTest()
59 : clock_(new MockClock), 59 : clock_(new MockClock),
60 ssl_config_service_(new SSLConfigServiceDefaults), 60 ssl_config_service_(new SSLConfigServiceDefaults),
61 proxy_service_(ProxyService::CreateDirect()), 61 proxy_service_(ProxyService::CreateDirect()),
62 compressor_(new QuicSpdyCompressor()), 62 compressor_(new QuicSpdyCompressor()),
63 auth_handler_factory_( 63 auth_handler_factory_(
64 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)) { 64 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
65 hanging_data_(NULL, 0, NULL, 0) {
65 request_.method = "GET"; 66 request_.method = "GET";
66 request_.url = GURL("http://www.google.com/"); 67 request_.url = GURL("http://www.google.com/");
67 request_.load_flags = 0; 68 request_.load_flags = 0;
68 } 69 }
69 70
70 virtual void SetUp() { 71 virtual void SetUp() {
71 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); 72 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
72 base::MessageLoop::current()->RunUntilIdle(); 73 base::MessageLoop::current()->RunUntilIdle();
73 } 74 }
74 75
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 header_.public_header.guid = random_generator_.RandUint64(); 205 header_.public_header.guid = random_generator_.RandUint64();
205 header_.public_header.reset_flag = false; 206 header_.public_header.reset_flag = false;
206 header_.public_header.version_flag = should_include_version; 207 header_.public_header.version_flag = should_include_version;
207 header_.packet_sequence_number = sequence_number; 208 header_.packet_sequence_number = sequence_number;
208 header_.fec_group = 0; 209 header_.fec_group = 0;
209 header_.entropy_flag = false; 210 header_.entropy_flag = false;
210 header_.fec_flag = false; 211 header_.fec_flag = false;
211 } 212 }
212 213
213 void CreateSession() { 214 void CreateSession() {
215 CreateSessionWithFactory(&socket_factory_);
216 }
217
218 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
214 params_.enable_quic = true; 219 params_.enable_quic = true;
215 params_.quic_clock = clock_; 220 params_.quic_clock = clock_;
216 params_.quic_random = &random_generator_; 221 params_.quic_random = &random_generator_;
217 params_.client_socket_factory = &socket_factory_; 222 params_.client_socket_factory = socket_factory;
218 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; 223 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
219 params_.host_resolver = &host_resolver_; 224 params_.host_resolver = &host_resolver_;
220 params_.cert_verifier = &cert_verifier_; 225 params_.cert_verifier = &cert_verifier_;
221 params_.transport_security_state = &transport_security_state_; 226 params_.transport_security_state = &transport_security_state_;
222 params_.proxy_service = proxy_service_.get(); 227 params_.proxy_service = proxy_service_.get();
223 params_.ssl_config_service = ssl_config_service_.get(); 228 params_.ssl_config_service = ssl_config_service_.get();
224 params_.http_auth_handler_factory = auth_handler_factory_.get(); 229 params_.http_auth_handler_factory = auth_handler_factory_.get();
225 params_.http_server_properties = &http_server_properties; 230 params_.http_server_properties = &http_server_properties;
226 231
227 session_ = new HttpNetworkSession(params_); 232 session_ = new HttpNetworkSession(params_);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 void ExpectBrokenAlternateProtocolMapping() { 294 void ExpectBrokenAlternateProtocolMapping() {
290 ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol( 295 ASSERT_TRUE(session_->http_server_properties()->HasAlternateProtocol(
291 HostPortPair::FromURL(request_.url))); 296 HostPortPair::FromURL(request_.url)));
292 const PortAlternateProtocolPair alternate = 297 const PortAlternateProtocolPair alternate =
293 session_->http_server_properties()->GetAlternateProtocol( 298 session_->http_server_properties()->GetAlternateProtocol(
294 HostPortPair::FromURL(request_.url)); 299 HostPortPair::FromURL(request_.url));
295 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); 300 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol);
296 } 301 }
297 302
298 void AddHangingNonAlternateProtocolSocketData() { 303 void AddHangingNonAlternateProtocolSocketData() {
299 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); 304 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
300 StaticSocketDataProvider data(NULL, 0, NULL, 0); 305 hanging_data_.set_connect_data(hanging_connect);
301 data.set_connect_data(never_finishing_connect); 306 socket_factory_.AddSocketDataProvider(&hanging_data_);
302 socket_factory_.AddSocketDataProvider(&data);
303 } 307 }
304 308
305 QuicPacketHeader header_; 309 QuicPacketHeader header_;
306 scoped_refptr<HttpNetworkSession> session_; 310 scoped_refptr<HttpNetworkSession> session_;
307 MockClientSocketFactory socket_factory_; 311 MockClientSocketFactory socket_factory_;
308 MockCryptoClientStreamFactory crypto_client_stream_factory_; 312 MockCryptoClientStreamFactory crypto_client_stream_factory_;
309 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. 313 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
310 MockHostResolver host_resolver_; 314 MockHostResolver host_resolver_;
311 MockCertVerifier cert_verifier_; 315 MockCertVerifier cert_verifier_;
312 TransportSecurityState transport_security_state_; 316 TransportSecurityState transport_security_state_;
313 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; 317 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_;
314 scoped_ptr<ProxyService> proxy_service_; 318 scoped_ptr<ProxyService> proxy_service_;
315 scoped_ptr<QuicSpdyCompressor> compressor_; 319 scoped_ptr<QuicSpdyCompressor> compressor_;
316 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; 320 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
317 MockRandom random_generator_; 321 MockRandom random_generator_;
318 HttpServerPropertiesImpl http_server_properties; 322 HttpServerPropertiesImpl http_server_properties;
319 HttpNetworkSession::Params params_; 323 HttpNetworkSession::Params params_;
320 HttpRequestInfo request_; 324 HttpRequestInfo request_;
321 CapturingBoundNetLog net_log_; 325 CapturingBoundNetLog net_log_;
326 StaticSocketDataProvider hanging_data_;
322 }; 327 };
323 328
324 TEST_F(QuicNetworkTransactionTest, ForceQuic) { 329 TEST_F(QuicNetworkTransactionTest, ForceQuic) {
325 params_.origin_to_force_quic_on = 330 params_.origin_to_force_quic_on =
326 HostPortPair::FromString("www.google.com:80"); 331 HostPortPair::FromString("www.google.com:80");
327 332
328 QuicStreamId stream_id = 3; 333 QuicStreamId stream_id = 3;
329 scoped_ptr<QuicEncryptedPacket> req( 334 scoped_ptr<QuicEncryptedPacket> req(
330 ConstructDataPacket(1, stream_id, true, true, 0, 335 ConstructDataPacket(1, stream_id, true, true, 0,
331 GetRequestString("GET", "/"))); 336 GetRequestString("GET", "/")));
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 // The non-alternate protocol job needs to hang in order to guarantee that 485 // The non-alternate protocol job needs to hang in order to guarantee that
481 // the alternate-protocol job will "win". 486 // the alternate-protocol job will "win".
482 AddHangingNonAlternateProtocolSocketData(); 487 AddHangingNonAlternateProtocolSocketData();
483 488
484 CreateSession(); 489 CreateSession();
485 490
486 SendRequestAndExpectHttpResponse("hello world"); 491 SendRequestAndExpectHttpResponse("hello world");
487 SendRequestAndExpectQuicResponse("hello!"); 492 SendRequestAndExpectQuicResponse("hello!");
488 } 493 }
489 494
495 TEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) {
496 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too.
497 crypto_client_stream_factory_.set_handshake_mode(
498 MockCryptoClientStream::COLD_START);
499
500 MockWrite http_writes[] = {
501 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
502 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
503 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")
504 };
505
506 MockRead http_reads[] = {
507 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
508 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
509 MockRead(SYNCHRONOUS, 5, "hello world"),
510 MockRead(SYNCHRONOUS, OK, 6)
511 };
512
513 DeterministicMockClientSocketFactory socket_factory;
514
515 DeterministicSocketData http_data(http_reads, arraysize(http_reads),
516 http_writes, arraysize(http_writes));
517 socket_factory.AddSocketDataProvider(&http_data);
518
519 // The QUIC transaction will not be allowed to complete.
520 MockWrite quic_writes[] = {
521 MockWrite(ASYNC, ERR_IO_PENDING, 0)
522 };
523 MockRead quic_reads[] = {
524 MockRead(ASYNC, ERR_IO_PENDING, 1),
525 };
526 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
527 quic_writes, arraysize(quic_writes));
528 socket_factory.AddSocketDataProvider(&quic_data);
529
530 // The HTTP transaction will complete.
531 DeterministicSocketData http_data2(http_reads, arraysize(http_reads),
532 http_writes, arraysize(http_writes));
533 socket_factory.AddSocketDataProvider(&http_data2);
534
535 CreateSessionWithFactory(&socket_factory);
536
537 // Run the first request.
538 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
539 SendRequestAndExpectHttpResponse("hello world");
540 ASSERT_TRUE(http_data.at_read_eof());
541 ASSERT_TRUE(http_data.at_write_eof());
542
543 // Now run the second request in which the QUIC socket hangs,
544 // and verify the the transaction continues over HTTP.
545 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
546 SendRequestAndExpectHttpResponse("hello world");
547
548 ASSERT_TRUE(http_data2.at_read_eof());
549 ASSERT_TRUE(http_data2.at_write_eof());
550 ASSERT_TRUE(!quic_data.at_read_eof());
551 ASSERT_TRUE(!quic_data.at_write_eof());
552 }
553
490 TEST_F(QuicNetworkTransactionTest, DontUseAlternateProtocolForQuicHttps) { 554 TEST_F(QuicNetworkTransactionTest, DontUseAlternateProtocolForQuicHttps) {
491 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. 555 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too.
492 556
493 MockRead http_reads[] = { 557 MockRead http_reads[] = {
494 MockRead("HTTP/1.1 200 OK\r\n"), 558 MockRead("HTTP/1.1 200 OK\r\n"),
495 MockRead("Content-length: 11\r\n"), 559 MockRead("Content-length: 11\r\n"),
496 MockRead(kQuicAlternateProtocolHttpHeader), 560 MockRead(kQuicAlternateProtocolHttpHeader),
497 MockRead("hello world"), 561 MockRead("hello world"),
498 562
499 MockRead("HTTP/1.1 200 OK\r\n"), 563 MockRead("HTTP/1.1 200 OK\r\n"),
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 MockRead(ASYNC, OK), // EOF 599 MockRead(ASYNC, OK), // EOF
536 }; 600 };
537 601
538 DelayedSocketData quic_data( 602 DelayedSocketData quic_data(
539 1, // wait for one write to finish before reading. 603 1, // wait for one write to finish before reading.
540 quic_reads, arraysize(quic_reads), 604 quic_reads, arraysize(quic_reads),
541 quic_writes, arraysize(quic_writes)); 605 quic_writes, arraysize(quic_writes));
542 606
543 socket_factory_.AddSocketDataProvider(&quic_data); 607 socket_factory_.AddSocketDataProvider(&quic_data);
544 608
609 // TODO(rch): Ideally, we would not need this, but since we have to do a DNS
610 // lookup, it's not synchronous. Perhaps we can configure the HostResolver
611 // to return immediately.
612 AddHangingNonAlternateProtocolSocketData();
613
545 CreateSession(); 614 CreateSession();
546 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 615 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
547 SendRequestAndExpectQuicResponse("hello!"); 616 SendRequestAndExpectQuicResponse("hello!");
548 } 617 }
549 618
550 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) { 619 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
551 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too. 620 HttpStreamFactory::EnableNpnSpdy(); // Enables QUIC too.
552 621
553 // Alternate-protocol job 622 // Alternate-protocol job
554 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); 623 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 672
604 CreateSession(); 673 CreateSession();
605 674
606 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); 675 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
607 SendRequestAndExpectHttpResponse("hello from http"); 676 SendRequestAndExpectHttpResponse("hello from http");
608 ExpectBrokenAlternateProtocolMapping(); 677 ExpectBrokenAlternateProtocolMapping();
609 } 678 }
610 679
611 } // namespace test 680 } // namespace test
612 } // namespace net 681 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_client_session.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698