Index: net/spdy/spdy_session_unittest.cc |
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc |
index ba3cb611ac849157ca10ea0a9d55b01820ad6239..15d41fec34fd00cd5baa5baaf6cb3c0ed5693be4 100644 |
--- a/net/spdy/spdy_session_unittest.cc |
+++ b/net/spdy/spdy_session_unittest.cc |
@@ -3633,6 +3633,46 @@ TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { |
data.RunFor(1); |
} |
+// The frame header is not included in flow control, but frame payload |
+// (including optional pad length and padding) is. |
+TEST_P(SpdySessionTest, SessionFlowControlPadding) { |
+ // Padding only exists in HTTP/2. |
+ if (GetParam() < kProtoSPDY4MinimumVersion) |
+ return; |
+ |
+ session_deps_.host_resolver->set_synchronous_mode(true); |
+ |
+ const int padding_length = 42; |
+ MockConnect connect_data(SYNCHRONOUS, OK); |
+ scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame( |
+ 1, kUploadData, kUploadDataSize, false, padding_length)); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 0), MockRead(ASYNC, 0, 1) // EOF |
+ }; |
+ DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
+ data.set_connect_data(connect_data); |
+ session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
+ |
+ CreateDeterministicNetworkSession(); |
+ base::WeakPtr<SpdySession> session = |
+ CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
+ EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
+ session->flow_control_state()); |
+ |
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
+ session->session_recv_window_size_); |
+ EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
+ |
+ data.RunFor(1); |
+ |
+ EXPECT_EQ(SpdySession::GetInitialWindowSize(GetParam()), |
+ session->session_recv_window_size_); |
+ EXPECT_EQ(kUploadDataSize + padding_length, |
+ session->session_unacked_recv_window_bytes_); |
+ |
+ data.RunFor(1); |
+} |
+ |
// A delegate that drops any received data. |
class DropReceivedDataDelegate : public test::StreamDelegateSendImmediate { |
public: |