| 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" |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 14 #include "base/test/histogram_tester.h" | 14 #include "base/test/histogram_tester.h" |
| 15 #include "net/base/host_port_pair.h" | 15 #include "net/base/host_port_pair.h" |
| 16 #include "net/base/io_buffer.h" | 16 #include "net/base/io_buffer.h" |
| 17 #include "net/base/ip_endpoint.h" | 17 #include "net/base/ip_endpoint.h" |
| 18 #include "net/base/proxy_delegate.h" | 18 #include "net/base/proxy_delegate.h" |
| 19 #include "net/base/request_priority.h" | 19 #include "net/base/request_priority.h" |
| 20 #include "net/base/test_data_stream.h" | 20 #include "net/base/test_data_stream.h" |
| 21 #include "net/base/test_proxy_delegate.h" | 21 #include "net/base/test_proxy_delegate.h" |
| 22 #include "net/cert/ct_policy_status.h" | 22 #include "net/cert/ct_policy_status.h" |
| 23 #include "net/log/test_net_log.h" | 23 #include "net/log/test_net_log.h" |
| 24 #include "net/log/test_net_log_entry.h" | 24 #include "net/log/test_net_log_entry.h" |
| 25 #include "net/log/test_net_log_util.h" | 25 #include "net/log/test_net_log_util.h" |
| 26 #include "net/proxy/proxy_server.h" | 26 #include "net/proxy/proxy_server.h" |
| 27 #include "net/socket/client_socket_pool_manager.h" | 27 #include "net/socket/client_socket_pool_manager.h" |
| 28 #include "net/socket/next_proto.h" | |
| 29 #include "net/socket/socket_test_util.h" | 28 #include "net/socket/socket_test_util.h" |
| 30 #include "net/spdy/spdy_http_utils.h" | 29 #include "net/spdy/spdy_http_utils.h" |
| 31 #include "net/spdy/spdy_session_pool.h" | 30 #include "net/spdy/spdy_session_pool.h" |
| 32 #include "net/spdy/spdy_session_test_util.h" | 31 #include "net/spdy/spdy_session_test_util.h" |
| 33 #include "net/spdy/spdy_stream.h" | 32 #include "net/spdy/spdy_stream.h" |
| 34 #include "net/spdy/spdy_stream_test_util.h" | 33 #include "net/spdy/spdy_stream_test_util.h" |
| 35 #include "net/spdy/spdy_test_util_common.h" | 34 #include "net/spdy/spdy_test_util_common.h" |
| 36 #include "net/spdy/spdy_test_utils.h" | 35 #include "net/spdy/spdy_test_utils.h" |
| 37 #include "net/test/cert_test_util.h" | 36 #include "net/test/cert_test_util.h" |
| 38 #include "net/test/gtest_util.h" | 37 #include "net/test/gtest_util.h" |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 spdy_util_.ConstructSpdyGoAway(1)); | 322 spdy_util_.ConstructSpdyGoAway(1)); |
| 324 MockRead reads[] = { | 323 MockRead reads[] = { |
| 325 CreateMockRead(*goaway, 0), | 324 CreateMockRead(*goaway, 0), |
| 326 }; | 325 }; |
| 327 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 326 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 328 session_deps_.socket_factory->AddSocketDataProvider(&data); | 327 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 329 | 328 |
| 330 CreateNetworkSession(); | 329 CreateNetworkSession(); |
| 331 CreateInsecureSpdySession(); | 330 CreateInsecureSpdySession(); |
| 332 | 331 |
| 333 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 334 | |
| 335 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 332 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
| 336 | 333 |
| 337 // Read and process the GOAWAY frame. | 334 // Read and process the GOAWAY frame. |
| 338 base::RunLoop().RunUntilIdle(); | 335 base::RunLoop().RunUntilIdle(); |
| 339 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 336 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 340 EXPECT_FALSE(session_); | 337 EXPECT_FALSE(session_); |
| 341 } | 338 } |
| 342 | 339 |
| 343 // A session receiving a GOAWAY frame immediately with no active | 340 // A session receiving a GOAWAY frame immediately with no active |
| 344 // streams should then close. | 341 // streams should then close. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 MockWrite writes[] = { | 381 MockWrite writes[] = { |
| 385 CreateMockWrite(*req1, 0), | 382 CreateMockWrite(*req1, 0), |
| 386 CreateMockWrite(*req2, 1), | 383 CreateMockWrite(*req2, 1), |
| 387 }; | 384 }; |
| 388 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 385 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 389 session_deps_.socket_factory->AddSocketDataProvider(&data); | 386 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 390 | 387 |
| 391 CreateNetworkSession(); | 388 CreateNetworkSession(); |
| 392 CreateInsecureSpdySession(); | 389 CreateInsecureSpdySession(); |
| 393 | 390 |
| 394 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 395 | |
| 396 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 391 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 397 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 392 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 398 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 393 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 399 spdy_stream1->SetDelegate(&delegate1); | 394 spdy_stream1->SetDelegate(&delegate1); |
| 400 | 395 |
| 401 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 396 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 402 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 397 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 403 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 398 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 404 spdy_stream2->SetDelegate(&delegate2); | 399 spdy_stream2->SetDelegate(&delegate2); |
| 405 | 400 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 452 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 458 MockWrite writes[] = { | 453 MockWrite writes[] = { |
| 459 CreateMockWrite(*req1, 0), | 454 CreateMockWrite(*req1, 0), |
| 460 }; | 455 }; |
| 461 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 456 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 462 session_deps_.socket_factory->AddSocketDataProvider(&data); | 457 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 463 | 458 |
| 464 CreateNetworkSession(); | 459 CreateNetworkSession(); |
| 465 CreateInsecureSpdySession(); | 460 CreateInsecureSpdySession(); |
| 466 | 461 |
| 467 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 468 | |
| 469 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 462 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 470 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 463 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 471 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 464 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 472 spdy_stream1->SetDelegate(&delegate1); | 465 spdy_stream1->SetDelegate(&delegate1); |
| 473 std::unique_ptr<SpdyHeaderBlock> headers1( | 466 std::unique_ptr<SpdyHeaderBlock> headers1( |
| 474 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 467 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 475 spdy_stream1->SendRequestHeaders(std::move(headers1), NO_MORE_DATA_TO_SEND); | 468 spdy_stream1->SendRequestHeaders(std::move(headers1), NO_MORE_DATA_TO_SEND); |
| 476 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 469 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
| 477 | 470 |
| 478 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 471 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 MockWrite writes[] = { | 517 MockWrite writes[] = { |
| 525 CreateMockWrite(*req1, 0), | 518 CreateMockWrite(*req1, 0), |
| 526 CreateMockWrite(*req2, 1), | 519 CreateMockWrite(*req2, 1), |
| 527 }; | 520 }; |
| 528 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 521 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 529 session_deps_.socket_factory->AddSocketDataProvider(&data); | 522 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 530 | 523 |
| 531 CreateNetworkSession(); | 524 CreateNetworkSession(); |
| 532 CreateInsecureSpdySession(); | 525 CreateInsecureSpdySession(); |
| 533 | 526 |
| 534 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 535 | |
| 536 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 527 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 537 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 528 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 538 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 529 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 539 spdy_stream1->SetDelegate(&delegate1); | 530 spdy_stream1->SetDelegate(&delegate1); |
| 540 | 531 |
| 541 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 532 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 542 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 533 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 543 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 534 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 544 spdy_stream2->SetDelegate(&delegate2); | 535 spdy_stream2->SetDelegate(&delegate2); |
| 545 | 536 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 MockWrite writes[] = { | 590 MockWrite writes[] = { |
| 600 CreateMockWrite(*req1, 0), | 591 CreateMockWrite(*req1, 0), |
| 601 CreateMockWrite(*req2, 1), | 592 CreateMockWrite(*req2, 1), |
| 602 }; | 593 }; |
| 603 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 594 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 604 session_deps_.socket_factory->AddSocketDataProvider(&data); | 595 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 605 | 596 |
| 606 CreateNetworkSession(); | 597 CreateNetworkSession(); |
| 607 CreateInsecureSpdySession(); | 598 CreateInsecureSpdySession(); |
| 608 | 599 |
| 609 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 610 | |
| 611 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 600 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 612 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 601 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 613 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 602 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| 614 spdy_stream1->SetDelegate(&delegate1); | 603 spdy_stream1->SetDelegate(&delegate1); |
| 615 | 604 |
| 616 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( | 605 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
| 617 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 606 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 618 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 607 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
| 619 spdy_stream2->SetDelegate(&delegate2); | 608 spdy_stream2->SetDelegate(&delegate2); |
| 620 | 609 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 724 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 736 MockWrite writes[] = { | 725 MockWrite writes[] = { |
| 737 CreateMockWrite(*req, 0), | 726 CreateMockWrite(*req, 0), |
| 738 }; | 727 }; |
| 739 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 728 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 740 session_deps_.socket_factory->AddSocketDataProvider(&data); | 729 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 741 | 730 |
| 742 CreateNetworkSession(); | 731 CreateNetworkSession(); |
| 743 CreateInsecureSpdySession(); | 732 CreateInsecureSpdySession(); |
| 744 | 733 |
| 745 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 746 | |
| 747 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 734 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 748 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 735 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 749 test::StreamDelegateDoNothing delegate(spdy_stream); | 736 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 750 spdy_stream->SetDelegate(&delegate); | 737 spdy_stream->SetDelegate(&delegate); |
| 751 | 738 |
| 752 std::unique_ptr<SpdyHeaderBlock> headers( | 739 std::unique_ptr<SpdyHeaderBlock> headers( |
| 753 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 740 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 754 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 741 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 755 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 742 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| 756 | 743 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 786 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 800 std::unique_ptr<SpdySerializedFrame> rst( | 787 std::unique_ptr<SpdySerializedFrame> rst( |
| 801 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 788 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 802 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; | 789 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; |
| 803 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 790 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 804 session_deps_.socket_factory->AddSocketDataProvider(&data); | 791 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 805 | 792 |
| 806 CreateNetworkSession(); | 793 CreateNetworkSession(); |
| 807 CreateInsecureSpdySession(); | 794 CreateInsecureSpdySession(); |
| 808 | 795 |
| 809 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 810 | |
| 811 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 796 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 812 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 797 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 813 test::StreamDelegateDoNothing delegate(spdy_stream); | 798 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 814 spdy_stream->SetDelegate(&delegate); | 799 spdy_stream->SetDelegate(&delegate); |
| 815 | 800 |
| 816 std::unique_ptr<SpdyHeaderBlock> headers( | 801 std::unique_ptr<SpdyHeaderBlock> headers( |
| 817 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 802 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 818 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 803 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 819 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 804 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| 820 | 805 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 850 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 835 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 851 MockWrite writes[] = { | 836 MockWrite writes[] = { |
| 852 CreateMockWrite(*req1, 0), | 837 CreateMockWrite(*req1, 0), |
| 853 }; | 838 }; |
| 854 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 839 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 855 session_deps_.socket_factory->AddSocketDataProvider(&data); | 840 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 856 | 841 |
| 857 CreateNetworkSession(); | 842 CreateNetworkSession(); |
| 858 CreateInsecureSpdySession(); | 843 CreateInsecureSpdySession(); |
| 859 | 844 |
| 860 EXPECT_EQ(HTTP2, session_->GetProtocolVersion()); | |
| 861 | |
| 862 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 845 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 863 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 846 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 864 test::StreamDelegateDoNothing delegate(spdy_stream); | 847 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 865 spdy_stream->SetDelegate(&delegate); | 848 spdy_stream->SetDelegate(&delegate); |
| 866 | 849 |
| 867 std::unique_ptr<SpdyHeaderBlock> headers( | 850 std::unique_ptr<SpdyHeaderBlock> headers( |
| 868 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 851 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
| 869 | 852 |
| 870 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 853 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 871 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 854 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1363 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 1346 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
| 1364 | 1347 |
| 1365 base::RunLoop().RunUntilIdle(); | 1348 base::RunLoop().RunUntilIdle(); |
| 1366 | 1349 |
| 1367 // Verify that there is one unclaimed push stream. | 1350 // Verify that there is one unclaimed push stream. |
| 1368 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); | 1351 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); |
| 1369 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( | 1352 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( |
| 1370 GURL("https://www.example.org/a.dat"))); | 1353 GURL("https://www.example.org/a.dat"))); |
| 1371 | 1354 |
| 1372 // Unclaimed push body consumed bytes from the session window. | 1355 // Unclaimed push body consumed bytes from the session window. |
| 1373 EXPECT_EQ( | 1356 EXPECT_EQ(kDefaultInitialWindowSize - kUploadDataSize, |
| 1374 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2) - kUploadDataSize, | 1357 session_->session_recv_window_size_); |
| 1375 session_->session_recv_window_size_); | |
| 1376 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 1358 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 1377 | 1359 |
| 1378 // Shift time to expire the push stream. Read the second SYN_STREAM, | 1360 // Shift time to expire the push stream. Read the second SYN_STREAM, |
| 1379 // and verify a RST_STREAM was written. | 1361 // and verify a RST_STREAM was written. |
| 1380 g_time_delta = base::TimeDelta::FromSeconds(301); | 1362 g_time_delta = base::TimeDelta::FromSeconds(301); |
| 1381 data.Resume(); | 1363 data.Resume(); |
| 1382 base::RunLoop().RunUntilIdle(); | 1364 base::RunLoop().RunUntilIdle(); |
| 1383 | 1365 |
| 1384 // Verify that the second pushed stream evicted the first pushed stream. | 1366 // Verify that the second pushed stream evicted the first pushed stream. |
| 1385 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); | 1367 EXPECT_EQ(1u, session_->num_unclaimed_pushed_streams()); |
| 1386 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( | 1368 EXPECT_EQ(1u, session_->count_unclaimed_pushed_streams_for_url( |
| 1387 GURL("https://www.example.org/0.dat"))); | 1369 GURL("https://www.example.org/0.dat"))); |
| 1388 | 1370 |
| 1389 // Verify that the session window reclaimed the evicted stream body. | 1371 // Verify that the session window reclaimed the evicted stream body. |
| 1390 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 1372 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 1391 session_->session_recv_window_size_); | |
| 1392 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); | 1373 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); |
| 1393 | 1374 |
| 1394 // Read and process EOF. | 1375 // Read and process EOF. |
| 1395 EXPECT_TRUE(session_); | 1376 EXPECT_TRUE(session_); |
| 1396 data.Resume(); | 1377 data.Resume(); |
| 1397 base::RunLoop().RunUntilIdle(); | 1378 base::RunLoop().RunUntilIdle(); |
| 1398 EXPECT_FALSE(session_); | 1379 EXPECT_FALSE(session_); |
| 1399 } | 1380 } |
| 1400 | 1381 |
| 1401 TEST_P(SpdySessionTest, FailedPing) { | 1382 TEST_P(SpdySessionTest, FailedPing) { |
| (...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2579 } | 2560 } |
| 2580 | 2561 |
| 2581 // Test that SpdySession::DoReadLoop reads data from the socket | 2562 // Test that SpdySession::DoReadLoop reads data from the socket |
| 2582 // without yielding. This test makes 32k - 1 bytes of data available | 2563 // without yielding. This test makes 32k - 1 bytes of data available |
| 2583 // on the socket for reading. It then verifies that it has read all | 2564 // on the socket for reading. It then verifies that it has read all |
| 2584 // the available data without yielding. | 2565 // the available data without yielding. |
| 2585 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { | 2566 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { |
| 2586 session_deps_.host_resolver->set_synchronous_mode(true); | 2567 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2587 session_deps_.time_func = InstantaneousReads; | 2568 session_deps_.time_func = InstantaneousReads; |
| 2588 | 2569 |
| 2589 BufferedSpdyFramer framer(HTTP2); | 2570 BufferedSpdyFramer framer; |
| 2590 | 2571 |
| 2591 std::unique_ptr<SpdySerializedFrame> req1( | 2572 std::unique_ptr<SpdySerializedFrame> req1( |
| 2592 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2573 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2593 MockWrite writes[] = { | 2574 MockWrite writes[] = { |
| 2594 CreateMockWrite(*req1, 0), | 2575 CreateMockWrite(*req1, 0), |
| 2595 }; | 2576 }; |
| 2596 | 2577 |
| 2597 // Build buffer of size kYieldAfterBytesRead / 4 | 2578 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2598 // (-spdy_data_frame_size). | 2579 // (-spdy_data_frame_size). |
| 2599 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2580 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2666 EXPECT_TRUE(data.AllReadDataConsumed()); | 2647 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2667 } | 2648 } |
| 2668 | 2649 |
| 2669 // Test that SpdySession::DoReadLoop yields if more than | 2650 // Test that SpdySession::DoReadLoop yields if more than |
| 2670 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time | 2651 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time |
| 2671 // function that makes the response frame look very slow to read. | 2652 // function that makes the response frame look very slow to read. |
| 2672 TEST_P(SpdySessionTest, TestYieldingSlowReads) { | 2653 TEST_P(SpdySessionTest, TestYieldingSlowReads) { |
| 2673 session_deps_.host_resolver->set_synchronous_mode(true); | 2654 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2674 session_deps_.time_func = SlowReads; | 2655 session_deps_.time_func = SlowReads; |
| 2675 | 2656 |
| 2676 BufferedSpdyFramer framer(HTTP2); | 2657 BufferedSpdyFramer framer; |
| 2677 | 2658 |
| 2678 std::unique_ptr<SpdySerializedFrame> req1( | 2659 std::unique_ptr<SpdySerializedFrame> req1( |
| 2679 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2660 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2680 MockWrite writes[] = { | 2661 MockWrite writes[] = { |
| 2681 CreateMockWrite(*req1, 0), | 2662 CreateMockWrite(*req1, 0), |
| 2682 }; | 2663 }; |
| 2683 | 2664 |
| 2684 std::unique_ptr<SpdySerializedFrame> resp1( | 2665 std::unique_ptr<SpdySerializedFrame> resp1( |
| 2685 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2666 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2686 | 2667 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2727 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2708 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2728 EXPECT_TRUE(data.AllReadDataConsumed()); | 2709 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2729 } | 2710 } |
| 2730 | 2711 |
| 2731 // Regression test for https://crbug.com/531570. | 2712 // Regression test for https://crbug.com/531570. |
| 2732 // Test the case where DoRead() takes long but returns synchronously. | 2713 // Test the case where DoRead() takes long but returns synchronously. |
| 2733 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { | 2714 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { |
| 2734 session_deps_.host_resolver->set_synchronous_mode(true); | 2715 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2735 session_deps_.time_func = SlowReads; | 2716 session_deps_.time_func = SlowReads; |
| 2736 | 2717 |
| 2737 BufferedSpdyFramer framer(HTTP2); | 2718 BufferedSpdyFramer framer; |
| 2738 | 2719 |
| 2739 std::unique_ptr<SpdySerializedFrame> req1( | 2720 std::unique_ptr<SpdySerializedFrame> req1( |
| 2740 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2721 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2741 MockWrite writes[] = { | 2722 MockWrite writes[] = { |
| 2742 CreateMockWrite(*req1, 0), | 2723 CreateMockWrite(*req1, 0), |
| 2743 }; | 2724 }; |
| 2744 | 2725 |
| 2745 std::unique_ptr<SpdySerializedFrame> partial_data_frame( | 2726 std::unique_ptr<SpdySerializedFrame> partial_data_frame( |
| 2746 framer.CreateDataFrame(1, "foo ", 4, DATA_FLAG_NONE)); | 2727 framer.CreateDataFrame(1, "foo ", 4, DATA_FLAG_NONE)); |
| 2747 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2728 std::unique_ptr<SpdySerializedFrame> finish_data_frame( |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2795 | 2776 |
| 2796 // Test that SpdySession::DoReadLoop yields while reading the | 2777 // Test that SpdySession::DoReadLoop yields while reading the |
| 2797 // data. This test makes 32k + 1 bytes of data available on the socket | 2778 // data. This test makes 32k + 1 bytes of data available on the socket |
| 2798 // for reading. It then verifies that DoRead has yielded even though | 2779 // for reading. It then verifies that DoRead has yielded even though |
| 2799 // there is data available for it to read (i.e, socket()->Read didn't | 2780 // there is data available for it to read (i.e, socket()->Read didn't |
| 2800 // return ERR_IO_PENDING during socket reads). | 2781 // return ERR_IO_PENDING during socket reads). |
| 2801 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { | 2782 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { |
| 2802 session_deps_.host_resolver->set_synchronous_mode(true); | 2783 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2803 session_deps_.time_func = InstantaneousReads; | 2784 session_deps_.time_func = InstantaneousReads; |
| 2804 | 2785 |
| 2805 BufferedSpdyFramer framer(HTTP2); | 2786 BufferedSpdyFramer framer; |
| 2806 | 2787 |
| 2807 std::unique_ptr<SpdySerializedFrame> req1( | 2788 std::unique_ptr<SpdySerializedFrame> req1( |
| 2808 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2789 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2809 MockWrite writes[] = { | 2790 MockWrite writes[] = { |
| 2810 CreateMockWrite(*req1, 0), | 2791 CreateMockWrite(*req1, 0), |
| 2811 }; | 2792 }; |
| 2812 | 2793 |
| 2813 // Build buffer of size kYieldAfterBytesRead / 4 | 2794 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2814 // (-spdy_data_frame_size). | 2795 // (-spdy_data_frame_size). |
| 2815 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2796 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2889 // | 2870 // |
| 2890 // The above reads 26K synchronously. Since that is less that 32K, we | 2871 // The above reads 26K synchronously. Since that is less that 32K, we |
| 2891 // will attempt to read again. However, that DoRead() will return | 2872 // will attempt to read again. However, that DoRead() will return |
| 2892 // ERR_IO_PENDING (because of async read), so DoReadLoop() will | 2873 // ERR_IO_PENDING (because of async read), so DoReadLoop() will |
| 2893 // yield. When we come back, DoRead() will read the results from the | 2874 // yield. When we come back, DoRead() will read the results from the |
| 2894 // async read, and rest of the data synchronously. | 2875 // async read, and rest of the data synchronously. |
| 2895 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { | 2876 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { |
| 2896 session_deps_.host_resolver->set_synchronous_mode(true); | 2877 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2897 session_deps_.time_func = InstantaneousReads; | 2878 session_deps_.time_func = InstantaneousReads; |
| 2898 | 2879 |
| 2899 BufferedSpdyFramer framer(HTTP2); | 2880 BufferedSpdyFramer framer; |
| 2900 | 2881 |
| 2901 std::unique_ptr<SpdySerializedFrame> req1( | 2882 std::unique_ptr<SpdySerializedFrame> req1( |
| 2902 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2883 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2903 MockWrite writes[] = { | 2884 MockWrite writes[] = { |
| 2904 CreateMockWrite(*req1, 0), | 2885 CreateMockWrite(*req1, 0), |
| 2905 }; | 2886 }; |
| 2906 | 2887 |
| 2907 // Build buffer of size kYieldAfterBytesRead / 4 | 2888 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2908 // (-spdy_data_frame_size). | 2889 // (-spdy_data_frame_size). |
| 2909 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2890 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2988 EXPECT_EQ(1u, observer.executed_count()); | 2969 EXPECT_EQ(1u, observer.executed_count()); |
| 2989 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2970 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2990 EXPECT_TRUE(data.AllReadDataConsumed()); | 2971 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2991 } | 2972 } |
| 2992 | 2973 |
| 2993 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure | 2974 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure |
| 2994 // nothing blows up. | 2975 // nothing blows up. |
| 2995 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { | 2976 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { |
| 2996 session_deps_.host_resolver->set_synchronous_mode(true); | 2977 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2997 | 2978 |
| 2998 BufferedSpdyFramer framer(HTTP2); | 2979 BufferedSpdyFramer framer; |
| 2999 | 2980 |
| 3000 std::unique_ptr<SpdySerializedFrame> req1( | 2981 std::unique_ptr<SpdySerializedFrame> req1( |
| 3001 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2982 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 3002 MockWrite writes[] = { | 2983 MockWrite writes[] = { |
| 3003 CreateMockWrite(*req1, 0), | 2984 CreateMockWrite(*req1, 0), |
| 3004 }; | 2985 }; |
| 3005 | 2986 |
| 3006 std::unique_ptr<SpdySerializedFrame> resp1( | 2987 std::unique_ptr<SpdySerializedFrame> resp1( |
| 3007 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2988 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3008 std::unique_ptr<SpdySerializedFrame> body1( | 2989 std::unique_ptr<SpdySerializedFrame> body1( |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3058 | 3039 |
| 3059 MockRead reads[] = { | 3040 MockRead reads[] = { |
| 3060 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3041 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 3061 }; | 3042 }; |
| 3062 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 3043 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
| 3063 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3044 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3064 | 3045 |
| 3065 CreateNetworkSession(); | 3046 CreateNetworkSession(); |
| 3066 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); | 3047 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3067 | 3048 |
| 3068 EXPECT_EQ(HTTP2, session_->buffered_spdy_framer_->protocol_version()); | 3049 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_send_window_size_); |
| 3069 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 3050 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3070 session_->session_send_window_size_); | |
| 3071 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | |
| 3072 session_->session_recv_window_size_); | |
| 3073 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3051 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3074 } | 3052 } |
| 3075 | 3053 |
| 3076 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3054 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
| 3077 // pointers to the idle session are currently held. | 3055 // pointers to the idle session are currently held. |
| 3078 TEST_P(SpdySessionTest, CloseOneIdleConnection) { | 3056 TEST_P(SpdySessionTest, CloseOneIdleConnection) { |
| 3079 ClientSocketPoolManager::set_max_sockets_per_group( | 3057 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3080 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3058 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3081 ClientSocketPoolManager::set_max_sockets_per_pool( | 3059 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 3082 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3060 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3461 EXPECT_FALSE(session_); | 3439 EXPECT_FALSE(session_); |
| 3462 } | 3440 } |
| 3463 | 3441 |
| 3464 // SpdySession::{Increase,Decrease}RecvWindowSize should properly | 3442 // SpdySession::{Increase,Decrease}RecvWindowSize should properly |
| 3465 // adjust the session receive window size. In addition, | 3443 // adjust the session receive window size. In addition, |
| 3466 // SpdySession::IncreaseRecvWindowSize should trigger | 3444 // SpdySession::IncreaseRecvWindowSize should trigger |
| 3467 // sending a WINDOW_UPDATE frame for a large enough delta. | 3445 // sending a WINDOW_UPDATE frame for a large enough delta. |
| 3468 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 3446 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
| 3469 session_deps_.host_resolver->set_synchronous_mode(true); | 3447 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3470 | 3448 |
| 3471 const int32_t initial_window_size = | 3449 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 3472 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); | |
| 3473 const int32_t delta_window_size = 100; | 3450 const int32_t delta_window_size = 100; |
| 3474 | 3451 |
| 3475 MockRead reads[] = { | 3452 MockRead reads[] = { |
| 3476 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF | 3453 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF |
| 3477 }; | 3454 }; |
| 3478 std::unique_ptr<SpdySerializedFrame> window_update( | 3455 std::unique_ptr<SpdySerializedFrame> window_update( |
| 3479 spdy_util_.ConstructSpdyWindowUpdate( | 3456 spdy_util_.ConstructSpdyWindowUpdate( |
| 3480 kSessionFlowControlStreamId, | 3457 kSessionFlowControlStreamId, |
| 3481 initial_window_size + delta_window_size)); | 3458 initial_window_size + delta_window_size)); |
| 3482 MockWrite writes[] = { | 3459 MockWrite writes[] = { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3526 | 3503 |
| 3527 MockRead reads[] = { | 3504 MockRead reads[] = { |
| 3528 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3505 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 3529 }; | 3506 }; |
| 3530 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 3507 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
| 3531 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3508 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3532 | 3509 |
| 3533 CreateNetworkSession(); | 3510 CreateNetworkSession(); |
| 3534 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); | 3511 session_ = CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3535 | 3512 |
| 3536 const int32_t initial_window_size = | 3513 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 3537 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); | |
| 3538 const int32_t delta_window_size = 100; | 3514 const int32_t delta_window_size = 100; |
| 3539 | 3515 |
| 3540 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3516 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 3541 | 3517 |
| 3542 session_->IncreaseSendWindowSize(delta_window_size); | 3518 session_->IncreaseSendWindowSize(delta_window_size); |
| 3543 EXPECT_EQ(initial_window_size + delta_window_size, | 3519 EXPECT_EQ(initial_window_size + delta_window_size, |
| 3544 session_->session_send_window_size_); | 3520 session_->session_send_window_size_); |
| 3545 | 3521 |
| 3546 session_->DecreaseSendWindowSize(delta_window_size); | 3522 session_->DecreaseSendWindowSize(delta_window_size); |
| 3547 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3523 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3559 CreateMockRead(*resp, 0), | 3535 CreateMockRead(*resp, 0), |
| 3560 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3536 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3561 MockRead(ASYNC, 0, 2) // EOF | 3537 MockRead(ASYNC, 0, 2) // EOF |
| 3562 }; | 3538 }; |
| 3563 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3539 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3564 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3540 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3565 | 3541 |
| 3566 CreateNetworkSession(); | 3542 CreateNetworkSession(); |
| 3567 CreateInsecureSpdySession(); | 3543 CreateInsecureSpdySession(); |
| 3568 | 3544 |
| 3569 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 3545 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3570 session_->session_recv_window_size_); | |
| 3571 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3546 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3572 | 3547 |
| 3573 base::RunLoop().RunUntilIdle(); | 3548 base::RunLoop().RunUntilIdle(); |
| 3574 | 3549 |
| 3575 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 3550 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3576 session_->session_recv_window_size_); | |
| 3577 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); | 3551 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); |
| 3578 | 3552 |
| 3579 EXPECT_TRUE(session_); | 3553 EXPECT_TRUE(session_); |
| 3580 data.Resume(); | 3554 data.Resume(); |
| 3581 base::RunLoop().RunUntilIdle(); | 3555 base::RunLoop().RunUntilIdle(); |
| 3582 EXPECT_FALSE(session_); | 3556 EXPECT_FALSE(session_); |
| 3583 } | 3557 } |
| 3584 | 3558 |
| 3585 // The frame header is not included in flow control, but frame payload | 3559 // The frame header is not included in flow control, but frame payload |
| 3586 // (including optional pad length and padding) is. | 3560 // (including optional pad length and padding) is. |
| 3587 TEST_P(SpdySessionTest, SessionFlowControlPadding) { | 3561 TEST_P(SpdySessionTest, SessionFlowControlPadding) { |
| 3588 session_deps_.host_resolver->set_synchronous_mode(true); | 3562 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3589 | 3563 |
| 3590 const int padding_length = 42; | 3564 const int padding_length = 42; |
| 3591 std::unique_ptr<SpdySerializedFrame> resp(spdy_util_.ConstructSpdyBodyFrame( | 3565 std::unique_ptr<SpdySerializedFrame> resp(spdy_util_.ConstructSpdyBodyFrame( |
| 3592 1, kUploadData, kUploadDataSize, false, padding_length)); | 3566 1, kUploadData, kUploadDataSize, false, padding_length)); |
| 3593 MockRead reads[] = { | 3567 MockRead reads[] = { |
| 3594 CreateMockRead(*resp, 0), | 3568 CreateMockRead(*resp, 0), |
| 3595 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3569 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3596 MockRead(ASYNC, 0, 2) // EOF | 3570 MockRead(ASYNC, 0, 2) // EOF |
| 3597 }; | 3571 }; |
| 3598 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3572 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3599 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3573 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3600 | 3574 |
| 3601 CreateNetworkSession(); | 3575 CreateNetworkSession(); |
| 3602 CreateInsecureSpdySession(); | 3576 CreateInsecureSpdySession(); |
| 3603 | 3577 |
| 3604 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 3578 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3605 session_->session_recv_window_size_); | |
| 3606 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3579 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3607 | 3580 |
| 3608 base::RunLoop().RunUntilIdle(); | 3581 base::RunLoop().RunUntilIdle(); |
| 3609 | 3582 |
| 3610 EXPECT_EQ(SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2), | 3583 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3611 session_->session_recv_window_size_); | |
| 3612 EXPECT_EQ(kUploadDataSize + padding_length, | 3584 EXPECT_EQ(kUploadDataSize + padding_length, |
| 3613 session_->session_unacked_recv_window_bytes_); | 3585 session_->session_unacked_recv_window_bytes_); |
| 3614 | 3586 |
| 3615 data.Resume(); | 3587 data.Resume(); |
| 3616 base::RunLoop().RunUntilIdle(); | 3588 base::RunLoop().RunUntilIdle(); |
| 3617 EXPECT_FALSE(session_); | 3589 EXPECT_FALSE(session_); |
| 3618 } | 3590 } |
| 3619 | 3591 |
| 3620 // Peer sends more data than stream level receiving flow control window. | 3592 // Peer sends more data than stream level receiving flow control window. |
| 3621 TEST_P(SpdySessionTest, StreamFlowControlTooMuchData) { | 3593 TEST_P(SpdySessionTest, StreamFlowControlTooMuchData) { |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3889 | 3861 |
| 3890 DropReceivedDataDelegate delegate(stream, msg_data); | 3862 DropReceivedDataDelegate delegate(stream, msg_data); |
| 3891 stream->SetDelegate(&delegate); | 3863 stream->SetDelegate(&delegate); |
| 3892 | 3864 |
| 3893 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 3865 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 3894 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 3866 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 3895 EXPECT_EQ(ERR_IO_PENDING, | 3867 EXPECT_EQ(ERR_IO_PENDING, |
| 3896 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 3868 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 3897 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3869 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 3898 | 3870 |
| 3899 const int32_t initial_window_size = | 3871 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 3900 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); | |
| 3901 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 3872 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 3902 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3873 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3903 | 3874 |
| 3904 base::RunLoop().RunUntilIdle(); | 3875 base::RunLoop().RunUntilIdle(); |
| 3905 | 3876 |
| 3906 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 3877 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 3907 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 3878 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
| 3908 | 3879 |
| 3909 stream->Close(); | 3880 stream->Close(); |
| 3910 EXPECT_FALSE(stream); | 3881 EXPECT_FALSE(stream); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3955 | 3926 |
| 3956 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3927 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 3957 stream->SetDelegate(&delegate); | 3928 stream->SetDelegate(&delegate); |
| 3958 | 3929 |
| 3959 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 3930 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 3960 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 3931 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 3961 EXPECT_EQ(ERR_IO_PENDING, | 3932 EXPECT_EQ(ERR_IO_PENDING, |
| 3962 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 3933 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 3963 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3934 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 3964 | 3935 |
| 3965 const int32_t initial_window_size = | 3936 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 3966 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); | |
| 3967 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3937 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 3968 | 3938 |
| 3969 // Write request. | 3939 // Write request. |
| 3970 base::RunLoop().RunUntilIdle(); | 3940 base::RunLoop().RunUntilIdle(); |
| 3971 | 3941 |
| 3972 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3942 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 3973 | 3943 |
| 3974 // Read response, but do not run the message loop, so that the body is not | 3944 // Read response, but do not run the message loop, so that the body is not |
| 3975 // written to the socket. | 3945 // written to the socket. |
| 3976 data.Resume(); | 3946 data.Resume(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4040 | 4010 |
| 4041 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 4011 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 4042 stream->SetDelegate(&delegate); | 4012 stream->SetDelegate(&delegate); |
| 4043 | 4013 |
| 4044 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( | 4014 std::unique_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock( |
| 4045 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); | 4015 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kMsgDataSize))); |
| 4046 EXPECT_EQ(ERR_IO_PENDING, | 4016 EXPECT_EQ(ERR_IO_PENDING, |
| 4047 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); | 4017 stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND)); |
| 4048 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 4018 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 4049 | 4019 |
| 4050 const int32_t initial_window_size = | 4020 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 4051 SpdySession::GetDefaultInitialWindowSize(kProtoHTTP2); | |
| 4052 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 4021 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 4053 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4022 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 4054 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 4023 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 4055 | 4024 |
| 4056 // Send request and message. | 4025 // Send request and message. |
| 4057 base::RunLoop().RunUntilIdle(); | 4026 base::RunLoop().RunUntilIdle(); |
| 4058 | 4027 |
| 4059 EXPECT_EQ(initial_window_size - kMsgDataSize, | 4028 EXPECT_EQ(initial_window_size - kMsgDataSize, |
| 4060 session_->session_send_window_size_); | 4029 session_->session_send_window_size_); |
| 4061 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4030 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4652 | 4621 |
| 4653 // Read response headers & body. Body overflows the session window, and a | 4622 // Read response headers & body. Body overflows the session window, and a |
| 4654 // goaway is written. | 4623 // goaway is written. |
| 4655 data.Resume(); | 4624 data.Resume(); |
| 4656 base::RunLoop().RunUntilIdle(); | 4625 base::RunLoop().RunUntilIdle(); |
| 4657 | 4626 |
| 4658 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR)); | 4627 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR)); |
| 4659 EXPECT_FALSE(session_); | 4628 EXPECT_FALSE(session_); |
| 4660 } | 4629 } |
| 4661 | 4630 |
| 4662 TEST_P(SpdySessionTest, SplitHeaders) { | |
| 4663 GURL kStreamUrl("https://www.example.org/foo.dat"); | |
| 4664 SpdyHeaderBlock headers; | |
| 4665 spdy_util_.AddUrlToHeaderBlock(kStreamUrl.spec(), &headers); | |
| 4666 headers["alpha"] = "beta"; | |
| 4667 | |
| 4668 SpdyHeaderBlock request_headers; | |
| 4669 SpdyHeaderBlock response_headers; | |
| 4670 | |
| 4671 SplitPushedHeadersToRequestAndResponse(headers, HTTP2, &request_headers, | |
| 4672 &response_headers); | |
| 4673 | |
| 4674 SpdyHeaderBlock::const_iterator it = response_headers.find("alpha"); | |
| 4675 std::string alpha_val = | |
| 4676 (it == response_headers.end()) ? std::string() : it->second.as_string(); | |
| 4677 EXPECT_EQ("beta", alpha_val); | |
| 4678 | |
| 4679 GURL request_url = GetUrlFromHeaderBlock(request_headers, HTTP2); | |
| 4680 EXPECT_EQ(kStreamUrl, request_url); | |
| 4681 } | |
| 4682 | |
| 4683 // Regression. Sorta. Push streams and client streams were sharing a single | 4631 // Regression. Sorta. Push streams and client streams were sharing a single |
| 4684 // limit for a long time. | 4632 // limit for a long time. |
| 4685 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { | 4633 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { |
| 4686 SettingsMap new_settings; | 4634 SettingsMap new_settings; |
| 4687 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 4635 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 4688 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); | 4636 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); |
| 4689 std::unique_ptr<SpdySerializedFrame> settings_frame( | 4637 std::unique_ptr<SpdySerializedFrame> settings_frame( |
| 4690 spdy_util_.ConstructSpdySettings(new_settings)); | 4638 spdy_util_.ConstructSpdySettings(new_settings)); |
| 4691 std::unique_ptr<SpdySerializedFrame> pushed(spdy_util_.ConstructSpdyPush( | 4639 std::unique_ptr<SpdySerializedFrame> pushed(spdy_util_.ConstructSpdyPush( |
| 4692 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 4640 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| (...skipping 1046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5739 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5687 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
| 5740 "spdy_pooling.pem"); | 5688 "spdy_pooling.pem"); |
| 5741 ssl_info.is_issued_by_known_root = true; | 5689 ssl_info.is_issued_by_known_root = true; |
| 5742 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5690 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
| 5743 | 5691 |
| 5744 EXPECT_TRUE(SpdySession::CanPool( | 5692 EXPECT_TRUE(SpdySession::CanPool( |
| 5745 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5693 &tss, ssl_info, "www.example.org", "mail.example.org")); |
| 5746 } | 5694 } |
| 5747 | 5695 |
| 5748 } // namespace net | 5696 } // namespace net |
| OLD | NEW |