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

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

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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
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/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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 } // namespace 60 } // namespace
61 61
62 namespace net { 62 namespace net {
63 namespace test { 63 namespace test {
64 64
65 // Helper class to encapsulate MockReads and MockWrites for QUIC. 65 // Helper class to encapsulate MockReads and MockWrites for QUIC.
66 // Simplify ownership issues and the interaction with the MockSocketFactory. 66 // Simplify ownership issues and the interaction with the MockSocketFactory.
67 class MockQuicData { 67 class MockQuicData {
68 public: 68 public:
69 ~MockQuicData() { 69 ~MockQuicData() { STLDeleteElements(&packets_); }
70 STLDeleteElements(&packets_);
71 }
72 70
73 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) { 71 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) {
74 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(), 72 reads_.push_back(MockRead(
75 sequence_number_++)); 73 SYNCHRONOUS, packet->data(), packet->length(), sequence_number_++));
76 packets_.push_back(packet.release()); 74 packets_.push_back(packet.release());
77 } 75 }
78 76
79 void AddRead(IoMode mode, int rv) { 77 void AddRead(IoMode mode, int rv) { reads_.push_back(MockRead(mode, rv)); }
80 reads_.push_back(MockRead(mode, rv));
81 }
82 78
83 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) { 79 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
84 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(), 80 writes_.push_back(MockWrite(
85 sequence_number_++)); 81 SYNCHRONOUS, packet->data(), packet->length(), sequence_number_++));
86 packets_.push_back(packet.release()); 82 packets_.push_back(packet.release());
87 } 83 }
88 84
89 void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory, 85 void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory,
90 size_t delay) { 86 size_t delay) {
91 MockRead* reads = reads_.empty() ? NULL : &reads_[0]; 87 MockRead* reads = reads_.empty() ? NULL : &reads_[0];
92 MockWrite* writes = writes_.empty() ? NULL : &writes_[0]; 88 MockWrite* writes = writes_.empty() ? NULL : &writes_[0];
93 socket_data_.reset(new DelayedSocketData( 89 socket_data_.reset(new DelayedSocketData(
94 delay, reads, reads_.size(), writes, writes_.size())); 90 delay, reads, reads_.size(), writes, writes_.size()));
95 factory->AddSocketDataProvider(socket_data_.get()); 91 factory->AddSocketDataProvider(socket_data_.get());
96 } 92 }
97 93
98 private: 94 private:
99 std::vector<QuicEncryptedPacket*> packets_; 95 std::vector<QuicEncryptedPacket*> packets_;
100 std::vector<MockWrite> writes_; 96 std::vector<MockWrite> writes_;
101 std::vector<MockRead> reads_; 97 std::vector<MockRead> reads_;
102 size_t sequence_number_; 98 size_t sequence_number_;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( 179 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
184 QuicPacketSequenceNumber sequence_number, 180 QuicPacketSequenceNumber sequence_number,
185 QuicStreamId stream_id, 181 QuicStreamId stream_id,
186 bool should_include_version, 182 bool should_include_version,
187 bool fin, 183 bool fin,
188 const SpdyHeaderBlock& headers) { 184 const SpdyHeaderBlock& headers) {
189 return maker_.MakeResponseHeadersPacket( 185 return maker_.MakeResponseHeadersPacket(
190 sequence_number, stream_id, should_include_version, fin, headers); 186 sequence_number, stream_id, should_include_version, fin, headers);
191 } 187 }
192 188
193 void CreateSession() { 189 void CreateSession() { CreateSessionWithFactory(&socket_factory_); }
194 CreateSessionWithFactory(&socket_factory_);
195 }
196 190
197 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { 191 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) {
198 params_.enable_quic = true; 192 params_.enable_quic = true;
199 params_.quic_clock = clock_; 193 params_.quic_clock = clock_;
200 params_.quic_random = &random_generator_; 194 params_.quic_random = &random_generator_;
201 params_.client_socket_factory = socket_factory; 195 params_.client_socket_factory = socket_factory;
202 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; 196 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
203 params_.host_resolver = &host_resolver_; 197 params_.host_resolver = &host_resolver_;
204 params_.cert_verifier = &cert_verifier_; 198 params_.cert_verifier = &cert_verifier_;
205 params_.transport_security_state = &transport_security_state_; 199 params_.transport_security_state = &transport_security_state_;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 scoped_ptr<ProxyService> proxy_service_; 302 scoped_ptr<ProxyService> proxy_service_;
309 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; 303 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
310 MockRandom random_generator_; 304 MockRandom random_generator_;
311 HttpServerPropertiesImpl http_server_properties; 305 HttpServerPropertiesImpl http_server_properties;
312 HttpNetworkSession::Params params_; 306 HttpNetworkSession::Params params_;
313 HttpRequestInfo request_; 307 HttpRequestInfo request_;
314 CapturingBoundNetLog net_log_; 308 CapturingBoundNetLog net_log_;
315 StaticSocketDataProvider hanging_data_; 309 StaticSocketDataProvider hanging_data_;
316 }; 310 };
317 311
318 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, 312 INSTANTIATE_TEST_CASE_P(Version,
313 QuicNetworkTransactionTest,
319 ::testing::ValuesIn(QuicSupportedVersions())); 314 ::testing::ValuesIn(QuicSupportedVersions()));
320 315
321 TEST_P(QuicNetworkTransactionTest, ForceQuic) { 316 TEST_P(QuicNetworkTransactionTest, ForceQuic) {
322 params_.origin_to_force_quic_on = 317 params_.origin_to_force_quic_on =
323 HostPortPair::FromString("www.google.com:80"); 318 HostPortPair::FromString("www.google.com:80");
324 319
325 MockQuicData mock_quic_data; 320 MockQuicData mock_quic_data;
326 mock_quic_data.AddWrite( 321 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
327 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 322 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
328 GetRequestHeaders("GET", "http", "/"))); 323 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
329 mock_quic_data.AddRead( 324 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
330 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
331 GetResponseHeaders("200 OK")));
332 mock_quic_data.AddRead( 325 mock_quic_data.AddRead(
333 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 326 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
334 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 327 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
335 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 328 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
336 329
337 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 330 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
338 331
339 // The non-alternate protocol job needs to hang in order to guarantee that 332 // The non-alternate protocol job needs to hang in order to guarantee that
340 // the alternate-protocol job will "win". 333 // the alternate-protocol job will "win".
341 AddHangingNonAlternateProtocolSocketData(); 334 AddHangingNonAlternateProtocolSocketData();
342 335
343 CreateSession(); 336 CreateSession();
344 337
345 SendRequestAndExpectQuicResponse("hello!"); 338 SendRequestAndExpectQuicResponse("hello!");
346 339
347 // Check that the NetLog was filled reasonably. 340 // Check that the NetLog was filled reasonably.
348 net::CapturingNetLog::CapturedEntryList entries; 341 net::CapturingNetLog::CapturedEntryList entries;
349 net_log_.GetEntries(&entries); 342 net_log_.GetEntries(&entries);
350 EXPECT_LT(0u, entries.size()); 343 EXPECT_LT(0u, entries.size());
351 344
352 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED. 345 // Check that we logged a QUIC_SESSION_PACKET_RECEIVED.
353 int pos = net::ExpectLogContainsSomewhere( 346 int pos = net::ExpectLogContainsSomewhere(
354 entries, 0, 347 entries,
348 0,
355 net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED, 349 net::NetLog::TYPE_QUIC_SESSION_PACKET_RECEIVED,
356 net::NetLog::PHASE_NONE); 350 net::NetLog::PHASE_NONE);
357 EXPECT_LT(0, pos); 351 EXPECT_LT(0, pos);
358 352
359 // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED. 353 // ... and also a TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED.
360 pos = net::ExpectLogContainsSomewhere( 354 pos = net::ExpectLogContainsSomewhere(
361 entries, 0, 355 entries,
356 0,
362 net::NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED, 357 net::NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_RECEIVED,
363 net::NetLog::PHASE_NONE); 358 net::NetLog::PHASE_NONE);
364 EXPECT_LT(0, pos); 359 EXPECT_LT(0, pos);
365 360
366 std::string packet_sequence_number; 361 std::string packet_sequence_number;
367 ASSERT_TRUE(entries[pos].GetStringValue( 362 ASSERT_TRUE(entries[pos].GetStringValue("packet_sequence_number",
368 "packet_sequence_number", &packet_sequence_number)); 363 &packet_sequence_number));
369 EXPECT_EQ("1", packet_sequence_number); 364 EXPECT_EQ("1", packet_sequence_number);
370 365
371 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED. 366 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED.
372 pos = net::ExpectLogContainsSomewhere( 367 pos = net::ExpectLogContainsSomewhere(
373 entries, 0, 368 entries,
369 0,
374 net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, 370 net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED,
375 net::NetLog::PHASE_NONE); 371 net::NetLog::PHASE_NONE);
376 EXPECT_LT(0, pos); 372 EXPECT_LT(0, pos);
377 373
378 int log_stream_id; 374 int log_stream_id;
379 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); 375 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
380 EXPECT_EQ(3, log_stream_id); 376 EXPECT_EQ(3, log_stream_id);
381 } 377 }
382 378
383 TEST_P(QuicNetworkTransactionTest, QuicProxy) { 379 TEST_P(QuicNetworkTransactionTest, QuicProxy) {
384 proxy_service_.reset( 380 proxy_service_.reset(
385 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70")); 381 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70"));
386 382
387 MockQuicData mock_quic_data; 383 MockQuicData mock_quic_data;
388 mock_quic_data.AddWrite( 384 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
389 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 385 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
390 GetRequestHeaders("GET", "http", "/"))); 386 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
391 mock_quic_data.AddRead( 387 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
392 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
393 GetResponseHeaders("200 OK")));
394 mock_quic_data.AddRead( 388 mock_quic_data.AddRead(
395 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 389 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
396 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 390 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
397 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 391 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
398 392
399 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 393 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
400 394
401 // There is no need to set up an alternate protocol job, because 395 // There is no need to set up an alternate protocol job, because
402 // no attempt will be made to speak to the proxy over TCP. 396 // no attempt will be made to speak to the proxy over TCP.
403 397
(...skipping 20 matching lines...) Expand all
424 EXPECT_EQ(ERR_IO_PENDING, rv); 418 EXPECT_EQ(ERR_IO_PENDING, rv);
425 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); 419 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
426 } 420 }
427 421
428 TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) { 422 TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) {
429 // Attempt to "force" quic on 443, which will not be honored. 423 // Attempt to "force" quic on 443, which will not be honored.
430 params_.origin_to_force_quic_on = 424 params_.origin_to_force_quic_on =
431 HostPortPair::FromString("www.google.com:443"); 425 HostPortPair::FromString("www.google.com:443");
432 426
433 MockRead http_reads[] = { 427 MockRead http_reads[] = {
434 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 428 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"),
435 MockRead("hello world"), 429 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
436 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 430 MockRead(ASYNC, OK)};
437 MockRead(ASYNC, OK)
438 };
439 431
440 StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0); 432 StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0);
441 socket_factory_.AddSocketDataProvider(&data); 433 socket_factory_.AddSocketDataProvider(&data);
442 SSLSocketDataProvider ssl(ASYNC, OK); 434 SSLSocketDataProvider ssl(ASYNC, OK);
443 socket_factory_.AddSSLSocketDataProvider(&ssl); 435 socket_factory_.AddSSLSocketDataProvider(&ssl);
444 436
445 CreateSession(); 437 CreateSession();
446 438
447 SendRequestAndExpectHttpResponse("hello world"); 439 SendRequestAndExpectHttpResponse("hello world");
448 } 440 }
449 441
450 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { 442 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) {
451 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 443 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
452 444
453 MockRead http_reads[] = { 445 MockRead http_reads[] = {
454 MockRead("HTTP/1.1 200 OK\r\n"), 446 MockRead("HTTP/1.1 200 OK\r\n"),
455 MockRead(kQuicAlternateProtocolHttpHeader), 447 MockRead(kQuicAlternateProtocolHttpHeader), MockRead("hello world"),
456 MockRead("hello world"), 448 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
457 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 449 MockRead(ASYNC, OK)};
458 MockRead(ASYNC, OK)
459 };
460 450
461 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 451 StaticSocketDataProvider http_data(
462 NULL, 0); 452 http_reads, arraysize(http_reads), NULL, 0);
463 socket_factory_.AddSocketDataProvider(&http_data); 453 socket_factory_.AddSocketDataProvider(&http_data);
464 454
465 MockQuicData mock_quic_data; 455 MockQuicData mock_quic_data;
466 mock_quic_data.AddWrite( 456 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
467 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 457 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
468 GetRequestHeaders("GET", "http", "/"))); 458 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
469 mock_quic_data.AddRead( 459 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
470 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
471 GetResponseHeaders("200 OK")));
472 mock_quic_data.AddRead( 460 mock_quic_data.AddRead(
473 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 461 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
474 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 462 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
475 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 463 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
476 464
477 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 465 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
478 466
479 // The non-alternate protocol job needs to hang in order to guarantee that 467 // The non-alternate protocol job needs to hang in order to guarantee that
480 // the alternate-protocol job will "win". 468 // the alternate-protocol job will "win".
481 AddHangingNonAlternateProtocolSocketData(); 469 AddHangingNonAlternateProtocolSocketData();
482 470
483 CreateSession(); 471 CreateSession();
484 472
485 SendRequestAndExpectHttpResponse("hello world"); 473 SendRequestAndExpectHttpResponse("hello world");
486 SendRequestAndExpectQuicResponse("hello!"); 474 SendRequestAndExpectQuicResponse("hello!");
487 } 475 }
488 476
489 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { 477 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) {
490 params_.origin_to_force_quic_on = 478 params_.origin_to_force_quic_on =
491 HostPortPair::FromString("www.google.com:443"); 479 HostPortPair::FromString("www.google.com:443");
492 params_.enable_quic_https = true; 480 params_.enable_quic_https = true;
493 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 481 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
494 482
495 MockRead http_reads[] = { 483 MockRead http_reads[] = {
496 MockRead("HTTP/1.1 200 OK\r\n"), 484 MockRead("HTTP/1.1 200 OK\r\n"),
497 MockRead(kQuicAlternateProtocolHttpsHeader), 485 MockRead(kQuicAlternateProtocolHttpsHeader), MockRead("hello world"),
498 MockRead("hello world"), 486 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
499 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 487 MockRead(ASYNC, OK)};
500 MockRead(ASYNC, OK)
501 };
502 488
503 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 489 StaticSocketDataProvider http_data(
504 NULL, 0); 490 http_reads, arraysize(http_reads), NULL, 0);
505 socket_factory_.AddSocketDataProvider(&http_data); 491 socket_factory_.AddSocketDataProvider(&http_data);
506 492
507 MockQuicData mock_quic_data; 493 MockQuicData mock_quic_data;
508 mock_quic_data.AddWrite( 494 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
509 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 495 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
510 GetRequestHeaders("GET", "http", "/"))); 496 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
511 mock_quic_data.AddRead( 497 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
512 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
513 GetResponseHeaders("200 OK")));
514 mock_quic_data.AddRead( 498 mock_quic_data.AddRead(
515 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 499 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
516 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 500 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
517 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 501 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
518 502
519 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 503 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
520 504
521 // The non-alternate protocol job needs to hang in order to guarantee that 505 // The non-alternate protocol job needs to hang in order to guarantee that
522 // the alternate-protocol job will "win". 506 // the alternate-protocol job will "win".
523 AddHangingNonAlternateProtocolSocketData(); 507 AddHangingNonAlternateProtocolSocketData();
524 508
525 CreateSession(); 509 CreateSession();
526 510
527 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). 511 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
528 SendRequestAndExpectHttpResponse("hello world"); 512 SendRequestAndExpectHttpResponse("hello world");
529 } 513 }
530 514
531 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { 515 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) {
532 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 516 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
533 crypto_client_stream_factory_.set_handshake_mode( 517 crypto_client_stream_factory_.set_handshake_mode(
534 MockCryptoClientStream::COLD_START); 518 MockCryptoClientStream::COLD_START);
535 519
536 MockWrite http_writes[] = { 520 MockWrite http_writes[] = {
537 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), 521 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"),
538 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), 522 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
539 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") 523 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")};
540 };
541 524
542 MockRead http_reads[] = { 525 MockRead http_reads[] = {
543 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), 526 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
544 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader), 527 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
545 MockRead(SYNCHRONOUS, 5, "hello world"), 528 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
546 MockRead(SYNCHRONOUS, OK, 6)
547 };
548 529
549 DeterministicMockClientSocketFactory socket_factory; 530 DeterministicMockClientSocketFactory socket_factory;
550 531
551 DeterministicSocketData http_data(http_reads, arraysize(http_reads), 532 DeterministicSocketData http_data(
552 http_writes, arraysize(http_writes)); 533 http_reads, arraysize(http_reads), http_writes, arraysize(http_writes));
553 socket_factory.AddSocketDataProvider(&http_data); 534 socket_factory.AddSocketDataProvider(&http_data);
554 535
555 // The QUIC transaction will not be allowed to complete. 536 // The QUIC transaction will not be allowed to complete.
556 MockWrite quic_writes[] = { 537 MockWrite quic_writes[] = {MockWrite(ASYNC, ERR_IO_PENDING, 0)};
557 MockWrite(ASYNC, ERR_IO_PENDING, 0) 538 MockRead quic_reads[] = {
539 MockRead(ASYNC, ERR_IO_PENDING, 1),
558 }; 540 };
559 MockRead quic_reads[] = { 541 DeterministicSocketData quic_data(
560 MockRead(ASYNC, ERR_IO_PENDING, 1), 542 quic_reads, arraysize(quic_reads), quic_writes, arraysize(quic_writes));
561 };
562 DeterministicSocketData quic_data(quic_reads, arraysize(quic_reads),
563 quic_writes, arraysize(quic_writes));
564 socket_factory.AddSocketDataProvider(&quic_data); 543 socket_factory.AddSocketDataProvider(&quic_data);
565 544
566 // The HTTP transaction will complete. 545 // The HTTP transaction will complete.
567 DeterministicSocketData http_data2(http_reads, arraysize(http_reads), 546 DeterministicSocketData http_data2(
568 http_writes, arraysize(http_writes)); 547 http_reads, arraysize(http_reads), http_writes, arraysize(http_writes));
569 socket_factory.AddSocketDataProvider(&http_data2); 548 socket_factory.AddSocketDataProvider(&http_data2);
570 549
571 CreateSessionWithFactory(&socket_factory); 550 CreateSessionWithFactory(&socket_factory);
572 551
573 // Run the first request. 552 // Run the first request.
574 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes)); 553 http_data.StopAfter(arraysize(http_reads) + arraysize(http_writes));
575 SendRequestAndExpectHttpResponse("hello world"); 554 SendRequestAndExpectHttpResponse("hello world");
576 ASSERT_TRUE(http_data.at_read_eof()); 555 ASSERT_TRUE(http_data.at_read_eof());
577 ASSERT_TRUE(http_data.at_write_eof()); 556 ASSERT_TRUE(http_data.at_write_eof());
578 557
579 // Now run the second request in which the QUIC socket hangs, 558 // Now run the second request in which the QUIC socket hangs,
580 // and verify the the transaction continues over HTTP. 559 // and verify the the transaction continues over HTTP.
581 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); 560 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes));
582 SendRequestAndExpectHttpResponse("hello world"); 561 SendRequestAndExpectHttpResponse("hello world");
583 562
584 ASSERT_TRUE(http_data2.at_read_eof()); 563 ASSERT_TRUE(http_data2.at_read_eof());
585 ASSERT_TRUE(http_data2.at_write_eof()); 564 ASSERT_TRUE(http_data2.at_write_eof());
586 ASSERT_TRUE(!quic_data.at_read_eof()); 565 ASSERT_TRUE(!quic_data.at_read_eof());
587 ASSERT_TRUE(!quic_data.at_write_eof()); 566 ASSERT_TRUE(!quic_data.at_write_eof());
588 } 567 }
589 568
590 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { 569 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
591 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 570 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
592 571
593 MockQuicData mock_quic_data; 572 MockQuicData mock_quic_data;
594 mock_quic_data.AddWrite( 573 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
595 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 574 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
596 GetRequestHeaders("GET", "http", "/"))); 575 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
597 mock_quic_data.AddRead( 576 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
598 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
599 GetResponseHeaders("200 OK")));
600 mock_quic_data.AddRead( 577 mock_quic_data.AddRead(
601 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 578 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
602 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 579 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
603 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 580 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
604 581
605 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 582 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
606 583
607 // The non-alternate protocol job needs to hang in order to guarantee that 584 // The non-alternate protocol job needs to hang in order to guarantee that
608 // the alternate-protocol job will "win". 585 // the alternate-protocol job will "win".
609 AddHangingNonAlternateProtocolSocketData(); 586 AddHangingNonAlternateProtocolSocketData();
610 587
611 CreateSession(); 588 CreateSession();
612 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 589 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
613 SendRequestAndExpectQuicResponse("hello!"); 590 SendRequestAndExpectQuicResponse("hello!");
614 } 591 }
615 592
616 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { 593 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
617 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 594 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
618 595
619 MockQuicData mock_quic_data; 596 MockQuicData mock_quic_data;
620 mock_quic_data.AddWrite( 597 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
621 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 598 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
622 GetRequestHeaders("GET", "http", "/"))); 599 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
623 mock_quic_data.AddRead( 600 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
624 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
625 GetResponseHeaders("200 OK")));
626 mock_quic_data.AddRead( 601 mock_quic_data.AddRead(
627 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 602 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
628 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 603 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
629 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 604 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
630 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 605 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
631 606
632 // In order for a new QUIC session to be established via alternate-protocol 607 // In order for a new QUIC session to be established via alternate-protocol
633 // without racing an HTTP connection, we need the host resolution to happen 608 // without racing an HTTP connection, we need the host resolution to happen
634 // synchronously. 609 // synchronously.
635 host_resolver_.set_synchronous_mode(true); 610 host_resolver_.set_synchronous_mode(true);
(...skipping 12 matching lines...) Expand all
648 SendRequestAndExpectQuicResponse("hello!"); 623 SendRequestAndExpectQuicResponse("hello!");
649 } 624 }
650 625
651 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { 626 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) {
652 proxy_service_.reset( 627 proxy_service_.reset(
653 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70")); 628 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"));
654 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 629 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
655 630
656 // Since we are using a proxy, the QUIC job will not succeed. 631 // Since we are using a proxy, the QUIC job will not succeed.
657 MockWrite http_writes[] = { 632 MockWrite http_writes[] = {
658 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"), 633 MockWrite(SYNCHRONOUS, 0, "GET http://www.google.com/ HTTP/1.1\r\n"),
659 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), 634 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"),
660 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n") 635 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")};
661 };
662 636
663 MockRead http_reads[] = { 637 MockRead http_reads[] = {
664 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), 638 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
665 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader), 639 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHttpHeader),
666 MockRead(SYNCHRONOUS, 5, "hello world"), 640 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)};
667 MockRead(SYNCHRONOUS, OK, 6)
668 };
669 641
670 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 642 StaticSocketDataProvider http_data(
671 http_writes, arraysize(http_writes)); 643 http_reads, arraysize(http_reads), http_writes, arraysize(http_writes));
672 socket_factory_.AddSocketDataProvider(&http_data); 644 socket_factory_.AddSocketDataProvider(&http_data);
673 645
674 // In order for a new QUIC session to be established via alternate-protocol 646 // In order for a new QUIC session to be established via alternate-protocol
675 // without racing an HTTP connection, we need the host resolution to happen 647 // without racing an HTTP connection, we need the host resolution to happen
676 // synchronously. 648 // synchronously.
677 host_resolver_.set_synchronous_mode(true); 649 host_resolver_.set_synchronous_mode(true);
678 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); 650 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
679 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); 651 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
680 AddressList address; 652 AddressList address;
681 host_resolver_.Resolve(info, 653 host_resolver_.Resolve(info,
682 DEFAULT_PRIORITY, 654 DEFAULT_PRIORITY,
683 &address, 655 &address,
684 CompletionCallback(), 656 CompletionCallback(),
685 NULL, 657 NULL,
686 net_log_.bound()); 658 net_log_.bound());
687 659
688 CreateSession(); 660 CreateSession();
689 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 661 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
690 SendRequestAndExpectHttpResponse("hello world"); 662 SendRequestAndExpectHttpResponse("hello world");
691 } 663 }
692 664
693 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { 665 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
694 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 666 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
695 667
696 MockQuicData mock_quic_data; 668 MockQuicData mock_quic_data;
697 mock_quic_data.AddWrite( 669 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
698 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 670 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
699 GetRequestHeaders("GET", "http", "/"))); 671 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
700 mock_quic_data.AddRead( 672 1, kStreamId5, false, false, GetResponseHeaders("200 OK")));
701 ConstructResponseHeadersPacket(1, kStreamId5, false, false,
702 GetResponseHeaders("200 OK")));
703 mock_quic_data.AddRead( 673 mock_quic_data.AddRead(
704 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!")); 674 ConstructDataPacket(2, kStreamId5, false, true, 0, "hello!"));
705 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 675 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
706 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF 676 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
707 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); 677 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1);
708 678
709 // The non-alternate protocol job needs to hang in order to guarantee that 679 // The non-alternate protocol job needs to hang in order to guarantee that
710 // the alternate-protocol job will "win". 680 // the alternate-protocol job will "win".
711 AddHangingNonAlternateProtocolSocketData(); 681 AddHangingNonAlternateProtocolSocketData();
712 682
713 // In order for a new QUIC session to be established via alternate-protocol 683 // In order for a new QUIC session to be established via alternate-protocol
714 // without racing an HTTP connection, we need the host resolution to happen 684 // without racing an HTTP connection, we need the host resolution to happen
715 // synchronously. Of course, even though QUIC *could* perform a 0-RTT 685 // synchronously. Of course, even though QUIC *could* perform a 0-RTT
716 // connection to the the server, in this test we require confirmation 686 // connection to the the server, in this test we require confirmation
717 // before encrypting so the HTTP job will still start. 687 // before encrypting so the HTTP job will still start.
718 host_resolver_.set_synchronous_mode(true); 688 host_resolver_.set_synchronous_mode(true);
719 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); 689 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
720 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); 690 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
721 AddressList address; 691 AddressList address;
722 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, 692 host_resolver_.Resolve(info,
723 CompletionCallback(), NULL, net_log_.bound()); 693 DEFAULT_PRIORITY,
694 &address,
695 CompletionCallback(),
696 NULL,
697 net_log_.bound());
724 698
725 CreateSession(); 699 CreateSession();
726 session_->quic_stream_factory()->set_require_confirmation(true); 700 session_->quic_stream_factory()->set_require_confirmation(true);
727 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 701 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
728 702
729 scoped_ptr<HttpNetworkTransaction> trans( 703 scoped_ptr<HttpNetworkTransaction> trans(
730 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 704 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
731 TestCompletionCallback callback; 705 TestCompletionCallback callback;
732 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); 706 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
733 EXPECT_EQ(ERR_IO_PENDING, rv); 707 EXPECT_EQ(ERR_IO_PENDING, rv);
734 708
735 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( 709 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
736 QuicSession::HANDSHAKE_CONFIRMED); 710 QuicSession::HANDSHAKE_CONFIRMED);
737 EXPECT_EQ(OK, callback.WaitForResult()); 711 EXPECT_EQ(OK, callback.WaitForResult());
738 } 712 }
739 713
740 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { 714 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
741 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 715 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
742 716
743 // Alternate-protocol job 717 // Alternate-protocol job
744 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); 718 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
745 MockRead quic_reads[] = { 719 MockRead quic_reads[] = {
746 MockRead(ASYNC, close->data(), close->length()), 720 MockRead(ASYNC, close->data(), close->length()),
747 MockRead(ASYNC, OK), // EOF 721 MockRead(ASYNC, OK), // EOF
748 }; 722 };
749 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), 723 StaticSocketDataProvider quic_data(
750 NULL, 0); 724 quic_reads, arraysize(quic_reads), NULL, 0);
751 socket_factory_.AddSocketDataProvider(&quic_data); 725 socket_factory_.AddSocketDataProvider(&quic_data);
752 726
753 // Main job which will succeed even though the alternate job fails. 727 // Main job which will succeed even though the alternate job fails.
754 MockRead http_reads[] = { 728 MockRead http_reads[] = {
755 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 729 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
756 MockRead("hello from http"), 730 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
757 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 731 MockRead(ASYNC, OK)};
758 MockRead(ASYNC, OK)
759 };
760 732
761 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 733 StaticSocketDataProvider http_data(
762 NULL, 0); 734 http_reads, arraysize(http_reads), NULL, 0);
763 socket_factory_.AddSocketDataProvider(&http_data); 735 socket_factory_.AddSocketDataProvider(&http_data);
764 736
765 CreateSession(); 737 CreateSession();
766 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); 738 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
767 SendRequestAndExpectHttpResponse("hello from http"); 739 SendRequestAndExpectHttpResponse("hello from http");
768 ExpectBrokenAlternateProtocolMapping(); 740 ExpectBrokenAlternateProtocolMapping();
769 } 741 }
770 742
771 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { 743 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) {
772 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 744 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
773 745
774 // Alternate-protocol job 746 // Alternate-protocol job
775 MockRead quic_reads[] = { 747 MockRead quic_reads[] = {
776 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), 748 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
777 }; 749 };
778 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), 750 StaticSocketDataProvider quic_data(
779 NULL, 0); 751 quic_reads, arraysize(quic_reads), NULL, 0);
780 socket_factory_.AddSocketDataProvider(&quic_data); 752 socket_factory_.AddSocketDataProvider(&quic_data);
781 753
782 // Main job which will succeed even though the alternate job fails. 754 // Main job which will succeed even though the alternate job fails.
783 MockRead http_reads[] = { 755 MockRead http_reads[] = {
784 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 756 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
785 MockRead("hello from http"), 757 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
786 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 758 MockRead(ASYNC, OK)};
787 MockRead(ASYNC, OK)
788 };
789 759
790 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 760 StaticSocketDataProvider http_data(
791 NULL, 0); 761 http_reads, arraysize(http_reads), NULL, 0);
792 socket_factory_.AddSocketDataProvider(&http_data); 762 socket_factory_.AddSocketDataProvider(&http_data);
793 763
794 CreateSession(); 764 CreateSession();
795 765
796 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); 766 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
797 SendRequestAndExpectHttpResponse("hello from http"); 767 SendRequestAndExpectHttpResponse("hello from http");
798 ExpectBrokenAlternateProtocolMapping(); 768 ExpectBrokenAlternateProtocolMapping();
799 } 769 }
800 770
801 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { 771 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) {
802 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 772 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
803 773
804 // Alternate-protocol job 774 // Alternate-protocol job
805 MockRead quic_reads[] = { 775 MockRead quic_reads[] = {
806 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), 776 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED),
807 }; 777 };
808 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), 778 StaticSocketDataProvider quic_data(
809 NULL, 0); 779 quic_reads, arraysize(quic_reads), NULL, 0);
810 socket_factory_.AddSocketDataProvider(&quic_data); 780 socket_factory_.AddSocketDataProvider(&quic_data);
811 781
812 AddHangingNonAlternateProtocolSocketData(); 782 AddHangingNonAlternateProtocolSocketData();
813 783
814 // Final job that will proceed when the QUIC job fails. 784 // Final job that will proceed when the QUIC job fails.
815 MockRead http_reads[] = { 785 MockRead http_reads[] = {
816 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 786 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
817 MockRead("hello from http"), 787 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
818 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 788 MockRead(ASYNC, OK)};
819 MockRead(ASYNC, OK)
820 };
821 789
822 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 790 StaticSocketDataProvider http_data(
823 NULL, 0); 791 http_reads, arraysize(http_reads), NULL, 0);
824 socket_factory_.AddSocketDataProvider(&http_data); 792 socket_factory_.AddSocketDataProvider(&http_data);
825 793
826 CreateSession(); 794 CreateSession();
827 795
828 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 796 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
829 797
830 SendRequestAndExpectHttpResponse("hello from http"); 798 SendRequestAndExpectHttpResponse("hello from http");
831 799
832 ExpectBrokenAlternateProtocolMapping(); 800 ExpectBrokenAlternateProtocolMapping();
833 801
834 EXPECT_TRUE(quic_data.at_read_eof()); 802 EXPECT_TRUE(quic_data.at_read_eof());
835 EXPECT_TRUE(quic_data.at_write_eof()); 803 EXPECT_TRUE(quic_data.at_write_eof());
836 } 804 }
837 805
838 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) { 806 TEST_P(QuicNetworkTransactionTest, NoBrokenAlternateProtocolOnConnectFailure) {
839 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 807 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
840 808
841 // Alternate-protocol job will fail before creating a QUIC session. 809 // Alternate-protocol job will fail before creating a QUIC session.
842 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0); 810 StaticSocketDataProvider quic_data(NULL, 0, NULL, 0);
843 quic_data.set_connect_data(MockConnect(SYNCHRONOUS, 811 quic_data.set_connect_data(
844 ERR_INTERNET_DISCONNECTED)); 812 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED));
845 socket_factory_.AddSocketDataProvider(&quic_data); 813 socket_factory_.AddSocketDataProvider(&quic_data);
846 814
847 // Main job which will succeed even though the alternate job fails. 815 // Main job which will succeed even though the alternate job fails.
848 MockRead http_reads[] = { 816 MockRead http_reads[] = {
849 MockRead("HTTP/1.1 200 OK\r\n\r\n"), 817 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello from http"),
850 MockRead("hello from http"), 818 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
851 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 819 MockRead(ASYNC, OK)};
852 MockRead(ASYNC, OK)
853 };
854 820
855 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 821 StaticSocketDataProvider http_data(
856 NULL, 0); 822 http_reads, arraysize(http_reads), NULL, 0);
857 socket_factory_.AddSocketDataProvider(&http_data); 823 socket_factory_.AddSocketDataProvider(&http_data);
858 824
859 CreateSession(); 825 CreateSession();
860 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); 826 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
861 SendRequestAndExpectHttpResponse("hello from http"); 827 SendRequestAndExpectHttpResponse("hello from http");
862 ExpectQuicAlternateProtocolMapping(); 828 ExpectQuicAlternateProtocolMapping();
863 } 829 }
864 830
865 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { 831 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
866 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. 832 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too.
867 833
868 MockQuicData mock_quic_data; 834 MockQuicData mock_quic_data;
869 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); 835 mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
870 mock_quic_data.AddWrite( 836 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
871 ConstructRequestHeadersPacket(1, kStreamId5, true, true, 837 1, kStreamId5, true, true, GetRequestHeaders("GET", "http", "/")));
872 GetRequestHeaders("GET", "http", "/")));
873 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 838 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
874 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); 839 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0);
875 840
876 // When the QUIC connection fails, we will try the request again over HTTP. 841 // When the QUIC connection fails, we will try the request again over HTTP.
877 MockRead http_reads[] = { 842 MockRead http_reads[] = {
878 MockRead("HTTP/1.1 200 OK\r\n"), 843 MockRead("HTTP/1.1 200 OK\r\n"),
879 MockRead(kQuicAlternateProtocolHttpHeader), 844 MockRead(kQuicAlternateProtocolHttpHeader), MockRead("hello world"),
880 MockRead("hello world"), 845 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
881 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 846 MockRead(ASYNC, OK)};
882 MockRead(ASYNC, OK)
883 };
884 847
885 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), 848 StaticSocketDataProvider http_data(
886 NULL, 0); 849 http_reads, arraysize(http_reads), NULL, 0);
887 socket_factory_.AddSocketDataProvider(&http_data); 850 socket_factory_.AddSocketDataProvider(&http_data);
888 851
889 // In order for a new QUIC session to be established via alternate-protocol 852 // In order for a new QUIC session to be established via alternate-protocol
890 // without racing an HTTP connection, we need the host resolution to happen 853 // without racing an HTTP connection, we need the host resolution to happen
891 // synchronously. 854 // synchronously.
892 host_resolver_.set_synchronous_mode(true); 855 host_resolver_.set_synchronous_mode(true);
893 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); 856 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", "");
894 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); 857 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80));
895 AddressList address; 858 AddressList address;
896 host_resolver_.Resolve(info, 859 host_resolver_.Resolve(info,
897 DEFAULT_PRIORITY, 860 DEFAULT_PRIORITY,
898 &address, 861 &address,
899 CompletionCallback(), 862 CompletionCallback(),
900 NULL, 863 NULL,
901 net_log_.bound()); 864 net_log_.bound());
902 865
903 CreateSession(); 866 CreateSession();
904 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); 867 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
905 SendRequestAndExpectHttpResponse("hello world"); 868 SendRequestAndExpectHttpResponse("hello world");
906 } 869 }
907 870
908 } // namespace test 871 } // namespace test
909 } // namespace net 872 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698