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 |