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 |