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

Unified Diff: net/spdy/spdy_session_spdy3_unittest.cc

Issue 14148007: [SPDY] Fix bug where a SPDY stream might not unstall properly in all cases (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_stream.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_session_spdy3_unittest.cc
diff --git a/net/spdy/spdy_session_spdy3_unittest.cc b/net/spdy/spdy_session_spdy3_unittest.cc
index 5d3fc19dad7a9e7614f891b80fb745f7de940af1..84193aef5f0ecb9597c1d1dc1ce9e117c914149a 100644
--- a/net/spdy/spdy_session_spdy3_unittest.cc
+++ b/net/spdy/spdy_session_spdy3_unittest.cc
@@ -4,6 +4,8 @@
#include "net/spdy/spdy_session.h"
+#include "base/bind.h"
+#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_endpoint.h"
@@ -44,6 +46,53 @@ base::TimeTicks TheNearFuture() {
} // namespace
class SpdySessionSpdy3Test : public PlatformTest {
+ public:
+ // Functions used with RunResumeAfterUnstallTest31().
+
+ void StallSessionOnly(SpdySession* session, SpdyStream* stream) {
+ StallSessionSend(session);
+ }
+
+ void StallStreamOnly(SpdySession* session, SpdyStream* stream) {
+ StallStreamSend(stream);
+ }
+
+ void StallSessionStream(SpdySession* session, SpdyStream* stream) {
+ StallSessionSend(session);
+ StallStreamSend(stream);
+ }
+
+ void StallStreamSession(SpdySession* session, SpdyStream* stream) {
+ StallStreamSend(stream);
+ StallSessionSend(session);
+ }
+
+ void UnstallSessionOnly(SpdySession* session,
+ SpdyStream* stream,
+ int32 delta_window_size) {
+ UnstallSessionSend(session, delta_window_size);
+ }
+
+ void UnstallStreamOnly(SpdySession* session,
+ SpdyStream* stream,
+ int32 delta_window_size) {
+ UnstallStreamSend(stream, delta_window_size);
+ }
+
+ void UnstallSessionStream(SpdySession* session,
+ SpdyStream* stream,
+ int32 delta_window_size) {
+ UnstallSessionSend(session, delta_window_size);
+ UnstallStreamSend(stream, delta_window_size);
+ }
+
+ void UnstallStreamSession(SpdySession* session,
+ SpdyStream* stream,
+ int32 delta_window_size) {
+ UnstallStreamSend(stream, delta_window_size);
+ UnstallSessionSend(session, delta_window_size);
+ }
+
protected:
SpdySessionSpdy3Test()
: spdy_session_pool_(NULL),
@@ -114,6 +163,22 @@ class SpdySessionSpdy3Test : public PlatformTest {
session->IncreaseSendWindowSize(delta_window_size);
}
+ void StallStreamSend(SpdyStream* stream) {
+ // Reduce the send window size to 0 to stall.
+ while (stream->send_window_size() > 0) {
+ stream->DecreaseSendWindowSize(
+ std::min(kMaxSpdyFrameChunkSize, stream->send_window_size()));
+ }
+ }
+
+ void UnstallStreamSend(SpdyStream* stream, int32 delta_window_size) {
+ stream->IncreaseSendWindowSize(delta_window_size);
+ }
+
+ void RunResumeAfterUnstallTest31(
+ const base::Callback<void(SpdySession*, SpdyStream*)>& stall_fn,
+ const base::Callback<void(SpdySession*, SpdyStream*, int32)>& unstall_fn);
+
scoped_refptr<TransportSocketParams> transport_params_;
SpdySessionDependencies session_deps_;
scoped_refptr<HttpNetworkSession> http_session_;
@@ -2601,9 +2666,11 @@ TEST_F(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31) {
EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_);
}
-// Cause a stall by reducing the flow control send window to 0. The
-// stream should resume when that window is then increased.
-TEST_F(SpdySessionSpdy3Test, ResumeAfterSendWindowSizeIncrease31) {
+// Given a stall function and an unstall function, runs a test to make
+// sure that a stream resumes after unstall.
+void SpdySessionSpdy3Test::RunResumeAfterUnstallTest31(
+ const base::Callback<void(SpdySession*, SpdyStream*)>& stall_fn,
+ const base::Callback<void(SpdySession*, SpdyStream*, int32)>& unstall_fn) {
const char kStreamUrl[] = "http://www.google.com/";
GURL url(kStreamUrl);
@@ -2667,13 +2734,13 @@ TEST_F(SpdySessionSpdy3Test, ResumeAfterSendWindowSizeIncrease31) {
EXPECT_FALSE(stream->send_stalled_by_flow_control());
- StallSessionSend(session);
+ stall_fn.Run(session, stream);
EXPECT_EQ(ERR_IO_PENDING, delegate.OnSendBody());
EXPECT_TRUE(stream->send_stalled_by_flow_control());
- UnstallSessionSend(session, kBodyDataSize);
+ unstall_fn.Run(session, stream, kBodyDataSize);
EXPECT_FALSE(stream->send_stalled_by_flow_control());
@@ -2688,6 +2755,63 @@ TEST_F(SpdySessionSpdy3Test, ResumeAfterSendWindowSizeIncrease31) {
EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent());
}
+// Run the resume-after-unstall test with all possible stall and
+// unstall sequences.
+
+TEST_F(SpdySessionSpdy3Test, ResumeAfterUnstallSession31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallSessionOnly,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallSessionOnly,
+ base::Unretained(this)));
+}
+
+// Equivalent to
+// SpdyStreamSpdy3Test.ResumeAfterSendWindowSizeIncrease.
+TEST_F(SpdySessionSpdy3Test, ResumeAfterUnstallStream31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallStreamOnly,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallStreamOnly,
+ base::Unretained(this)));
+}
+
+TEST_F(SpdySessionSpdy3Test,
+ StallSessionStreamResumeAfterUnstallSessionStream31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallSessionStream,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallSessionStream,
+ base::Unretained(this)));
+}
+
+TEST_F(SpdySessionSpdy3Test,
+ StallStreamSessionResumeAfterUnstallSessionStream31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallStreamSession,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallSessionStream,
+ base::Unretained(this)));
+}
+
+TEST_F(SpdySessionSpdy3Test,
+ StallStreamSessionResumeAfterUnstallStreamSession31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallStreamSession,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallStreamSession,
+ base::Unretained(this)));
+}
+
+TEST_F(SpdySessionSpdy3Test,
+ StallSessionStreamResumeAfterUnstallStreamSession31) {
+ RunResumeAfterUnstallTest31(
+ base::Bind(&SpdySessionSpdy3Test::StallSessionStream,
+ base::Unretained(this)),
+ base::Bind(&SpdySessionSpdy3Test::UnstallStreamSession,
+ base::Unretained(this)));
+}
+
// Cause a stall by reducing the flow control send window to 0. The
// streams should resume in priority order when that window is then
// increased.
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698