| Index: net/spdy/spdy_stream_spdy3_unittest.cc
 | 
| diff --git a/net/spdy/spdy_stream_spdy3_unittest.cc b/net/spdy/spdy_stream_spdy3_unittest.cc
 | 
| index b08dcd103b099e2deb514f07c880aa118e1c6518..db8f612e8b5de35c8f0afff40e476072a33ea1cc 100644
 | 
| --- a/net/spdy/spdy_stream_spdy3_unittest.cc
 | 
| +++ b/net/spdy/spdy_stream_spdy3_unittest.cc
 | 
| @@ -150,7 +150,7 @@ TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) {
 | 
|    EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
|    EXPECT_EQ(std::string(kPostBody, kPostBodyLength),
 | 
|              delegate.TakeReceivedData());
 | 
| -  EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) {
 | 
| @@ -226,9 +226,8 @@ TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) {
 | 
|  
 | 
|    EXPECT_TRUE(delegate.send_headers_completed());
 | 
|    EXPECT_EQ("101", delegate.GetResponseHeaderValue(":status"));
 | 
| -  EXPECT_EQ(1, delegate.headers_sent());
 | 
|    EXPECT_EQ(std::string(), delegate.TakeReceivedData());
 | 
| -  EXPECT_EQ(6, delegate.data_sent());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SpdyStreamSpdy3Test, PushedStream) {
 | 
| @@ -347,7 +346,7 @@ TEST_F(SpdyStreamSpdy3Test, StreamError) {
 | 
|    EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
|    EXPECT_EQ(std::string(kPostBody, kPostBodyLength),
 | 
|              delegate.TakeReceivedData());
 | 
| -  EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
|  
 | 
|    // Check that the NetLog was filled reasonably.
 | 
|    net::CapturingNetLog::CapturedEntryList entries;
 | 
| @@ -365,6 +364,133 @@ TEST_F(SpdyStreamSpdy3Test, StreamError) {
 | 
|    EXPECT_EQ(static_cast<int>(stream_id), stream_id2);
 | 
|  }
 | 
|  
 | 
| +// Make sure that large blocks of data are properly split up into
 | 
| +// frame-sized chunks for a request/response (i.e., an HTTP-like)
 | 
| +// stream.
 | 
| +TEST_F(SpdyStreamSpdy3Test, SendLargeDataAfterOpenRequestResponse) {
 | 
| +  GURL url(kStreamUrl);
 | 
| +
 | 
| +  session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
 | 
| +
 | 
| +  scoped_ptr<SpdyFrame> req(
 | 
| +      ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
 | 
| +  std::string chunk_data(kMaxSpdyFrameChunkSize, 'x');
 | 
| +  scoped_ptr<SpdyFrame> chunk(
 | 
| +      ConstructSpdyBodyFrame(
 | 
| +          1, chunk_data.data(), chunk_data.length(), false));
 | 
| +  MockWrite writes[] = {
 | 
| +    CreateMockWrite(*req, 0),
 | 
| +    CreateMockWrite(*chunk, 1),
 | 
| +    CreateMockWrite(*chunk, 2),
 | 
| +    CreateMockWrite(*chunk, 3),
 | 
| +  };
 | 
| +
 | 
| +  scoped_ptr<SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0));
 | 
| +  MockRead reads[] = {
 | 
| +    CreateMockRead(*resp, 4),
 | 
| +    MockRead(ASYNC, 0, 0, 5), // EOF
 | 
| +  };
 | 
| +
 | 
| +  OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
 | 
| +  MockConnect connect_data(SYNCHRONOUS, OK);
 | 
| +  data.set_connect_data(connect_data);
 | 
| +
 | 
| +  session_deps_.socket_factory->AddSocketDataProvider(&data);
 | 
| +
 | 
| +  scoped_refptr<SpdySession> session(CreateSpdySession());
 | 
| +
 | 
| +  InitializeSpdySession(session, host_port_pair_);
 | 
| +
 | 
| +  base::WeakPtr<SpdyStream> stream =
 | 
| +      CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
 | 
| +  ASSERT_TRUE(stream.get() != NULL);
 | 
| +
 | 
| +  std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x');
 | 
| +  StreamDelegateWithBody delegate(stream, body_data);
 | 
| +  stream->SetDelegate(&delegate);
 | 
| +
 | 
| +  EXPECT_FALSE(stream->HasUrl());
 | 
| +
 | 
| +  stream->set_spdy_headers(
 | 
| +      spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
 | 
| +  EXPECT_TRUE(stream->HasUrl());
 | 
| +  EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
 | 
| +
 | 
| +  EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
 | 
| +
 | 
| +  EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
 | 
| +
 | 
| +  EXPECT_TRUE(delegate.send_headers_completed());
 | 
| +  EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
 | 
| +  EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
| +  EXPECT_EQ(std::string(), delegate.TakeReceivedData());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
| +}
 | 
| +
 | 
| +// Make sure that large blocks of data are properly split up into
 | 
| +// frame-sized chunks for a bidirectional (i.e., non-HTTP-like)
 | 
| +// stream.
 | 
| +TEST_F(SpdyStreamSpdy3Test, SendLargeDataAfterOpenBidirectional) {
 | 
| +  GURL url(kStreamUrl);
 | 
| +
 | 
| +  session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
 | 
| +
 | 
| +  scoped_ptr<SpdyFrame> req(
 | 
| +      ConstructSpdyPost(kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0));
 | 
| +  std::string chunk_data(kMaxSpdyFrameChunkSize, 'x');
 | 
| +  scoped_ptr<SpdyFrame> chunk(
 | 
| +      ConstructSpdyBodyFrame(
 | 
| +          1, chunk_data.data(), chunk_data.length(), false));
 | 
| +  MockWrite writes[] = {
 | 
| +    CreateMockWrite(*req, 0),
 | 
| +    CreateMockWrite(*chunk, 2),
 | 
| +    CreateMockWrite(*chunk, 3),
 | 
| +    CreateMockWrite(*chunk, 4),
 | 
| +  };
 | 
| +
 | 
| +  scoped_ptr<SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0));
 | 
| +  MockRead reads[] = {
 | 
| +    CreateMockRead(*resp, 1),
 | 
| +    MockRead(ASYNC, 0, 0, 5), // EOF
 | 
| +  };
 | 
| +
 | 
| +  OrderedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
 | 
| +  MockConnect connect_data(SYNCHRONOUS, OK);
 | 
| +  data.set_connect_data(connect_data);
 | 
| +
 | 
| +  session_deps_.socket_factory->AddSocketDataProvider(&data);
 | 
| +
 | 
| +  scoped_refptr<SpdySession> session(CreateSpdySession());
 | 
| +
 | 
| +  InitializeSpdySession(session, host_port_pair_);
 | 
| +
 | 
| +  base::WeakPtr<SpdyStream> stream =
 | 
| +      CreateStreamSynchronously(session, url, LOWEST, BoundNetLog());
 | 
| +  ASSERT_TRUE(stream.get() != NULL);
 | 
| +
 | 
| +  std::string body_data(3 * kMaxSpdyFrameChunkSize, 'x');
 | 
| +  StreamDelegateSendImmediate delegate(
 | 
| +      stream, scoped_ptr<SpdyHeaderBlock>(), body_data);
 | 
| +  stream->SetDelegate(&delegate);
 | 
| +
 | 
| +  EXPECT_FALSE(stream->HasUrl());
 | 
| +
 | 
| +  stream->set_spdy_headers(
 | 
| +      spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength));
 | 
| +  EXPECT_TRUE(stream->HasUrl());
 | 
| +  EXPECT_EQ(kStreamUrl, stream->GetUrl().spec());
 | 
| +
 | 
| +  EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true));
 | 
| +
 | 
| +  EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose());
 | 
| +
 | 
| +  EXPECT_TRUE(delegate.send_headers_completed());
 | 
| +  EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
 | 
| +  EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
| +  EXPECT_EQ(std::string(), delegate.TakeReceivedData());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
| +}
 | 
| +
 | 
|  // Call IncreaseSendWindowSize on a stream with a large enough delta
 | 
|  // to overflow an int32. The SpdyStream should handle that case
 | 
|  // gracefully.
 | 
| @@ -530,7 +656,7 @@ void SpdyStreamSpdy3Test::RunResumeAfterUnstallRequestResponseTest(
 | 
|    EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status"));
 | 
|    EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
|    EXPECT_EQ(std::string(), delegate.TakeReceivedData());
 | 
| -  EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.body_data_sent());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncreaseRequestResponse) {
 | 
| @@ -622,19 +748,15 @@ void SpdyStreamSpdy3Test::RunResumeAfterUnstallBidirectionalTest(
 | 
|    EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version"));
 | 
|    EXPECT_EQ(std::string(kPostBody, kPostBodyLength),
 | 
|              delegate.TakeReceivedData());
 | 
| -  EXPECT_EQ(static_cast<int>(kPostBodyLength), delegate.data_sent());
 | 
| +  EXPECT_TRUE(data.at_write_eof());
 | 
|  }
 | 
|  
 | 
| -// TODO(akalin): Re-enable these when http://crbug.com/242288 is
 | 
| -// fixed.
 | 
| -TEST_F(SpdyStreamSpdy3Test,
 | 
| -       DISABLED_ResumeAfterSendWindowSizeIncreaseBidirectional) {
 | 
| +TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeIncreaseBidirectional) {
 | 
|    RunResumeAfterUnstallBidirectionalTest(
 | 
|        base::Bind(&IncreaseStreamSendWindowSize));
 | 
|  }
 | 
|  
 | 
| -TEST_F(SpdyStreamSpdy3Test,
 | 
| -       DISABLED_ResumeAfterSendWindowSizeAdjustBidirectional) {
 | 
| +TEST_F(SpdyStreamSpdy3Test, ResumeAfterSendWindowSizeAdjustBidirectional) {
 | 
|    RunResumeAfterUnstallBidirectionalTest(
 | 
|        base::Bind(&AdjustStreamSendWindowSize));
 | 
|  }
 | 
| 
 |