| 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 |