| 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 "net/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 #include "testing/platform_test.h" | 41 #include "testing/platform_test.h" |
| 42 | 42 |
| 43 using net::test::IsError; | 43 using net::test::IsError; |
| 44 using net::test::IsOk; | 44 using net::test::IsOk; |
| 45 | 45 |
| 46 namespace net { | 46 namespace net { |
| 47 | 47 |
| 48 namespace { | 48 namespace { |
| 49 | 49 |
| 50 enum TestCase { | 50 enum TestCase { |
| 51 // Test using the SPDY/3.1 protocol. | 51 // Test without specifying a stream dependency based on the RequestPriority. |
| 52 kTestCaseSPDY31, | 52 kTestCaseNoPriorityDependencies, |
| 53 | 53 |
| 54 // Test using the HTTP/2 protocol, without specifying a stream | 54 // Test specifying a stream dependency based on the RequestPriority. |
| 55 // dependency based on the RequestPriority. | 55 kTestCasePriorityDependencies |
| 56 kTestCaseHTTP2NoPriorityDependencies, | |
| 57 | |
| 58 // Test using the HTTP/2 protocol, specifying a stream | |
| 59 // dependency based on the RequestPriority. | |
| 60 kTestCaseHTTP2PriorityDependencies | |
| 61 }; | 56 }; |
| 62 | 57 |
| 63 const char kHttpURLFromAnotherOrigin[] = "http://www.example2.org/a.dat"; | 58 const char kHttpURLFromAnotherOrigin[] = "http://www.example2.org/a.dat"; |
| 64 const char kHttpsURLFromAnotherOrigin[] = "https://www.example2.org/b.dat"; | 59 const char kHttpsURLFromAnotherOrigin[] = "https://www.example2.org/b.dat"; |
| 65 | 60 |
| 66 const char kBodyData[] = "Body data"; | 61 const char kBodyData[] = "Body data"; |
| 67 const size_t kBodyDataSize = arraysize(kBodyData); | 62 const size_t kBodyDataSize = arraysize(kBodyData); |
| 68 const base::StringPiece kBodyDataStringPiece(kBodyData, kBodyDataSize); | 63 const base::StringPiece kBodyDataStringPiece(kBodyData, kBodyDataSize); |
| 69 | 64 |
| 70 static base::TimeDelta g_time_delta; | 65 static base::TimeDelta g_time_delta; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 UnstallSessionSend(delta_window_size); | 118 UnstallSessionSend(delta_window_size); |
| 124 UnstallStreamSend(stream, delta_window_size); | 119 UnstallStreamSend(stream, delta_window_size); |
| 125 } | 120 } |
| 126 | 121 |
| 127 void UnstallStreamSession(SpdyStream* stream, int32_t delta_window_size) { | 122 void UnstallStreamSession(SpdyStream* stream, int32_t delta_window_size) { |
| 128 UnstallStreamSend(stream, delta_window_size); | 123 UnstallStreamSend(stream, delta_window_size); |
| 129 UnstallSessionSend(delta_window_size); | 124 UnstallSessionSend(delta_window_size); |
| 130 } | 125 } |
| 131 | 126 |
| 132 protected: | 127 protected: |
| 133 NextProto GetProtocol() const { | |
| 134 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2; | |
| 135 } | |
| 136 | |
| 137 bool GetDependenciesFromPriority() const { | 128 bool GetDependenciesFromPriority() const { |
| 138 return GetParam() == kTestCaseHTTP2PriorityDependencies; | 129 return GetParam() == kTestCasePriorityDependencies; |
| 139 } | 130 } |
| 140 | 131 |
| 141 SpdySessionTest() | 132 SpdySessionTest() |
| 142 : old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( | 133 : old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( |
| 143 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 134 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
| 144 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( | 135 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
| 145 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 136 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
| 146 spdy_util_(GetProtocol(), GetDependenciesFromPriority()), | 137 spdy_util_(GetDependenciesFromPriority()), |
| 147 session_deps_(GetProtocol()), | |
| 148 spdy_session_pool_(nullptr), | 138 spdy_session_pool_(nullptr), |
| 149 test_url_(kDefaultUrl), | 139 test_url_(kDefaultUrl), |
| 150 test_server_(test_url_), | 140 test_server_(test_url_), |
| 151 key_(HostPortPair::FromURL(test_url_), | 141 key_(HostPortPair::FromURL(test_url_), |
| 152 ProxyServer::Direct(), | 142 ProxyServer::Direct(), |
| 153 PRIVACY_MODE_DISABLED) { | 143 PRIVACY_MODE_DISABLED) { |
| 154 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); | 144 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); |
| 155 } | 145 } |
| 156 | 146 |
| 157 virtual ~SpdySessionTest() { | 147 virtual ~SpdySessionTest() { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 base::WeakPtr<SpdySession> session_; | 218 base::WeakPtr<SpdySession> session_; |
| 229 SpdySessionPool* spdy_session_pool_; | 219 SpdySessionPool* spdy_session_pool_; |
| 230 const GURL test_url_; | 220 const GURL test_url_; |
| 231 const url::SchemeHostPort test_server_; | 221 const url::SchemeHostPort test_server_; |
| 232 SpdySessionKey key_; | 222 SpdySessionKey key_; |
| 233 BoundTestNetLog log_; | 223 BoundTestNetLog log_; |
| 234 }; | 224 }; |
| 235 | 225 |
| 236 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, | 226 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, |
| 237 SpdySessionTest, | 227 SpdySessionTest, |
| 238 testing::Values(kTestCaseSPDY31, | 228 testing::Values(kTestCaseNoPriorityDependencies, |
| 239 kTestCaseHTTP2NoPriorityDependencies, | 229 kTestCasePriorityDependencies)); |
| 240 kTestCaseHTTP2PriorityDependencies)); | |
| 241 | 230 |
| 242 // Try to create a SPDY session that will fail during | 231 // Try to create a SPDY session that will fail during |
| 243 // initialization. Nothing should blow up. | 232 // initialization. Nothing should blow up. |
| 244 TEST_P(SpdySessionTest, InitialReadError) { | 233 TEST_P(SpdySessionTest, InitialReadError) { |
| 245 CreateNetworkSession(); | 234 CreateNetworkSession(); |
| 246 | 235 |
| 247 session_ = TryCreateFakeSpdySessionExpectingFailure(spdy_session_pool_, key_, | 236 session_ = TryCreateFakeSpdySessionExpectingFailure(spdy_session_pool_, key_, |
| 248 ERR_CONNECTION_CLOSED); | 237 ERR_CONNECTION_CLOSED); |
| 249 EXPECT_TRUE(session_); | 238 EXPECT_TRUE(session_); |
| 250 // Flush the read. | 239 // Flush the read. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 spdy_util_.ConstructSpdyGoAway(1)); | 323 spdy_util_.ConstructSpdyGoAway(1)); |
| 335 MockRead reads[] = { | 324 MockRead reads[] = { |
| 336 CreateMockRead(*goaway, 0), | 325 CreateMockRead(*goaway, 0), |
| 337 }; | 326 }; |
| 338 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 327 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 339 session_deps_.socket_factory->AddSocketDataProvider(&data); | 328 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 340 | 329 |
| 341 CreateNetworkSession(); | 330 CreateNetworkSession(); |
| 342 CreateInsecureSpdySession(); | 331 CreateInsecureSpdySession(); |
| 343 | 332 |
| 344 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 333 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 345 | 334 |
| 346 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 335 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
| 347 | 336 |
| 348 // Read and process the GOAWAY frame. | 337 // Read and process the GOAWAY frame. |
| 349 base::RunLoop().RunUntilIdle(); | 338 base::RunLoop().RunUntilIdle(); |
| 350 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 339 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 351 EXPECT_FALSE(session_); | 340 EXPECT_FALSE(session_); |
| 352 } | 341 } |
| 353 | 342 |
| 354 // A session receiving a GOAWAY frame immediately with no active | 343 // A session receiving a GOAWAY frame immediately with no active |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 MockWrite writes[] = { | 384 MockWrite writes[] = { |
| 396 CreateMockWrite(*req1, 0), | 385 CreateMockWrite(*req1, 0), |
| 397 CreateMockWrite(*req2, 1), | 386 CreateMockWrite(*req2, 1), |
| 398 }; | 387 }; |
| 399 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 388 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 400 session_deps_.socket_factory->AddSocketDataProvider(&data); | 389 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 401 | 390 |
| 402 CreateNetworkSession(); | 391 CreateNetworkSession(); |
| 403 CreateInsecureSpdySession(); | 392 CreateInsecureSpdySession(); |
| 404 | 393 |
| 405 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 394 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 406 | 395 |
| 407 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 396 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 408 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 397 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 409 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 398 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 410 spdy_stream1->SetDelegate(&delegate1); | 399 spdy_stream1->SetDelegate(&delegate1); |
| 411 | 400 |
| 412 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 401 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 413 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 402 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 414 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 403 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 415 spdy_stream2->SetDelegate(&delegate2); | 404 spdy_stream2->SetDelegate(&delegate2); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 457 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 469 MockWrite writes[] = { | 458 MockWrite writes[] = { |
| 470 CreateMockWrite(*req1, 0), | 459 CreateMockWrite(*req1, 0), |
| 471 }; | 460 }; |
| 472 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 461 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 473 session_deps_.socket_factory->AddSocketDataProvider(&data); | 462 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 474 | 463 |
| 475 CreateNetworkSession(); | 464 CreateNetworkSession(); |
| 476 CreateInsecureSpdySession(); | 465 CreateInsecureSpdySession(); |
| 477 | 466 |
| 478 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 467 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 479 | 468 |
| 480 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 469 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 481 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 470 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 482 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 471 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 483 spdy_stream1->SetDelegate(&delegate1); | 472 spdy_stream1->SetDelegate(&delegate1); |
| 484 std::unique_ptr<SpdyHeaderBlock> headers1( | 473 std::unique_ptr<SpdyHeaderBlock> headers1( |
| 485 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 474 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 486 spdy_stream1->SendRequestHeaders(std::move(headers1), NO_MORE_DATA_TO_SEND); | 475 spdy_stream1->SendRequestHeaders(std::move(headers1), NO_MORE_DATA_TO_SEND); |
| 487 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 476 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
| 488 | 477 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 MockWrite writes[] = { | 524 MockWrite writes[] = { |
| 536 CreateMockWrite(*req1, 0), | 525 CreateMockWrite(*req1, 0), |
| 537 CreateMockWrite(*req2, 1), | 526 CreateMockWrite(*req2, 1), |
| 538 }; | 527 }; |
| 539 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 528 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 540 session_deps_.socket_factory->AddSocketDataProvider(&data); | 529 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 541 | 530 |
| 542 CreateNetworkSession(); | 531 CreateNetworkSession(); |
| 543 CreateInsecureSpdySession(); | 532 CreateInsecureSpdySession(); |
| 544 | 533 |
| 545 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 534 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 546 | 535 |
| 547 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 536 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 548 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 537 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 549 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 538 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 550 spdy_stream1->SetDelegate(&delegate1); | 539 spdy_stream1->SetDelegate(&delegate1); |
| 551 | 540 |
| 552 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 541 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 553 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 542 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 554 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 543 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 555 spdy_stream2->SetDelegate(&delegate2); | 544 spdy_stream2->SetDelegate(&delegate2); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 MockWrite writes[] = { | 599 MockWrite writes[] = { |
| 611 CreateMockWrite(*req1, 0), | 600 CreateMockWrite(*req1, 0), |
| 612 CreateMockWrite(*req2, 1), | 601 CreateMockWrite(*req2, 1), |
| 613 }; | 602 }; |
| 614 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 603 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 615 session_deps_.socket_factory->AddSocketDataProvider(&data); | 604 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 616 | 605 |
| 617 CreateNetworkSession(); | 606 CreateNetworkSession(); |
| 618 CreateInsecureSpdySession(); | 607 CreateInsecureSpdySession(); |
| 619 | 608 |
| 620 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 609 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 621 | 610 |
| 622 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 611 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 623 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 612 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 624 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 613 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 625 spdy_stream1->SetDelegate(&delegate1); | 614 spdy_stream1->SetDelegate(&delegate1); |
| 626 | 615 |
| 627 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 616 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 628 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 617 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 629 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 618 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 630 spdy_stream2->SetDelegate(&delegate2); | 619 spdy_stream2->SetDelegate(&delegate2); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 735 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 747 MockWrite writes[] = { | 736 MockWrite writes[] = { |
| 748 CreateMockWrite(*req, 0), | 737 CreateMockWrite(*req, 0), |
| 749 }; | 738 }; |
| 750 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 739 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 751 session_deps_.socket_factory->AddSocketDataProvider(&data); | 740 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 752 | 741 |
| 753 CreateNetworkSession(); | 742 CreateNetworkSession(); |
| 754 CreateInsecureSpdySession(); | 743 CreateInsecureSpdySession(); |
| 755 | 744 |
| 756 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 745 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 757 | 746 |
| 758 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 747 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 759 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 748 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 760 test::StreamDelegateDoNothing delegate(spdy_stream); | 749 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 761 spdy_stream->SetDelegate(&delegate); | 750 spdy_stream->SetDelegate(&delegate); |
| 762 | 751 |
| 763 std::unique_ptr<SpdyHeaderBlock> headers( | 752 std::unique_ptr<SpdyHeaderBlock> headers( |
| 764 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 753 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 765 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 754 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 766 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 755 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 799 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 811 std::unique_ptr<SpdySerializedFrame> rst( | 800 std::unique_ptr<SpdySerializedFrame> rst( |
| 812 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 801 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 813 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; | 802 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; |
| 814 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 803 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 815 session_deps_.socket_factory->AddSocketDataProvider(&data); | 804 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 816 | 805 |
| 817 CreateNetworkSession(); | 806 CreateNetworkSession(); |
| 818 CreateInsecureSpdySession(); | 807 CreateInsecureSpdySession(); |
| 819 | 808 |
| 820 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 809 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 821 | 810 |
| 822 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 811 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 823 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 812 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 824 test::StreamDelegateDoNothing delegate(spdy_stream); | 813 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 825 spdy_stream->SetDelegate(&delegate); | 814 spdy_stream->SetDelegate(&delegate); |
| 826 | 815 |
| 827 std::unique_ptr<SpdyHeaderBlock> headers( | 816 std::unique_ptr<SpdyHeaderBlock> headers( |
| 828 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 817 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 829 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 818 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 830 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 819 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 861 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 850 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 862 MockWrite writes[] = { | 851 MockWrite writes[] = { |
| 863 CreateMockWrite(*req1, 0), | 852 CreateMockWrite(*req1, 0), |
| 864 }; | 853 }; |
| 865 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 854 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 866 session_deps_.socket_factory->AddSocketDataProvider(&data); | 855 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 867 | 856 |
| 868 CreateNetworkSession(); | 857 CreateNetworkSession(); |
| 869 CreateInsecureSpdySession(); | 858 CreateInsecureSpdySession(); |
| 870 | 859 |
| 871 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 860 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); |
| 872 | 861 |
| 873 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 862 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 874 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 863 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 875 test::StreamDelegateDoNothing delegate(spdy_stream); | 864 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 876 spdy_stream->SetDelegate(&delegate); | 865 spdy_stream->SetDelegate(&delegate); |
| 877 | 866 |
| 878 std::unique_ptr<SpdyHeaderBlock> headers( | 867 std::unique_ptr<SpdyHeaderBlock> headers( |
| 879 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 868 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 880 | 869 |
| 881 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 870 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 EXPECT_EQ(kUploadData, delegate2.TakeReceivedData()); | 1157 EXPECT_EQ(kUploadData, delegate2.TakeReceivedData()); |
| 1169 | 1158 |
| 1170 // Session was destroyed. | 1159 // Session was destroyed. |
| 1171 EXPECT_FALSE(session_); | 1160 EXPECT_FALSE(session_); |
| 1172 } | 1161 } |
| 1173 | 1162 |
| 1174 // Regression test for https://crbug.com/481009. | 1163 // Regression test for https://crbug.com/481009. |
| 1175 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { | 1164 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { |
| 1176 session_deps_.host_resolver->set_synchronous_mode(true); | 1165 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1177 | 1166 |
| 1178 int seq = 0; | |
| 1179 std::vector<MockRead> reads; | |
| 1180 | |
| 1181 // Receive SETTINGS frame that sets max_concurrent_streams to zero. | 1167 // Receive SETTINGS frame that sets max_concurrent_streams to zero. |
| 1182 SettingsMap settings_zero; | 1168 SettingsMap settings_zero; |
| 1183 settings_zero[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1169 settings_zero[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1184 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0); | 1170 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0); |
| 1185 std::unique_ptr<SpdySerializedFrame> settings_frame_zero( | 1171 std::unique_ptr<SpdySerializedFrame> settings_frame_zero( |
| 1186 spdy_util_.ConstructSpdySettings(settings_zero)); | 1172 spdy_util_.ConstructSpdySettings(settings_zero)); |
| 1187 reads.push_back(CreateMockRead(*settings_frame_zero, seq++)); | |
| 1188 | 1173 |
| 1189 // Acknowledge it. | 1174 // Acknowledge it. |
| 1190 std::vector<MockWrite> writes; | 1175 std::unique_ptr<SpdySerializedFrame> settings_ack0( |
| 1191 std::unique_ptr<SpdySerializedFrame> settings_ack0; | 1176 spdy_util_.ConstructSpdySettingsAck()); |
| 1192 if (GetProtocol() == kProtoHTTP2) { | |
| 1193 settings_ack0.reset(spdy_util_.ConstructSpdySettingsAck()); | |
| 1194 writes.push_back(CreateMockWrite(*settings_ack0, seq++)); | |
| 1195 } | |
| 1196 | |
| 1197 // Pause. | |
| 1198 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, seq++)); | |
| 1199 | 1177 |
| 1200 // Receive SETTINGS frame that sets max_concurrent_streams to one. | 1178 // Receive SETTINGS frame that sets max_concurrent_streams to one. |
| 1201 SettingsMap settings_one; | 1179 SettingsMap settings_one; |
| 1202 settings_one[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1180 settings_one[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1203 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 1); | 1181 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 1); |
| 1204 std::unique_ptr<SpdySerializedFrame> settings_frame_one( | 1182 std::unique_ptr<SpdySerializedFrame> settings_frame_one( |
| 1205 spdy_util_.ConstructSpdySettings(settings_one)); | 1183 spdy_util_.ConstructSpdySettings(settings_one)); |
| 1206 reads.push_back(CreateMockRead(*settings_frame_one, seq++)); | |
| 1207 | 1184 |
| 1208 // Acknowledge it. | 1185 // Acknowledge it. |
| 1209 std::unique_ptr<SpdySerializedFrame> settings_ack1; | 1186 std::unique_ptr<SpdySerializedFrame> settings_ack1( |
| 1210 if (GetProtocol() == kProtoHTTP2) { | 1187 spdy_util_.ConstructSpdySettingsAck()); |
| 1211 settings_ack1.reset(spdy_util_.ConstructSpdySettingsAck()); | |
| 1212 writes.push_back(CreateMockWrite(*settings_ack1, seq++)); | |
| 1213 } | |
| 1214 | 1188 |
| 1215 // Request and response. | 1189 // Request and response. |
| 1216 std::unique_ptr<SpdySerializedFrame> req( | 1190 std::unique_ptr<SpdySerializedFrame> req( |
| 1217 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1191 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 1218 writes.push_back(CreateMockWrite(*req, seq++)); | |
| 1219 | 1192 |
| 1220 std::unique_ptr<SpdySerializedFrame> resp( | 1193 std::unique_ptr<SpdySerializedFrame> resp( |
| 1221 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1194 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1222 reads.push_back(CreateMockRead(*resp, seq++)); | |
| 1223 | 1195 |
| 1224 std::unique_ptr<SpdySerializedFrame> body( | 1196 std::unique_ptr<SpdySerializedFrame> body( |
| 1225 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1197 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 1226 reads.push_back(CreateMockRead(*body, seq++)); | |
| 1227 | 1198 |
| 1228 reads.push_back(MockRead(ASYNC, 0, seq++)); | 1199 MockRead reads[] = {CreateMockRead(*settings_frame_zero, 0), |
| 1200 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 1201 CreateMockRead(*settings_frame_one, 3), |
| 1202 CreateMockRead(*resp, 6), |
| 1203 CreateMockRead(*body, 7), |
| 1204 MockRead(ASYNC, 0, 8)}; |
| 1229 | 1205 |
| 1230 SequencedSocketData data(reads.data(), reads.size(), writes.data(), | 1206 MockWrite writes[] = {CreateMockWrite(*settings_ack0, 1), |
| 1231 writes.size()); | 1207 CreateMockWrite(*settings_ack1, 4), |
| 1208 CreateMockWrite(*req, 5)}; |
| 1209 |
| 1210 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1232 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1211 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1233 | 1212 |
| 1234 // Create session. | 1213 // Create session. |
| 1235 CreateNetworkSession(); | 1214 CreateNetworkSession(); |
| 1236 CreateInsecureSpdySession(); | 1215 CreateInsecureSpdySession(); |
| 1237 | 1216 |
| 1238 // Receive SETTINGS frame that sets max_concurrent_streams to zero. | 1217 // Receive SETTINGS frame that sets max_concurrent_streams to zero. |
| 1239 base::RunLoop().RunUntilIdle(); | 1218 base::RunLoop().RunUntilIdle(); |
| 1240 EXPECT_EQ(0u, session_->max_concurrent_streams_); | 1219 EXPECT_EQ(0u, session_->max_concurrent_streams_); |
| 1241 | 1220 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1385 | 1364 |
| 1386 base::RunLoop().RunUntilIdle(); | 1365 base::RunLoop().RunUntilIdle(); |
| 1387 | 1366 |
| 1388 // Verify that there is one unclaimed push stream. | 1367 // Verify that there is one unclaimed push stream. |
| 1389 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); | 1368 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); |
| 1390 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( | 1369 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( |
| 1391 GURL("https://www.example.org/a.dat"))); | 1370 GURL("https://www.example.org/a.dat"))); |
| 1392 | 1371 |
| 1393 // Unclaimed push body consumed bytes from the session window. | 1372 // Unclaimed push body consumed bytes from the session window. |
| 1394 EXPECT_EQ( | 1373 EXPECT_EQ( |
| 1395 SpdySession::GetDefaultInitialWindowSize(GetProtocol()) - kUploadDataSize, | 1374 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2) - kUploadDataSize, |
| 1396 session_->session_recv_window_size_); | 1375 session_->session_recv_window_size_); |
| 1397 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 1376 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 1398 | 1377 |
| 1399 // Shift time to expire the push stream. Read the second SYN_STREAM, | 1378 // Shift time to expire the push stream. Read the second SYN_STREAM, |
| 1400 // and verify a RST_STREAM was written. | 1379 // and verify a RST_STREAM was written. |
| 1401 g_time_delta = base::TimeDelta::FromSeconds(301); | 1380 g_time_delta = base::TimeDelta::FromSeconds(301); |
| 1402 data.Resume(); | 1381 data.Resume(); |
| 1403 base::RunLoop().RunUntilIdle(); | 1382 base::RunLoop().RunUntilIdle(); |
| 1404 | 1383 |
| 1405 // Verify that the second pushed stream evicted the first pushed stream. | 1384 // Verify that the second pushed stream evicted the first pushed stream. |
| 1406 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); | 1385 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); |
| 1407 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( | 1386 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( |
| 1408 GURL("https://www.example.org/0.dat"))); | 1387 GURL("https://www.example.org/0.dat"))); |
| 1409 | 1388 |
| 1410 // Verify that the session window reclaimed the evicted stream body. | 1389 // Verify that the session window reclaimed the evicted stream body. |
| 1411 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 1390 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 1412 session_->session_recv_window_size_); | 1391 session_->session_recv_window_size_); |
| 1413 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); | 1392 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); |
| 1414 | 1393 |
| 1415 // Read and process EOF. | 1394 // Read and process EOF. |
| 1416 EXPECT_TRUE(session_); | 1395 EXPECT_TRUE(session_); |
| 1417 data.Resume(); | 1396 data.Resume(); |
| 1418 base::RunLoop().RunUntilIdle(); | 1397 base::RunLoop().RunUntilIdle(); |
| 1419 EXPECT_FALSE(session_); | 1398 EXPECT_FALSE(session_); |
| 1420 } | 1399 } |
| 1421 | 1400 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1474 | 1453 |
| 1475 // Request kInitialMaxConcurrentStreams + 1 streams. Receive a | 1454 // Request kInitialMaxConcurrentStreams + 1 streams. Receive a |
| 1476 // settings frame increasing the max concurrent streams by 1. Make | 1455 // settings frame increasing the max concurrent streams by 1. Make |
| 1477 // sure nothing blows up. This is a regression test for | 1456 // sure nothing blows up. This is a regression test for |
| 1478 // http://crbug.com/57331 . | 1457 // http://crbug.com/57331 . |
| 1479 TEST_P(SpdySessionTest, OnSettings) { | 1458 TEST_P(SpdySessionTest, OnSettings) { |
| 1480 session_deps_.host_resolver->set_synchronous_mode(true); | 1459 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1481 | 1460 |
| 1482 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; | 1461 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 1483 | 1462 |
| 1484 int seq = 0; | |
| 1485 std::vector<MockWrite> writes; | |
| 1486 std::unique_ptr<SpdySerializedFrame> settings_ack( | |
| 1487 spdy_util_.ConstructSpdySettingsAck()); | |
| 1488 if (GetProtocol() == kProtoHTTP2) { | |
| 1489 writes.push_back(CreateMockWrite(*settings_ack, ++seq)); | |
| 1490 } | |
| 1491 | |
| 1492 SettingsMap new_settings; | 1463 SettingsMap new_settings; |
| 1493 const uint32_t max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | 1464 const uint32_t max_concurrent_streams = kInitialMaxConcurrentStreams + 1; |
| 1494 new_settings[kSpdySettingsIds] = | 1465 new_settings[kSpdySettingsIds] = |
| 1495 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1466 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1496 std::unique_ptr<SpdySerializedFrame> settings_frame( | 1467 std::unique_ptr<SpdySerializedFrame> settings_frame( |
| 1497 spdy_util_.ConstructSpdySettings(new_settings)); | 1468 spdy_util_.ConstructSpdySettings(new_settings)); |
| 1498 MockRead reads[] = { | 1469 MockRead reads[] = { |
| 1499 CreateMockRead(*settings_frame, 0), | 1470 CreateMockRead(*settings_frame, 0), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 1500 MockRead(ASYNC, ERR_IO_PENDING, ++seq), | 1471 MockRead(ASYNC, 0, 3), |
| 1501 MockRead(ASYNC, 0, ++seq), | |
| 1502 }; | 1472 }; |
| 1503 | 1473 |
| 1504 SequencedSocketData data(reads, arraysize(reads), writes.data(), | 1474 std::unique_ptr<SpdySerializedFrame> settings_ack( |
| 1505 writes.size()); | 1475 spdy_util_.ConstructSpdySettingsAck()); |
| 1476 MockWrite writes[] = {CreateMockWrite(*settings_ack, 1)}; |
| 1477 |
| 1478 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1506 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1479 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1507 | 1480 |
| 1508 CreateNetworkSession(); | 1481 CreateNetworkSession(); |
| 1509 CreateInsecureSpdySession(); | 1482 CreateInsecureSpdySession(); |
| 1510 | 1483 |
| 1511 // Create the maximum number of concurrent streams. | 1484 // Create the maximum number of concurrent streams. |
| 1512 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { | 1485 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { |
| 1513 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 1486 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 1514 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 1487 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 1515 ASSERT_TRUE(spdy_stream); | 1488 ASSERT_TRUE(spdy_stream); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1527 EXPECT_THAT(stream_releaser.WaitForResult(), IsOk()); | 1500 EXPECT_THAT(stream_releaser.WaitForResult(), IsOk()); |
| 1528 | 1501 |
| 1529 data.Resume(); | 1502 data.Resume(); |
| 1530 base::RunLoop().RunUntilIdle(); | 1503 base::RunLoop().RunUntilIdle(); |
| 1531 EXPECT_FALSE(session_); | 1504 EXPECT_FALSE(session_); |
| 1532 | 1505 |
| 1533 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1506 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 1534 EXPECT_TRUE(data.AllReadDataConsumed()); | 1507 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 1535 } | 1508 } |
| 1536 | 1509 |
| 1537 // Start with a persisted value for max concurrent streams. Receive a | |
| 1538 // settings frame increasing the max concurrent streams by 1 and which | |
| 1539 // also clears the persisted data. Verify that persisted data is | |
| 1540 // correct. | |
| 1541 TEST_P(SpdySessionTest, ClearSettings) { | |
| 1542 if (spdy_util_.spdy_version() >= HTTP2) { | |
| 1543 // HTTP/2 doesn't include settings persistence, or a CLEAR_SETTINGS flag. | |
| 1544 // Flag 0x1, CLEAR_SETTINGS in SPDY3, is instead settings ACK in HTTP/2. | |
| 1545 return; | |
| 1546 } | |
| 1547 session_deps_.host_resolver->set_synchronous_mode(true); | |
| 1548 | |
| 1549 SettingsMap new_settings; | |
| 1550 const uint32_t max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | |
| 1551 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | |
| 1552 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | |
| 1553 std::unique_ptr<SpdySerializedFrame> settings_frame( | |
| 1554 spdy_util_.ConstructSpdySettings(new_settings)); | |
| 1555 uint8_t flags = SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; | |
| 1556 test::SetFrameFlags(settings_frame.get(), flags, spdy_util_.spdy_version()); | |
| 1557 MockRead reads[] = { | |
| 1558 CreateMockRead(*settings_frame, 0), | |
| 1559 MockRead(ASYNC, ERR_IO_PENDING, 1), | |
| 1560 MockRead(ASYNC, 0, 2), | |
| 1561 }; | |
| 1562 | |
| 1563 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | |
| 1564 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
| 1565 | |
| 1566 // Load a cert that is valid for: | |
| 1567 // www.example.org | |
| 1568 // mail.example.org | |
| 1569 // mail.example.com | |
| 1570 base::FilePath certs_dir = GetTestCertsDirectory(); | |
| 1571 scoped_refptr<X509Certificate> test_cert( | |
| 1572 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | |
| 1573 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | |
| 1574 | |
| 1575 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 1576 ssl.cert = test_cert; | |
| 1577 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | |
| 1578 | |
| 1579 CreateNetworkSession(); | |
| 1580 | |
| 1581 // Initialize the SpdySetting with the default. | |
| 1582 spdy_session_pool_->http_server_properties()->SetSpdySetting( | |
| 1583 test_server_, SETTINGS_MAX_CONCURRENT_STREAMS, | |
| 1584 SETTINGS_FLAG_PLEASE_PERSIST, kInitialMaxConcurrentStreams); | |
| 1585 | |
| 1586 EXPECT_FALSE(spdy_session_pool_->http_server_properties() | |
| 1587 ->GetSpdySettings(test_server_) | |
| 1588 .empty()); | |
| 1589 | |
| 1590 CreateSecureSpdySession(); | |
| 1591 | |
| 1592 // Create the maximum number of concurrent streams. | |
| 1593 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { | |
| 1594 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | |
| 1595 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | |
| 1596 ASSERT_TRUE(spdy_stream); | |
| 1597 } | |
| 1598 | |
| 1599 StreamReleaserCallback stream_releaser; | |
| 1600 | |
| 1601 SpdyStreamRequest request; | |
| 1602 ASSERT_EQ(ERR_IO_PENDING, | |
| 1603 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, | |
| 1604 MEDIUM, BoundNetLog(), | |
| 1605 stream_releaser.MakeCallback(&request))); | |
| 1606 | |
| 1607 base::RunLoop().RunUntilIdle(); | |
| 1608 | |
| 1609 EXPECT_THAT(stream_releaser.WaitForResult(), IsOk()); | |
| 1610 | |
| 1611 // Make sure that persisted data is cleared. | |
| 1612 EXPECT_TRUE(spdy_session_pool_->http_server_properties() | |
| 1613 ->GetSpdySettings(test_server_) | |
| 1614 .empty()); | |
| 1615 | |
| 1616 // Make sure session's max_concurrent_streams is correct. | |
| 1617 EXPECT_EQ(kInitialMaxConcurrentStreams + 1, | |
| 1618 session_->max_concurrent_streams_); | |
| 1619 | |
| 1620 data.Resume(); | |
| 1621 base::RunLoop().RunUntilIdle(); | |
| 1622 EXPECT_FALSE(session_); | |
| 1623 } | |
| 1624 | |
| 1625 // Start with max concurrent streams set to 1. Request two streams. | 1510 // Start with max concurrent streams set to 1. Request two streams. |
| 1626 // When the first completes, have the callback close its stream, which | 1511 // When the first completes, have the callback close its stream, which |
| 1627 // should trigger the second stream creation. Then cancel that one | 1512 // should trigger the second stream creation. Then cancel that one |
| 1628 // immediately. Don't crash. This is a regression test for | 1513 // immediately. Don't crash. This is a regression test for |
| 1629 // http://crbug.com/63532 . | 1514 // http://crbug.com/63532 . |
| 1630 TEST_P(SpdySessionTest, CancelPendingCreateStream) { | 1515 TEST_P(SpdySessionTest, CancelPendingCreateStream) { |
| 1631 session_deps_.host_resolver->set_synchronous_mode(true); | 1516 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1632 | 1517 |
| 1633 MockRead reads[] = { | 1518 MockRead reads[] = { |
| 1634 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1519 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1683 | 1568 |
| 1684 MockRead reads[] = { | 1569 MockRead reads[] = { |
| 1685 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1570 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 1686 }; | 1571 }; |
| 1687 | 1572 |
| 1688 SettingsMap settings; | 1573 SettingsMap settings; |
| 1689 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1574 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1690 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); | 1575 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
| 1691 std::unique_ptr<SpdySerializedFrame> settings_frame( | 1576 std::unique_ptr<SpdySerializedFrame> settings_frame( |
| 1692 spdy_util_.ConstructSpdySettings(settings)); | 1577 spdy_util_.ConstructSpdySettings(settings)); |
| 1693 std::vector<MockWrite> writes; | 1578 MockWrite writes[] = {MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, |
| 1694 if (GetProtocol() == kProtoHTTP2) { | 1579 kHttp2ConnectionHeaderPrefixSize), |
| 1695 writes.push_back( | 1580 CreateMockWrite(*settings_frame)}; |
| 1696 MockWrite(ASYNC, | |
| 1697 kHttp2ConnectionHeaderPrefix, | |
| 1698 kHttp2ConnectionHeaderPrefixSize)); | |
| 1699 } | |
| 1700 writes.push_back(CreateMockWrite(*settings_frame)); | |
| 1701 | 1581 |
| 1702 SettingsMap server_settings; | 1582 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 1703 const uint32_t initial_max_concurrent_streams = 1; | 1583 arraysize(writes)); |
| 1704 server_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | |
| 1705 SettingsFlagsAndValue(SETTINGS_FLAG_PERSISTED, | |
| 1706 initial_max_concurrent_streams); | |
| 1707 std::unique_ptr<SpdySerializedFrame> server_settings_frame( | |
| 1708 spdy_util_.ConstructSpdySettings(server_settings)); | |
| 1709 if (GetProtocol() == kProtoSPDY31) { | |
| 1710 writes.push_back(CreateMockWrite(*server_settings_frame)); | |
| 1711 } | |
| 1712 | |
| 1713 StaticSocketDataProvider data(reads, arraysize(reads), writes.data(), | |
| 1714 writes.size()); | |
| 1715 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1584 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1716 | 1585 |
| 1717 // Load a cert that is valid for: | 1586 // Load a cert that is valid for: |
| 1718 // www.example.org | 1587 // www.example.org |
| 1719 // mail.example.org | 1588 // mail.example.org |
| 1720 // mail.example.com | 1589 // mail.example.com |
| 1721 base::FilePath certs_dir = GetTestCertsDirectory(); | 1590 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 1722 scoped_refptr<X509Certificate> test_cert( | 1591 scoped_refptr<X509Certificate> test_cert( |
| 1723 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | 1592 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); |
| 1724 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | 1593 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); |
| 1725 | 1594 |
| 1726 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 1595 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 1727 ssl.cert = test_cert; | 1596 ssl.cert = test_cert; |
| 1728 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 1597 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
| 1729 | 1598 |
| 1730 CreateNetworkSession(); | 1599 CreateNetworkSession(); |
| 1731 | 1600 |
| 1601 const uint32_t initial_max_concurrent_streams = 1; |
| 1732 spdy_session_pool_->http_server_properties()->SetSpdySetting( | 1602 spdy_session_pool_->http_server_properties()->SetSpdySetting( |
| 1733 test_server_, SETTINGS_MAX_CONCURRENT_STREAMS, | 1603 test_server_, SETTINGS_MAX_CONCURRENT_STREAMS, |
| 1734 SETTINGS_FLAG_PLEASE_PERSIST, initial_max_concurrent_streams); | 1604 SETTINGS_FLAG_PLEASE_PERSIST, initial_max_concurrent_streams); |
| 1735 | 1605 |
| 1736 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | 1606 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
| 1737 pool_peer.SetEnableSendingInitialData(true); | 1607 pool_peer.SetEnableSendingInitialData(true); |
| 1738 | 1608 |
| 1739 CreateSecureSpdySession(); | 1609 CreateSecureSpdySession(); |
| 1740 | 1610 |
| 1741 base::RunLoop().RunUntilIdle(); | 1611 base::RunLoop().RunUntilIdle(); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 base::RunLoop().RunUntilIdle(); | 1683 base::RunLoop().RunUntilIdle(); |
| 1814 | 1684 |
| 1815 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 1685 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 1816 EXPECT_FALSE(session_); | 1686 EXPECT_FALSE(session_); |
| 1817 | 1687 |
| 1818 // Check that the NetLog was filled reasonably. | 1688 // Check that the NetLog was filled reasonably. |
| 1819 TestNetLogEntry::List entries; | 1689 TestNetLogEntry::List entries; |
| 1820 log_.GetEntries(&entries); | 1690 log_.GetEntries(&entries); |
| 1821 EXPECT_LT(0u, entries.size()); | 1691 EXPECT_LT(0u, entries.size()); |
| 1822 | 1692 |
| 1823 if (GetProtocol() == kProtoHTTP2) { | 1693 int pos = ExpectLogContainsSomewhere( |
| 1824 int pos = ExpectLogContainsSomewhere( | 1694 entries, 0, NetLog::TYPE_HTTP2_SESSION_GOAWAY, NetLog::PHASE_NONE); |
| 1825 entries, 0, NetLog::TYPE_HTTP2_SESSION_GOAWAY, NetLog::PHASE_NONE); | 1695 TestNetLogEntry entry = entries[pos]; |
| 1826 TestNetLogEntry entry = entries[pos]; | 1696 int last_accepted_stream_id; |
| 1827 int last_accepted_stream_id; | 1697 ASSERT_TRUE(entry.GetIntegerValue("last_accepted_stream_id", |
| 1828 ASSERT_TRUE(entry.GetIntegerValue("last_accepted_stream_id", | 1698 &last_accepted_stream_id)); |
| 1829 &last_accepted_stream_id)); | 1699 EXPECT_EQ(42, last_accepted_stream_id); |
| 1830 EXPECT_EQ(42, last_accepted_stream_id); | 1700 int active_streams; |
| 1831 int active_streams; | 1701 ASSERT_TRUE(entry.GetIntegerValue("active_streams", &active_streams)); |
| 1832 ASSERT_TRUE(entry.GetIntegerValue("active_streams", &active_streams)); | 1702 EXPECT_EQ(0, active_streams); |
| 1833 EXPECT_EQ(0, active_streams); | 1703 int unclaimed_streams; |
| 1834 int unclaimed_streams; | 1704 ASSERT_TRUE(entry.GetIntegerValue("unclaimed_streams", &unclaimed_streams)); |
| 1835 ASSERT_TRUE(entry.GetIntegerValue("unclaimed_streams", &unclaimed_streams)); | 1705 EXPECT_EQ(0, unclaimed_streams); |
| 1836 EXPECT_EQ(0, unclaimed_streams); | 1706 int status; |
| 1837 int status; | 1707 ASSERT_TRUE(entry.GetIntegerValue("status", &status)); |
| 1838 ASSERT_TRUE(entry.GetIntegerValue("status", &status)); | 1708 EXPECT_EQ(GOAWAY_ENHANCE_YOUR_CALM, status); |
| 1839 EXPECT_EQ(GOAWAY_ENHANCE_YOUR_CALM, status); | 1709 std::string debug_data; |
| 1840 std::string debug_data; | 1710 ASSERT_TRUE(entry.GetStringValue("debug_data", &debug_data)); |
| 1841 ASSERT_TRUE(entry.GetStringValue("debug_data", &debug_data)); | 1711 EXPECT_EQ("foo", debug_data); |
| 1842 EXPECT_EQ("foo", debug_data); | |
| 1843 } | |
| 1844 | 1712 |
| 1845 // Check that we logged SPDY_SESSION_CLOSE correctly. | 1713 // Check that we logged SPDY_SESSION_CLOSE correctly. |
| 1846 int pos = ExpectLogContainsSomewhere( | 1714 pos = ExpectLogContainsSomewhere(entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, |
| 1847 entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, NetLog::PHASE_NONE); | 1715 NetLog::PHASE_NONE); |
| 1848 TestNetLogEntry entry = entries[pos]; | 1716 entry = entries[pos]; |
| 1849 int error_code = 0; | 1717 int error_code = 0; |
| 1850 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1718 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
| 1851 EXPECT_THAT(error_code, IsOk()); | 1719 EXPECT_THAT(error_code, IsOk()); |
| 1852 } | 1720 } |
| 1853 | 1721 |
| 1854 TEST_P(SpdySessionTest, NetLogOnSessionEOF) { | 1722 TEST_P(SpdySessionTest, NetLogOnSessionEOF) { |
| 1855 session_deps_.host_resolver->set_synchronous_mode(true); | 1723 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1856 | 1724 |
| 1857 MockRead reads[] = { | 1725 MockRead reads[] = { |
| 1858 MockRead(SYNCHRONOUS, 0, 0) // EOF | 1726 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 std::unique_ptr<SpdyHeaderBlock> headers( | 1781 std::unique_ptr<SpdyHeaderBlock> headers( |
| 1914 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 1782 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 1915 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 1783 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 1916 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 1784 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| 1917 | 1785 |
| 1918 // Write request headers & capture resulting histogram update. | 1786 // Write request headers & capture resulting histogram update. |
| 1919 base::HistogramTester histogram_tester; | 1787 base::HistogramTester histogram_tester; |
| 1920 | 1788 |
| 1921 base::RunLoop().RunUntilIdle(); | 1789 base::RunLoop().RunUntilIdle(); |
| 1922 // Regression test of compression performance under the request fixture. | 1790 // Regression test of compression performance under the request fixture. |
| 1923 switch (spdy_util_.spdy_version()) { | |
| 1924 case SPDY3: | |
| 1925 #if defined(USE_SYSTEM_ZLIB) | |
| 1926 histogram_tester.ExpectBucketCount( | |
| 1927 "Net.SpdySynStreamCompressionPercentage", 30, 1); | |
| 1928 #else | |
| 1929 histogram_tester.ExpectBucketCount( | |
| 1930 "Net.SpdySynStreamCompressionPercentage", 31, 1); | |
| 1931 #endif | |
| 1932 break; | |
| 1933 case HTTP2: | |
| 1934 histogram_tester.ExpectBucketCount( | 1791 histogram_tester.ExpectBucketCount( |
| 1935 "Net.SpdySynStreamCompressionPercentage", 81, 1); | 1792 "Net.SpdySynStreamCompressionPercentage", 81, 1); |
| 1936 break; | |
| 1937 default: | |
| 1938 NOTREACHED(); | |
| 1939 } | |
| 1940 | 1793 |
| 1941 // Read and process EOF. | 1794 // Read and process EOF. |
| 1942 EXPECT_TRUE(session_); | 1795 EXPECT_TRUE(session_); |
| 1943 data.Resume(); | 1796 data.Resume(); |
| 1944 base::RunLoop().RunUntilIdle(); | 1797 base::RunLoop().RunUntilIdle(); |
| 1945 EXPECT_FALSE(session_); | 1798 EXPECT_FALSE(session_); |
| 1946 } | 1799 } |
| 1947 | 1800 |
| 1948 // Queue up a low-priority SYN_STREAM followed by a high-priority | 1801 // Queue up a low-priority SYN_STREAM followed by a high-priority |
| 1949 // one. The high priority one should still send first and receive | 1802 // one. The high priority one should still send first and receive |
| (...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2726 } | 2579 } |
| 2727 | 2580 |
| 2728 // Test that SpdySession::DoReadLoop reads data from the socket | 2581 // Test that SpdySession::DoReadLoop reads data from the socket |
| 2729 // without yielding. This test makes 32k - 1 bytes of data available | 2582 // without yielding. This test makes 32k - 1 bytes of data available |
| 2730 // on the socket for reading. It then verifies that it has read all | 2583 // on the socket for reading. It then verifies that it has read all |
| 2731 // the available data without yielding. | 2584 // the available data without yielding. |
| 2732 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { | 2585 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { |
| 2733 session_deps_.host_resolver->set_synchronous_mode(true); | 2586 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2734 session_deps_.time_func = InstantaneousReads; | 2587 session_deps_.time_func = InstantaneousReads; |
| 2735 | 2588 |
| 2736 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2589 BufferedSpdyFramer framer(HTTP2); |
| 2737 | 2590 |
| 2738 std::unique_ptr<SpdySerializedFrame> req1( | 2591 std::unique_ptr<SpdySerializedFrame> req1( |
| 2739 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2592 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2740 MockWrite writes[] = { | 2593 MockWrite writes[] = { |
| 2741 CreateMockWrite(*req1, 0), | 2594 CreateMockWrite(*req1, 0), |
| 2742 }; | 2595 }; |
| 2743 | 2596 |
| 2744 // Build buffer of size kYieldAfterBytesRead / 4 | 2597 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2745 // (-spdy_data_frame_size). | 2598 // (-spdy_data_frame_size). |
| 2746 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2599 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2813 EXPECT_TRUE(data.AllReadDataConsumed()); | 2666 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2814 } | 2667 } |
| 2815 | 2668 |
| 2816 // Test that SpdySession::DoReadLoop yields if more than | 2669 // Test that SpdySession::DoReadLoop yields if more than |
| 2817 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time | 2670 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time |
| 2818 // function that makes the response frame look very slow to read. | 2671 // function that makes the response frame look very slow to read. |
| 2819 TEST_P(SpdySessionTest, TestYieldingSlowReads) { | 2672 TEST_P(SpdySessionTest, TestYieldingSlowReads) { |
| 2820 session_deps_.host_resolver->set_synchronous_mode(true); | 2673 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2821 session_deps_.time_func = SlowReads; | 2674 session_deps_.time_func = SlowReads; |
| 2822 | 2675 |
| 2823 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2676 BufferedSpdyFramer framer(HTTP2); |
| 2824 | 2677 |
| 2825 std::unique_ptr<SpdySerializedFrame> req1( | 2678 std::unique_ptr<SpdySerializedFrame> req1( |
| 2826 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2679 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2827 MockWrite writes[] = { | 2680 MockWrite writes[] = { |
| 2828 CreateMockWrite(*req1, 0), | 2681 CreateMockWrite(*req1, 0), |
| 2829 }; | 2682 }; |
| 2830 | 2683 |
| 2831 std::unique_ptr<SpdySerializedFrame> resp1( | 2684 std::unique_ptr<SpdySerializedFrame> resp1( |
| 2832 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2685 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2833 | 2686 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2874 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2727 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2875 EXPECT_TRUE(data.AllReadDataConsumed()); | 2728 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2876 } | 2729 } |
| 2877 | 2730 |
| 2878 // Regression test for https://crbug.com/531570. | 2731 // Regression test for https://crbug.com/531570. |
| 2879 // Test the case where DoRead() takes long but returns synchronously. | 2732 // Test the case where DoRead() takes long but returns synchronously. |
| 2880 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { | 2733 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { |
| 2881 session_deps_.host_resolver->set_synchronous_mode(true); | 2734 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2882 session_deps_.time_func = SlowReads; | 2735 session_deps_.time_func = SlowReads; |
| 2883 | 2736 |
| 2884 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2737 BufferedSpdyFramer framer(HTTP2); |
| 2885 | 2738 |
| 2886 std::unique_ptr<SpdySerializedFrame> req1( | 2739 std::unique_ptr<SpdySerializedFrame> req1( |
| 2887 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2740 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2888 MockWrite writes[] = { | 2741 MockWrite writes[] = { |
| 2889 CreateMockWrite(*req1, 0), | 2742 CreateMockWrite(*req1, 0), |
| 2890 }; | 2743 }; |
| 2891 | 2744 |
| 2892 std::unique_ptr<SpdySerializedFrame> partial_data_frame( | 2745 std::unique_ptr<SpdySerializedFrame> partial_data_frame( |
| 2893 framer.CreateDataFrame(1, "foo ", 4, DATA_FLAG_NONE)); | 2746 framer.CreateDataFrame(1, "foo ", 4, DATA_FLAG_NONE)); |
| 2894 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2747 std::unique_ptr<SpdySerializedFrame> finish_data_frame( |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2942 | 2795 |
| 2943 // Test that SpdySession::DoReadLoop yields while reading the | 2796 // Test that SpdySession::DoReadLoop yields while reading the |
| 2944 // data. This test makes 32k + 1 bytes of data available on the socket | 2797 // data. This test makes 32k + 1 bytes of data available on the socket |
| 2945 // for reading. It then verifies that DoRead has yielded even though | 2798 // for reading. It then verifies that DoRead has yielded even though |
| 2946 // there is data available for it to read (i.e, socket()->Read didn't | 2799 // there is data available for it to read (i.e, socket()->Read didn't |
| 2947 // return ERR_IO_PENDING during socket reads). | 2800 // return ERR_IO_PENDING during socket reads). |
| 2948 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { | 2801 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { |
| 2949 session_deps_.host_resolver->set_synchronous_mode(true); | 2802 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2950 session_deps_.time_func = InstantaneousReads; | 2803 session_deps_.time_func = InstantaneousReads; |
| 2951 | 2804 |
| 2952 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2805 BufferedSpdyFramer framer(HTTP2); |
| 2953 | 2806 |
| 2954 std::unique_ptr<SpdySerializedFrame> req1( | 2807 std::unique_ptr<SpdySerializedFrame> req1( |
| 2955 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2808 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2956 MockWrite writes[] = { | 2809 MockWrite writes[] = { |
| 2957 CreateMockWrite(*req1, 0), | 2810 CreateMockWrite(*req1, 0), |
| 2958 }; | 2811 }; |
| 2959 | 2812 |
| 2960 // Build buffer of size kYieldAfterBytesRead / 4 | 2813 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2961 // (-spdy_data_frame_size). | 2814 // (-spdy_data_frame_size). |
| 2962 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2815 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3036 // | 2889 // |
| 3037 // The above reads 26K synchronously. Since that is less that 32K, we | 2890 // The above reads 26K synchronously. Since that is less that 32K, we |
| 3038 // will attempt to read again. However, that DoRead() will return | 2891 // will attempt to read again. However, that DoRead() will return |
| 3039 // ERR_IO_PENDING (because of async read), so DoReadLoop() will | 2892 // ERR_IO_PENDING (because of async read), so DoReadLoop() will |
| 3040 // yield. When we come back, DoRead() will read the results from the | 2893 // yield. When we come back, DoRead() will read the results from the |
| 3041 // async read, and rest of the data synchronously. | 2894 // async read, and rest of the data synchronously. |
| 3042 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { | 2895 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { |
| 3043 session_deps_.host_resolver->set_synchronous_mode(true); | 2896 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3044 session_deps_.time_func = InstantaneousReads; | 2897 session_deps_.time_func = InstantaneousReads; |
| 3045 | 2898 |
| 3046 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2899 BufferedSpdyFramer framer(HTTP2); |
| 3047 | 2900 |
| 3048 std::unique_ptr<SpdySerializedFrame> req1( | 2901 std::unique_ptr<SpdySerializedFrame> req1( |
| 3049 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2902 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 3050 MockWrite writes[] = { | 2903 MockWrite writes[] = { |
| 3051 CreateMockWrite(*req1, 0), | 2904 CreateMockWrite(*req1, 0), |
| 3052 }; | 2905 }; |
| 3053 | 2906 |
| 3054 // Build buffer of size kYieldAfterBytesRead / 4 | 2907 // Build buffer of size kYieldAfterBytesRead / 4 |
| 3055 // (-spdy_data_frame_size). | 2908 // (-spdy_data_frame_size). |
| 3056 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2909 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3135 EXPECT_EQ(1u, observer.executed_count()); | 2988 EXPECT_EQ(1u, observer.executed_count()); |
| 3136 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2989 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 3137 EXPECT_TRUE(data.AllReadDataConsumed()); | 2990 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 3138 } | 2991 } |
| 3139 | 2992 |
| 3140 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure | 2993 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure |
| 3141 // nothing blows up. | 2994 // nothing blows up. |
| 3142 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { | 2995 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { |
| 3143 session_deps_.host_resolver->set_synchronous_mode(true); | 2996 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3144 | 2997 |
| 3145 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 2998 BufferedSpdyFramer framer(HTTP2); |
| 3146 | 2999 |
| 3147 std::unique_ptr<SpdySerializedFrame> req1( | 3000 std::unique_ptr<SpdySerializedFrame> req1( |
| 3148 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 3001 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 3149 MockWrite writes[] = { | 3002 MockWrite writes[] = { |
| 3150 CreateMockWrite(*req1, 0), | 3003 CreateMockWrite(*req1, 0), |
| 3151 }; | 3004 }; |
| 3152 | 3005 |
| 3153 std::unique_ptr<SpdySerializedFrame> resp1( | 3006 std::unique_ptr<SpdySerializedFrame> resp1( |
| 3154 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 3007 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3155 std::unique_ptr<SpdySerializedFrame> body1( | 3008 std::unique_ptr<SpdySerializedFrame> body1( |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3205 | 3058 |
| 3206 MockRead reads[] = { | 3059 MockRead reads[] = { |
| 3207 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3060 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 3208 }; | 3061 }; |
| 3209 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 3062 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
| 3210 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3063 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3211 | 3064 |
| 3212 CreateNetworkSession(); | 3065 CreateNetworkSession(); |
| 3213 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); | 3066 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3214 | 3067 |
| 3215 EXPECT_EQ(spdy_util_.spdy_version(), | 3068 EXPECT_EQ(HTTP2, session_->buffered_spdy_framer_->protocol_version()); |
| 3216 session_->buffered_spdy_framer_->protocol_version()); | 3069 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3217 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | |
| 3218 session_->session_send_window_size_); | 3070 session_->session_send_window_size_); |
| 3219 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 3071 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3220 session_->session_recv_window_size_); | 3072 session_->session_recv_window_size_); |
| 3221 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3073 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3222 } | 3074 } |
| 3223 | 3075 |
| 3224 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3076 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
| 3225 // pointers to the idle session are currently held. | 3077 // pointers to the idle session are currently held. |
| 3226 TEST_P(SpdySessionTest, CloseOneIdleConnection) { | 3078 TEST_P(SpdySessionTest, CloseOneIdleConnection) { |
| 3227 ClientSocketPoolManager::set_max_sockets_per_group( | 3079 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3228 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3080 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3229 ClientSocketPoolManager::set_max_sockets_per_pool( | 3081 ClientSocketPoolManager::set_max_sockets_per_pool( |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3610 } | 3462 } |
| 3611 | 3463 |
| 3612 // SpdySession::{Increase,Decrease}RecvWindowSize should properly | 3464 // SpdySession::{Increase,Decrease}RecvWindowSize should properly |
| 3613 // adjust the session receive window size. In addition, | 3465 // adjust the session receive window size. In addition, |
| 3614 // SpdySession::IncreaseRecvWindowSize should trigger | 3466 // SpdySession::IncreaseRecvWindowSize should trigger |
| 3615 // sending a WINDOW_UPDATE frame for a large enough delta. | 3467 // sending a WINDOW_UPDATE frame for a large enough delta. |
| 3616 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 3468 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
| 3617 session_deps_.host_resolver->set_synchronous_mode(true); | 3469 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3618 | 3470 |
| 3619 const int32_t initial_window_size = | 3471 const int32_t initial_window_size = |
| 3620 SpdySession::GetDefaultInitialWindowSize(GetProtocol()); | 3472 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); |
| 3621 const int32_t delta_window_size = 100; | 3473 const int32_t delta_window_size = 100; |
| 3622 | 3474 |
| 3623 MockRead reads[] = { | 3475 MockRead reads[] = { |
| 3624 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF | 3476 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF |
| 3625 }; | 3477 }; |
| 3626 std::unique_ptr<SpdySerializedFrame> window_update( | 3478 std::unique_ptr<SpdySerializedFrame> window_update( |
| 3627 spdy_util_.ConstructSpdyWindowUpdate( | 3479 spdy_util_.ConstructSpdyWindowUpdate( |
| 3628 kSessionFlowControlStreamId, | 3480 kSessionFlowControlStreamId, |
| 3629 initial_window_size + delta_window_size)); | 3481 initial_window_size + delta_window_size)); |
| 3630 MockWrite writes[] = { | 3482 MockWrite writes[] = { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3675 MockRead reads[] = { | 3527 MockRead reads[] = { |
| 3676 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3528 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 3677 }; | 3529 }; |
| 3678 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 3530 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
| 3679 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3531 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3680 | 3532 |
| 3681 CreateNetworkSession(); | 3533 CreateNetworkSession(); |
| 3682 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); | 3534 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3683 | 3535 |
| 3684 const int32_t initial_window_size = | 3536 const int32_t initial_window_size = |
| 3685 SpdySession::GetDefaultInitialWindowSize(GetProtocol()); | 3537 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); |
| 3686 const int32_t delta_window_size = 100; | 3538 const int32_t delta_window_size = 100; |
| 3687 | 3539 |
| 3688 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3540 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 3689 | 3541 |
| 3690 session_->IncreaseSendWindowSize(delta_window_size); | 3542 session_->IncreaseSendWindowSize(delta_window_size); |
| 3691 EXPECT_EQ(initial_window_size + delta_window_size, | 3543 EXPECT_EQ(initial_window_size + delta_window_size, |
| 3692 session_->session_send_window_size_); | 3544 session_->session_send_window_size_); |
| 3693 | 3545 |
| 3694 session_->DecreaseSendWindowSize(delta_window_size); | 3546 session_->DecreaseSendWindowSize(delta_window_size); |
| 3695 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3547 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3707 CreateMockRead(*resp, 0), | 3559 CreateMockRead(*resp, 0), |
| 3708 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3560 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3709 MockRead(ASYNC, 0, 2) // EOF | 3561 MockRead(ASYNC, 0, 2) // EOF |
| 3710 }; | 3562 }; |
| 3711 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3563 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3712 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3564 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3713 | 3565 |
| 3714 CreateNetworkSession(); | 3566 CreateNetworkSession(); |
| 3715 CreateInsecureSpdySession(); | 3567 CreateInsecureSpdySession(); |
| 3716 | 3568 |
| 3717 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 3569 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3718 session_->session_recv_window_size_); | 3570 session_->session_recv_window_size_); |
| 3719 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3571 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3720 | 3572 |
| 3721 base::RunLoop().RunUntilIdle(); | 3573 base::RunLoop().RunUntilIdle(); |
| 3722 | 3574 |
| 3723 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 3575 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3724 session_->session_recv_window_size_); | 3576 session_->session_recv_window_size_); |
| 3725 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); | 3577 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); |
| 3726 | 3578 |
| 3727 EXPECT_TRUE(session_); | 3579 EXPECT_TRUE(session_); |
| 3728 data.Resume(); | 3580 data.Resume(); |
| 3729 base::RunLoop().RunUntilIdle(); | 3581 base::RunLoop().RunUntilIdle(); |
| 3730 EXPECT_FALSE(session_); | 3582 EXPECT_FALSE(session_); |
| 3731 } | 3583 } |
| 3732 | 3584 |
| 3733 // The frame header is not included in flow control, but frame payload | 3585 // The frame header is not included in flow control, but frame payload |
| 3734 // (including optional pad length and padding) is. | 3586 // (including optional pad length and padding) is. |
| 3735 TEST_P(SpdySessionTest, SessionFlowControlPadding) { | 3587 TEST_P(SpdySessionTest, SessionFlowControlPadding) { |
| 3736 // Padding only exists in HTTP/2. | |
| 3737 if (GetProtocol() < kProtoHTTP2) | |
| 3738 return; | |
| 3739 | |
| 3740 session_deps_.host_resolver->set_synchronous_mode(true); | 3588 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3741 | 3589 |
| 3742 const int padding_length = 42; | 3590 const int padding_length = 42; |
| 3743 std::unique_ptr<SpdySerializedFrame> resp(spdy_util_.ConstructSpdyBodyFrame( | 3591 std::unique_ptr<SpdySerializedFrame> resp(spdy_util_.ConstructSpdyBodyFrame( |
| 3744 1, kUploadData, kUploadDataSize, false, padding_length)); | 3592 1, kUploadData, kUploadDataSize, false, padding_length)); |
| 3745 MockRead reads[] = { | 3593 MockRead reads[] = { |
| 3746 CreateMockRead(*resp, 0), | 3594 CreateMockRead(*resp, 0), |
| 3747 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3595 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3748 MockRead(ASYNC, 0, 2) // EOF | 3596 MockRead(ASYNC, 0, 2) // EOF |
| 3749 }; | 3597 }; |
| 3750 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3598 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3751 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3599 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3752 | 3600 |
| 3753 CreateNetworkSession(); | 3601 CreateNetworkSession(); |
| 3754 CreateInsecureSpdySession(); | 3602 CreateInsecureSpdySession(); |
| 3755 | 3603 |
| 3756 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 3604 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3757 session_->session_recv_window_size_); | 3605 session_->session_recv_window_size_); |
| 3758 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3606 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3759 | 3607 |
| 3760 base::RunLoop().RunUntilIdle(); | 3608 base::RunLoop().RunUntilIdle(); |
| 3761 | 3609 |
| 3762 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(GetProtocol()), | 3610 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), |
| 3763 session_->session_recv_window_size_); | 3611 session_->session_recv_window_size_); |
| 3764 EXPECT_EQ(kUploadDataSize + padding_length, | 3612 EXPECT_EQ(kUploadDataSize + padding_length, |
| 3765 session_->session_unacked_recv_window_bytes_); | 3613 session_->session_unacked_recv_window_bytes_); |
| 3766 | 3614 |
| 3767 data.Resume(); | 3615 data.Resume(); |
| 3768 base::RunLoop().RunUntilIdle(); | 3616 base::RunLoop().RunUntilIdle(); |
| 3769 EXPECT_FALSE(session_); | 3617 EXPECT_FALSE(session_); |
| 3770 } | 3618 } |
| 3771 | 3619 |
| 3772 // Peer sends more data than stream level receiving flow control window. | 3620 // Peer sends more data than stream level receiving flow control window. |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4042 DropReceivedDataDelegate delegate(stream, msg_data); | 3890 DropReceivedDataDelegate delegate(stream, msg_data); |
| 4043 stream->SetDelegate(&delegate); | 3891 stream->SetDelegate(&delegate); |
| 4044 | 3892 |
| 4045 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 3893 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 4046 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 3894 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 4047 EXPECT_EQ(ERR_IO_PENDING, | 3895 EXPECT_EQ(ERR_IO_PENDING, |
| 4048 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 3896 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 4049 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3897 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 4050 | 3898 |
| 4051 const int32_t initial_window_size = | 3899 const int32_t initial_window_size = |
| 4052 SpdySession::GetDefaultInitialWindowSize(GetProtocol()); | 3900 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); |
| 4053 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 3901 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 4054 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3902 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 4055 | 3903 |
| 4056 base::RunLoop().RunUntilIdle(); | 3904 base::RunLoop().RunUntilIdle(); |
| 4057 | 3905 |
| 4058 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 3906 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 4059 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 3907 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
| 4060 | 3908 |
| 4061 stream->Close(); | 3909 stream->Close(); |
| 4062 EXPECT_FALSE(stream); | 3910 EXPECT_FALSE(stream); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4108 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3956 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 4109 stream->SetDelegate(&delegate); | 3957 stream->SetDelegate(&delegate); |
| 4110 | 3958 |
| 4111 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 3959 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 4112 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 3960 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 4113 EXPECT_EQ(ERR_IO_PENDING, | 3961 EXPECT_EQ(ERR_IO_PENDING, |
| 4114 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 3962 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 4115 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3963 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 4116 | 3964 |
| 4117 const int32_t initial_window_size = | 3965 const int32_t initial_window_size = |
| 4118 SpdySession::GetDefaultInitialWindowSize(GetProtocol()); | 3966 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); |
| 4119 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3967 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 4120 | 3968 |
| 4121 // Write request. | 3969 // Write request. |
| 4122 base::RunLoop().RunUntilIdle(); | 3970 base::RunLoop().RunUntilIdle(); |
| 4123 | 3971 |
| 4124 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3972 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 4125 | 3973 |
| 4126 // Read response, but do not run the message loop, so that the body is not | 3974 // Read response, but do not run the message loop, so that the body is not |
| 4127 // written to the socket. | 3975 // written to the socket. |
| 4128 data.Resume(); | 3976 data.Resume(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4193 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 4041 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 4194 stream->SetDelegate(&delegate); | 4042 stream->SetDelegate(&delegate); |
| 4195 | 4043 |
| 4196 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 4044 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 4197 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 4045 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 4198 EXPECT_EQ(ERR_IO_PENDING, | 4046 EXPECT_EQ(ERR_IO_PENDING, |
| 4199 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 4047 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 4200 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 4048 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 4201 | 4049 |
| 4202 const int32_t initial_window_size = | 4050 const int32_t initial_window_size = |
| 4203 SpdySession::GetDefaultInitialWindowSize(GetProtocol()); | 4051 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); |
| 4204 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 4052 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 4205 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4053 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 4206 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 4054 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 4207 | 4055 |
| 4208 // Send request and message. | 4056 // Send request and message. |
| 4209 base::RunLoop().RunUntilIdle(); | 4057 base::RunLoop().RunUntilIdle(); |
| 4210 | 4058 |
| 4211 EXPECT_EQ(initial_window_size - kMsgDataSize, | 4059 EXPECT_EQ(initial_window_size - kMsgDataSize, |
| 4212 session_->session_send_window_size_); | 4060 session_->session_send_window_size_); |
| 4213 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4061 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4813 | 4661 |
| 4814 TEST_P(SpdySessionTest, SplitHeaders) { | 4662 TEST_P(SpdySessionTest, SplitHeaders) { |
| 4815 GURL kStreamUrl("https://www.example.org/foo.dat"); | 4663 GURL kStreamUrl("https://www.example.org/foo.dat"); |
| 4816 SpdyHeaderBlock headers; | 4664 SpdyHeaderBlock headers; |
| 4817 spdy_util_.AddUrlToHeaderBlock(kStreamUrl.spec(), &headers); | 4665 spdy_util_.AddUrlToHeaderBlock(kStreamUrl.spec(), &headers); |
| 4818 headers["alpha"] = "beta"; | 4666 headers["alpha"] = "beta"; |
| 4819 | 4667 |
| 4820 SpdyHeaderBlock request_headers; | 4668 SpdyHeaderBlock request_headers; |
| 4821 SpdyHeaderBlock response_headers; | 4669 SpdyHeaderBlock response_headers; |
| 4822 | 4670 |
| 4823 SplitPushedHeadersToRequestAndResponse( | 4671 SplitPushedHeadersToRequestAndResponse(headers, HTTP2, &request_headers, |
| 4824 headers, spdy_util_.spdy_version(), &request_headers, &response_headers); | 4672 &response_headers); |
| 4825 | 4673 |
| 4826 SpdyHeaderBlock::const_iterator it = response_headers.find("alpha"); | 4674 SpdyHeaderBlock::const_iterator it = response_headers.find("alpha"); |
| 4827 std::string alpha_val = | 4675 std::string alpha_val = |
| 4828 (it == response_headers.end()) ? std::string() : it->second.as_string(); | 4676 (it == response_headers.end()) ? std::string() : it->second.as_string(); |
| 4829 EXPECT_EQ("beta", alpha_val); | 4677 EXPECT_EQ("beta", alpha_val); |
| 4830 | 4678 |
| 4831 GURL request_url = | 4679 GURL request_url = GetUrlFromHeaderBlock(request_headers, HTTP2); |
| 4832 GetUrlFromHeaderBlock(request_headers, spdy_util_.spdy_version()); | |
| 4833 EXPECT_EQ(kStreamUrl, request_url); | 4680 EXPECT_EQ(kStreamUrl, request_url); |
| 4834 } | 4681 } |
| 4835 | 4682 |
| 4836 // Regression. Sorta. Push streams and client streams were sharing a single | 4683 // Regression. Sorta. Push streams and client streams were sharing a single |
| 4837 // limit for a long time. | 4684 // limit for a long time. |
| 4838 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { | 4685 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { |
| 4839 SettingsMap new_settings; | 4686 SettingsMap new_settings; |
| 4840 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 4687 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 4841 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); | 4688 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); |
| 4842 std::unique_ptr<SpdySerializedFrame> settings_frame( | 4689 std::unique_ptr<SpdySerializedFrame> settings_frame( |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5173 EXPECT_EQ(0u, session_->num_pushed_streams()); | 5020 EXPECT_EQ(0u, session_->num_pushed_streams()); |
| 5174 EXPECT_EQ(0u, session_->num_active_pushed_streams()); | 5021 EXPECT_EQ(0u, session_->num_active_pushed_streams()); |
| 5175 | 5022 |
| 5176 // Read EOF. | 5023 // Read EOF. |
| 5177 data.Resume(); | 5024 data.Resume(); |
| 5178 base::RunLoop().RunUntilIdle(); | 5025 base::RunLoop().RunUntilIdle(); |
| 5179 EXPECT_FALSE(session_); | 5026 EXPECT_FALSE(session_); |
| 5180 } | 5027 } |
| 5181 | 5028 |
| 5182 TEST_P(SpdySessionTest, IgnoreReservedRemoteStreamsCount) { | 5029 TEST_P(SpdySessionTest, IgnoreReservedRemoteStreamsCount) { |
| 5183 // Streams in reserved remote state exist only in HTTP/2. | |
| 5184 if (spdy_util_.spdy_version() < HTTP2) | |
| 5185 return; | |
| 5186 | |
| 5187 std::unique_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush( | 5030 std::unique_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush( |
| 5188 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 5031 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| 5189 SpdyHeaderBlock push_headers; | 5032 SpdyHeaderBlock push_headers; |
| 5190 spdy_util_.AddUrlToHeaderBlock("https://www.example.org/b.dat", | 5033 spdy_util_.AddUrlToHeaderBlock("https://www.example.org/b.dat", |
| 5191 &push_headers); | 5034 &push_headers); |
| 5192 std::unique_ptr<SpdySerializedFrame> push_b( | 5035 std::unique_ptr<SpdySerializedFrame> push_b( |
| 5193 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 4, 1)); | 5036 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 4, 1)); |
| 5194 std::unique_ptr<SpdySerializedFrame> headers_b( | 5037 std::unique_ptr<SpdySerializedFrame> headers_b( |
| 5195 spdy_util_.ConstructSpdyPushHeaders(4, nullptr, 0)); | 5038 spdy_util_.ConstructSpdyPushHeaders(4, nullptr, 0)); |
| 5196 MockRead reads[] = { | 5039 MockRead reads[] = { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5270 EXPECT_EQ(1u, session_->num_pushed_streams()); | 5113 EXPECT_EQ(1u, session_->num_pushed_streams()); |
| 5271 EXPECT_EQ(1u, session_->num_active_pushed_streams()); | 5114 EXPECT_EQ(1u, session_->num_active_pushed_streams()); |
| 5272 | 5115 |
| 5273 // Read EOF. | 5116 // Read EOF. |
| 5274 data.Resume(); | 5117 data.Resume(); |
| 5275 base::RunLoop().RunUntilIdle(); | 5118 base::RunLoop().RunUntilIdle(); |
| 5276 EXPECT_FALSE(session_); | 5119 EXPECT_FALSE(session_); |
| 5277 } | 5120 } |
| 5278 | 5121 |
| 5279 TEST_P(SpdySessionTest, CancelReservedStreamOnHeadersReceived) { | 5122 TEST_P(SpdySessionTest, CancelReservedStreamOnHeadersReceived) { |
| 5280 // Streams in reserved remote state exist only in HTTP/2. | |
| 5281 if (spdy_util_.spdy_version() < HTTP2) | |
| 5282 return; | |
| 5283 | |
| 5284 const char kPushedUrl[] = "https://www.example.org/a.dat"; | 5123 const char kPushedUrl[] = "https://www.example.org/a.dat"; |
| 5285 SpdyHeaderBlock push_headers; | 5124 SpdyHeaderBlock push_headers; |
| 5286 spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); | 5125 spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); |
| 5287 std::unique_ptr<SpdySerializedFrame> push_promise( | 5126 std::unique_ptr<SpdySerializedFrame> push_promise( |
| 5288 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); | 5127 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); |
| 5289 std::unique_ptr<SpdySerializedFrame> headers_frame( | 5128 std::unique_ptr<SpdySerializedFrame> headers_frame( |
| 5290 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); | 5129 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); |
| 5291 MockRead reads[] = { | 5130 MockRead reads[] = { |
| 5292 MockRead(ASYNC, ERR_IO_PENDING, 1), | 5131 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 5293 CreateMockRead(*push_promise, 2), | 5132 CreateMockRead(*push_promise, 2), |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5434 private: | 5273 private: |
| 5435 SpdySerializedFrame altsvc_frame_; | 5274 SpdySerializedFrame altsvc_frame_; |
| 5436 std::vector<MockRead> reads_; | 5275 std::vector<MockRead> reads_; |
| 5437 std::unique_ptr<SequencedSocketData> data_; | 5276 std::unique_ptr<SequencedSocketData> data_; |
| 5438 scoped_refptr<X509Certificate> cert_; | 5277 scoped_refptr<X509Certificate> cert_; |
| 5439 SSLSocketDataProvider ssl_; | 5278 SSLSocketDataProvider ssl_; |
| 5440 }; | 5279 }; |
| 5441 | 5280 |
| 5442 INSTANTIATE_TEST_CASE_P(HTTP2, | 5281 INSTANTIATE_TEST_CASE_P(HTTP2, |
| 5443 AltSvcFrameTest, | 5282 AltSvcFrameTest, |
| 5444 testing::Values(kTestCaseHTTP2PriorityDependencies)); | 5283 testing::Values(kTestCasePriorityDependencies)); |
| 5445 | 5284 |
| 5446 TEST_P(AltSvcFrameTest, ProcessAltSvcFrame) { | 5285 TEST_P(AltSvcFrameTest, ProcessAltSvcFrame) { |
| 5447 const char origin[] = "https://mail.example.org"; | 5286 const char origin[] = "https://mail.example.org"; |
| 5448 SpdyAltSvcIR altsvc_ir(0); | 5287 SpdyAltSvcIR altsvc_ir(0); |
| 5449 altsvc_ir.add_altsvc(alternative_service_); | 5288 altsvc_ir.add_altsvc(alternative_service_); |
| 5450 altsvc_ir.set_origin(origin); | 5289 altsvc_ir.set_origin(origin); |
| 5451 AddSocketData(altsvc_ir); | 5290 AddSocketData(altsvc_ir); |
| 5452 AddSSLSocketData(); | 5291 AddSSLSocketData(); |
| 5453 | 5292 |
| 5454 CreateNetworkSession(); | 5293 CreateNetworkSession(); |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5900 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5739 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
| 5901 "spdy_pooling.pem"); | 5740 "spdy_pooling.pem"); |
| 5902 ssl_info.is_issued_by_known_root = true; | 5741 ssl_info.is_issued_by_known_root = true; |
| 5903 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5742 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
| 5904 | 5743 |
| 5905 EXPECT_TRUE(SpdySession::CanPool( | 5744 EXPECT_TRUE(SpdySession::CanPool( |
| 5906 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5745 &tss, ssl_info, "www.example.org", "mail.example.org")); |
| 5907 } | 5746 } |
| 5908 | 5747 |
| 5909 } // namespace net | 5748 } // namespace net |
| OLD | NEW |