| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 GURL test_url_; | 212 GURL test_url_; |
| 213 HostPortPair test_host_port_pair_; | 213 HostPortPair test_host_port_pair_; |
| 214 SpdySessionKey key_; | 214 SpdySessionKey key_; |
| 215 }; | 215 }; |
| 216 | 216 |
| 217 INSTANTIATE_TEST_CASE_P( | 217 INSTANTIATE_TEST_CASE_P( |
| 218 NextProto, | 218 NextProto, |
| 219 SpdySessionTest, | 219 SpdySessionTest, |
| 220 testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2)); | 220 testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2)); |
| 221 | 221 |
| 222 // TODO(akalin): Don't early-exit in the tests below for values > | |
| 223 // kProtoSPDY3. | |
| 224 | |
| 225 TEST_P(SpdySessionTest, GoAway) { | 222 TEST_P(SpdySessionTest, GoAway) { |
| 226 if (GetParam() > kProtoSPDY3) | |
| 227 return; | |
| 228 | |
| 229 session_deps_.host_resolver->set_synchronous_mode(true); | 223 session_deps_.host_resolver->set_synchronous_mode(true); |
| 230 | 224 |
| 231 MockConnect connect_data(SYNCHRONOUS, OK); | 225 MockConnect connect_data(SYNCHRONOUS, OK); |
| 232 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 226 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 233 MockRead reads[] = { | 227 MockRead reads[] = { |
| 234 CreateMockRead(*goaway, 2), | 228 CreateMockRead(*goaway, 2), |
| 235 MockRead(ASYNC, 0, 3) // EOF | 229 MockRead(ASYNC, 0, 3) // EOF |
| 236 }; | 230 }; |
| 237 scoped_ptr<SpdyFrame> req1( | 231 scoped_ptr<SpdyFrame> req1( |
| 238 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 232 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 // Delete the first session. | 295 // Delete the first session. |
| 302 session = NULL; | 296 session = NULL; |
| 303 | 297 |
| 304 // Delete the second session. | 298 // Delete the second session. |
| 305 spdy_session_pool_->Remove(session2); | 299 spdy_session_pool_->Remove(session2); |
| 306 session2 = NULL; | 300 session2 = NULL; |
| 307 EXPECT_EQ(NULL, spdy_stream2.get()); | 301 EXPECT_EQ(NULL, spdy_stream2.get()); |
| 308 } | 302 } |
| 309 | 303 |
| 310 TEST_P(SpdySessionTest, ClientPing) { | 304 TEST_P(SpdySessionTest, ClientPing) { |
| 311 if (GetParam() > kProtoSPDY3) | |
| 312 return; | |
| 313 | |
| 314 session_deps_.enable_ping = true; | 305 session_deps_.enable_ping = true; |
| 315 session_deps_.host_resolver->set_synchronous_mode(true); | 306 session_deps_.host_resolver->set_synchronous_mode(true); |
| 316 | 307 |
| 317 MockConnect connect_data(SYNCHRONOUS, OK); | 308 MockConnect connect_data(SYNCHRONOUS, OK); |
| 318 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1)); | 309 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1)); |
| 319 MockRead reads[] = { | 310 MockRead reads[] = { |
| 320 CreateMockRead(*read_ping), | 311 CreateMockRead(*read_ping), |
| 321 MockRead(SYNCHRONOUS, 0, 0) // EOF | 312 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 322 }; | 313 }; |
| 323 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1)); | 314 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 EXPECT_FALSE(session->check_ping_status_pending()); | 351 EXPECT_FALSE(session->check_ping_status_pending()); |
| 361 EXPECT_GE(session->last_activity_time(), before_ping_time); | 352 EXPECT_GE(session->last_activity_time(), before_ping_time); |
| 362 | 353 |
| 363 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); | 354 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); |
| 364 | 355 |
| 365 // Delete the first session. | 356 // Delete the first session. |
| 366 session = NULL; | 357 session = NULL; |
| 367 } | 358 } |
| 368 | 359 |
| 369 TEST_P(SpdySessionTest, ServerPing) { | 360 TEST_P(SpdySessionTest, ServerPing) { |
| 370 if (GetParam() > kProtoSPDY3) | |
| 371 return; | |
| 372 | |
| 373 session_deps_.host_resolver->set_synchronous_mode(true); | 361 session_deps_.host_resolver->set_synchronous_mode(true); |
| 374 | 362 |
| 375 MockConnect connect_data(SYNCHRONOUS, OK); | 363 MockConnect connect_data(SYNCHRONOUS, OK); |
| 376 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(2)); | 364 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(2)); |
| 377 MockRead reads[] = { | 365 MockRead reads[] = { |
| 378 CreateMockRead(*read_ping), | 366 CreateMockRead(*read_ping), |
| 379 MockRead(SYNCHRONOUS, 0, 0) // EOF | 367 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 380 }; | 368 }; |
| 381 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(2)); | 369 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(2)); |
| 382 MockWrite writes[] = { | 370 MockWrite writes[] = { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 405 base::MessageLoop::current()->RunUntilIdle(); | 393 base::MessageLoop::current()->RunUntilIdle(); |
| 406 | 394 |
| 407 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); | 395 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); |
| 408 | 396 |
| 409 // Delete the session. | 397 // Delete the session. |
| 410 session = NULL; | 398 session = NULL; |
| 411 EXPECT_EQ(NULL, spdy_stream1.get()); | 399 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 412 } | 400 } |
| 413 | 401 |
| 414 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { | 402 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { |
| 415 if (GetParam() > kProtoSPDY3) | |
| 416 return; | |
| 417 | |
| 418 session_deps_.host_resolver->set_synchronous_mode(true); | 403 session_deps_.host_resolver->set_synchronous_mode(true); |
| 419 | 404 |
| 420 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 405 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 421 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 406 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
| 422 session_deps_.time_func = TheNearFuture; | 407 session_deps_.time_func = TheNearFuture; |
| 423 | 408 |
| 424 CreateNetworkSession(); | 409 CreateNetworkSession(); |
| 425 | 410 |
| 426 scoped_refptr<SpdySession> session = GetSession(key_); | 411 scoped_refptr<SpdySession> session = GetSession(key_); |
| 427 | 412 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 // Verify that the second pushed stream evicted the first pushed stream. | 449 // Verify that the second pushed stream evicted the first pushed stream. |
| 465 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); | 450 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); |
| 466 iter = session->unclaimed_pushed_streams_.find("http://www.google.com/b.dat"); | 451 iter = session->unclaimed_pushed_streams_.find("http://www.google.com/b.dat"); |
| 467 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); | 452 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); |
| 468 | 453 |
| 469 // Delete the session. | 454 // Delete the session. |
| 470 session = NULL; | 455 session = NULL; |
| 471 } | 456 } |
| 472 | 457 |
| 473 TEST_P(SpdySessionTest, FailedPing) { | 458 TEST_P(SpdySessionTest, FailedPing) { |
| 474 if (GetParam() > kProtoSPDY3) | |
| 475 return; | |
| 476 | |
| 477 session_deps_.host_resolver->set_synchronous_mode(true); | 459 session_deps_.host_resolver->set_synchronous_mode(true); |
| 478 | 460 |
| 479 MockConnect connect_data(SYNCHRONOUS, OK); | 461 MockConnect connect_data(SYNCHRONOUS, OK); |
| 480 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1)); | 462 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1)); |
| 481 MockRead reads[] = { | 463 MockRead reads[] = { |
| 482 CreateMockRead(*read_ping), | 464 CreateMockRead(*read_ping), |
| 483 MockRead(SYNCHRONOUS, 0, 0) // EOF | 465 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 484 }; | 466 }; |
| 485 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1)); | 467 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1)); |
| 486 MockWrite writes[] = { | 468 MockWrite writes[] = { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 EXPECT_EQ(0u, session->num_active_streams()); | 511 EXPECT_EQ(0u, session->num_active_streams()); |
| 530 EXPECT_EQ(0u, session->num_unclaimed_pushed_streams()); | 512 EXPECT_EQ(0u, session->num_unclaimed_pushed_streams()); |
| 531 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); | 513 EXPECT_FALSE(spdy_session_pool_->HasSession(key_)); |
| 532 | 514 |
| 533 // Delete the first session. | 515 // Delete the first session. |
| 534 session = NULL; | 516 session = NULL; |
| 535 EXPECT_EQ(NULL, spdy_stream1.get()); | 517 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 536 } | 518 } |
| 537 | 519 |
| 538 TEST_P(SpdySessionTest, CloseIdleSessions) { | 520 TEST_P(SpdySessionTest, CloseIdleSessions) { |
| 539 if (GetParam() > kProtoSPDY3) | |
| 540 return; | |
| 541 | |
| 542 MockConnect connect_data(SYNCHRONOUS, OK); | 521 MockConnect connect_data(SYNCHRONOUS, OK); |
| 543 MockRead reads[] = { | 522 MockRead reads[] = { |
| 544 MockRead(ASYNC, 0, 0) // EOF | 523 MockRead(ASYNC, 0, 0) // EOF |
| 545 }; | 524 }; |
| 546 | 525 |
| 547 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 526 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 548 data.set_connect_data(connect_data); | 527 data.set_connect_data(connect_data); |
| 549 session_deps_.socket_factory->AddSocketDataProvider(&data); | 528 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 550 | 529 |
| 551 CreateNetworkSession(); | 530 CreateNetworkSession(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 EXPECT_FALSE(session2->is_active()); | 634 EXPECT_FALSE(session2->is_active()); |
| 656 EXPECT_TRUE(session2->IsClosed()); | 635 EXPECT_TRUE(session2->IsClosed()); |
| 657 } | 636 } |
| 658 | 637 |
| 659 // Start with max concurrent streams set to 1. Request two streams. Receive a | 638 // Start with max concurrent streams set to 1. Request two streams. Receive a |
| 660 // settings frame setting max concurrent streams to 2. Have the callback | 639 // settings frame setting max concurrent streams to 2. Have the callback |
| 661 // release the stream, which releases its reference (the last) to the session. | 640 // release the stream, which releases its reference (the last) to the session. |
| 662 // Make sure nothing blows up. | 641 // Make sure nothing blows up. |
| 663 // http://crbug.com/57331 | 642 // http://crbug.com/57331 |
| 664 TEST_P(SpdySessionTest, OnSettings) { | 643 TEST_P(SpdySessionTest, OnSettings) { |
| 665 if (GetParam() > kProtoSPDY3) | |
| 666 return; | |
| 667 | |
| 668 session_deps_.host_resolver->set_synchronous_mode(true); | 644 session_deps_.host_resolver->set_synchronous_mode(true); |
| 669 | 645 |
| 670 SettingsMap new_settings; | 646 SettingsMap new_settings; |
| 671 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 647 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 672 const uint32 max_concurrent_streams = 2; | 648 const uint32 max_concurrent_streams = 2; |
| 673 new_settings[kSpdySettingsIds1] = | 649 new_settings[kSpdySettingsIds1] = |
| 674 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 650 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 675 | 651 |
| 676 // Set up the socket so we read a SETTINGS frame that raises max concurrent | 652 // Set up the socket so we read a SETTINGS frame that raises max concurrent |
| 677 // streams to 2. | 653 // streams to 2. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 stream_releaser.MakeCallback(&request))); | 692 stream_releaser.MakeCallback(&request))); |
| 717 session = NULL; | 693 session = NULL; |
| 718 | 694 |
| 719 EXPECT_EQ(OK, stream_releaser.WaitForResult()); | 695 EXPECT_EQ(OK, stream_releaser.WaitForResult()); |
| 720 } | 696 } |
| 721 | 697 |
| 722 // Start with max concurrent streams set to 1 (that is persisted). Receive a | 698 // Start with max concurrent streams set to 1 (that is persisted). Receive a |
| 723 // settings frame setting max concurrent streams to 2 and which also clears the | 699 // settings frame setting max concurrent streams to 2 and which also clears the |
| 724 // persisted data. Verify that persisted data is correct. | 700 // persisted data. Verify that persisted data is correct. |
| 725 TEST_P(SpdySessionTest, ClearSettings) { | 701 TEST_P(SpdySessionTest, ClearSettings) { |
| 726 if (GetParam() > kProtoSPDY3) | |
| 727 return; | |
| 728 | |
| 729 session_deps_.host_resolver->set_synchronous_mode(true); | 702 session_deps_.host_resolver->set_synchronous_mode(true); |
| 730 | 703 |
| 731 SettingsMap new_settings; | 704 SettingsMap new_settings; |
| 732 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 705 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 733 const uint32 max_concurrent_streams = 2; | 706 const uint32 max_concurrent_streams = 2; |
| 734 new_settings[kSpdySettingsIds1] = | 707 new_settings[kSpdySettingsIds1] = |
| 735 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 708 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 736 | 709 |
| 737 // Set up the socket so we read a SETTINGS frame that raises max concurrent | 710 // Set up the socket so we read a SETTINGS frame that raises max concurrent |
| 738 // streams to 2 and clears previously persisted data. | 711 // streams to 2 and clears previously persisted data. |
| 739 MockConnect connect_data(SYNCHRONOUS, OK); | 712 MockConnect connect_data(SYNCHRONOUS, OK); |
| 740 scoped_ptr<SpdyFrame> settings_frame( | 713 scoped_ptr<SpdyFrame> settings_frame( |
| 741 spdy_util_.ConstructSpdySettings(new_settings)); | 714 spdy_util_.ConstructSpdySettings(new_settings)); |
| 742 uint8 flags = SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; | 715 uint8 flags = SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; |
| 743 test::SetFrameFlags(settings_frame.get(), flags, SPDY3); | 716 test::SetFrameFlags(settings_frame.get(), flags, spdy_util_.spdy_version()); |
| 744 MockRead reads[] = { | 717 MockRead reads[] = { |
| 745 CreateMockRead(*settings_frame), | 718 CreateMockRead(*settings_frame), |
| 746 MockRead(SYNCHRONOUS, 0, 0) // EOF | 719 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 747 }; | 720 }; |
| 748 | 721 |
| 749 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 722 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 750 data.set_connect_data(connect_data); | 723 data.set_connect_data(connect_data); |
| 751 session_deps_.socket_factory->AddSocketDataProvider(&data); | 724 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 752 | 725 |
| 753 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 726 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 EXPECT_EQ(2u, session->max_concurrent_streams()); | 765 EXPECT_EQ(2u, session->max_concurrent_streams()); |
| 793 | 766 |
| 794 session = NULL; | 767 session = NULL; |
| 795 } | 768 } |
| 796 | 769 |
| 797 // Start with max concurrent streams set to 1. Request two streams. When the | 770 // Start with max concurrent streams set to 1. Request two streams. When the |
| 798 // first completes, have the callback close itself, which should trigger the | 771 // first completes, have the callback close itself, which should trigger the |
| 799 // second stream creation. Then cancel that one immediately. Don't crash. | 772 // second stream creation. Then cancel that one immediately. Don't crash. |
| 800 // http://crbug.com/63532 | 773 // http://crbug.com/63532 |
| 801 TEST_P(SpdySessionTest, CancelPendingCreateStream) { | 774 TEST_P(SpdySessionTest, CancelPendingCreateStream) { |
| 802 if (GetParam() > kProtoSPDY3) | |
| 803 return; | |
| 804 | |
| 805 session_deps_.host_resolver->set_synchronous_mode(true); | 775 session_deps_.host_resolver->set_synchronous_mode(true); |
| 806 | 776 |
| 807 MockRead reads[] = { | 777 MockRead reads[] = { |
| 808 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 778 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 809 }; | 779 }; |
| 810 | 780 |
| 811 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 781 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 812 MockConnect connect_data(SYNCHRONOUS, OK); | 782 MockConnect connect_data(SYNCHRONOUS, OK); |
| 813 | 783 |
| 814 data.set_connect_data(connect_data); | 784 data.set_connect_data(connect_data); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 EXPECT_EQ(NULL, spdy_stream1.get()); | 820 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 851 | 821 |
| 852 request.CancelRequest(); | 822 request.CancelRequest(); |
| 853 callback.reset(); | 823 callback.reset(); |
| 854 | 824 |
| 855 // Should not crash when running the pending callback. | 825 // Should not crash when running the pending callback. |
| 856 base::MessageLoop::current()->RunUntilIdle(); | 826 base::MessageLoop::current()->RunUntilIdle(); |
| 857 } | 827 } |
| 858 | 828 |
| 859 TEST_P(SpdySessionTest, SendInitialSettingsOnNewSession) { | 829 TEST_P(SpdySessionTest, SendInitialSettingsOnNewSession) { |
| 860 if (GetParam() > kProtoSPDY3) | |
| 861 return; | |
| 862 | |
| 863 session_deps_.host_resolver->set_synchronous_mode(true); | 830 session_deps_.host_resolver->set_synchronous_mode(true); |
| 864 | 831 |
| 865 MockRead reads[] = { | 832 MockRead reads[] = { |
| 866 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 833 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 867 }; | 834 }; |
| 868 | 835 |
| 869 SettingsMap settings; | 836 SettingsMap settings; |
| 870 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 837 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 871 const SpdySettingsIds kSpdySettingsIds2 = SETTINGS_INITIAL_WINDOW_SIZE; | 838 const SpdySettingsIds kSpdySettingsIds2 = SETTINGS_INITIAL_WINDOW_SIZE; |
| 872 const uint32 kInitialRecvWindowSize = 10 * 1024 * 1024; | 839 const uint32 kInitialRecvWindowSize = 10 * 1024 * 1024; |
| 873 settings[kSpdySettingsIds1] = | 840 settings[kSpdySettingsIds1] = |
| 874 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); | 841 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
| 875 if (spdy_util_.spdy_version() >= SPDY3) { | 842 if (spdy_util_.spdy_version() >= SPDY3) { |
| 876 settings[kSpdySettingsIds2] = | 843 settings[kSpdySettingsIds2] = |
| 877 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); | 844 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); |
| 878 } | 845 } |
| 879 MockConnect connect_data(SYNCHRONOUS, OK); | 846 MockConnect connect_data(SYNCHRONOUS, OK); |
| 880 scoped_ptr<SpdyFrame> settings_frame( | 847 scoped_ptr<SpdyFrame> settings_frame( |
| 881 spdy_util_.ConstructSpdySettings(settings)); | 848 spdy_util_.ConstructSpdySettings(settings)); |
| 849 scoped_ptr<SpdyFrame> initial_window_update( |
| 850 spdy_util_.ConstructSpdyWindowUpdate( |
| 851 kSessionFlowControlStreamId, |
| 852 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); |
| 882 MockWrite writes[] = { | 853 MockWrite writes[] = { |
| 883 CreateMockWrite(*settings_frame), | 854 CreateMockWrite(*settings_frame), |
| 855 CreateMockWrite(*initial_window_update), |
| 884 }; | 856 }; |
| 885 session_deps_.stream_initial_recv_window_size = kInitialRecvWindowSize; | 857 session_deps_.stream_initial_recv_window_size = kInitialRecvWindowSize; |
| 858 int num_writes = arraysize(writes); |
| 859 // We don't have session windows for SPDY versions less than 3.1. |
| 860 if (spdy_util_.protocol() < kProtoSPDY31) { |
| 861 --num_writes; |
| 862 } |
| 886 | 863 |
| 887 StaticSocketDataProvider data( | 864 StaticSocketDataProvider data(reads, arraysize(reads), writes, num_writes); |
| 888 reads, arraysize(reads), writes, arraysize(writes)); | |
| 889 data.set_connect_data(connect_data); | 865 data.set_connect_data(connect_data); |
| 890 session_deps_.socket_factory->AddSocketDataProvider(&data); | 866 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 891 | 867 |
| 892 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 868 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 893 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 869 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
| 894 | 870 |
| 895 CreateNetworkSession(); | 871 CreateNetworkSession(); |
| 896 | 872 |
| 897 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | 873 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
| 898 pool_peer.EnableSendingInitialSettings(true); | 874 pool_peer.EnableSendingInitialSettings(true); |
| 899 | 875 |
| 900 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 876 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 901 | 877 |
| 902 base::MessageLoop::current()->RunUntilIdle(); | 878 base::MessageLoop::current()->RunUntilIdle(); |
| 903 EXPECT_TRUE(data.at_write_eof()); | 879 EXPECT_TRUE(data.at_write_eof()); |
| 904 } | 880 } |
| 905 | 881 |
| 906 TEST_P(SpdySessionTest, SendSettingsOnNewSession) { | 882 TEST_P(SpdySessionTest, SendSettingsOnNewSession) { |
| 907 if (GetParam() > kProtoSPDY3) | |
| 908 return; | |
| 909 | |
| 910 session_deps_.host_resolver->set_synchronous_mode(true); | 883 session_deps_.host_resolver->set_synchronous_mode(true); |
| 911 | 884 |
| 912 MockRead reads[] = { | 885 MockRead reads[] = { |
| 913 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 886 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 914 }; | 887 }; |
| 915 | 888 |
| 916 // Create the bogus setting that we want to verify is sent out. | 889 // Create the bogus setting that we want to verify is sent out. |
| 917 // Note that it will be marked as SETTINGS_FLAG_PERSISTED when sent out. But | 890 // Note that it will be marked as SETTINGS_FLAG_PERSISTED when sent out. But |
| 918 // to persist it into the HttpServerProperties, we need to mark as | 891 // to persist it into the HttpServerProperties, we need to mark as |
| 919 // SETTINGS_FLAG_PLEASE_PERSIST. | 892 // SETTINGS_FLAG_PLEASE_PERSIST. |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1197 | 1170 |
| 1198 TEST_P(SpdySessionTest, IPPoolingCloseCurrentSessions) { | 1171 TEST_P(SpdySessionTest, IPPoolingCloseCurrentSessions) { |
| 1199 IPPoolingTest(GetParam(), SPDY_POOL_CLOSE_CURRENT_SESSIONS); | 1172 IPPoolingTest(GetParam(), SPDY_POOL_CLOSE_CURRENT_SESSIONS); |
| 1200 } | 1173 } |
| 1201 | 1174 |
| 1202 TEST_P(SpdySessionTest, IPPoolingCloseIdleSessions) { | 1175 TEST_P(SpdySessionTest, IPPoolingCloseIdleSessions) { |
| 1203 IPPoolingTest(GetParam(), SPDY_POOL_CLOSE_IDLE_SESSIONS); | 1176 IPPoolingTest(GetParam(), SPDY_POOL_CLOSE_IDLE_SESSIONS); |
| 1204 } | 1177 } |
| 1205 | 1178 |
| 1206 TEST_P(SpdySessionTest, ClearSettingsStorageOnIPAddressChanged) { | 1179 TEST_P(SpdySessionTest, ClearSettingsStorageOnIPAddressChanged) { |
| 1207 if (GetParam() > kProtoSPDY3) | |
| 1208 return; | |
| 1209 | |
| 1210 CreateNetworkSession(); | 1180 CreateNetworkSession(); |
| 1211 | 1181 |
| 1212 HttpServerProperties* test_http_server_properties = | 1182 HttpServerProperties* test_http_server_properties = |
| 1213 spdy_session_pool_->http_server_properties(); | 1183 spdy_session_pool_->http_server_properties(); |
| 1214 SettingsFlagsAndValue flags_and_value1(SETTINGS_FLAG_PLEASE_PERSIST, 2); | 1184 SettingsFlagsAndValue flags_and_value1(SETTINGS_FLAG_PLEASE_PERSIST, 2); |
| 1215 test_http_server_properties->SetSpdySetting( | 1185 test_http_server_properties->SetSpdySetting( |
| 1216 test_host_port_pair_, | 1186 test_host_port_pair_, |
| 1217 SETTINGS_MAX_CONCURRENT_STREAMS, | 1187 SETTINGS_MAX_CONCURRENT_STREAMS, |
| 1218 SETTINGS_FLAG_PLEASE_PERSIST, | 1188 SETTINGS_FLAG_PLEASE_PERSIST, |
| 1219 2); | 1189 2); |
| 1220 EXPECT_NE(0u, test_http_server_properties->GetSpdySettings( | 1190 EXPECT_NE(0u, test_http_server_properties->GetSpdySettings( |
| 1221 test_host_port_pair_).size()); | 1191 test_host_port_pair_).size()); |
| 1222 spdy_session_pool_->OnIPAddressChanged(); | 1192 spdy_session_pool_->OnIPAddressChanged(); |
| 1223 EXPECT_EQ(0u, test_http_server_properties->GetSpdySettings( | 1193 EXPECT_EQ(0u, test_http_server_properties->GetSpdySettings( |
| 1224 test_host_port_pair_).size()); | 1194 test_host_port_pair_).size()); |
| 1225 } | 1195 } |
| 1226 | 1196 |
| 1227 TEST_P(SpdySessionTest, Initialize) { | 1197 TEST_P(SpdySessionTest, Initialize) { |
| 1228 if (GetParam() > kProtoSPDY3) | |
| 1229 return; | |
| 1230 | |
| 1231 CapturingBoundNetLog log; | 1198 CapturingBoundNetLog log; |
| 1232 session_deps_.net_log = log.bound().net_log(); | 1199 session_deps_.net_log = log.bound().net_log(); |
| 1233 session_deps_.host_resolver->set_synchronous_mode(true); | 1200 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1234 | 1201 |
| 1235 MockConnect connect_data(SYNCHRONOUS, OK); | 1202 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1236 MockRead reads[] = { | 1203 MockRead reads[] = { |
| 1237 MockRead(ASYNC, 0, 0) // EOF | 1204 MockRead(ASYNC, 0, 0) // EOF |
| 1238 }; | 1205 }; |
| 1239 | 1206 |
| 1240 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 1207 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1270 | 1237 |
| 1271 CapturingNetLog::CapturedEntry entry = entries[pos]; | 1238 CapturingNetLog::CapturedEntry entry = entries[pos]; |
| 1272 NetLog::Source socket_source; | 1239 NetLog::Source socket_source; |
| 1273 EXPECT_TRUE(NetLog::Source::FromEventParameters(entry.params.get(), | 1240 EXPECT_TRUE(NetLog::Source::FromEventParameters(entry.params.get(), |
| 1274 &socket_source)); | 1241 &socket_source)); |
| 1275 EXPECT_TRUE(socket_source.IsValid()); | 1242 EXPECT_TRUE(socket_source.IsValid()); |
| 1276 EXPECT_NE(log.bound().source().id, socket_source.id); | 1243 EXPECT_NE(log.bound().source().id, socket_source.id); |
| 1277 } | 1244 } |
| 1278 | 1245 |
| 1279 TEST_P(SpdySessionTest, CloseSessionOnError) { | 1246 TEST_P(SpdySessionTest, CloseSessionOnError) { |
| 1280 if (GetParam() > kProtoSPDY3) | |
| 1281 return; | |
| 1282 | |
| 1283 session_deps_.host_resolver->set_synchronous_mode(true); | 1247 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1284 | 1248 |
| 1285 MockConnect connect_data(SYNCHRONOUS, OK); | 1249 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1286 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); | 1250 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); |
| 1287 MockRead reads[] = { | 1251 MockRead reads[] = { |
| 1288 CreateMockRead(*goaway), | 1252 CreateMockRead(*goaway), |
| 1289 MockRead(SYNCHRONOUS, 0, 0) // EOF | 1253 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 1290 }; | 1254 }; |
| 1291 | 1255 |
| 1292 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 1256 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1326 CapturingNetLog::CapturedEntry entry = entries[pos]; | 1290 CapturingNetLog::CapturedEntry entry = entries[pos]; |
| 1327 int error_code = 0; | 1291 int error_code = 0; |
| 1328 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1292 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
| 1329 EXPECT_EQ(ERR_CONNECTION_CLOSED, error_code); | 1293 EXPECT_EQ(ERR_CONNECTION_CLOSED, error_code); |
| 1330 } | 1294 } |
| 1331 | 1295 |
| 1332 // Queue up a low-priority SYN_STREAM followed by a high-priority | 1296 // Queue up a low-priority SYN_STREAM followed by a high-priority |
| 1333 // one. The high priority one should still send first and receive | 1297 // one. The high priority one should still send first and receive |
| 1334 // first. | 1298 // first. |
| 1335 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { | 1299 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { |
| 1336 if (GetParam() > kProtoSPDY3) | |
| 1337 return; | |
| 1338 | |
| 1339 // Construct the request. | 1300 // Construct the request. |
| 1340 MockConnect connect_data(SYNCHRONOUS, OK); | 1301 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1341 scoped_ptr<SpdyFrame> req_highest( | 1302 scoped_ptr<SpdyFrame> req_highest( |
| 1342 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, HIGHEST, true)); | 1303 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, HIGHEST, true)); |
| 1343 scoped_ptr<SpdyFrame> req_lowest( | 1304 scoped_ptr<SpdyFrame> req_lowest( |
| 1344 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); | 1305 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); |
| 1345 MockWrite writes[] = { | 1306 MockWrite writes[] = { |
| 1346 CreateMockWrite(*req_highest, 0), | 1307 CreateMockWrite(*req_highest, 0), |
| 1347 CreateMockWrite(*req_lowest, 1), | 1308 CreateMockWrite(*req_lowest, 1), |
| 1348 }; | 1309 }; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 | 1372 |
| 1412 data.RunFor(7); | 1373 data.RunFor(7); |
| 1413 | 1374 |
| 1414 EXPECT_FALSE(spdy_stream_lowest); | 1375 EXPECT_FALSE(spdy_stream_lowest); |
| 1415 EXPECT_FALSE(spdy_stream_highest); | 1376 EXPECT_FALSE(spdy_stream_highest); |
| 1416 EXPECT_EQ(3u, delegate_lowest.stream_id()); | 1377 EXPECT_EQ(3u, delegate_lowest.stream_id()); |
| 1417 EXPECT_EQ(1u, delegate_highest.stream_id()); | 1378 EXPECT_EQ(1u, delegate_highest.stream_id()); |
| 1418 } | 1379 } |
| 1419 | 1380 |
| 1420 TEST_P(SpdySessionTest, CancelStream) { | 1381 TEST_P(SpdySessionTest, CancelStream) { |
| 1421 if (GetParam() > kProtoSPDY3) | |
| 1422 return; | |
| 1423 | |
| 1424 MockConnect connect_data(SYNCHRONOUS, OK); | 1382 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1425 // Request 1, at HIGHEST priority, will be cancelled before it writes data. | 1383 // Request 1, at HIGHEST priority, will be cancelled before it writes data. |
| 1426 // Request 2, at LOWEST priority, will be a full request and will be id 1. | 1384 // Request 2, at LOWEST priority, will be a full request and will be id 1. |
| 1427 scoped_ptr<SpdyFrame> req2( | 1385 scoped_ptr<SpdyFrame> req2( |
| 1428 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 1386 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 1429 MockWrite writes[] = { | 1387 MockWrite writes[] = { |
| 1430 CreateMockWrite(*req2, 0), | 1388 CreateMockWrite(*req2, 0), |
| 1431 }; | 1389 }; |
| 1432 | 1390 |
| 1433 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1391 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1493 EXPECT_EQ(1u, delegate2.stream_id()); | 1451 EXPECT_EQ(1u, delegate2.stream_id()); |
| 1494 | 1452 |
| 1495 spdy_stream2->Cancel(); | 1453 spdy_stream2->Cancel(); |
| 1496 EXPECT_EQ(NULL, spdy_stream2.get()); | 1454 EXPECT_EQ(NULL, spdy_stream2.get()); |
| 1497 } | 1455 } |
| 1498 | 1456 |
| 1499 // Create two streams that are set to re-close themselves on close, | 1457 // Create two streams that are set to re-close themselves on close, |
| 1500 // and then close the session. Nothing should blow up. Also a | 1458 // and then close the session. Nothing should blow up. Also a |
| 1501 // regression test for http://crbug.com/139518 . | 1459 // regression test for http://crbug.com/139518 . |
| 1502 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedSelfClosingStreams) { | 1460 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedSelfClosingStreams) { |
| 1503 if (GetParam() > kProtoSPDY3) | |
| 1504 return; | |
| 1505 | |
| 1506 session_deps_.host_resolver->set_synchronous_mode(true); | 1461 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1507 | 1462 |
| 1508 MockConnect connect_data(SYNCHRONOUS, OK); | 1463 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1509 | 1464 |
| 1510 // No actual data will be sent. | 1465 // No actual data will be sent. |
| 1511 MockWrite writes[] = { | 1466 MockWrite writes[] = { |
| 1512 MockWrite(ASYNC, 0, 1) // EOF | 1467 MockWrite(ASYNC, 0, 1) // EOF |
| 1513 }; | 1468 }; |
| 1514 | 1469 |
| 1515 MockRead reads[] = { | 1470 MockRead reads[] = { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1569 | 1524 |
| 1570 EXPECT_TRUE(delegate1.StreamIsClosed()); | 1525 EXPECT_TRUE(delegate1.StreamIsClosed()); |
| 1571 EXPECT_TRUE(delegate2.StreamIsClosed()); | 1526 EXPECT_TRUE(delegate2.StreamIsClosed()); |
| 1572 | 1527 |
| 1573 session = NULL; | 1528 session = NULL; |
| 1574 } | 1529 } |
| 1575 | 1530 |
| 1576 // Create two streams that are set to close each other on close, and | 1531 // Create two streams that are set to close each other on close, and |
| 1577 // then close the session. Nothing should blow up. | 1532 // then close the session. Nothing should blow up. |
| 1578 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedMutuallyClosingStreams) { | 1533 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedMutuallyClosingStreams) { |
| 1579 if (GetParam() > kProtoSPDY3) | |
| 1580 return; | |
| 1581 | |
| 1582 session_deps_.host_resolver->set_synchronous_mode(true); | 1534 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1583 | 1535 |
| 1584 MockConnect connect_data(SYNCHRONOUS, OK); | 1536 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1585 | 1537 |
| 1586 // No actual data will be sent. | 1538 // No actual data will be sent. |
| 1587 MockWrite writes[] = { | 1539 MockWrite writes[] = { |
| 1588 MockWrite(ASYNC, 0, 1) // EOF | 1540 MockWrite(ASYNC, 0, 1) // EOF |
| 1589 }; | 1541 }; |
| 1590 | 1542 |
| 1591 MockRead reads[] = { | 1543 MockRead reads[] = { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1647 | 1599 |
| 1648 EXPECT_TRUE(delegate1.StreamIsClosed()); | 1600 EXPECT_TRUE(delegate1.StreamIsClosed()); |
| 1649 EXPECT_TRUE(delegate2.StreamIsClosed()); | 1601 EXPECT_TRUE(delegate2.StreamIsClosed()); |
| 1650 | 1602 |
| 1651 session = NULL; | 1603 session = NULL; |
| 1652 } | 1604 } |
| 1653 | 1605 |
| 1654 // Create two streams that are set to re-close themselves on close, | 1606 // Create two streams that are set to re-close themselves on close, |
| 1655 // activate them, and then close the session. Nothing should blow up. | 1607 // activate them, and then close the session. Nothing should blow up. |
| 1656 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { | 1608 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { |
| 1657 if (GetParam() > kProtoSPDY3) | |
| 1658 return; | |
| 1659 | |
| 1660 session_deps_.host_resolver->set_synchronous_mode(true); | 1609 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1661 | 1610 |
| 1662 MockConnect connect_data(SYNCHRONOUS, OK); | 1611 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1663 | 1612 |
| 1664 scoped_ptr<SpdyFrame> req1( | 1613 scoped_ptr<SpdyFrame> req1( |
| 1665 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 1614 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 1666 scoped_ptr<SpdyFrame> req2( | 1615 scoped_ptr<SpdyFrame> req2( |
| 1667 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 1616 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
| 1668 MockWrite writes[] = { | 1617 MockWrite writes[] = { |
| 1669 CreateMockWrite(*req1, 0), | 1618 CreateMockWrite(*req1, 0), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1733 | 1682 |
| 1734 EXPECT_TRUE(delegate1.StreamIsClosed()); | 1683 EXPECT_TRUE(delegate1.StreamIsClosed()); |
| 1735 EXPECT_TRUE(delegate2.StreamIsClosed()); | 1684 EXPECT_TRUE(delegate2.StreamIsClosed()); |
| 1736 | 1685 |
| 1737 session = NULL; | 1686 session = NULL; |
| 1738 } | 1687 } |
| 1739 | 1688 |
| 1740 // Create two streams that are set to close each other on close, | 1689 // Create two streams that are set to close each other on close, |
| 1741 // activate them, and then close the session. Nothing should blow up. | 1690 // activate them, and then close the session. Nothing should blow up. |
| 1742 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { | 1691 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { |
| 1743 if (GetParam() > kProtoSPDY3) | |
| 1744 return; | |
| 1745 | |
| 1746 session_deps_.host_resolver->set_synchronous_mode(true); | 1692 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1747 | 1693 |
| 1748 MockConnect connect_data(SYNCHRONOUS, OK); | 1694 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1749 | 1695 |
| 1750 scoped_ptr<SpdyFrame> req1( | 1696 scoped_ptr<SpdyFrame> req1( |
| 1751 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 1697 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 1752 scoped_ptr<SpdyFrame> req2( | 1698 scoped_ptr<SpdyFrame> req2( |
| 1753 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 1699 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
| 1754 MockWrite writes[] = { | 1700 MockWrite writes[] = { |
| 1755 CreateMockWrite(*req1, 0), | 1701 CreateMockWrite(*req1, 0), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 EXPECT_EQ(NULL, spdy_stream1.get()); | 1765 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 1820 EXPECT_EQ(NULL, spdy_stream2.get()); | 1766 EXPECT_EQ(NULL, spdy_stream2.get()); |
| 1821 | 1767 |
| 1822 EXPECT_TRUE(delegate1.StreamIsClosed()); | 1768 EXPECT_TRUE(delegate1.StreamIsClosed()); |
| 1823 EXPECT_TRUE(delegate2.StreamIsClosed()); | 1769 EXPECT_TRUE(delegate2.StreamIsClosed()); |
| 1824 | 1770 |
| 1825 session = NULL; | 1771 session = NULL; |
| 1826 } | 1772 } |
| 1827 | 1773 |
| 1828 TEST_P(SpdySessionTest, VerifyDomainAuthentication) { | 1774 TEST_P(SpdySessionTest, VerifyDomainAuthentication) { |
| 1829 if (GetParam() > kProtoSPDY3) | |
| 1830 return; | |
| 1831 | |
| 1832 session_deps_.host_resolver->set_synchronous_mode(true); | 1775 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1833 | 1776 |
| 1834 MockConnect connect_data(SYNCHRONOUS, OK); | 1777 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1835 | 1778 |
| 1836 // No actual data will be sent. | 1779 // No actual data will be sent. |
| 1837 MockWrite writes[] = { | 1780 MockWrite writes[] = { |
| 1838 MockWrite(ASYNC, 0, 1) // EOF | 1781 MockWrite(ASYNC, 0, 1) // EOF |
| 1839 }; | 1782 }; |
| 1840 | 1783 |
| 1841 MockRead reads[] = { | 1784 MockRead reads[] = { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1890 BoundNetLog())); | 1833 BoundNetLog())); |
| 1891 | 1834 |
| 1892 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); | 1835 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); |
| 1893 EXPECT_TRUE(session->VerifyDomainAuthentication("www.example.org")); | 1836 EXPECT_TRUE(session->VerifyDomainAuthentication("www.example.org")); |
| 1894 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.org")); | 1837 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.org")); |
| 1895 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.com")); | 1838 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.com")); |
| 1896 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); | 1839 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); |
| 1897 } | 1840 } |
| 1898 | 1841 |
| 1899 TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) { | 1842 TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) { |
| 1900 if (GetParam() > kProtoSPDY3) | |
| 1901 return; | |
| 1902 | |
| 1903 session_deps_.host_resolver->set_synchronous_mode(true); | 1843 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1904 | 1844 |
| 1905 MockConnect connect_data(SYNCHRONOUS, OK); | 1845 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1906 | 1846 |
| 1907 // No actual data will be sent. | 1847 // No actual data will be sent. |
| 1908 MockWrite writes[] = { | 1848 MockWrite writes[] = { |
| 1909 MockWrite(ASYNC, 0, 1) // EOF | 1849 MockWrite(ASYNC, 0, 1) // EOF |
| 1910 }; | 1850 }; |
| 1911 | 1851 |
| 1912 MockRead reads[] = { | 1852 MockRead reads[] = { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1962 BoundNetLog())); | 1902 BoundNetLog())); |
| 1963 | 1903 |
| 1964 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); | 1904 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); |
| 1965 EXPECT_TRUE(session->VerifyDomainAuthentication("www.example.org")); | 1905 EXPECT_TRUE(session->VerifyDomainAuthentication("www.example.org")); |
| 1966 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.org")); | 1906 EXPECT_TRUE(session->VerifyDomainAuthentication("mail.example.org")); |
| 1967 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.example.com")); | 1907 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.example.com")); |
| 1968 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); | 1908 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); |
| 1969 } | 1909 } |
| 1970 | 1910 |
| 1971 TEST_P(SpdySessionTest, CloseTwoStalledCreateStream) { | 1911 TEST_P(SpdySessionTest, CloseTwoStalledCreateStream) { |
| 1972 if (GetParam() > kProtoSPDY3) | |
| 1973 return; | |
| 1974 | |
| 1975 // TODO(rtenneti): Define a helper class/methods and move the common code in | 1912 // TODO(rtenneti): Define a helper class/methods and move the common code in |
| 1976 // this file. | 1913 // this file. |
| 1977 MockConnect connect_data(SYNCHRONOUS, OK); | 1914 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1978 | 1915 |
| 1979 SettingsMap new_settings; | 1916 SettingsMap new_settings; |
| 1980 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 1917 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 1981 const uint32 max_concurrent_streams = 1; | 1918 const uint32 max_concurrent_streams = 1; |
| 1982 new_settings[kSpdySettingsIds1] = | 1919 new_settings[kSpdySettingsIds1] = |
| 1983 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1920 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1984 | 1921 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 | 2040 |
| 2104 EXPECT_EQ(0u, delegate3.stream_id()); | 2041 EXPECT_EQ(0u, delegate3.stream_id()); |
| 2105 data.RunFor(4); | 2042 data.RunFor(4); |
| 2106 EXPECT_EQ(NULL, stream3.get()); | 2043 EXPECT_EQ(NULL, stream3.get()); |
| 2107 EXPECT_EQ(5u, delegate3.stream_id()); | 2044 EXPECT_EQ(5u, delegate3.stream_id()); |
| 2108 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); | 2045 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); |
| 2109 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 2046 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 2110 } | 2047 } |
| 2111 | 2048 |
| 2112 TEST_P(SpdySessionTest, CancelTwoStalledCreateStream) { | 2049 TEST_P(SpdySessionTest, CancelTwoStalledCreateStream) { |
| 2113 if (GetParam() > kProtoSPDY3) | |
| 2114 return; | |
| 2115 | |
| 2116 session_deps_.host_resolver->set_synchronous_mode(true); | 2050 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2117 | 2051 |
| 2118 MockRead reads[] = { | 2052 MockRead reads[] = { |
| 2119 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2053 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 2120 }; | 2054 }; |
| 2121 | 2055 |
| 2122 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2056 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 2123 MockConnect connect_data(SYNCHRONOUS, OK); | 2057 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2124 | 2058 |
| 2125 data.set_connect_data(connect_data); | 2059 data.set_connect_data(connect_data); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2183 | 2117 |
| 2184 // Cancel the third stream. | 2118 // Cancel the third stream. |
| 2185 base::WeakPtr<SpdyStream> spdy_stream3 = request3.ReleaseStream(); | 2119 base::WeakPtr<SpdyStream> spdy_stream3 = request3.ReleaseStream(); |
| 2186 spdy_stream3->Cancel(); | 2120 spdy_stream3->Cancel(); |
| 2187 EXPECT_EQ(NULL, spdy_stream3.get()); | 2121 EXPECT_EQ(NULL, spdy_stream3.get()); |
| 2188 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); | 2122 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); |
| 2189 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 2123 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 2190 } | 2124 } |
| 2191 | 2125 |
| 2192 TEST_P(SpdySessionTest, NeedsCredentials) { | 2126 TEST_P(SpdySessionTest, NeedsCredentials) { |
| 2193 if (GetParam() > kProtoSPDY3) | |
| 2194 return; | |
| 2195 | |
| 2196 MockConnect connect_data(SYNCHRONOUS, OK); | 2127 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2197 MockRead reads[] = { | 2128 MockRead reads[] = { |
| 2198 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2129 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 2199 }; | 2130 }; |
| 2200 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2131 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 2201 data.set_connect_data(connect_data); | 2132 data.set_connect_data(connect_data); |
| 2202 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2133 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2203 | 2134 |
| 2204 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2135 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 2205 ssl.channel_id_sent = true; | 2136 ssl.channel_id_sent = true; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2245 | 2176 |
| 2246 EXPECT_EQ(spdy_util_.spdy_version() >= SPDY3, session->NeedsCredentials()); | 2177 EXPECT_EQ(spdy_util_.spdy_version() >= SPDY3, session->NeedsCredentials()); |
| 2247 | 2178 |
| 2248 // Flush the SpdySession::OnReadComplete() task. | 2179 // Flush the SpdySession::OnReadComplete() task. |
| 2249 base::MessageLoop::current()->RunUntilIdle(); | 2180 base::MessageLoop::current()->RunUntilIdle(); |
| 2250 | 2181 |
| 2251 spdy_session_pool_->Remove(session); | 2182 spdy_session_pool_->Remove(session); |
| 2252 } | 2183 } |
| 2253 | 2184 |
| 2254 TEST_P(SpdySessionTest, SendCredentials) { | 2185 TEST_P(SpdySessionTest, SendCredentials) { |
| 2255 if (GetParam() > kProtoSPDY3) | 2186 if (GetParam() < kProtoSPDY3) |
| 2256 return; | 2187 return; |
| 2257 | 2188 |
| 2258 MockConnect connect_data(SYNCHRONOUS, OK); | 2189 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2259 MockRead reads[] = { | 2190 MockRead reads[] = { |
| 2260 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2191 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 2261 }; | 2192 }; |
| 2262 SettingsMap settings; | 2193 SettingsMap settings; |
| 2263 scoped_ptr<SpdyFrame> settings_frame( | 2194 scoped_ptr<SpdyFrame> settings_frame( |
| 2264 spdy_util_.ConstructSpdySettings(settings)); | 2195 spdy_util_.ConstructSpdySettings(settings)); |
| 2265 MockWrite writes[] = { | 2196 MockWrite writes[] = { |
| 2266 CreateMockWrite(*settings_frame), | 2197 CreateMockWrite(*settings_frame), |
| 2267 }; | 2198 }; |
| 2268 StaticSocketDataProvider data(reads, arraysize(reads), | 2199 StaticSocketDataProvider data(reads, arraysize(reads), |
| 2269 writes, arraysize(writes)); | 2200 writes, arraysize(writes)); |
| 2270 data.set_connect_data(connect_data); | 2201 data.set_connect_data(connect_data); |
| 2271 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2202 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2272 | 2203 |
| 2273 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2204 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 2274 ssl.channel_id_sent = true; | 2205 ssl.channel_id_sent = true; |
| 2275 ssl.protocol_negotiated = kProtoSPDY3; | 2206 ssl.protocol_negotiated = GetParam(); |
| 2276 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 2207 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
| 2277 | 2208 |
| 2278 CreateNetworkSession(); | 2209 CreateNetworkSession(); |
| 2279 | 2210 |
| 2280 const GURL kTestUrl("https://www.foo.com"); | 2211 const GURL kTestUrl("https://www.foo.com"); |
| 2281 HostPortPair test_host_port_pair(kTestUrl.host(), 443); | 2212 HostPortPair test_host_port_pair(kTestUrl.host(), 443); |
| 2282 SpdySessionKey key(test_host_port_pair, ProxyServer::Direct(), | 2213 SpdySessionKey key(test_host_port_pair, ProxyServer::Direct(), |
| 2283 kPrivacyModeDisabled); | 2214 kPrivacyModeDisabled); |
| 2284 | 2215 |
| 2285 scoped_refptr<SpdySession> session = GetSession(key); | 2216 scoped_refptr<SpdySession> session = GetSession(key); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2314 EXPECT_TRUE(session->NeedsCredentials()); | 2245 EXPECT_TRUE(session->NeedsCredentials()); |
| 2315 | 2246 |
| 2316 // Flush the SpdySession::OnReadComplete() task. | 2247 // Flush the SpdySession::OnReadComplete() task. |
| 2317 base::MessageLoop::current()->RunUntilIdle(); | 2248 base::MessageLoop::current()->RunUntilIdle(); |
| 2318 | 2249 |
| 2319 spdy_session_pool_->Remove(session); | 2250 spdy_session_pool_->Remove(session); |
| 2320 EXPECT_FALSE(spdy_session_pool_->HasSession(key)); | 2251 EXPECT_FALSE(spdy_session_pool_->HasSession(key)); |
| 2321 } | 2252 } |
| 2322 | 2253 |
| 2323 TEST_P(SpdySessionTest, UpdateStreamsSendWindowSize) { | 2254 TEST_P(SpdySessionTest, UpdateStreamsSendWindowSize) { |
| 2324 if (GetParam() != kProtoSPDY3) | 2255 if (GetParam() < kProtoSPDY3) |
| 2325 return; | 2256 return; |
| 2326 | 2257 |
| 2327 // Set SETTINGS_INITIAL_WINDOW_SIZE to a small number so that WINDOW_UPDATE | 2258 // Set SETTINGS_INITIAL_WINDOW_SIZE to a small number so that WINDOW_UPDATE |
| 2328 // gets sent. | 2259 // gets sent. |
| 2329 SettingsMap new_settings; | 2260 SettingsMap new_settings; |
| 2330 int32 window_size = 1; | 2261 int32 window_size = 1; |
| 2331 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = | 2262 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = |
| 2332 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); | 2263 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); |
| 2333 | 2264 |
| 2334 // Set up the socket so we read a SETTINGS frame that sets | 2265 // Set up the socket so we read a SETTINGS frame that sets |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2376 ASSERT_TRUE(spdy_stream2.get() != NULL); | 2307 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 2377 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); | 2308 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); |
| 2378 spdy_stream2->Cancel(); | 2309 spdy_stream2->Cancel(); |
| 2379 EXPECT_EQ(NULL, spdy_stream2.get()); | 2310 EXPECT_EQ(NULL, spdy_stream2.get()); |
| 2380 } | 2311 } |
| 2381 | 2312 |
| 2382 // Test that SpdySession::DoRead reads data from the socket without yielding. | 2313 // Test that SpdySession::DoRead reads data from the socket without yielding. |
| 2383 // This test makes 32k - 1 bytes of data available on the socket for reading. It | 2314 // This test makes 32k - 1 bytes of data available on the socket for reading. It |
| 2384 // then verifies that it has read all the available data without yielding. | 2315 // then verifies that it has read all the available data without yielding. |
| 2385 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { | 2316 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { |
| 2386 if (GetParam() > kProtoSPDY3) | |
| 2387 return; | |
| 2388 | |
| 2389 MockConnect connect_data(SYNCHRONOUS, OK); | 2317 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2390 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2318 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
| 2391 | 2319 |
| 2392 scoped_ptr<SpdyFrame> req1( | 2320 scoped_ptr<SpdyFrame> req1( |
| 2393 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2321 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 2394 MockWrite writes[] = { | 2322 MockWrite writes[] = { |
| 2395 CreateMockWrite(*req1, 0), | 2323 CreateMockWrite(*req1, 0), |
| 2396 }; | 2324 }; |
| 2397 | 2325 |
| 2398 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). | 2326 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2468 EXPECT_EQ(0u, observer.executed_count()); | 2396 EXPECT_EQ(0u, observer.executed_count()); |
| 2469 EXPECT_TRUE(data.at_write_eof()); | 2397 EXPECT_TRUE(data.at_write_eof()); |
| 2470 EXPECT_TRUE(data.at_read_eof()); | 2398 EXPECT_TRUE(data.at_read_eof()); |
| 2471 } | 2399 } |
| 2472 | 2400 |
| 2473 // Test that SpdySession::DoRead yields while reading the data. This test makes | 2401 // Test that SpdySession::DoRead yields while reading the data. This test makes |
| 2474 // 32k + 1 bytes of data available on the socket for reading. It then verifies | 2402 // 32k + 1 bytes of data available on the socket for reading. It then verifies |
| 2475 // that DoRead has yielded even though there is data available for it to read | 2403 // that DoRead has yielded even though there is data available for it to read |
| 2476 // (i.e, socket()->Read didn't return ERR_IO_PENDING during socket reads). | 2404 // (i.e, socket()->Read didn't return ERR_IO_PENDING during socket reads). |
| 2477 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { | 2405 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { |
| 2478 if (GetParam() > kProtoSPDY3) | |
| 2479 return; | |
| 2480 | |
| 2481 MockConnect connect_data(SYNCHRONOUS, OK); | 2406 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2482 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2407 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
| 2483 | 2408 |
| 2484 scoped_ptr<SpdyFrame> req1( | 2409 scoped_ptr<SpdyFrame> req1( |
| 2485 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2410 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 2486 MockWrite writes[] = { | 2411 MockWrite writes[] = { |
| 2487 CreateMockWrite(*req1, 0), | 2412 CreateMockWrite(*req1, 0), |
| 2488 }; | 2413 }; |
| 2489 | 2414 |
| 2490 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). | 2415 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2568 // | 2493 // |
| 2569 // MockRead of SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K | 2494 // MockRead of SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K |
| 2570 // ASYNC 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K. | 2495 // ASYNC 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K. |
| 2571 // | 2496 // |
| 2572 // The above reads 26K synchronously. Since that is less that 32K, we will | 2497 // The above reads 26K synchronously. Since that is less that 32K, we will |
| 2573 // attempt to read again. However, that DoRead() will return ERR_IO_PENDING | 2498 // attempt to read again. However, that DoRead() will return ERR_IO_PENDING |
| 2574 // (because of async read), so DoRead() will yield. When we come back, DoRead() | 2499 // (because of async read), so DoRead() will yield. When we come back, DoRead() |
| 2575 // will read the results from the async read, and rest of the data | 2500 // will read the results from the async read, and rest of the data |
| 2576 // synchronously. | 2501 // synchronously. |
| 2577 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { | 2502 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { |
| 2578 if (GetParam() > kProtoSPDY3) | |
| 2579 return; | |
| 2580 | |
| 2581 MockConnect connect_data(SYNCHRONOUS, OK); | 2503 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2582 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2504 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
| 2583 | 2505 |
| 2584 scoped_ptr<SpdyFrame> req1( | 2506 scoped_ptr<SpdyFrame> req1( |
| 2585 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2507 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 2586 MockWrite writes[] = { | 2508 MockWrite writes[] = { |
| 2587 CreateMockWrite(*req1, 0), | 2509 CreateMockWrite(*req1, 0), |
| 2588 }; | 2510 }; |
| 2589 | 2511 |
| 2590 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). | 2512 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size). |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2676 EXPECT_EQ(1u, observer.executed_count()); | 2598 EXPECT_EQ(1u, observer.executed_count()); |
| 2677 EXPECT_TRUE(data.at_write_eof()); | 2599 EXPECT_TRUE(data.at_write_eof()); |
| 2678 EXPECT_TRUE(data.at_read_eof()); | 2600 EXPECT_TRUE(data.at_read_eof()); |
| 2679 } | 2601 } |
| 2680 | 2602 |
| 2681 // Send a GoAway frame when SpdySession is in DoLoop. If scoped_refptr to | 2603 // Send a GoAway frame when SpdySession is in DoLoop. If scoped_refptr to |
| 2682 // <SpdySession> is deleted from SpdySession::DoLoop(), we get a crash because | 2604 // <SpdySession> is deleted from SpdySession::DoLoop(), we get a crash because |
| 2683 // GoAway could delete the SpdySession from the SpdySessionPool and the last | 2605 // GoAway could delete the SpdySession from the SpdySessionPool and the last |
| 2684 // reference to SpdySession. | 2606 // reference to SpdySession. |
| 2685 TEST_P(SpdySessionTest, GoAwayWhileInDoLoop) { | 2607 TEST_P(SpdySessionTest, GoAwayWhileInDoLoop) { |
| 2686 if (GetParam() > kProtoSPDY3) | |
| 2687 return; | |
| 2688 | |
| 2689 MockConnect connect_data(SYNCHRONOUS, OK); | 2608 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2690 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2609 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
| 2691 | 2610 |
| 2692 scoped_ptr<SpdyFrame> req1( | 2611 scoped_ptr<SpdyFrame> req1( |
| 2693 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2612 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
| 2694 MockWrite writes[] = { | 2613 MockWrite writes[] = { |
| 2695 CreateMockWrite(*req1, 0), | 2614 CreateMockWrite(*req1, 0), |
| 2696 }; | 2615 }; |
| 2697 | 2616 |
| 2698 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2617 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2786 EXPECT_EQ(0, session->session_recv_window_size_); | 2705 EXPECT_EQ(0, session->session_recv_window_size_); |
| 2787 } else if (GetParam() == kProtoSPDY3) { | 2706 } else if (GetParam() == kProtoSPDY3) { |
| 2788 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM, session->flow_control_state()); | 2707 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM, session->flow_control_state()); |
| 2789 EXPECT_EQ(0, session->session_send_window_size_); | 2708 EXPECT_EQ(0, session->session_send_window_size_); |
| 2790 EXPECT_EQ(0, session->session_recv_window_size_); | 2709 EXPECT_EQ(0, session->session_recv_window_size_); |
| 2791 } else { | 2710 } else { |
| 2792 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 2711 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 2793 session->flow_control_state()); | 2712 session->flow_control_state()); |
| 2794 EXPECT_EQ(kSpdySessionInitialWindowSize, | 2713 EXPECT_EQ(kSpdySessionInitialWindowSize, |
| 2795 session->session_send_window_size_); | 2714 session->session_send_window_size_); |
| 2796 EXPECT_EQ(kDefaultInitialRecvWindowSize, | 2715 EXPECT_EQ(kSpdySessionInitialWindowSize, |
| 2797 session->session_recv_window_size_); | 2716 session->session_recv_window_size_); |
| 2798 } | 2717 } |
| 2799 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2718 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2800 } | 2719 } |
| 2801 | 2720 |
| 2802 // SpdySession::{Increase,Decrease}RecvWindowSize should properly | 2721 // SpdySession::{Increase,Decrease}RecvWindowSize should properly |
| 2803 // adjust the session receive window size when the "enable_spdy_31" | 2722 // adjust the session receive window size for SPDY 3.1 and higher. In |
| 2804 // flag is set. In addition, SpdySession::IncreaseRecvWindowSize | 2723 // addition, SpdySession::IncreaseRecvWindowSize should trigger |
| 2805 // should trigger sending a WINDOW_UPDATE frame for a large enough | 2724 // sending a WINDOW_UPDATE frame for a large enough delta. |
| 2806 // delta. | |
| 2807 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 2725 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
| 2808 if (GetParam() < kProtoSPDY31) | 2726 if (GetParam() < kProtoSPDY31) |
| 2809 return; | 2727 return; |
| 2810 | 2728 |
| 2811 session_deps_.host_resolver->set_synchronous_mode(true); | 2729 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2812 | 2730 |
| 2813 const int32 delta_window_size = 100; | 2731 const int32 delta_window_size = 100; |
| 2814 | 2732 |
| 2815 MockConnect connect_data(SYNCHRONOUS, OK); | 2733 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2816 MockRead reads[] = { | 2734 MockRead reads[] = { |
| 2817 MockRead(ASYNC, 0, 2) // EOF | 2735 MockRead(ASYNC, 0, 1) // EOF |
| 2818 }; | 2736 }; |
| 2819 scoped_ptr<SpdyFrame> initial_window_update( | |
| 2820 spdy_util_.ConstructSpdyWindowUpdate( | |
| 2821 kSessionFlowControlStreamId, | |
| 2822 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 2823 scoped_ptr<SpdyFrame> window_update( | 2737 scoped_ptr<SpdyFrame> window_update( |
| 2824 spdy_util_.ConstructSpdyWindowUpdate( | 2738 spdy_util_.ConstructSpdyWindowUpdate( |
| 2825 kSessionFlowControlStreamId, | 2739 kSessionFlowControlStreamId, |
| 2826 kSpdySessionInitialWindowSize + delta_window_size)); | 2740 kSpdySessionInitialWindowSize + delta_window_size)); |
| 2827 MockWrite writes[] = { | 2741 MockWrite writes[] = { |
| 2828 CreateMockWrite(*initial_window_update, 0), | 2742 CreateMockWrite(*window_update, 0), |
| 2829 CreateMockWrite(*window_update, 1), | |
| 2830 }; | 2743 }; |
| 2831 DeterministicSocketData data(reads, arraysize(reads), | 2744 DeterministicSocketData data(reads, arraysize(reads), |
| 2832 writes, arraysize(writes)); | 2745 writes, arraysize(writes)); |
| 2833 data.set_connect_data(connect_data); | 2746 data.set_connect_data(connect_data); |
| 2834 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2747 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2835 | 2748 |
| 2836 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2749 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 2837 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 2750 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
| 2838 | 2751 |
| 2839 CreateDeterministicNetworkSession(); | 2752 CreateDeterministicNetworkSession(); |
| 2840 scoped_refptr<SpdySession> session = GetSession(key_); | 2753 scoped_refptr<SpdySession> session = GetSession(key_); |
| 2841 InitializeSession( | 2754 InitializeSession( |
| 2842 http_session_.get(), session.get(), test_host_port_pair_); | 2755 http_session_.get(), session.get(), test_host_port_pair_); |
| 2843 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 2756 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 2844 session->flow_control_state()); | 2757 session->flow_control_state()); |
| 2845 | 2758 |
| 2846 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2759 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 2847 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2760 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2848 | 2761 |
| 2849 session->IncreaseRecvWindowSize(delta_window_size); | 2762 session->IncreaseRecvWindowSize(delta_window_size); |
| 2850 EXPECT_EQ(kDefaultInitialRecvWindowSize + delta_window_size, | 2763 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size, |
| 2851 session->session_recv_window_size_); | 2764 session->session_recv_window_size_); |
| 2852 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); | 2765 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); |
| 2853 | 2766 |
| 2854 // Should trigger sending a WINDOW_UPDATE frame. | 2767 // Should trigger sending a WINDOW_UPDATE frame. |
| 2855 session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize); | 2768 session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize); |
| 2856 EXPECT_EQ(kDefaultInitialRecvWindowSize + delta_window_size + | 2769 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size + |
| 2857 kSpdySessionInitialWindowSize, | 2770 kSpdySessionInitialWindowSize, |
| 2858 session->session_recv_window_size_); | 2771 session->session_recv_window_size_); |
| 2859 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2772 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2860 | 2773 |
| 2861 data.RunFor(2); | 2774 data.RunFor(1); |
| 2862 | 2775 |
| 2863 session->DecreaseRecvWindowSize( | 2776 session->DecreaseRecvWindowSize( |
| 2864 kDefaultInitialRecvWindowSize + delta_window_size + | 2777 kSpdySessionInitialWindowSize + delta_window_size + |
| 2865 kSpdySessionInitialWindowSize); | 2778 kSpdySessionInitialWindowSize); |
| 2866 EXPECT_EQ(0, session->session_recv_window_size_); | 2779 EXPECT_EQ(0, session->session_recv_window_size_); |
| 2867 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2780 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2868 } | 2781 } |
| 2869 | 2782 |
| 2870 // SpdySession::{Increase,Decrease}SendWindowSize should properly | 2783 // SpdySession::{Increase,Decrease}SendWindowSize should properly |
| 2871 // adjust the session send window size when the "enable_spdy_31" flag | 2784 // adjust the session send window size when the "enable_spdy_31" flag |
| 2872 // is set. | 2785 // is set. |
| 2873 TEST_P(SpdySessionTest, AdjustSendWindowSize) { | 2786 TEST_P(SpdySessionTest, AdjustSendWindowSize) { |
| 2874 if (GetParam() < kProtoSPDY31) | 2787 if (GetParam() < kProtoSPDY31) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2907 // receive window size to decrease. | 2820 // receive window size to decrease. |
| 2908 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { | 2821 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { |
| 2909 if (GetParam() < kProtoSPDY31) | 2822 if (GetParam() < kProtoSPDY31) |
| 2910 return; | 2823 return; |
| 2911 | 2824 |
| 2912 session_deps_.host_resolver->set_synchronous_mode(true); | 2825 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2913 | 2826 |
| 2914 MockConnect connect_data(SYNCHRONOUS, OK); | 2827 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2915 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); | 2828 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); |
| 2916 MockRead reads[] = { | 2829 MockRead reads[] = { |
| 2917 CreateMockRead(*resp, 1), | 2830 CreateMockRead(*resp, 0), |
| 2918 MockRead(ASYNC, 0, 2) // EOF | 2831 MockRead(ASYNC, 0, 1) // EOF |
| 2919 }; | 2832 }; |
| 2920 scoped_ptr<SpdyFrame> initial_window_update( | 2833 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
| 2921 spdy_util_.ConstructSpdyWindowUpdate( | |
| 2922 kSessionFlowControlStreamId, | |
| 2923 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 2924 MockWrite writes[] = { | |
| 2925 CreateMockWrite(*initial_window_update, 0), | |
| 2926 }; | |
| 2927 DeterministicSocketData data(reads, arraysize(reads), | |
| 2928 writes, arraysize(writes)); | |
| 2929 data.set_connect_data(connect_data); | 2834 data.set_connect_data(connect_data); |
| 2930 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2835 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2931 | 2836 |
| 2932 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2837 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 2933 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 2838 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
| 2934 | 2839 |
| 2935 CreateDeterministicNetworkSession(); | 2840 CreateDeterministicNetworkSession(); |
| 2936 scoped_refptr<SpdySession> session = GetSession(key_); | 2841 scoped_refptr<SpdySession> session = GetSession(key_); |
| 2937 InitializeSession( | 2842 InitializeSession( |
| 2938 http_session_.get(), session.get(), test_host_port_pair_); | 2843 http_session_.get(), session.get(), test_host_port_pair_); |
| 2939 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 2844 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 2940 session->flow_control_state()); | 2845 session->flow_control_state()); |
| 2941 | 2846 |
| 2942 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2847 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 2943 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2848 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2944 | 2849 |
| 2945 data.RunFor(3); | 2850 data.RunFor(2); |
| 2946 | 2851 |
| 2947 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2852 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 2948 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2853 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2949 } | 2854 } |
| 2950 | 2855 |
| 2951 // A delegate that drops any received data. | 2856 // A delegate that drops any received data. |
| 2952 class DropReceivedDataDelegate : public test::StreamDelegateSendImmediate { | 2857 class DropReceivedDataDelegate : public test::StreamDelegateSendImmediate { |
| 2953 public: | 2858 public: |
| 2954 DropReceivedDataDelegate(const base::WeakPtr<SpdyStream>& stream, | 2859 DropReceivedDataDelegate(const base::WeakPtr<SpdyStream>& stream, |
| 2955 base::StringPiece data) | 2860 base::StringPiece data) |
| 2956 : StreamDelegateSendImmediate(stream, data) {} | 2861 : StreamDelegateSendImmediate(stream, data) {} |
| 2957 | 2862 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2968 if (GetParam() < kProtoSPDY31) | 2873 if (GetParam() < kProtoSPDY31) |
| 2969 return; | 2874 return; |
| 2970 | 2875 |
| 2971 const char kStreamUrl[] = "http://www.google.com/"; | 2876 const char kStreamUrl[] = "http://www.google.com/"; |
| 2972 | 2877 |
| 2973 const int32 msg_data_size = 100; | 2878 const int32 msg_data_size = 100; |
| 2974 const std::string msg_data(msg_data_size, 'a'); | 2879 const std::string msg_data(msg_data_size, 'a'); |
| 2975 | 2880 |
| 2976 MockConnect connect_data(SYNCHRONOUS, OK); | 2881 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2977 | 2882 |
| 2978 scoped_ptr<SpdyFrame> initial_window_update( | |
| 2979 spdy_util_.ConstructSpdyWindowUpdate( | |
| 2980 kSessionFlowControlStreamId, | |
| 2981 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 2982 scoped_ptr<SpdyFrame> req( | 2883 scoped_ptr<SpdyFrame> req( |
| 2983 spdy_util_.ConstructSpdyPost( | 2884 spdy_util_.ConstructSpdyPost( |
| 2984 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | 2885 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
| 2985 scoped_ptr<SpdyFrame> msg( | 2886 scoped_ptr<SpdyFrame> msg( |
| 2986 spdy_util_.ConstructSpdyBodyFrame( | 2887 spdy_util_.ConstructSpdyBodyFrame( |
| 2987 1, msg_data.data(), msg_data_size, false)); | 2888 1, msg_data.data(), msg_data_size, false)); |
| 2988 MockWrite writes[] = { | 2889 MockWrite writes[] = { |
| 2989 CreateMockWrite(*initial_window_update, 0), | 2890 CreateMockWrite(*req, 0), |
| 2990 CreateMockWrite(*req, 1), | 2891 CreateMockWrite(*msg, 2), |
| 2991 CreateMockWrite(*msg, 3), | |
| 2992 }; | 2892 }; |
| 2993 | 2893 |
| 2994 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2894 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2995 scoped_ptr<SpdyFrame> echo( | 2895 scoped_ptr<SpdyFrame> echo( |
| 2996 spdy_util_.ConstructSpdyBodyFrame( | 2896 spdy_util_.ConstructSpdyBodyFrame( |
| 2997 1, msg_data.data(), msg_data_size, false)); | 2897 1, msg_data.data(), msg_data_size, false)); |
| 2998 scoped_ptr<SpdyFrame> window_update( | 2898 scoped_ptr<SpdyFrame> window_update( |
| 2999 spdy_util_.ConstructSpdyWindowUpdate( | 2899 spdy_util_.ConstructSpdyWindowUpdate( |
| 3000 kSessionFlowControlStreamId, msg_data_size)); | 2900 kSessionFlowControlStreamId, msg_data_size)); |
| 3001 MockRead reads[] = { | 2901 MockRead reads[] = { |
| 3002 CreateMockRead(*resp, 2), | 2902 CreateMockRead(*resp, 1), |
| 3003 CreateMockRead(*echo, 4), | 2903 CreateMockRead(*echo, 3), |
| 3004 MockRead(ASYNC, 0, 5) // EOF | 2904 MockRead(ASYNC, 0, 4) // EOF |
| 3005 }; | 2905 }; |
| 3006 | 2906 |
| 3007 // Create SpdySession and SpdyStream and send the request. | 2907 // Create SpdySession and SpdyStream and send the request. |
| 3008 DeterministicSocketData data(reads, arraysize(reads), | 2908 DeterministicSocketData data(reads, arraysize(reads), |
| 3009 writes, arraysize(writes)); | 2909 writes, arraysize(writes)); |
| 3010 data.set_connect_data(connect_data); | 2910 data.set_connect_data(connect_data); |
| 3011 session_deps_.host_resolver->set_synchronous_mode(true); | 2911 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3012 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2912 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3013 | 2913 |
| 3014 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2914 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3027 | 2927 |
| 3028 DropReceivedDataDelegate delegate(stream, msg_data); | 2928 DropReceivedDataDelegate delegate(stream, msg_data); |
| 3029 stream->SetDelegate(&delegate); | 2929 stream->SetDelegate(&delegate); |
| 3030 | 2930 |
| 3031 scoped_ptr<SpdyHeaderBlock> headers( | 2931 scoped_ptr<SpdyHeaderBlock> headers( |
| 3032 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 2932 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3033 EXPECT_EQ(ERR_IO_PENDING, | 2933 EXPECT_EQ(ERR_IO_PENDING, |
| 3034 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 2934 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3035 EXPECT_TRUE(stream->HasUrl()); | 2935 EXPECT_TRUE(stream->HasUrl()); |
| 3036 | 2936 |
| 3037 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2937 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3038 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2938 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3039 | 2939 |
| 3040 data.RunFor(5); | 2940 data.RunFor(4); |
| 3041 | 2941 |
| 3042 EXPECT_TRUE(data.at_write_eof()); | 2942 EXPECT_TRUE(data.at_write_eof()); |
| 3043 EXPECT_TRUE(data.at_read_eof()); | 2943 EXPECT_TRUE(data.at_read_eof()); |
| 3044 | 2944 |
| 3045 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2945 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3046 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 2946 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3047 | 2947 |
| 3048 stream->Close(); | 2948 stream->Close(); |
| 3049 EXPECT_EQ(NULL, stream.get()); | 2949 EXPECT_EQ(NULL, stream.get()); |
| 3050 | 2950 |
| 3051 EXPECT_EQ(OK, delegate.WaitForClose()); | 2951 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 3052 | 2952 |
| 3053 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2953 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3054 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 2954 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3055 } | 2955 } |
| 3056 | 2956 |
| 3057 // Send data back and forth but close the stream before its data frame | 2957 // Send data back and forth but close the stream before its data frame |
| 3058 // can be written to the socket. The send window should then increase | 2958 // can be written to the socket. The send window should then increase |
| 3059 // to its original value, i.e. we shouldn't "leak" send window bytes. | 2959 // to its original value, i.e. we shouldn't "leak" send window bytes. |
| 3060 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { | 2960 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { |
| 3061 if (GetParam() < kProtoSPDY31) | 2961 if (GetParam() < kProtoSPDY31) |
| 3062 return; | 2962 return; |
| 3063 | 2963 |
| 3064 const char kStreamUrl[] = "http://www.google.com/"; | 2964 const char kStreamUrl[] = "http://www.google.com/"; |
| 3065 | 2965 |
| 3066 const int32 msg_data_size = 100; | 2966 const int32 msg_data_size = 100; |
| 3067 const std::string msg_data(msg_data_size, 'a'); | 2967 const std::string msg_data(msg_data_size, 'a'); |
| 3068 | 2968 |
| 3069 MockConnect connect_data(SYNCHRONOUS, OK); | 2969 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3070 | 2970 |
| 3071 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3072 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3073 kSessionFlowControlStreamId, | |
| 3074 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3075 scoped_ptr<SpdyFrame> req( | 2971 scoped_ptr<SpdyFrame> req( |
| 3076 spdy_util_.ConstructSpdyPost( | 2972 spdy_util_.ConstructSpdyPost( |
| 3077 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | 2973 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
| 3078 MockWrite writes[] = { | 2974 MockWrite writes[] = { |
| 3079 CreateMockWrite(*initial_window_update, 0), | 2975 CreateMockWrite(*req, 0), |
| 3080 CreateMockWrite(*req, 1), | |
| 3081 }; | 2976 }; |
| 3082 | 2977 |
| 3083 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2978 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3084 MockRead reads[] = { | 2979 MockRead reads[] = { |
| 3085 CreateMockRead(*resp, 2), | 2980 CreateMockRead(*resp, 1), |
| 3086 MockRead(ASYNC, 0, 3) // EOF | 2981 MockRead(ASYNC, 0, 2) // EOF |
| 3087 }; | 2982 }; |
| 3088 | 2983 |
| 3089 // Create SpdySession and SpdyStream and send the request. | 2984 // Create SpdySession and SpdyStream and send the request. |
| 3090 DeterministicSocketData data(reads, arraysize(reads), | 2985 DeterministicSocketData data(reads, arraysize(reads), |
| 3091 writes, arraysize(writes)); | 2986 writes, arraysize(writes)); |
| 3092 data.set_connect_data(connect_data); | 2987 data.set_connect_data(connect_data); |
| 3093 session_deps_.host_resolver->set_synchronous_mode(true); | 2988 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3094 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2989 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3095 | 2990 |
| 3096 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2991 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3111 stream->SetDelegate(&delegate); | 3006 stream->SetDelegate(&delegate); |
| 3112 | 3007 |
| 3113 scoped_ptr<SpdyHeaderBlock> headers( | 3008 scoped_ptr<SpdyHeaderBlock> headers( |
| 3114 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3009 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3115 EXPECT_EQ(ERR_IO_PENDING, | 3010 EXPECT_EQ(ERR_IO_PENDING, |
| 3116 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3011 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3117 EXPECT_TRUE(stream->HasUrl()); | 3012 EXPECT_TRUE(stream->HasUrl()); |
| 3118 | 3013 |
| 3119 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3014 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3120 | 3015 |
| 3121 data.RunFor(2); | 3016 data.RunFor(1); |
| 3122 | 3017 |
| 3123 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3018 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3124 | 3019 |
| 3125 data.RunFor(1); | 3020 data.RunFor(1); |
| 3126 | 3021 |
| 3127 EXPECT_TRUE(data.at_write_eof()); | 3022 EXPECT_TRUE(data.at_write_eof()); |
| 3128 EXPECT_TRUE(data.at_read_eof()); | 3023 EXPECT_TRUE(data.at_read_eof()); |
| 3129 | 3024 |
| 3130 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3025 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3131 session->session_send_window_size_); | 3026 session->session_send_window_size_); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3145 if (GetParam() < kProtoSPDY31) | 3040 if (GetParam() < kProtoSPDY31) |
| 3146 return; | 3041 return; |
| 3147 | 3042 |
| 3148 const char kStreamUrl[] = "http://www.google.com/"; | 3043 const char kStreamUrl[] = "http://www.google.com/"; |
| 3149 | 3044 |
| 3150 const int32 msg_data_size = 100; | 3045 const int32 msg_data_size = 100; |
| 3151 const std::string msg_data(msg_data_size, 'a'); | 3046 const std::string msg_data(msg_data_size, 'a'); |
| 3152 | 3047 |
| 3153 MockConnect connect_data(SYNCHRONOUS, OK); | 3048 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3154 | 3049 |
| 3155 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3156 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3157 kSessionFlowControlStreamId, | |
| 3158 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3159 scoped_ptr<SpdyFrame> req( | 3050 scoped_ptr<SpdyFrame> req( |
| 3160 spdy_util_.ConstructSpdyPost( | 3051 spdy_util_.ConstructSpdyPost( |
| 3161 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | 3052 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
| 3162 scoped_ptr<SpdyFrame> msg( | 3053 scoped_ptr<SpdyFrame> msg( |
| 3163 spdy_util_.ConstructSpdyBodyFrame( | 3054 spdy_util_.ConstructSpdyBodyFrame( |
| 3164 1, msg_data.data(), msg_data_size, false)); | 3055 1, msg_data.data(), msg_data_size, false)); |
| 3165 MockWrite writes[] = { | 3056 MockWrite writes[] = { |
| 3166 CreateMockWrite(*initial_window_update, 0), | 3057 CreateMockWrite(*req, 0), |
| 3167 CreateMockWrite(*req, 1), | 3058 CreateMockWrite(*msg, 2), |
| 3168 CreateMockWrite(*msg, 3), | |
| 3169 }; | 3059 }; |
| 3170 | 3060 |
| 3171 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3061 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3172 scoped_ptr<SpdyFrame> echo( | 3062 scoped_ptr<SpdyFrame> echo( |
| 3173 spdy_util_.ConstructSpdyBodyFrame( | 3063 spdy_util_.ConstructSpdyBodyFrame( |
| 3174 1, msg_data.data(), msg_data_size, false)); | 3064 1, msg_data.data(), msg_data_size, false)); |
| 3175 scoped_ptr<SpdyFrame> window_update( | 3065 scoped_ptr<SpdyFrame> window_update( |
| 3176 spdy_util_.ConstructSpdyWindowUpdate( | 3066 spdy_util_.ConstructSpdyWindowUpdate( |
| 3177 kSessionFlowControlStreamId, msg_data_size)); | 3067 kSessionFlowControlStreamId, msg_data_size)); |
| 3178 MockRead reads[] = { | 3068 MockRead reads[] = { |
| 3179 CreateMockRead(*resp, 2), | 3069 CreateMockRead(*resp, 1), |
| 3180 CreateMockRead(*echo, 4), | 3070 CreateMockRead(*echo, 3), |
| 3181 CreateMockRead(*window_update, 5), | 3071 CreateMockRead(*window_update, 4), |
| 3182 MockRead(ASYNC, 0, 6) // EOF | 3072 MockRead(ASYNC, 0, 5) // EOF |
| 3183 }; | 3073 }; |
| 3184 | 3074 |
| 3185 // Create SpdySession and SpdyStream and send the request. | 3075 // Create SpdySession and SpdyStream and send the request. |
| 3186 DeterministicSocketData data(reads, arraysize(reads), | 3076 DeterministicSocketData data(reads, arraysize(reads), |
| 3187 writes, arraysize(writes)); | 3077 writes, arraysize(writes)); |
| 3188 data.set_connect_data(connect_data); | 3078 data.set_connect_data(connect_data); |
| 3189 session_deps_.host_resolver->set_synchronous_mode(true); | 3079 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3190 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3080 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3191 | 3081 |
| 3192 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 3082 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3206 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3096 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 3207 stream->SetDelegate(&delegate); | 3097 stream->SetDelegate(&delegate); |
| 3208 | 3098 |
| 3209 scoped_ptr<SpdyHeaderBlock> headers( | 3099 scoped_ptr<SpdyHeaderBlock> headers( |
| 3210 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3100 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3211 EXPECT_EQ(ERR_IO_PENDING, | 3101 EXPECT_EQ(ERR_IO_PENDING, |
| 3212 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3102 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3213 EXPECT_TRUE(stream->HasUrl()); | 3103 EXPECT_TRUE(stream->HasUrl()); |
| 3214 | 3104 |
| 3215 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3105 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3216 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3106 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3217 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3107 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3218 | 3108 |
| 3219 data.RunFor(2); | 3109 data.RunFor(1); |
| 3220 | 3110 |
| 3221 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3111 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3222 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3112 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3223 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3113 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3224 | 3114 |
| 3225 data.RunFor(1); | 3115 data.RunFor(1); |
| 3226 | 3116 |
| 3227 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3117 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3228 session->session_send_window_size_); | 3118 session->session_send_window_size_); |
| 3229 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3119 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3230 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3120 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3231 | 3121 |
| 3232 data.RunFor(1); | 3122 data.RunFor(1); |
| 3233 | 3123 |
| 3234 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3124 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3235 session->session_send_window_size_); | 3125 session->session_send_window_size_); |
| 3236 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3126 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3237 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3127 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3238 | 3128 |
| 3239 data.RunFor(1); | 3129 data.RunFor(1); |
| 3240 | 3130 |
| 3241 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3131 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3242 session->session_send_window_size_); | 3132 session->session_send_window_size_); |
| 3243 EXPECT_EQ(kDefaultInitialRecvWindowSize - msg_data_size, | 3133 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3244 session->session_recv_window_size_); | 3134 session->session_recv_window_size_); |
| 3245 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3135 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3246 | 3136 |
| 3247 data.RunFor(1); | 3137 data.RunFor(1); |
| 3248 | 3138 |
| 3249 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3139 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3250 EXPECT_EQ(kDefaultInitialRecvWindowSize - msg_data_size, | 3140 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, |
| 3251 session->session_recv_window_size_); | 3141 session->session_recv_window_size_); |
| 3252 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3142 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3253 | 3143 |
| 3254 EXPECT_TRUE(data.at_write_eof()); | 3144 EXPECT_TRUE(data.at_write_eof()); |
| 3255 EXPECT_TRUE(data.at_read_eof()); | 3145 EXPECT_TRUE(data.at_read_eof()); |
| 3256 | 3146 |
| 3257 EXPECT_EQ(msg_data, delegate.TakeReceivedData()); | 3147 EXPECT_EQ(msg_data, delegate.TakeReceivedData()); |
| 3258 | 3148 |
| 3259 // Draining the delegate's read queue should increase the session's | 3149 // Draining the delegate's read queue should increase the session's |
| 3260 // receive window. | 3150 // receive window. |
| 3261 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3151 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3262 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3152 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3263 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3153 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3264 | 3154 |
| 3265 stream->Close(); | 3155 stream->Close(); |
| 3266 EXPECT_EQ(NULL, stream.get()); | 3156 EXPECT_EQ(NULL, stream.get()); |
| 3267 | 3157 |
| 3268 EXPECT_EQ(OK, delegate.WaitForClose()); | 3158 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 3269 | 3159 |
| 3270 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3160 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 3271 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 3161 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
| 3272 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3162 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3273 } | 3163 } |
| 3274 | 3164 |
| 3275 // Given a stall function and an unstall function, runs a test to make | 3165 // Given a stall function and an unstall function, runs a test to make |
| 3276 // sure that a stream resumes after unstall. | 3166 // sure that a stream resumes after unstall. |
| 3277 void SpdySessionTest::RunResumeAfterUnstallTest( | 3167 void SpdySessionTest::RunResumeAfterUnstallTest( |
| 3278 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_fn, | 3168 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_fn, |
| 3279 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& | 3169 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& |
| 3280 unstall_function) { | 3170 unstall_function) { |
| 3281 const char kStreamUrl[] = "http://www.google.com/"; | 3171 const char kStreamUrl[] = "http://www.google.com/"; |
| 3282 GURL url(kStreamUrl); | 3172 GURL url(kStreamUrl); |
| 3283 | 3173 |
| 3284 session_deps_.host_resolver->set_synchronous_mode(true); | 3174 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3285 | 3175 |
| 3286 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3287 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3288 kSessionFlowControlStreamId, | |
| 3289 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3290 scoped_ptr<SpdyFrame> req( | 3176 scoped_ptr<SpdyFrame> req( |
| 3291 spdy_util_.ConstructSpdyPost( | 3177 spdy_util_.ConstructSpdyPost( |
| 3292 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3178 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 3293 scoped_ptr<SpdyFrame> body( | 3179 scoped_ptr<SpdyFrame> body( |
| 3294 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 3180 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); |
| 3295 MockWrite writes[] = { | 3181 MockWrite writes[] = { |
| 3296 CreateMockWrite(*initial_window_update, 0), | 3182 CreateMockWrite(*req, 0), |
| 3297 CreateMockWrite(*req, 1), | 3183 CreateMockWrite(*body, 1), |
| 3298 CreateMockWrite(*body, 2), | |
| 3299 }; | 3184 }; |
| 3300 | 3185 |
| 3301 scoped_ptr<SpdyFrame> resp( | 3186 scoped_ptr<SpdyFrame> resp( |
| 3302 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3187 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3303 scoped_ptr<SpdyFrame> echo( | 3188 scoped_ptr<SpdyFrame> echo( |
| 3304 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | 3189 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 3305 MockRead reads[] = { | 3190 MockRead reads[] = { |
| 3306 CreateMockRead(*resp, 3), | 3191 CreateMockRead(*resp, 2), |
| 3307 MockRead(ASYNC, 0, 0, 4), // EOF | 3192 MockRead(ASYNC, 0, 0, 3), // EOF |
| 3308 }; | 3193 }; |
| 3309 | 3194 |
| 3310 DeterministicSocketData data(reads, arraysize(reads), | 3195 DeterministicSocketData data(reads, arraysize(reads), |
| 3311 writes, arraysize(writes)); | 3196 writes, arraysize(writes)); |
| 3312 MockConnect connect_data(SYNCHRONOUS, OK); | 3197 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3313 data.set_connect_data(connect_data); | 3198 data.set_connect_data(connect_data); |
| 3314 | 3199 |
| 3315 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3200 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3316 | 3201 |
| 3317 CreateDeterministicNetworkSession(); | 3202 CreateDeterministicNetworkSession(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3334 | 3219 |
| 3335 scoped_ptr<SpdyHeaderBlock> headers( | 3220 scoped_ptr<SpdyHeaderBlock> headers( |
| 3336 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3221 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3337 EXPECT_EQ(ERR_IO_PENDING, | 3222 EXPECT_EQ(ERR_IO_PENDING, |
| 3338 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3223 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3339 EXPECT_TRUE(stream->HasUrl()); | 3224 EXPECT_TRUE(stream->HasUrl()); |
| 3340 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 3225 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 3341 | 3226 |
| 3342 stall_fn.Run(session.get(), stream.get()); | 3227 stall_fn.Run(session.get(), stream.get()); |
| 3343 | 3228 |
| 3344 data.RunFor(2); | 3229 data.RunFor(1); |
| 3345 | 3230 |
| 3346 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 3231 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 3347 | 3232 |
| 3348 unstall_function.Run(session.get(), stream.get(), kBodyDataSize); | 3233 unstall_function.Run(session.get(), stream.get(), kBodyDataSize); |
| 3349 | 3234 |
| 3350 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 3235 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 3351 | 3236 |
| 3352 data.RunFor(3); | 3237 data.RunFor(3); |
| 3353 | 3238 |
| 3354 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 3239 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3436 // increased. | 3321 // increased. |
| 3437 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { | 3322 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { |
| 3438 if (GetParam() < kProtoSPDY31) | 3323 if (GetParam() < kProtoSPDY31) |
| 3439 return; | 3324 return; |
| 3440 | 3325 |
| 3441 const char kStreamUrl[] = "http://www.google.com/"; | 3326 const char kStreamUrl[] = "http://www.google.com/"; |
| 3442 GURL url(kStreamUrl); | 3327 GURL url(kStreamUrl); |
| 3443 | 3328 |
| 3444 session_deps_.host_resolver->set_synchronous_mode(true); | 3329 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3445 | 3330 |
| 3446 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3447 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3448 kSessionFlowControlStreamId, | |
| 3449 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3450 scoped_ptr<SpdyFrame> req1( | 3331 scoped_ptr<SpdyFrame> req1( |
| 3451 spdy_util_.ConstructSpdyPost( | 3332 spdy_util_.ConstructSpdyPost( |
| 3452 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3333 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 3453 scoped_ptr<SpdyFrame> req2( | 3334 scoped_ptr<SpdyFrame> req2( |
| 3454 spdy_util_.ConstructSpdyPost( | 3335 spdy_util_.ConstructSpdyPost( |
| 3455 kStreamUrl, 3, kBodyDataSize, MEDIUM, NULL, 0)); | 3336 kStreamUrl, 3, kBodyDataSize, MEDIUM, NULL, 0)); |
| 3456 scoped_ptr<SpdyFrame> body1( | 3337 scoped_ptr<SpdyFrame> body1( |
| 3457 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 3338 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); |
| 3458 scoped_ptr<SpdyFrame> body2( | 3339 scoped_ptr<SpdyFrame> body2( |
| 3459 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 3340 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); |
| 3460 MockWrite writes[] = { | 3341 MockWrite writes[] = { |
| 3461 CreateMockWrite(*initial_window_update, 0), | 3342 CreateMockWrite(*req1, 0), |
| 3462 CreateMockWrite(*req1, 1), | 3343 CreateMockWrite(*req2, 1), |
| 3463 CreateMockWrite(*req2, 2), | 3344 CreateMockWrite(*body2, 2), |
| 3464 CreateMockWrite(*body2, 3), | 3345 CreateMockWrite(*body1, 3), |
| 3465 CreateMockWrite(*body1, 4), | |
| 3466 }; | 3346 }; |
| 3467 | 3347 |
| 3468 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3348 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3469 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3349 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 3470 MockRead reads[] = { | 3350 MockRead reads[] = { |
| 3471 CreateMockRead(*resp1, 5), | 3351 CreateMockRead(*resp1, 4), |
| 3472 CreateMockRead(*resp2, 6), | 3352 CreateMockRead(*resp2, 5), |
| 3473 MockRead(ASYNC, 0, 0, 7), // EOF | 3353 MockRead(ASYNC, 0, 0, 6), // EOF |
| 3474 }; | 3354 }; |
| 3475 | 3355 |
| 3476 DeterministicSocketData data(reads, arraysize(reads), | 3356 DeterministicSocketData data(reads, arraysize(reads), |
| 3477 writes, arraysize(writes)); | 3357 writes, arraysize(writes)); |
| 3478 MockConnect connect_data(SYNCHRONOUS, OK); | 3358 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3479 data.set_connect_data(connect_data); | 3359 data.set_connect_data(connect_data); |
| 3480 | 3360 |
| 3481 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3361 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3482 | 3362 |
| 3483 CreateDeterministicNetworkSession(); | 3363 CreateDeterministicNetworkSession(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3512 | 3392 |
| 3513 StallSessionSend(session.get()); | 3393 StallSessionSend(session.get()); |
| 3514 | 3394 |
| 3515 scoped_ptr<SpdyHeaderBlock> headers1( | 3395 scoped_ptr<SpdyHeaderBlock> headers1( |
| 3516 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3396 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3517 EXPECT_EQ(ERR_IO_PENDING, | 3397 EXPECT_EQ(ERR_IO_PENDING, |
| 3518 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); | 3398 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); |
| 3519 EXPECT_TRUE(stream1->HasUrl()); | 3399 EXPECT_TRUE(stream1->HasUrl()); |
| 3520 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); | 3400 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); |
| 3521 | 3401 |
| 3522 data.RunFor(2); | 3402 data.RunFor(1); |
| 3523 EXPECT_EQ(1u, stream1->stream_id()); | 3403 EXPECT_EQ(1u, stream1->stream_id()); |
| 3524 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); | 3404 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); |
| 3525 | 3405 |
| 3526 scoped_ptr<SpdyHeaderBlock> headers2( | 3406 scoped_ptr<SpdyHeaderBlock> headers2( |
| 3527 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3407 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3528 EXPECT_EQ(ERR_IO_PENDING, | 3408 EXPECT_EQ(ERR_IO_PENDING, |
| 3529 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); | 3409 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); |
| 3530 EXPECT_TRUE(stream2->HasUrl()); | 3410 EXPECT_TRUE(stream2->HasUrl()); |
| 3531 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); | 3411 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); |
| 3532 | 3412 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3598 // 0. Unstalling the session should properly handle deleted streams. | 3478 // 0. Unstalling the session should properly handle deleted streams. |
| 3599 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { | 3479 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { |
| 3600 if (GetParam() < kProtoSPDY31) | 3480 if (GetParam() < kProtoSPDY31) |
| 3601 return; | 3481 return; |
| 3602 | 3482 |
| 3603 const char kStreamUrl[] = "http://www.google.com/"; | 3483 const char kStreamUrl[] = "http://www.google.com/"; |
| 3604 GURL url(kStreamUrl); | 3484 GURL url(kStreamUrl); |
| 3605 | 3485 |
| 3606 session_deps_.host_resolver->set_synchronous_mode(true); | 3486 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3607 | 3487 |
| 3608 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3609 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3610 kSessionFlowControlStreamId, | |
| 3611 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3612 scoped_ptr<SpdyFrame> req1( | 3488 scoped_ptr<SpdyFrame> req1( |
| 3613 spdy_util_.ConstructSpdyPost( | 3489 spdy_util_.ConstructSpdyPost( |
| 3614 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3490 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 3615 scoped_ptr<SpdyFrame> req2( | 3491 scoped_ptr<SpdyFrame> req2( |
| 3616 spdy_util_.ConstructSpdyPost( | 3492 spdy_util_.ConstructSpdyPost( |
| 3617 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); | 3493 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); |
| 3618 scoped_ptr<SpdyFrame> req3( | 3494 scoped_ptr<SpdyFrame> req3( |
| 3619 spdy_util_.ConstructSpdyPost( | 3495 spdy_util_.ConstructSpdyPost( |
| 3620 kStreamUrl, 5, kBodyDataSize, LOWEST, NULL, 0)); | 3496 kStreamUrl, 5, kBodyDataSize, LOWEST, NULL, 0)); |
| 3621 scoped_ptr<SpdyFrame> body2( | 3497 scoped_ptr<SpdyFrame> body2( |
| 3622 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 3498 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); |
| 3623 MockWrite writes[] = { | 3499 MockWrite writes[] = { |
| 3624 CreateMockWrite(*initial_window_update, 0), | 3500 CreateMockWrite(*req1, 0), |
| 3625 CreateMockWrite(*req1, 1), | 3501 CreateMockWrite(*req2, 1), |
| 3626 CreateMockWrite(*req2, 2), | 3502 CreateMockWrite(*req3, 2), |
| 3627 CreateMockWrite(*req3, 3), | 3503 CreateMockWrite(*body2, 3), |
| 3628 CreateMockWrite(*body2, 4), | |
| 3629 }; | 3504 }; |
| 3630 | 3505 |
| 3631 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3506 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 3632 MockRead reads[] = { | 3507 MockRead reads[] = { |
| 3633 CreateMockRead(*resp2, 5), | 3508 CreateMockRead(*resp2, 4), |
| 3634 MockRead(ASYNC, 0, 0, 6), // EOF | 3509 MockRead(ASYNC, 0, 0, 5), // EOF |
| 3635 }; | 3510 }; |
| 3636 | 3511 |
| 3637 DeterministicSocketData data(reads, arraysize(reads), | 3512 DeterministicSocketData data(reads, arraysize(reads), |
| 3638 writes, arraysize(writes)); | 3513 writes, arraysize(writes)); |
| 3639 MockConnect connect_data(SYNCHRONOUS, OK); | 3514 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3640 data.set_connect_data(connect_data); | 3515 data.set_connect_data(connect_data); |
| 3641 | 3516 |
| 3642 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3517 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3643 | 3518 |
| 3644 CreateDeterministicNetworkSession(); | 3519 CreateDeterministicNetworkSession(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3684 | 3559 |
| 3685 StallSessionSend(session.get()); | 3560 StallSessionSend(session.get()); |
| 3686 | 3561 |
| 3687 scoped_ptr<SpdyHeaderBlock> headers1( | 3562 scoped_ptr<SpdyHeaderBlock> headers1( |
| 3688 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3563 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3689 EXPECT_EQ(ERR_IO_PENDING, | 3564 EXPECT_EQ(ERR_IO_PENDING, |
| 3690 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); | 3565 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); |
| 3691 EXPECT_TRUE(stream1->HasUrl()); | 3566 EXPECT_TRUE(stream1->HasUrl()); |
| 3692 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); | 3567 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); |
| 3693 | 3568 |
| 3694 data.RunFor(2); | 3569 data.RunFor(1); |
| 3695 EXPECT_EQ(1u, stream1->stream_id()); | 3570 EXPECT_EQ(1u, stream1->stream_id()); |
| 3696 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); | 3571 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); |
| 3697 | 3572 |
| 3698 scoped_ptr<SpdyHeaderBlock> headers2( | 3573 scoped_ptr<SpdyHeaderBlock> headers2( |
| 3699 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3574 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3700 EXPECT_EQ(ERR_IO_PENDING, | 3575 EXPECT_EQ(ERR_IO_PENDING, |
| 3701 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); | 3576 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); |
| 3702 EXPECT_TRUE(stream2->HasUrl()); | 3577 EXPECT_TRUE(stream2->HasUrl()); |
| 3703 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); | 3578 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); |
| 3704 | 3579 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3767 // being closed. | 3642 // being closed. |
| 3768 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { | 3643 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { |
| 3769 if (GetParam() < kProtoSPDY31) | 3644 if (GetParam() < kProtoSPDY31) |
| 3770 return; | 3645 return; |
| 3771 | 3646 |
| 3772 const char kStreamUrl[] = "http://www.google.com/"; | 3647 const char kStreamUrl[] = "http://www.google.com/"; |
| 3773 GURL url(kStreamUrl); | 3648 GURL url(kStreamUrl); |
| 3774 | 3649 |
| 3775 session_deps_.host_resolver->set_synchronous_mode(true); | 3650 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3776 | 3651 |
| 3777 scoped_ptr<SpdyFrame> initial_window_update( | |
| 3778 spdy_util_.ConstructSpdyWindowUpdate( | |
| 3779 kSessionFlowControlStreamId, | |
| 3780 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 3781 scoped_ptr<SpdyFrame> req1( | 3652 scoped_ptr<SpdyFrame> req1( |
| 3782 spdy_util_.ConstructSpdyPost( | 3653 spdy_util_.ConstructSpdyPost( |
| 3783 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3654 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 3784 scoped_ptr<SpdyFrame> req2( | 3655 scoped_ptr<SpdyFrame> req2( |
| 3785 spdy_util_.ConstructSpdyPost( | 3656 spdy_util_.ConstructSpdyPost( |
| 3786 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); | 3657 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); |
| 3787 scoped_ptr<SpdyFrame> body1( | 3658 scoped_ptr<SpdyFrame> body1( |
| 3788 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | 3659 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 3789 MockWrite writes[] = { | 3660 MockWrite writes[] = { |
| 3790 CreateMockWrite(*initial_window_update, 0), | 3661 CreateMockWrite(*req1, 0), |
| 3791 CreateMockWrite(*req1, 1), | 3662 CreateMockWrite(*req2, 1), |
| 3792 CreateMockWrite(*req2, 2), | |
| 3793 }; | 3663 }; |
| 3794 | 3664 |
| 3795 MockRead reads[] = { | 3665 MockRead reads[] = { |
| 3796 MockRead(ASYNC, 0, 0, 3), // EOF | 3666 MockRead(ASYNC, 0, 0, 2), // EOF |
| 3797 }; | 3667 }; |
| 3798 | 3668 |
| 3799 DeterministicSocketData data(reads, arraysize(reads), | 3669 DeterministicSocketData data(reads, arraysize(reads), |
| 3800 writes, arraysize(writes)); | 3670 writes, arraysize(writes)); |
| 3801 MockConnect connect_data(SYNCHRONOUS, OK); | 3671 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3802 data.set_connect_data(connect_data); | 3672 data.set_connect_data(connect_data); |
| 3803 | 3673 |
| 3804 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3674 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3805 | 3675 |
| 3806 CreateDeterministicNetworkSession(); | 3676 CreateDeterministicNetworkSession(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3835 | 3705 |
| 3836 StallSessionSend(session.get()); | 3706 StallSessionSend(session.get()); |
| 3837 | 3707 |
| 3838 scoped_ptr<SpdyHeaderBlock> headers1( | 3708 scoped_ptr<SpdyHeaderBlock> headers1( |
| 3839 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3709 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3840 EXPECT_EQ(ERR_IO_PENDING, | 3710 EXPECT_EQ(ERR_IO_PENDING, |
| 3841 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); | 3711 stream1->SendRequestHeaders(headers1.Pass(), MORE_DATA_TO_SEND)); |
| 3842 EXPECT_TRUE(stream1->HasUrl()); | 3712 EXPECT_TRUE(stream1->HasUrl()); |
| 3843 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); | 3713 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); |
| 3844 | 3714 |
| 3845 data.RunFor(2); | 3715 data.RunFor(1); |
| 3846 EXPECT_EQ(1u, stream1->stream_id()); | 3716 EXPECT_EQ(1u, stream1->stream_id()); |
| 3847 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); | 3717 EXPECT_TRUE(stream1->send_stalled_by_flow_control()); |
| 3848 | 3718 |
| 3849 scoped_ptr<SpdyHeaderBlock> headers2( | 3719 scoped_ptr<SpdyHeaderBlock> headers2( |
| 3850 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3720 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 3851 EXPECT_EQ(ERR_IO_PENDING, | 3721 EXPECT_EQ(ERR_IO_PENDING, |
| 3852 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); | 3722 stream2->SendRequestHeaders(headers2.Pass(), MORE_DATA_TO_SEND)); |
| 3853 EXPECT_TRUE(stream2->HasUrl()); | 3723 EXPECT_TRUE(stream2->HasUrl()); |
| 3854 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); | 3724 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); |
| 3855 | 3725 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3874 | 3744 |
| 3875 EXPECT_TRUE(delegate1.send_headers_completed()); | 3745 EXPECT_TRUE(delegate1.send_headers_completed()); |
| 3876 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 3746 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
| 3877 | 3747 |
| 3878 EXPECT_TRUE(delegate2.send_headers_completed()); | 3748 EXPECT_TRUE(delegate2.send_headers_completed()); |
| 3879 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 3749 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
| 3880 | 3750 |
| 3881 EXPECT_TRUE(data.at_write_eof()); | 3751 EXPECT_TRUE(data.at_write_eof()); |
| 3882 } | 3752 } |
| 3883 | 3753 |
| 3754 |
| 3884 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3755 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
| 3885 // pointers to the idle session are currently held. | 3756 // pointers to the idle session are currently held. |
| 3886 TEST_P(SpdySessionTest, CloseOneIdleConnection) { | 3757 TEST_P(SpdySessionTest, CloseOneIdleConnection) { |
| 3887 if (GetParam() > kProtoSPDY3) | |
| 3888 return; | |
| 3889 | |
| 3890 ClientSocketPoolManager::set_max_sockets_per_group( | 3758 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3891 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3759 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3892 ClientSocketPoolManager::set_max_sockets_per_pool( | 3760 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 3893 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3761 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3894 | 3762 |
| 3895 MockConnect connect_data(SYNCHRONOUS, OK); | 3763 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3896 MockRead reads[] = { | 3764 MockRead reads[] = { |
| 3897 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3765 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 3898 }; | 3766 }; |
| 3899 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 3767 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3935 // The socket pool should close the connection asynchronously and establish a | 3803 // The socket pool should close the connection asynchronously and establish a |
| 3936 // new connection. | 3804 // new connection. |
| 3937 EXPECT_EQ(OK, callback2.WaitForResult()); | 3805 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3938 EXPECT_FALSE(pool->IsStalled()); | 3806 EXPECT_FALSE(pool->IsStalled()); |
| 3939 } | 3807 } |
| 3940 | 3808 |
| 3941 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3809 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
| 3942 // pointers to the idle session are currently held, in the case the SPDY session | 3810 // pointers to the idle session are currently held, in the case the SPDY session |
| 3943 // has an alias. | 3811 // has an alias. |
| 3944 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { | 3812 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { |
| 3945 if (GetParam() > kProtoSPDY3) | |
| 3946 return; | |
| 3947 | |
| 3948 ClientSocketPoolManager::set_max_sockets_per_group( | 3813 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3949 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3814 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3950 ClientSocketPoolManager::set_max_sockets_per_pool( | 3815 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 3951 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3816 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3952 | 3817 |
| 3953 MockConnect connect_data(SYNCHRONOUS, OK); | 3818 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3954 MockRead reads[] = { | 3819 MockRead reads[] = { |
| 3955 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3820 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 3956 }; | 3821 }; |
| 3957 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 3822 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4022 | 3887 |
| 4023 // The socket pool should close the connection asynchronously and establish a | 3888 // The socket pool should close the connection asynchronously and establish a |
| 4024 // new connection. | 3889 // new connection. |
| 4025 EXPECT_EQ(OK, callback3.WaitForResult()); | 3890 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 4026 EXPECT_FALSE(pool->IsStalled()); | 3891 EXPECT_FALSE(pool->IsStalled()); |
| 4027 } | 3892 } |
| 4028 | 3893 |
| 4029 // Tests the case of a non-SPDY request closing an idle SPDY session when a | 3894 // Tests the case of a non-SPDY request closing an idle SPDY session when a |
| 4030 // pointer to the idle session is still held. | 3895 // pointer to the idle session is still held. |
| 4031 TEST_P(SpdySessionTest, CloseOneIdleConnectionSessionStillHeld) { | 3896 TEST_P(SpdySessionTest, CloseOneIdleConnectionSessionStillHeld) { |
| 4032 if (GetParam() > kProtoSPDY3) | |
| 4033 return; | |
| 4034 | |
| 4035 ClientSocketPoolManager::set_max_sockets_per_group( | 3897 ClientSocketPoolManager::set_max_sockets_per_group( |
| 4036 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3898 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 4037 ClientSocketPoolManager::set_max_sockets_per_pool( | 3899 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 4038 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3900 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 4039 | 3901 |
| 4040 MockConnect connect_data(SYNCHRONOUS, OK); | 3902 MockConnect connect_data(SYNCHRONOUS, OK); |
| 4041 MockRead reads[] = { | 3903 MockRead reads[] = { |
| 4042 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3904 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 4043 }; | 3905 }; |
| 4044 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 3906 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4084 | 3946 |
| 4085 // Release the pointer to the session so it can be closed. | 3947 // Release the pointer to the session so it can be closed. |
| 4086 session1 = NULL; | 3948 session1 = NULL; |
| 4087 EXPECT_EQ(OK, callback2.WaitForResult()); | 3949 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 4088 EXPECT_FALSE(pool->IsStalled()); | 3950 EXPECT_FALSE(pool->IsStalled()); |
| 4089 } | 3951 } |
| 4090 | 3952 |
| 4091 // Tests that a non-SPDY request can't close a SPDY session that's currently in | 3953 // Tests that a non-SPDY request can't close a SPDY session that's currently in |
| 4092 // use. | 3954 // use. |
| 4093 TEST_P(SpdySessionTest, CloseOneIdleConnectionFailsWhenSessionInUse) { | 3955 TEST_P(SpdySessionTest, CloseOneIdleConnectionFailsWhenSessionInUse) { |
| 4094 if (GetParam() > kProtoSPDY3) | |
| 4095 return; | |
| 4096 | |
| 4097 ClientSocketPoolManager::set_max_sockets_per_group( | 3956 ClientSocketPoolManager::set_max_sockets_per_group( |
| 4098 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3957 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 4099 ClientSocketPoolManager::set_max_sockets_per_pool( | 3958 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 4100 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3959 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 4101 | 3960 |
| 4102 MockConnect connect_data(SYNCHRONOUS, OK); | 3961 MockConnect connect_data(SYNCHRONOUS, OK); |
| 4103 MockRead reads[] = { | 3962 MockRead reads[] = { |
| 4104 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3963 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 4105 }; | 3964 }; |
| 4106 scoped_ptr<SpdyFrame> req1( | 3965 scoped_ptr<SpdyFrame> req1( |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4217 spdy_session_pool_->Remove(session_privacy_enabled); | 4076 spdy_session_pool_->Remove(session_privacy_enabled); |
| 4218 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_enabled)); | 4077 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_enabled)); |
| 4219 EXPECT_TRUE(spdy_session_pool_->HasSession(key_privacy_disabled)); | 4078 EXPECT_TRUE(spdy_session_pool_->HasSession(key_privacy_disabled)); |
| 4220 | 4079 |
| 4221 spdy_session_pool_->Remove(session_privacy_disabled); | 4080 spdy_session_pool_->Remove(session_privacy_disabled); |
| 4222 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_enabled)); | 4081 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_enabled)); |
| 4223 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_disabled)); | 4082 EXPECT_FALSE(spdy_session_pool_->HasSession(key_privacy_disabled)); |
| 4224 } | 4083 } |
| 4225 | 4084 |
| 4226 } // namespace net | 4085 } // namespace net |
| OLD | NEW |