OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |