| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 // Verify that there is one unclaimed push stream. | 1228 // Verify that there is one unclaimed push stream. |
| 1229 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); | 1229 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); |
| 1230 SpdySession::PushedStreamMap::iterator iter = | 1230 SpdySession::PushedStreamMap::iterator iter = |
| 1231 session->unclaimed_pushed_streams_.find( | 1231 session->unclaimed_pushed_streams_.find( |
| 1232 GURL("http://www.google.com/a.dat")); | 1232 GURL("http://www.google.com/a.dat")); |
| 1233 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); | 1233 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); |
| 1234 | 1234 |
| 1235 if (session->flow_control_state_ == | 1235 if (session->flow_control_state_ == |
| 1236 SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) { | 1236 SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) { |
| 1237 // Unclaimed push body consumed bytes from the session window. | 1237 // Unclaimed push body consumed bytes from the session window. |
| 1238 EXPECT_EQ(kSpdySessionInitialWindowSize - kUploadDataSize, | 1238 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()) - kUploadDataSize, |
| 1239 session->session_recv_window_size_); | 1239 session->session_recv_window_size_); |
| 1240 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 1240 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 1241 } | 1241 } |
| 1242 | 1242 |
| 1243 // Shift time to expire the push stream. Read the second SYN_STREAM, | 1243 // Shift time to expire the push stream. Read the second SYN_STREAM, |
| 1244 // and verify a RST_STREAM was written. | 1244 // and verify a RST_STREAM was written. |
| 1245 g_time_delta = base::TimeDelta::FromSeconds(301); | 1245 g_time_delta = base::TimeDelta::FromSeconds(301); |
| 1246 data.RunFor(2); | 1246 data.RunFor(2); |
| 1247 | 1247 |
| 1248 // Verify that the second pushed stream evicted the first pushed stream. | 1248 // Verify that the second pushed stream evicted the first pushed stream. |
| 1249 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); | 1249 EXPECT_EQ(1u, session->num_unclaimed_pushed_streams()); |
| 1250 iter = session->unclaimed_pushed_streams_.find( | 1250 iter = session->unclaimed_pushed_streams_.find( |
| 1251 GURL("http://www.google.com/b.dat")); | 1251 GURL("http://www.google.com/b.dat")); |
| 1252 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); | 1252 EXPECT_TRUE(session->unclaimed_pushed_streams_.end() != iter); |
| 1253 | 1253 |
| 1254 if (session->flow_control_state_ == | 1254 if (session->flow_control_state_ == |
| 1255 SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) { | 1255 SpdySession::FLOW_CONTROL_STREAM_AND_SESSION) { |
| 1256 // Verify that the session window reclaimed the evicted stream body. | 1256 // Verify that the session window reclaimed the evicted stream body. |
| 1257 EXPECT_EQ(kSpdySessionInitialWindowSize, | 1257 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
| 1258 session->session_recv_window_size_); | 1258 session->session_recv_window_size_); |
| 1259 EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_); | 1259 EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_); |
| 1260 } | 1260 } |
| 1261 | 1261 |
| 1262 // Read and process EOF. | 1262 // Read and process EOF. |
| 1263 data.RunFor(1); | 1263 data.RunFor(1); |
| 1264 base::MessageLoop::current()->RunUntilIdle(); | 1264 base::MessageLoop::current()->RunUntilIdle(); |
| 1265 EXPECT_TRUE(session == NULL); | 1265 EXPECT_TRUE(session == NULL); |
| 1266 } | 1266 } |
| 1267 | 1267 |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1546 if (spdy_util_.spdy_version() >= SPDY3) { | 1546 if (spdy_util_.spdy_version() >= SPDY3) { |
| 1547 settings[kSpdySettingsIds2] = | 1547 settings[kSpdySettingsIds2] = |
| 1548 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); | 1548 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); |
| 1549 } | 1549 } |
| 1550 MockConnect connect_data(SYNCHRONOUS, OK); | 1550 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1551 scoped_ptr<SpdyFrame> settings_frame( | 1551 scoped_ptr<SpdyFrame> settings_frame( |
| 1552 spdy_util_.ConstructSpdySettings(settings)); | 1552 spdy_util_.ConstructSpdySettings(settings)); |
| 1553 scoped_ptr<SpdyFrame> initial_window_update( | 1553 scoped_ptr<SpdyFrame> initial_window_update( |
| 1554 spdy_util_.ConstructSpdyWindowUpdate( | 1554 spdy_util_.ConstructSpdyWindowUpdate( |
| 1555 kSessionFlowControlStreamId, | 1555 kSessionFlowControlStreamId, |
| 1556 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | 1556 kDefaultInitialRecvWindowSize - |
| 1557 SpdySession::GetInitialWindowSize(GetParam()))); |
| 1557 std::vector<MockWrite> writes; | 1558 std::vector<MockWrite> writes; |
| 1558 if ((GetParam() >= kProtoSPDY4MinimumVersion) && | 1559 if ((GetParam() >= kProtoSPDY4MinimumVersion) && |
| 1559 (GetParam() <= kProtoSPDY4MaximumVersion)) { | 1560 (GetParam() <= kProtoSPDY4MaximumVersion)) { |
| 1560 writes.push_back( | 1561 writes.push_back( |
| 1561 MockWrite(ASYNC, | 1562 MockWrite(ASYNC, |
| 1562 kHttp2ConnectionHeaderPrefix, | 1563 kHttp2ConnectionHeaderPrefix, |
| 1563 kHttp2ConnectionHeaderPrefixSize)); | 1564 kHttp2ConnectionHeaderPrefixSize)); |
| 1564 } | 1565 } |
| 1565 writes.push_back(CreateMockWrite(*settings_frame)); | 1566 writes.push_back(CreateMockWrite(*settings_frame)); |
| 1566 if (GetParam() >= kProtoSPDY31) { | 1567 if (GetParam() >= kProtoSPDY31) { |
| (...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3074 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3075 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3075 | 3076 |
| 3076 CreateNetworkSession(); | 3077 CreateNetworkSession(); |
| 3077 base::WeakPtr<SpdySession> session = | 3078 base::WeakPtr<SpdySession> session = |
| 3078 CreateFakeSpdySession(spdy_session_pool_, key_); | 3079 CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3079 | 3080 |
| 3080 EXPECT_EQ(spdy_util_.spdy_version(), | 3081 EXPECT_EQ(spdy_util_.spdy_version(), |
| 3081 session->buffered_spdy_framer_->protocol_version()); | 3082 session->buffered_spdy_framer_->protocol_version()); |
| 3082 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3083 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 3083 session->flow_control_state()); | 3084 session->flow_control_state()); |
| 3084 EXPECT_EQ(kSpdySessionInitialWindowSize, | 3085 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
| 3085 session->session_send_window_size_); | 3086 session->session_send_window_size_); |
| 3086 EXPECT_EQ(kSpdySessionInitialWindowSize, | 3087 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
| 3087 session->session_recv_window_size_); | 3088 session->session_recv_window_size_); |
| 3088 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3089 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3089 } | 3090 } |
| 3090 | 3091 |
| 3091 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3092 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
| 3092 // pointers to the idle session are currently held. | 3093 // pointers to the idle session are currently held. |
| 3093 TEST_P(SpdySessionTest, CloseOneIdleConnection) { | 3094 TEST_P(SpdySessionTest, CloseOneIdleConnection) { |
| 3094 ClientSocketPoolManager::set_max_sockets_per_group( | 3095 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3095 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3096 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3096 ClientSocketPoolManager::set_max_sockets_per_pool( | 3097 ClientSocketPoolManager::set_max_sockets_per_pool( |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3503 // SpdySession::{Increase,Decrease}RecvWindowSize should properly | 3504 // SpdySession::{Increase,Decrease}RecvWindowSize should properly |
| 3504 // adjust the session receive window size for SPDY 3.1 and higher. In | 3505 // adjust the session receive window size for SPDY 3.1 and higher. In |
| 3505 // addition, SpdySession::IncreaseRecvWindowSize should trigger | 3506 // addition, SpdySession::IncreaseRecvWindowSize should trigger |
| 3506 // sending a WINDOW_UPDATE frame for a large enough delta. | 3507 // sending a WINDOW_UPDATE frame for a large enough delta. |
| 3507 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 3508 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
| 3508 if (GetParam() < kProtoSPDY31) | 3509 if (GetParam() < kProtoSPDY31) |
| 3509 return; | 3510 return; |
| 3510 | 3511 |
| 3511 session_deps_.host_resolver->set_synchronous_mode(true); | 3512 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3512 | 3513 |
| 3514 const int32 initial_window_size = |
| 3515 SpdySession::GetInitialWindowSize(GetParam()); |
| 3513 const int32 delta_window_size = 100; | 3516 const int32 delta_window_size = 100; |
| 3514 | 3517 |
| 3515 MockConnect connect_data(SYNCHRONOUS, OK); | 3518 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3516 MockRead reads[] = { | 3519 MockRead reads[] = { |
| 3517 MockRead(ASYNC, 0, 1) // EOF | 3520 MockRead(ASYNC, 0, 1) // EOF |
| 3518 }; | 3521 }; |
| 3519 scoped_ptr<SpdyFrame> window_update( | 3522 scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( |
| 3520 spdy_util_.ConstructSpdyWindowUpdate( | 3523 kSessionFlowControlStreamId, initial_window_size + delta_window_size)); |
| 3521 kSessionFlowControlStreamId, | |
| 3522 kSpdySessionInitialWindowSize + delta_window_size)); | |
| 3523 MockWrite writes[] = { | 3524 MockWrite writes[] = { |
| 3524 CreateMockWrite(*window_update, 0), | 3525 CreateMockWrite(*window_update, 0), |
| 3525 }; | 3526 }; |
| 3526 DeterministicSocketData data(reads, arraysize(reads), | 3527 DeterministicSocketData data(reads, arraysize(reads), |
| 3527 writes, arraysize(writes)); | 3528 writes, arraysize(writes)); |
| 3528 data.set_connect_data(connect_data); | 3529 data.set_connect_data(connect_data); |
| 3529 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3530 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3530 | 3531 |
| 3531 CreateDeterministicNetworkSession(); | 3532 CreateDeterministicNetworkSession(); |
| 3532 base::WeakPtr<SpdySession> session = | 3533 base::WeakPtr<SpdySession> session = |
| 3533 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3534 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
| 3534 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3535 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 3535 session->flow_control_state()); | 3536 session->flow_control_state()); |
| 3536 | 3537 |
| 3537 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3538 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3538 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3539 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3539 | 3540 |
| 3540 session->IncreaseRecvWindowSize(delta_window_size); | 3541 session->IncreaseRecvWindowSize(delta_window_size); |
| 3541 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size, | 3542 EXPECT_EQ(initial_window_size + delta_window_size, |
| 3542 session->session_recv_window_size_); | 3543 session->session_recv_window_size_); |
| 3543 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); | 3544 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); |
| 3544 | 3545 |
| 3545 // Should trigger sending a WINDOW_UPDATE frame. | 3546 // Should trigger sending a WINDOW_UPDATE frame. |
| 3546 session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize); | 3547 session->IncreaseRecvWindowSize(initial_window_size); |
| 3547 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size + | 3548 EXPECT_EQ(initial_window_size + delta_window_size + initial_window_size, |
| 3548 kSpdySessionInitialWindowSize, | |
| 3549 session->session_recv_window_size_); | 3549 session->session_recv_window_size_); |
| 3550 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3550 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3551 | 3551 |
| 3552 data.RunFor(1); | 3552 data.RunFor(1); |
| 3553 | 3553 |
| 3554 // DecreaseRecvWindowSize() expects |in_io_loop_| to be true. | 3554 // DecreaseRecvWindowSize() expects |in_io_loop_| to be true. |
| 3555 session->in_io_loop_ = true; | 3555 session->in_io_loop_ = true; |
| 3556 session->DecreaseRecvWindowSize( | 3556 session->DecreaseRecvWindowSize(initial_window_size + delta_window_size + |
| 3557 kSpdySessionInitialWindowSize + delta_window_size + | 3557 initial_window_size); |
| 3558 kSpdySessionInitialWindowSize); | |
| 3559 session->in_io_loop_ = false; | 3558 session->in_io_loop_ = false; |
| 3560 EXPECT_EQ(0, session->session_recv_window_size_); | 3559 EXPECT_EQ(0, session->session_recv_window_size_); |
| 3561 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3560 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3562 } | 3561 } |
| 3563 | 3562 |
| 3564 // SpdySession::{Increase,Decrease}SendWindowSize should properly | 3563 // SpdySession::{Increase,Decrease}SendWindowSize should properly |
| 3565 // adjust the session send window size when the "enable_spdy_31" flag | 3564 // adjust the session send window size when the "enable_spdy_31" flag |
| 3566 // is set. | 3565 // is set. |
| 3567 TEST_P(SpdySessionTest, AdjustSendWindowSize) { | 3566 TEST_P(SpdySessionTest, AdjustSendWindowSize) { |
| 3568 if (GetParam() < kProtoSPDY31) | 3567 if (GetParam() < kProtoSPDY31) |
| 3569 return; | 3568 return; |
| 3570 | 3569 |
| 3571 session_deps_.host_resolver->set_synchronous_mode(true); | 3570 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3572 | 3571 |
| 3573 MockConnect connect_data(SYNCHRONOUS, OK); | 3572 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3574 MockRead reads[] = { | 3573 MockRead reads[] = { |
| 3575 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3574 MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 3576 }; | 3575 }; |
| 3577 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 3576 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
| 3578 data.set_connect_data(connect_data); | 3577 data.set_connect_data(connect_data); |
| 3579 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3578 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3580 | 3579 |
| 3581 CreateNetworkSession(); | 3580 CreateNetworkSession(); |
| 3582 base::WeakPtr<SpdySession> session = | 3581 base::WeakPtr<SpdySession> session = |
| 3583 CreateFakeSpdySession(spdy_session_pool_, key_); | 3582 CreateFakeSpdySession(spdy_session_pool_, key_); |
| 3584 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3583 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 3585 session->flow_control_state()); | 3584 session->flow_control_state()); |
| 3586 | 3585 |
| 3586 const int32 initial_window_size = |
| 3587 SpdySession::GetInitialWindowSize(GetParam()); |
| 3587 const int32 delta_window_size = 100; | 3588 const int32 delta_window_size = 100; |
| 3588 | 3589 |
| 3589 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3590 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3590 | 3591 |
| 3591 session->IncreaseSendWindowSize(delta_window_size); | 3592 session->IncreaseSendWindowSize(delta_window_size); |
| 3592 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size, | 3593 EXPECT_EQ(initial_window_size + delta_window_size, |
| 3593 session->session_send_window_size_); | 3594 session->session_send_window_size_); |
| 3594 | 3595 |
| 3595 session->DecreaseSendWindowSize(delta_window_size); | 3596 session->DecreaseSendWindowSize(delta_window_size); |
| 3596 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3597 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3597 } | 3598 } |
| 3598 | 3599 |
| 3599 // Incoming data for an inactive stream should not cause the session | 3600 // Incoming data for an inactive stream should not cause the session |
| 3600 // receive window size to decrease, but it should cause the unacked | 3601 // receive window size to decrease, but it should cause the unacked |
| 3601 // bytes to increase. | 3602 // bytes to increase. |
| 3602 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { | 3603 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { |
| 3603 if (GetParam() < kProtoSPDY31) | 3604 if (GetParam() < kProtoSPDY31) |
| 3604 return; | 3605 return; |
| 3605 | 3606 |
| 3606 session_deps_.host_resolver->set_synchronous_mode(true); | 3607 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3607 | 3608 |
| 3608 MockConnect connect_data(SYNCHRONOUS, OK); | 3609 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3609 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); | 3610 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); |
| 3610 MockRead reads[] = { | 3611 MockRead reads[] = { |
| 3611 CreateMockRead(*resp, 0), | 3612 CreateMockRead(*resp, 0), |
| 3612 MockRead(ASYNC, 0, 1) // EOF | 3613 MockRead(ASYNC, 0, 1) // EOF |
| 3613 }; | 3614 }; |
| 3614 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 3615 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
| 3615 data.set_connect_data(connect_data); | 3616 data.set_connect_data(connect_data); |
| 3616 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3617 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3617 | 3618 |
| 3618 CreateDeterministicNetworkSession(); | 3619 CreateDeterministicNetworkSession(); |
| 3619 base::WeakPtr<SpdySession> session = | 3620 base::WeakPtr<SpdySession> session = |
| 3620 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3621 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
| 3621 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3622 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 3622 session->flow_control_state()); | 3623 session->flow_control_state()); |
| 3623 | 3624 |
| 3624 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3625 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
| 3626 session->session_recv_window_size_); |
| 3625 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3627 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3626 | 3628 |
| 3627 data.RunFor(1); | 3629 data.RunFor(1); |
| 3628 | 3630 |
| 3629 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3631 EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
| 3632 session->session_recv_window_size_); |
| 3630 EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_); | 3633 EXPECT_EQ(kUploadDataSize, session->session_unacked_recv_window_bytes_); |
| 3631 | 3634 |
| 3632 data.RunFor(1); | 3635 data.RunFor(1); |
| 3633 } | 3636 } |
| 3634 | 3637 |
| 3635 // A delegate that drops any received data. | 3638 // A delegate that drops any received data. |
| 3636 class DropReceivedDataDelegate : public test::StreamDelegateSendImmediate { | 3639 class DropReceivedDataDelegate : public test::StreamDelegateSendImmediate { |
| 3637 public: | 3640 public: |
| 3638 DropReceivedDataDelegate(const base::WeakPtr<SpdyStream>& stream, | 3641 DropReceivedDataDelegate(const base::WeakPtr<SpdyStream>& stream, |
| 3639 base::StringPiece data) | 3642 base::StringPiece data) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3704 | 3707 |
| 3705 DropReceivedDataDelegate delegate(stream, msg_data); | 3708 DropReceivedDataDelegate delegate(stream, msg_data); |
| 3706 stream->SetDelegate(&delegate); | 3709 stream->SetDelegate(&delegate); |
| 3707 | 3710 |
| 3708 scoped_ptr<SpdyHeaderBlock> headers( | 3711 scoped_ptr<SpdyHeaderBlock> headers( |
| 3709 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3712 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3710 EXPECT_EQ(ERR_IO_PENDING, | 3713 EXPECT_EQ(ERR_IO_PENDING, |
| 3711 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3714 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3712 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3715 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 3713 | 3716 |
| 3714 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3717 const int32 initial_window_size = |
| 3718 SpdySession::GetInitialWindowSize(GetParam()); |
| 3719 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3715 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3720 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3716 | 3721 |
| 3717 data.RunFor(4); | 3722 data.RunFor(4); |
| 3718 | 3723 |
| 3719 EXPECT_TRUE(data.at_write_eof()); | 3724 EXPECT_TRUE(data.at_write_eof()); |
| 3720 EXPECT_TRUE(data.at_read_eof()); | 3725 EXPECT_TRUE(data.at_read_eof()); |
| 3721 | 3726 |
| 3722 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3727 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3723 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3728 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3724 | 3729 |
| 3725 stream->Close(); | 3730 stream->Close(); |
| 3726 EXPECT_EQ(NULL, stream.get()); | 3731 EXPECT_EQ(NULL, stream.get()); |
| 3727 | 3732 |
| 3728 EXPECT_EQ(OK, delegate.WaitForClose()); | 3733 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 3729 | 3734 |
| 3730 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3735 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3731 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3736 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3732 } | 3737 } |
| 3733 | 3738 |
| 3734 // Send data back and forth but close the stream before its data frame | 3739 // Send data back and forth but close the stream before its data frame |
| 3735 // can be written to the socket. The send window should then increase | 3740 // can be written to the socket. The send window should then increase |
| 3736 // to its original value, i.e. we shouldn't "leak" send window bytes. | 3741 // to its original value, i.e. we shouldn't "leak" send window bytes. |
| 3737 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { | 3742 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { |
| 3738 if (GetParam() < kProtoSPDY31) | 3743 if (GetParam() < kProtoSPDY31) |
| 3739 return; | 3744 return; |
| 3740 | 3745 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3779 | 3784 |
| 3780 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3785 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 3781 stream->SetDelegate(&delegate); | 3786 stream->SetDelegate(&delegate); |
| 3782 | 3787 |
| 3783 scoped_ptr<SpdyHeaderBlock> headers( | 3788 scoped_ptr<SpdyHeaderBlock> headers( |
| 3784 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3789 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3785 EXPECT_EQ(ERR_IO_PENDING, | 3790 EXPECT_EQ(ERR_IO_PENDING, |
| 3786 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3791 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3787 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3792 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 3788 | 3793 |
| 3789 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3794 const int32 initial_window_size = |
| 3795 SpdySession::GetInitialWindowSize(GetParam()); |
| 3796 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3790 | 3797 |
| 3791 data.RunFor(1); | 3798 data.RunFor(1); |
| 3792 | 3799 |
| 3793 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3800 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3794 | 3801 |
| 3795 data.RunFor(1); | 3802 data.RunFor(1); |
| 3796 | 3803 |
| 3797 EXPECT_TRUE(data.at_write_eof()); | 3804 EXPECT_TRUE(data.at_write_eof()); |
| 3798 EXPECT_TRUE(data.at_read_eof()); | 3805 EXPECT_TRUE(data.at_read_eof()); |
| 3799 | 3806 |
| 3800 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3807 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3801 session->session_send_window_size_); | 3808 session->session_send_window_size_); |
| 3802 | 3809 |
| 3803 // Closing the stream should increase the session's send window. | 3810 // Closing the stream should increase the session's send window. |
| 3804 stream->Close(); | 3811 stream->Close(); |
| 3805 EXPECT_EQ(NULL, stream.get()); | 3812 EXPECT_EQ(NULL, stream.get()); |
| 3806 | 3813 |
| 3807 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3814 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3808 | 3815 |
| 3809 EXPECT_EQ(OK, delegate.WaitForClose()); | 3816 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 3810 } | 3817 } |
| 3811 | 3818 |
| 3812 // Send data back and forth; the send and receive windows should | 3819 // Send data back and forth; the send and receive windows should |
| 3813 // change appropriately. | 3820 // change appropriately. |
| 3814 TEST_P(SpdySessionTest, SessionFlowControlEndToEnd) { | 3821 TEST_P(SpdySessionTest, SessionFlowControlEndToEnd) { |
| 3815 if (GetParam() < kProtoSPDY31) | 3822 if (GetParam() < kProtoSPDY31) |
| 3816 return; | 3823 return; |
| 3817 | 3824 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3868 | 3875 |
| 3869 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3876 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
| 3870 stream->SetDelegate(&delegate); | 3877 stream->SetDelegate(&delegate); |
| 3871 | 3878 |
| 3872 scoped_ptr<SpdyHeaderBlock> headers( | 3879 scoped_ptr<SpdyHeaderBlock> headers( |
| 3873 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3880 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 3874 EXPECT_EQ(ERR_IO_PENDING, | 3881 EXPECT_EQ(ERR_IO_PENDING, |
| 3875 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3882 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 3876 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 3883 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
| 3877 | 3884 |
| 3878 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3885 const int32 initial_window_size = |
| 3879 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3886 SpdySession::GetInitialWindowSize(GetParam()); |
| 3887 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3888 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3880 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3889 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3881 | 3890 |
| 3882 data.RunFor(1); | 3891 data.RunFor(1); |
| 3883 | 3892 |
| 3884 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3893 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3885 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3894 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3886 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3895 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3887 | 3896 |
| 3888 data.RunFor(1); | 3897 data.RunFor(1); |
| 3889 | 3898 |
| 3890 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3899 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3891 session->session_send_window_size_); | 3900 session->session_send_window_size_); |
| 3892 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3901 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3893 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3902 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3894 | 3903 |
| 3895 data.RunFor(1); | 3904 data.RunFor(1); |
| 3896 | 3905 |
| 3897 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3906 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3898 session->session_send_window_size_); | 3907 session->session_send_window_size_); |
| 3899 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3908 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3900 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3909 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3901 | 3910 |
| 3902 data.RunFor(1); | 3911 data.RunFor(1); |
| 3903 | 3912 |
| 3904 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3913 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3905 session->session_send_window_size_); | 3914 session->session_send_window_size_); |
| 3906 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3915 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3907 session->session_recv_window_size_); | 3916 session->session_recv_window_size_); |
| 3908 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3917 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3909 | 3918 |
| 3910 data.RunFor(1); | 3919 data.RunFor(1); |
| 3911 | 3920 |
| 3912 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3921 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3913 EXPECT_EQ(kSpdySessionInitialWindowSize - msg_data_size, | 3922 EXPECT_EQ(initial_window_size - msg_data_size, |
| 3914 session->session_recv_window_size_); | 3923 session->session_recv_window_size_); |
| 3915 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3924 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 3916 | 3925 |
| 3917 EXPECT_TRUE(data.at_write_eof()); | 3926 EXPECT_TRUE(data.at_write_eof()); |
| 3918 EXPECT_TRUE(data.at_read_eof()); | 3927 EXPECT_TRUE(data.at_read_eof()); |
| 3919 | 3928 |
| 3920 EXPECT_EQ(msg_data, delegate.TakeReceivedData()); | 3929 EXPECT_EQ(msg_data, delegate.TakeReceivedData()); |
| 3921 | 3930 |
| 3922 // Draining the delegate's read queue should increase the session's | 3931 // Draining the delegate's read queue should increase the session's |
| 3923 // receive window. | 3932 // receive window. |
| 3924 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3933 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3925 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3934 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3926 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3935 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3927 | 3936 |
| 3928 stream->Close(); | 3937 stream->Close(); |
| 3929 EXPECT_EQ(NULL, stream.get()); | 3938 EXPECT_EQ(NULL, stream.get()); |
| 3930 | 3939 |
| 3931 EXPECT_EQ(OK, delegate.WaitForClose()); | 3940 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 3932 | 3941 |
| 3933 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 3942 EXPECT_EQ(initial_window_size, session->session_send_window_size_); |
| 3934 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3943 EXPECT_EQ(initial_window_size, session->session_recv_window_size_); |
| 3935 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 3944 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 3936 } | 3945 } |
| 3937 | 3946 |
| 3938 // Given a stall function and an unstall function, runs a test to make | 3947 // Given a stall function and an unstall function, runs a test to make |
| 3939 // sure that a stream resumes after unstall. | 3948 // sure that a stream resumes after unstall. |
| 3940 void SpdySessionTest::RunResumeAfterUnstallTest( | 3949 void SpdySessionTest::RunResumeAfterUnstallTest( |
| 3941 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_function, | 3950 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_function, |
| 3942 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& | 3951 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& |
| 3943 unstall_function) { | 3952 unstall_function) { |
| 3944 const char kStreamUrl[] = "http://www.google.com/"; | 3953 const char kStreamUrl[] = "http://www.google.com/"; |
| (...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5120 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5129 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
| 5121 "spdy_pooling.pem"); | 5130 "spdy_pooling.pem"); |
| 5122 ssl_info.is_issued_by_known_root = true; | 5131 ssl_info.is_issued_by_known_root = true; |
| 5123 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5132 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
| 5124 | 5133 |
| 5125 EXPECT_TRUE(SpdySession::CanPool( | 5134 EXPECT_TRUE(SpdySession::CanPool( |
| 5126 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5135 &tss, ssl_info, "www.example.org", "mail.example.org")); |
| 5127 } | 5136 } |
| 5128 | 5137 |
| 5129 } // namespace net | 5138 } // namespace net |
| OLD | NEW |