Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: net/spdy/spdy_session_unittest.cc

Issue 17760008: [SPDY] Enable tests for SPDY/3.1 and SPDY/4 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_stream_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698