| 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
|
|
|