Index: net/spdy/spdy_network_transaction_unittest.cc |
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc |
index 1c9abed27485dacb384dd685e6879e233275e134..38fe7ed113c3b3478cd975a1d1a04a147597e33f 100644 |
--- a/net/spdy/spdy_network_transaction_unittest.cc |
+++ b/net/spdy/spdy_network_transaction_unittest.cc |
@@ -2059,57 +2059,50 @@ TEST_P(SpdyNetworkTransactionTest, EmptyPost) { |
EXPECT_EQ("hello!", out.response_data); |
} |
-// While we're doing a post, the server sends back a SYN_REPLY. |
-TEST_P(SpdyNetworkTransactionTest, PostWithEarlySynReply) { |
- static const char upload[] = { "hello!" }; |
- ScopedVector<UploadElementReader> element_readers; |
- element_readers.push_back( |
- new UploadBytesElementReader(upload, sizeof(upload))); |
- UploadDataStream stream(element_readers.Pass(), 0); |
- |
- // Setup the request |
- HttpRequestInfo request; |
- request.method = "POST"; |
- request.url = GURL(kRequestUrl); |
- request.upload_data_stream = &stream; |
- |
- scoped_ptr<SpdyFrame> stream_reply( |
- spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
- MockRead reads[] = { |
- CreateMockRead(*stream_reply, 1), |
- MockRead(ASYNC, 0, 4) // EOF |
- }; |
- |
- scoped_ptr<SpdyFrame> req( |
- spdy_util_.ConstructSpdyPost( |
- kRequestUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); |
+// While we're doing a post, the server sends the reply before upload completes. |
+TEST_P(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { |
+ scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); |
scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
- scoped_ptr<SpdyFrame> rst( |
- spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
MockWrite writes[] = { |
CreateMockWrite(*req, 0), |
- CreateMockWrite(*body, 2), |
- CreateMockWrite(*rst, 3) |
+ CreateMockWrite(*body, 3), |
+ }; |
+ scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1), |
+ CreateMockRead(*body, 2), |
+ MockRead(ASYNC, 0, 4) // EOF |
}; |
+ // Write the request headers, and read the complete response |
+ // while still waiting for chunked request data. |
DeterministicSocketData data(reads, arraysize(reads), |
writes, arraysize(writes)); |
- NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, |
+ NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), |
+ DEFAULT_PRIORITY, |
BoundNetLog(), GetParam(), NULL); |
helper.SetDeterministic(); |
helper.RunPreTestSetup(); |
helper.AddDeterministicData(&data); |
- HttpNetworkTransaction* trans = helper.trans(); |
- TestCompletionCallback callback; |
- int rv = trans->Start( |
- &CreatePostRequest(), callback.callback(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
+ ASSERT_TRUE(helper.StartDefaultTest()); |
- data.RunFor(4); |
- rv = callback.WaitForResult(); |
- EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); |
- data.RunFor(1); |
+ // Process the request headers, SYN_REPLY, and response body. |
+ // The request body is still in flight. |
+ data.RunFor(3); |
+ |
+ const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); |
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
+ |
+ // Finish sending the request body. |
+ helper.request().upload_data_stream->AppendChunk( |
+ kUploadData, kUploadDataSize, true); |
+ data.RunFor(2); |
+ |
+ std::string response_body; |
+ EXPECT_EQ(OK, ReadTransaction(helper.trans(), &response_body)); |
+ EXPECT_EQ(kUploadData, response_body); |
+ helper.VerifyDataConsumed(); |
} |
// The client upon cancellation tries to send a RST_STREAM frame. The mock |