| Index: net/spdy/spdy_stream_spdy2_unittest.cc
|
| diff --git a/net/spdy/spdy_stream_spdy2_unittest.cc b/net/spdy/spdy_stream_spdy2_unittest.cc
|
| index d8d02085ab65cf4daf70194bcd83ace8284ce660..43dc11b4030edaf581357d00d09a2e3ce4e41833 100644
|
| --- a/net/spdy/spdy_stream_spdy2_unittest.cc
|
| +++ b/net/spdy/spdy_stream_spdy2_unittest.cc
|
| @@ -141,7 +141,7 @@ TEST_F(SpdyStreamSpdy2Test, 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(SpdyStreamSpdy2Test, SendHeaderAndDataAfterOpen) {
|
| @@ -216,9 +216,8 @@ TEST_F(SpdyStreamSpdy2Test, 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(SpdyStreamSpdy2Test, PushedStream) {
|
| @@ -334,7 +333,7 @@ TEST_F(SpdyStreamSpdy2Test, 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;
|
| @@ -352,6 +351,133 @@ TEST_F(SpdyStreamSpdy2Test, 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(SpdyStreamSpdy2Test, SendLargeDataAfterOpenRequestResponse) {
|
| + GURL url(kStreamUrl);
|
| +
|
| + session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
|
| +
|
| + scoped_ptr<SpdyFrame> req(
|
| + ConstructSpdyPost(kStreamUrl, kPostBodyLength, 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(SpdyStreamSpdy2Test, SendLargeDataAfterOpenBidirectional) {
|
| + GURL url(kStreamUrl);
|
| +
|
| + session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
|
| +
|
| + scoped_ptr<SpdyFrame> req(
|
| + ConstructSpdyPost(kStreamUrl, kPostBodyLength, 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());
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace test
|
|
|