SPDY flow control: enforce obeying send window size via a command-line switch, initial support for receive window size.

BUG=48100
TEST=net_unittestss --gtest_filter="SpdyProtocolTest.ControlFrameStructs:SpdyNetworkTransactionTest.WindowUpdate:SpdyNetworkTransactionTest.WindowUpdateOverflow"

Review URL: http://codereview.chromium.org/3052005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53297 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 7dbc12cd..2100e92 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -940,22 +940,24 @@
   helper.VerifyDataConsumed();
 }
 
-// Test that WINDOW_UPDATE frames change window_size correctly.
+// Test that sent data frames and received WINDOW_UPDATE frames change
+// the send_window_size_ correctly.
 TEST_F(SpdyNetworkTransactionTest, WindowUpdate) {
   SpdySessionDependencies session_deps;
   scoped_refptr<HttpNetworkSession> session =
       SpdySessionDependencies::SpdyCreateSession(&session_deps);
 
-  // We disable SSL for this test.
   SpdySession::SetSSLMode(false);
+  SpdySession::SetFlowControl(true);
 
   // Setup the request
-  static const char upload[] = { "hello!" };
+  static const char kUploadData[] = "hello!";
+  static const int kUploadDataSize = arraysize(kUploadData)-1;
   HttpRequestInfo request;
   request.method = "POST";
   request.url = GURL("http://www.google.com/");
   request.upload_data = new UploadData();
-  request.upload_data->AppendBytes(upload, strlen(upload));
+  request.upload_data->AppendBytes(kUploadData, kUploadDataSize);
 
   scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0));
   scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
@@ -989,7 +991,8 @@
 
   ASSERT_TRUE(trans->stream_ != NULL);
   ASSERT_TRUE(trans->stream_->stream() != NULL);
-  EXPECT_EQ(spdy::kInitialWindowSize, trans->stream_->stream()->window_size());
+  EXPECT_EQ(spdy::kInitialWindowSize,
+            trans->stream_->stream()->send_window_size());
 
   EXPECT_EQ(ERR_IO_PENDING, rv);
   rv = callback.WaitForResult();
@@ -997,10 +1000,12 @@
 
   ASSERT_TRUE(trans->stream_ != NULL);
   ASSERT_TRUE(trans->stream_->stream() != NULL);
-  EXPECT_EQ(spdy::kInitialWindowSize + kDeltaWindowSize,
-            trans->stream_->stream()->window_size());
+  EXPECT_EQ(spdy::kInitialWindowSize + kDeltaWindowSize - kUploadDataSize,
+            trans->stream_->stream()->send_window_size());
   EXPECT_TRUE(data->at_read_eof());
   EXPECT_TRUE(data->at_write_eof());
+
+  SpdySession::SetFlowControl(false);
 }
 
 // Test that WINDOW_UPDATE frame causing overflow is handled correctly.
@@ -1009,16 +1014,16 @@
   scoped_refptr<HttpNetworkSession> session =
       SpdySessionDependencies::SpdyCreateSession(&session_deps);
 
-  // We disable SSL for this test.
   SpdySession::SetSSLMode(false);
+  SpdySession::SetFlowControl(true);
 
   // Setup the request
-  static const char upload[] = { "hello!" };
+  static const char kUploadData[] = "hello!";
   HttpRequestInfo request;
   request.method = "POST";
   request.url = GURL("http://www.google.com/");
   request.upload_data = new UploadData();
-  request.upload_data->AppendBytes(upload, strlen(upload));
+  request.upload_data->AppendBytes(kUploadData, arraysize(kUploadData)-1);
 
   scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0));
   scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
@@ -1055,7 +1060,8 @@
 
   ASSERT_TRUE(trans->stream_ != NULL);
   ASSERT_TRUE(trans->stream_->stream() != NULL);
-  EXPECT_EQ(spdy::kInitialWindowSize, trans->stream_->stream()->window_size());
+  EXPECT_EQ(spdy::kInitialWindowSize,
+            trans->stream_->stream()->send_window_size());
 
   EXPECT_EQ(ERR_IO_PENDING, rv);
   rv = callback.WaitForResult();
@@ -1067,6 +1073,8 @@
 
   EXPECT_FALSE(data->at_read_eof());
   EXPECT_TRUE(data->at_write_eof());
+
+  SpdySession::SetFlowControl(false);
 }
 
 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) {