Chromium Code Reviews| 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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 base::MessageLoop::current()->RunUntilIdle(); | 135 base::MessageLoop::current()->RunUntilIdle(); |
| 136 } | 136 } |
| 137 | 137 |
| 138 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 138 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 139 QuicPacketSequenceNumber num) { | 139 QuicPacketSequenceNumber num) { |
| 140 return maker_.MakeConnectionClosePacket(num); | 140 return maker_.MakeConnectionClosePacket(num); |
| 141 } | 141 } |
| 142 | 142 |
| 143 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 143 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 144 QuicPacketSequenceNumber largest_received, | 144 QuicPacketSequenceNumber largest_received, |
| 145 QuicPacketSequenceNumber least_unacked) { | 145 QuicPacketSequenceNumber least_unacked, |
| 146 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); | 146 QuicConnectionIdLength connection_id_length) { |
| 147 return maker_.MakeAckPacket(2, connection_id_length, largest_received, | |
| 148 least_unacked, true); | |
| 147 } | 149 } |
| 148 | 150 |
| 149 SpdyHeaderBlock GetRequestHeaders(const std::string& method, | 151 SpdyHeaderBlock GetRequestHeaders(const std::string& method, |
| 150 const std::string& scheme, | 152 const std::string& scheme, |
| 151 const std::string& path) { | 153 const std::string& path) { |
| 152 return maker_.GetRequestHeaders(method, scheme, path); | 154 return maker_.GetRequestHeaders(method, scheme, path); |
| 153 } | 155 } |
| 154 | 156 |
| 155 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { | 157 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { |
| 156 return maker_.GetResponseHeaders(status); | 158 return maker_.GetResponseHeaders(status); |
| 157 } | 159 } |
| 158 | 160 |
| 159 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( | 161 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( |
| 160 QuicPacketSequenceNumber sequence_number, | 162 QuicPacketSequenceNumber sequence_number, |
| 161 QuicStreamId stream_id, | 163 QuicStreamId stream_id, |
| 162 bool should_include_version, | 164 bool should_include_version, |
| 163 bool fin, | 165 bool fin, |
| 164 QuicStreamOffset offset, | 166 QuicStreamOffset offset, |
| 165 base::StringPiece data) { | 167 base::StringPiece data) { |
| 166 return maker_.MakeDataPacket( | 168 return maker_.MakeDataPacket(sequence_number, stream_id, |
| 167 sequence_number, stream_id, should_include_version, fin, offset, data); | 169 should_include_version, fin, offset, data); |
| 168 } | 170 } |
| 169 | 171 |
| 170 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( | 172 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 171 QuicPacketSequenceNumber sequence_number, | 173 QuicPacketSequenceNumber sequence_number, |
| 172 QuicStreamId stream_id, | 174 QuicStreamId stream_id, |
| 175 QuicConnectionIdLength connection_id_length, | |
| 173 bool should_include_version, | 176 bool should_include_version, |
| 174 bool fin, | 177 bool fin, |
| 175 const SpdyHeaderBlock& headers) { | 178 const SpdyHeaderBlock& headers) { |
| 176 return maker_.MakeRequestHeadersPacket( | 179 return maker_.MakeRequestHeadersPacket( |
| 177 sequence_number, stream_id, should_include_version, fin, headers); | 180 sequence_number, stream_id, connection_id_length, |
| 181 should_include_version, fin, headers); | |
| 178 } | 182 } |
| 179 | 183 |
| 180 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( | 184 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 181 QuicPacketSequenceNumber sequence_number, | 185 QuicPacketSequenceNumber sequence_number, |
| 182 QuicStreamId stream_id, | 186 QuicStreamId stream_id, |
| 187 QuicConnectionIdLength connection_id_length, | |
| 183 bool should_include_version, | 188 bool should_include_version, |
| 184 bool fin, | 189 bool fin, |
| 185 const SpdyHeaderBlock& headers) { | 190 const SpdyHeaderBlock& headers) { |
| 186 return maker_.MakeResponseHeadersPacket( | 191 return maker_.MakeResponseHeadersPacket( |
| 187 sequence_number, stream_id, should_include_version, fin, headers); | 192 sequence_number, stream_id, connection_id_length, |
| 193 should_include_version, fin, headers); | |
| 188 } | 194 } |
| 189 | 195 |
| 190 void CreateSession() { | 196 void CreateSession() { |
| 191 CreateSessionWithFactory(&socket_factory_, false); | 197 CreateSessionWithFactory(&socket_factory_, false); |
| 192 } | 198 } |
| 193 | 199 |
| 194 void CreateSessionWithNextProtos() { | 200 void CreateSessionWithNextProtos() { |
| 195 CreateSessionWithFactory(&socket_factory_, true); | 201 CreateSessionWithFactory(&socket_factory_, true); |
| 196 } | 202 } |
| 197 | 203 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 }; | 330 }; |
| 325 | 331 |
| 326 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, | 332 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, |
| 327 ::testing::ValuesIn(QuicSupportedVersions())); | 333 ::testing::ValuesIn(QuicSupportedVersions())); |
| 328 | 334 |
| 329 TEST_P(QuicNetworkTransactionTest, ForceQuic) { | 335 TEST_P(QuicNetworkTransactionTest, ForceQuic) { |
| 330 params_.origin_to_force_quic_on = | 336 params_.origin_to_force_quic_on = |
| 331 HostPortPair::FromString("www.google.com:80"); | 337 HostPortPair::FromString("www.google.com:80"); |
| 332 | 338 |
| 333 MockQuicData mock_quic_data; | 339 MockQuicData mock_quic_data; |
| 334 mock_quic_data.AddWrite( | 340 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 335 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 341 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
|
Ryan Hamilton
2015/01/08 18:35:44
As discussed offline, we should probably change th
ramant (doing other things)
2015/01/08 22:21:15
Done.
| |
| 336 GetRequestHeaders("GET", "http", "/"))); | 342 GetRequestHeaders("GET", "http", "/"))); |
| 337 mock_quic_data.AddRead( | 343 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 338 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 344 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 339 GetResponseHeaders("200 OK"))); | 345 GetResponseHeaders("200 OK"))); |
| 340 mock_quic_data.AddRead( | 346 mock_quic_data.AddRead( |
| 341 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 347 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 342 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 348 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 343 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 349 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 344 | 350 |
| 345 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 351 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 346 | 352 |
| 347 // The non-alternate protocol job needs to hang in order to guarantee that | 353 // The non-alternate protocol job needs to hang in order to guarantee that |
| 348 // the alternate-protocol job will "win". | 354 // the alternate-protocol job will "win". |
| 349 AddHangingNonAlternateProtocolSocketData(); | 355 AddHangingNonAlternateProtocolSocketData(); |
| 350 | 356 |
| 351 CreateSession(); | 357 CreateSession(); |
| 352 | 358 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 int log_stream_id; | 392 int log_stream_id; |
| 387 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); | 393 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); |
| 388 EXPECT_EQ(3, log_stream_id); | 394 EXPECT_EQ(3, log_stream_id); |
| 389 } | 395 } |
| 390 | 396 |
| 391 TEST_P(QuicNetworkTransactionTest, QuicProxy) { | 397 TEST_P(QuicNetworkTransactionTest, QuicProxy) { |
| 392 proxy_service_.reset( | 398 proxy_service_.reset( |
| 393 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70")); | 399 ProxyService::CreateFixedFromPacResult("QUIC myproxy:70")); |
| 394 | 400 |
| 395 MockQuicData mock_quic_data; | 401 MockQuicData mock_quic_data; |
| 396 mock_quic_data.AddWrite( | 402 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 397 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 403 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 398 GetRequestHeaders("GET", "http", "/"))); | 404 GetRequestHeaders("GET", "http", "/"))); |
| 399 mock_quic_data.AddRead( | 405 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 400 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 406 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 401 GetResponseHeaders("200 OK"))); | 407 GetResponseHeaders("200 OK"))); |
| 402 mock_quic_data.AddRead( | 408 mock_quic_data.AddRead( |
| 403 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 409 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 404 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 410 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 405 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 411 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 406 | 412 |
| 407 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 413 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 408 | 414 |
| 409 // There is no need to set up an alternate protocol job, because | 415 // There is no need to set up an alternate protocol job, because |
| 410 // no attempt will be made to speak to the proxy over TCP. | 416 // no attempt will be made to speak to the proxy over TCP. |
| 411 | 417 |
| 412 CreateSession(); | 418 CreateSession(); |
| 413 | 419 |
| 414 SendRequestAndExpectQuicResponse("hello!"); | 420 SendRequestAndExpectQuicResponse("hello!"); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 462 MockRead("hello world"), | 468 MockRead("hello world"), |
| 463 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 469 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 464 MockRead(ASYNC, OK) | 470 MockRead(ASYNC, OK) |
| 465 }; | 471 }; |
| 466 | 472 |
| 467 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 473 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 468 nullptr, 0); | 474 nullptr, 0); |
| 469 socket_factory_.AddSocketDataProvider(&http_data); | 475 socket_factory_.AddSocketDataProvider(&http_data); |
| 470 | 476 |
| 471 MockQuicData mock_quic_data; | 477 MockQuicData mock_quic_data; |
| 472 mock_quic_data.AddWrite( | 478 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 473 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 479 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 474 GetRequestHeaders("GET", "http", "/"))); | 480 GetRequestHeaders("GET", "http", "/"))); |
| 475 mock_quic_data.AddRead( | 481 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 476 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 482 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 477 GetResponseHeaders("200 OK"))); | 483 GetResponseHeaders("200 OK"))); |
| 478 mock_quic_data.AddRead( | 484 mock_quic_data.AddRead( |
| 479 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 485 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 480 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 486 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 481 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 487 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 482 | 488 |
| 483 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 489 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 484 | 490 |
| 485 // The non-alternate protocol job needs to hang in order to guarantee that | 491 // The non-alternate protocol job needs to hang in order to guarantee that |
| 486 // the alternate-protocol job will "win". | 492 // the alternate-protocol job will "win". |
| 487 AddHangingNonAlternateProtocolSocketData(); | 493 AddHangingNonAlternateProtocolSocketData(); |
| 488 | 494 |
| 489 CreateSessionWithNextProtos(); | 495 CreateSessionWithNextProtos(); |
| 490 | 496 |
| 491 SendRequestAndExpectHttpResponse("hello world"); | 497 SendRequestAndExpectHttpResponse("hello world"); |
| 492 SendRequestAndExpectQuicResponse("hello!"); | 498 SendRequestAndExpectQuicResponse("hello!"); |
| 493 } | 499 } |
| 494 | 500 |
| 495 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { | 501 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { |
| 496 MockRead http_reads[] = { | 502 MockRead http_reads[] = { |
| 497 MockRead("HTTP/1.1 200 OK\r\n"), | 503 MockRead("HTTP/1.1 200 OK\r\n"), |
| 498 MockRead(kQuicAlternateProtocol50pctHttpHeader), | 504 MockRead(kQuicAlternateProtocol50pctHttpHeader), |
| 499 MockRead("hello world"), | 505 MockRead("hello world"), |
| 500 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 506 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 501 MockRead(ASYNC, OK) | 507 MockRead(ASYNC, OK) |
| 502 }; | 508 }; |
| 503 | 509 |
| 504 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 510 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 505 nullptr, 0); | 511 nullptr, 0); |
| 506 socket_factory_.AddSocketDataProvider(&http_data); | 512 socket_factory_.AddSocketDataProvider(&http_data); |
| 507 | 513 |
| 508 MockQuicData mock_quic_data; | 514 MockQuicData mock_quic_data; |
| 509 mock_quic_data.AddWrite( | 515 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 510 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 516 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 511 GetRequestHeaders("GET", "http", "/"))); | 517 GetRequestHeaders("GET", "http", "/"))); |
| 512 mock_quic_data.AddRead( | 518 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 513 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 519 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 514 GetResponseHeaders("200 OK"))); | 520 GetResponseHeaders("200 OK"))); |
| 515 mock_quic_data.AddRead( | 521 mock_quic_data.AddRead( |
| 516 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 522 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 517 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 523 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 518 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 524 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 519 | 525 |
| 520 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 526 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 521 | 527 |
| 522 // The non-alternate protocol job needs to hang in order to guarantee that | 528 // The non-alternate protocol job needs to hang in order to guarantee that |
| 523 // the alternate-protocol job will "win". | 529 // the alternate-protocol job will "win". |
| 524 AddHangingNonAlternateProtocolSocketData(); | 530 AddHangingNonAlternateProtocolSocketData(); |
| 525 | 531 |
| 526 params_.alternate_protocol_probability_threshold = .25; | 532 params_.alternate_protocol_probability_threshold = .25; |
| 527 CreateSessionWithNextProtos(); | 533 CreateSessionWithNextProtos(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 583 MockRead("hello world"), | 589 MockRead("hello world"), |
| 584 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 590 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 585 MockRead(ASYNC, OK) | 591 MockRead(ASYNC, OK) |
| 586 }; | 592 }; |
| 587 | 593 |
| 588 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 594 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 589 nullptr, 0); | 595 nullptr, 0); |
| 590 socket_factory_.AddSocketDataProvider(&http_data); | 596 socket_factory_.AddSocketDataProvider(&http_data); |
| 591 | 597 |
| 592 MockQuicData mock_quic_data; | 598 MockQuicData mock_quic_data; |
| 593 mock_quic_data.AddWrite( | 599 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 594 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 600 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 595 GetRequestHeaders("GET", "http", "/"))); | 601 GetRequestHeaders("GET", "http", "/"))); |
| 596 mock_quic_data.AddRead( | 602 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 597 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 603 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 598 GetResponseHeaders("200 OK"))); | 604 GetResponseHeaders("200 OK"))); |
| 599 mock_quic_data.AddRead( | 605 mock_quic_data.AddRead( |
| 600 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 606 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 601 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 607 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 602 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 608 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 603 | 609 |
| 604 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 610 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 605 | 611 |
| 606 // The non-alternate protocol job needs to hang in order to guarantee that | 612 // The non-alternate protocol job needs to hang in order to guarantee that |
| 607 // the alternate-protocol job will "win". | 613 // the alternate-protocol job will "win". |
| 608 AddHangingNonAlternateProtocolSocketData(); | 614 AddHangingNonAlternateProtocolSocketData(); |
| 609 | 615 |
| 610 CreateSessionWithNextProtos(); | 616 CreateSessionWithNextProtos(); |
| 611 | 617 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 666 SendRequestAndExpectHttpResponse("hello world"); | 672 SendRequestAndExpectHttpResponse("hello world"); |
| 667 | 673 |
| 668 ASSERT_TRUE(http_data2.at_read_eof()); | 674 ASSERT_TRUE(http_data2.at_read_eof()); |
| 669 ASSERT_TRUE(http_data2.at_write_eof()); | 675 ASSERT_TRUE(http_data2.at_write_eof()); |
| 670 ASSERT_TRUE(!quic_data.at_read_eof()); | 676 ASSERT_TRUE(!quic_data.at_read_eof()); |
| 671 ASSERT_TRUE(!quic_data.at_write_eof()); | 677 ASSERT_TRUE(!quic_data.at_write_eof()); |
| 672 } | 678 } |
| 673 | 679 |
| 674 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { | 680 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { |
| 675 MockQuicData mock_quic_data; | 681 MockQuicData mock_quic_data; |
| 676 mock_quic_data.AddWrite( | 682 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 677 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 683 1, kClientDataStreamId1, PACKET_8BYTE_CONNECTION_ID, true, true, |
| 678 GetRequestHeaders("GET", "http", "/"))); | 684 GetRequestHeaders("GET", "http", "/"))); |
| 679 mock_quic_data.AddRead( | 685 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 680 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 686 1, kClientDataStreamId1, PACKET_8BYTE_CONNECTION_ID, false, false, |
| 681 GetResponseHeaders("200 OK"))); | 687 GetResponseHeaders("200 OK"))); |
| 682 mock_quic_data.AddRead( | 688 mock_quic_data.AddRead( |
| 683 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 689 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 684 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 690 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_8BYTE_CONNECTION_ID)); |
| 685 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 691 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 686 | 692 |
| 687 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 693 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 688 | 694 |
| 689 // The non-alternate protocol job needs to hang in order to guarantee that | 695 // The non-alternate protocol job needs to hang in order to guarantee that |
| 690 // the alternate-protocol job will "win". | 696 // the alternate-protocol job will "win". |
| 691 AddHangingNonAlternateProtocolSocketData(); | 697 AddHangingNonAlternateProtocolSocketData(); |
| 692 | 698 |
| 693 CreateSessionWithNextProtos(); | 699 CreateSessionWithNextProtos(); |
| 694 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 700 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 695 SendRequestAndExpectQuicResponse("hello!"); | 701 SendRequestAndExpectQuicResponse("hello!"); |
| 696 } | 702 } |
| 697 | 703 |
| 698 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { | 704 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { |
| 699 MockQuicData mock_quic_data; | 705 MockQuicData mock_quic_data; |
| 700 mock_quic_data.AddWrite( | 706 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 701 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 707 1, kClientDataStreamId1, PACKET_8BYTE_CONNECTION_ID, true, true, |
| 702 GetRequestHeaders("GET", "http", "/"))); | 708 GetRequestHeaders("GET", "http", "/"))); |
| 703 mock_quic_data.AddRead( | 709 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 704 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 710 1, kClientDataStreamId1, PACKET_8BYTE_CONNECTION_ID, false, false, |
| 705 GetResponseHeaders("200 OK"))); | 711 GetResponseHeaders("200 OK"))); |
| 706 mock_quic_data.AddRead( | 712 mock_quic_data.AddRead( |
| 707 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 713 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 708 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 714 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_8BYTE_CONNECTION_ID)); |
| 709 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 715 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 710 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 716 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 711 | 717 |
| 712 // In order for a new QUIC session to be established via alternate-protocol | 718 // In order for a new QUIC session to be established via alternate-protocol |
| 713 // without racing an HTTP connection, we need the host resolution to happen | 719 // without racing an HTTP connection, we need the host resolution to happen |
| 714 // synchronously. | 720 // synchronously. |
| 715 host_resolver_.set_synchronous_mode(true); | 721 host_resolver_.set_synchronous_mode(true); |
| 716 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 722 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 717 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 723 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 718 AddressList address; | 724 AddressList address; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 nullptr, | 770 nullptr, |
| 765 net_log_.bound()); | 771 net_log_.bound()); |
| 766 | 772 |
| 767 CreateSessionWithNextProtos(); | 773 CreateSessionWithNextProtos(); |
| 768 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 774 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 769 SendRequestAndExpectHttpResponse("hello world"); | 775 SendRequestAndExpectHttpResponse("hello world"); |
| 770 } | 776 } |
| 771 | 777 |
| 772 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 778 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 773 MockQuicData mock_quic_data; | 779 MockQuicData mock_quic_data; |
| 774 mock_quic_data.AddWrite( | 780 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 775 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 781 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 776 GetRequestHeaders("GET", "http", "/"))); | 782 GetRequestHeaders("GET", "http", "/"))); |
| 777 mock_quic_data.AddRead( | 783 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 778 ConstructResponseHeadersPacket(1, kClientDataStreamId1, false, false, | 784 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, false, false, |
| 779 GetResponseHeaders("200 OK"))); | 785 GetResponseHeaders("200 OK"))); |
| 780 mock_quic_data.AddRead( | 786 mock_quic_data.AddRead( |
| 781 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 787 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 782 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 788 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 783 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | 789 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 784 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); | 790 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 785 | 791 |
| 786 // The non-alternate protocol job needs to hang in order to guarantee that | 792 // The non-alternate protocol job needs to hang in order to guarantee that |
| 787 // the alternate-protocol job will "win". | 793 // the alternate-protocol job will "win". |
| 788 AddHangingNonAlternateProtocolSocketData(); | 794 AddHangingNonAlternateProtocolSocketData(); |
| 789 | 795 |
| 790 // In order for a new QUIC session to be established via alternate-protocol | 796 // In order for a new QUIC session to be established via alternate-protocol |
| 791 // without racing an HTTP connection, we need the host resolution to happen | 797 // without racing an HTTP connection, we need the host resolution to happen |
| 792 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 798 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 992 CreateSessionWithNextProtos(); | 998 CreateSessionWithNextProtos(); |
| 993 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 999 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 994 SendRequestAndExpectHttpResponse("hello from http"); | 1000 SendRequestAndExpectHttpResponse("hello from http"); |
| 995 | 1001 |
| 996 ExpectBrokenAlternateProtocolMapping(); | 1002 ExpectBrokenAlternateProtocolMapping(); |
| 997 } | 1003 } |
| 998 | 1004 |
| 999 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { | 1005 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
| 1000 MockQuicData mock_quic_data; | 1006 MockQuicData mock_quic_data; |
| 1001 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); | 1007 mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); |
| 1002 mock_quic_data.AddWrite( | 1008 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1003 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1009 1, kClientDataStreamId1, PACKET_0BYTE_CONNECTION_ID, true, true, |
| 1004 GetRequestHeaders("GET", "http", "/"))); | 1010 GetRequestHeaders("GET", "http", "/"))); |
| 1005 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1011 mock_quic_data.AddWrite(ConstructAckPacket(2, 1, PACKET_0BYTE_CONNECTION_ID)); |
| 1006 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); | 1012 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
| 1007 | 1013 |
| 1008 // When the QUIC connection fails, we will try the request again over HTTP. | 1014 // When the QUIC connection fails, we will try the request again over HTTP. |
| 1009 MockRead http_reads[] = { | 1015 MockRead http_reads[] = { |
| 1010 MockRead("HTTP/1.1 200 OK\r\n"), | 1016 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1011 MockRead(kQuicAlternateProtocolHttpHeader), | 1017 MockRead(kQuicAlternateProtocolHttpHeader), |
| 1012 MockRead("hello world"), | 1018 MockRead("hello world"), |
| 1013 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1019 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1014 MockRead(ASYNC, OK) | 1020 MockRead(ASYNC, OK) |
| 1015 }; | 1021 }; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1032 nullptr, | 1038 nullptr, |
| 1033 net_log_.bound()); | 1039 net_log_.bound()); |
| 1034 | 1040 |
| 1035 CreateSessionWithNextProtos(); | 1041 CreateSessionWithNextProtos(); |
| 1036 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1042 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1037 SendRequestAndExpectHttpResponse("hello world"); | 1043 SendRequestAndExpectHttpResponse("hello world"); |
| 1038 } | 1044 } |
| 1039 | 1045 |
| 1040 } // namespace test | 1046 } // namespace test |
| 1041 } // namespace net | 1047 } // namespace net |
| OLD | NEW |