| Index: net/http/http_stream_parser_unittest.cc
|
| diff --git a/net/http/http_stream_parser_unittest.cc b/net/http/http_stream_parser_unittest.cc
|
| index a30cb0091cdb225e21ede3fc1df05a43a7e60008..8590bb45efa0e03ef98f693a5c9edf1453a718cf 100644
|
| --- a/net/http/http_stream_parser_unittest.cc
|
| +++ b/net/http/http_stream_parser_unittest.cc
|
| @@ -43,18 +43,18 @@ const size_t kMaxPayloadSize =
|
| // Helper method to create a connected ClientSocketHandle using |data|.
|
| // Modifies |data|.
|
| scoped_ptr<ClientSocketHandle> CreateConnectedSocketHandle(
|
| - DeterministicSocketData* data) {
|
| + SequencedSocketData* data) {
|
| data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
|
|
| - scoped_ptr<DeterministicMockTCPClientSocket> transport(
|
| - new DeterministicMockTCPClientSocket(nullptr, data));
|
| - data->set_delegate(transport->AsWeakPtr());
|
| + scoped_ptr<MockTCPClientSocket> socket(
|
| + new MockTCPClientSocket(net::AddressList(), nullptr, data));
|
| + data->set_socket(socket.get());
|
|
|
| TestCompletionCallback callback;
|
| - EXPECT_EQ(OK, transport->Connect(callback.callback()));
|
| + EXPECT_EQ(OK, socket->Connect(callback.callback()));
|
|
|
| scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
|
| - socket_handle->SetSocket(transport.Pass());
|
| + socket_handle->SetSocket(socket.Pass());
|
| return socket_handle.Pass();
|
| }
|
|
|
| @@ -229,8 +229,7 @@ TEST(HttpStreamParser, AsyncSingleChunkAndAsyncSocket) {
|
| ChunkedUploadDataStream upload_stream(0);
|
| ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| scoped_ptr<ClientSocketHandle> socket_handle =
|
| CreateConnectedSocketHandle(&data);
|
|
|
| @@ -254,25 +253,16 @@ TEST(HttpStreamParser, AsyncSingleChunkAndAsyncSocket) {
|
| parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
|
| &response_info, callback.callback()));
|
|
|
| - // Complete the initial request write.
|
| - data.RunFor(1);
|
| + // Complete the initial request write. Callback should not have been invoked.
|
| + base::RunLoop().RunUntilIdle();
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Now append the only chunk.
|
| + // Now append the only chunk and wait for the callback.
|
| upload_stream.AppendData(kChunk, arraysize(kChunk) - 1, true);
|
| - // Write the chunk.
|
| - data.RunFor(1);
|
| - ASSERT_FALSE(callback.have_result());
|
| -
|
| - // Write the trailer.
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(OK, callback.WaitForResult());
|
|
|
| // Attempt to read the response status and the response headers.
|
| ASSERT_EQ(ERR_IO_PENDING, parser.ReadResponseHeaders(callback.callback()));
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_GT(callback.WaitForResult(), 0);
|
|
|
| // Finally, attempt to read the response body.
|
| @@ -280,8 +270,6 @@ TEST(HttpStreamParser, AsyncSingleChunkAndAsyncSocket) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.ReadResponseBody(body_buffer.get(), kBodySize,
|
| callback.callback()));
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(kBodySize, callback.WaitForResult());
|
| }
|
|
|
| @@ -315,8 +303,7 @@ TEST(HttpStreamParser, SyncSingleChunkAndAsyncSocket) {
|
| // Append the only chunk.
|
| upload_stream.AppendData(kChunk, arraysize(kChunk) - 1, true);
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| scoped_ptr<ClientSocketHandle> socket_handle =
|
| CreateConnectedSocketHandle(&data);
|
|
|
| @@ -339,19 +326,10 @@ TEST(HttpStreamParser, SyncSingleChunkAndAsyncSocket) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
|
| &response_info, callback.callback()));
|
| -
|
| - // Write the request and the only chunk.
|
| - data.RunFor(2);
|
| -
|
| - // Write the trailer.
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(OK, callback.WaitForResult());
|
|
|
| // Attempt to read the response status and the response headers.
|
| ASSERT_EQ(ERR_IO_PENDING, parser.ReadResponseHeaders(callback.callback()));
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_GT(callback.WaitForResult(), 0);
|
|
|
| // Finally, attempt to read the response body.
|
| @@ -359,8 +337,6 @@ TEST(HttpStreamParser, SyncSingleChunkAndAsyncSocket) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.ReadResponseBody(body_buffer.get(), kBodySize,
|
| callback.callback()));
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(kBodySize, callback.WaitForResult());
|
| }
|
|
|
| @@ -401,8 +377,7 @@ TEST(HttpStreamParser, AsyncChunkAndAsyncSocketWithMultipleChunks) {
|
| upload_stream.AppendData(kChunk1, arraysize(kChunk1) - 1, false);
|
| ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| scoped_ptr<ClientSocketHandle> socket_handle =
|
| CreateConnectedSocketHandle(&data);
|
|
|
| @@ -425,47 +400,26 @@ TEST(HttpStreamParser, AsyncChunkAndAsyncSocketWithMultipleChunks) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
|
| &response_info, callback.callback()));
|
| -
|
| - // Complete the initial request write. Additionally, this should enqueue the
|
| - // first chunk.
|
| - data.RunFor(1);
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Now append another chunk (while the first write is still pending), which
|
| - // should not confuse the state machine.
|
| - upload_stream.AppendData(kChunk2, arraysize(kChunk2) - 1, false);
|
| - ASSERT_FALSE(callback.have_result());
|
| -
|
| - // Complete writing the first chunk, which should then enqueue the second
|
| - // chunk for writing and return, because it is set to complete
|
| - // asynchronously.
|
| - data.RunFor(1);
|
| + // Sending the request and the first chunk completes.
|
| + base::RunLoop().RunUntilIdle();
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Complete writing the second chunk. However, because no chunks are
|
| - // available yet, no further writes should be called until a new chunk is
|
| - // added.
|
| - data.RunFor(1);
|
| + // Now append another chunk.
|
| + upload_stream.AppendData(kChunk2, arraysize(kChunk2) - 1, false);
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Add the final chunk. This will enqueue another write, but it will not
|
| - // complete due to the async nature.
|
| + // Add the final chunk, while the write for the second is still pending,
|
| + // which should not confuse the state machine.
|
| upload_stream.AppendData(kChunk3, arraysize(kChunk3) - 1, true);
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Finalize writing the last chunk, which will enqueue the trailer.
|
| - data.RunFor(1);
|
| - ASSERT_FALSE(callback.have_result());
|
| -
|
| - // Finalize writing the trailer.
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| + // Wait for writes to complete.
|
| ASSERT_EQ(OK, callback.WaitForResult());
|
|
|
| // Attempt to read the response status and the response headers.
|
| ASSERT_EQ(ERR_IO_PENDING, parser.ReadResponseHeaders(callback.callback()));
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_GT(callback.WaitForResult(), 0);
|
|
|
| // Finally, attempt to read the response body.
|
| @@ -473,8 +427,6 @@ TEST(HttpStreamParser, AsyncChunkAndAsyncSocketWithMultipleChunks) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.ReadResponseBody(body_buffer.get(), kBodySize,
|
| callback.callback()));
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(kBodySize, callback.WaitForResult());
|
| }
|
|
|
| @@ -503,8 +455,7 @@ TEST(HttpStreamParser, AsyncEmptyChunkedUpload) {
|
| ChunkedUploadDataStream upload_stream(0);
|
| ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| scoped_ptr<ClientSocketHandle> socket_handle =
|
| CreateConnectedSocketHandle(&data);
|
|
|
| @@ -528,23 +479,14 @@ TEST(HttpStreamParser, AsyncEmptyChunkedUpload) {
|
| parser.SendRequest("GET /one.html HTTP/1.1\r\n", request_headers,
|
| &response_info, callback.callback()));
|
|
|
| - // Complete writing the request headers.
|
| - data.RunFor(1);
|
| - ASSERT_FALSE(callback.have_result());
|
| -
|
| // Now append the terminal 0-byte "chunk".
|
| upload_stream.AppendData(nullptr, 0, true);
|
| ASSERT_FALSE(callback.have_result());
|
|
|
| - // Finalize writing the trailer.
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(OK, callback.WaitForResult());
|
|
|
| // Attempt to read the response status and the response headers.
|
| ASSERT_EQ(ERR_IO_PENDING, parser.ReadResponseHeaders(callback.callback()));
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_GT(callback.WaitForResult(), 0);
|
|
|
| // Finally, attempt to read the response body.
|
| @@ -552,8 +494,6 @@ TEST(HttpStreamParser, AsyncEmptyChunkedUpload) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.ReadResponseBody(body_buffer.get(), kBodySize,
|
| callback.callback()));
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(kBodySize, callback.WaitForResult());
|
| }
|
|
|
| @@ -584,8 +524,7 @@ TEST(HttpStreamParser, SyncEmptyChunkedUpload) {
|
| // Append final empty chunk.
|
| upload_stream.AppendData(nullptr, 0, true);
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| scoped_ptr<ClientSocketHandle> socket_handle =
|
| CreateConnectedSocketHandle(&data);
|
|
|
| @@ -610,14 +549,10 @@ TEST(HttpStreamParser, SyncEmptyChunkedUpload) {
|
| &response_info, callback.callback()));
|
|
|
| // Complete writing the request headers and body.
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(OK, callback.WaitForResult());
|
|
|
| // Attempt to read the response status and the response headers.
|
| ASSERT_EQ(ERR_IO_PENDING, parser.ReadResponseHeaders(callback.callback()));
|
| - data.RunFor(2);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_GT(callback.WaitForResult(), 0);
|
|
|
| // Finally, attempt to read the response body.
|
| @@ -625,8 +560,6 @@ TEST(HttpStreamParser, SyncEmptyChunkedUpload) {
|
| ASSERT_EQ(ERR_IO_PENDING,
|
| parser.ReadResponseBody(body_buffer.get(), kBodySize,
|
| callback.callback()));
|
| - data.RunFor(1);
|
| - ASSERT_TRUE(callback.have_result());
|
| ASSERT_EQ(kBodySize, callback.WaitForResult());
|
| }
|
|
|
| @@ -685,20 +618,9 @@ TEST(HttpStreamParser, TruncatedHeaders) {
|
|
|
| for (size_t i = 0; i < arraysize(reads); i++) {
|
| SCOPED_TRACE(i);
|
| - DeterministicSocketData data(reads[i], 2, writes, arraysize(writes));
|
| - data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| - data.SetStop(3);
|
| -
|
| - scoped_ptr<DeterministicMockTCPClientSocket> transport(
|
| - new DeterministicMockTCPClientSocket(NULL, &data));
|
| - data.set_delegate(transport->AsWeakPtr());
|
| -
|
| - TestCompletionCallback callback;
|
| - int rv = transport->Connect(callback.callback());
|
| - ASSERT_EQ(OK, rv);
|
| -
|
| - scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
|
| - socket_handle->SetSocket(transport.Pass());
|
| + SequencedSocketData data(reads[i], 2, writes, arraysize(writes));
|
| + scoped_ptr<ClientSocketHandle> socket_handle(
|
| + CreateConnectedSocketHandle(&data));
|
|
|
| HttpRequestInfo request_info;
|
| request_info.method = "GET";
|
| @@ -715,11 +637,11 @@ TEST(HttpStreamParser, TruncatedHeaders) {
|
|
|
| HttpRequestHeaders request_headers;
|
| HttpResponseInfo response_info;
|
| - rv = parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
|
| - &response_info, callback.callback());
|
| - ASSERT_EQ(OK, rv);
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
|
| + &response_info, callback.callback()));
|
|
|
| - rv = parser.ReadResponseHeaders(callback.callback());
|
| + int rv = parser.ReadResponseHeaders(callback.callback());
|
| if (i == arraysize(reads) - 1) {
|
| EXPECT_EQ(OK, rv);
|
| EXPECT_TRUE(response_info.headers.get());
|
| @@ -752,21 +674,9 @@ TEST(HttpStreamParser, Websocket101Response) {
|
| MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n\r\n"),
|
| };
|
|
|
| - DeterministicSocketData data(reads, arraysize(reads),
|
| - writes, arraysize(writes));
|
| - data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| - data.SetStop(2);
|
| -
|
| - scoped_ptr<DeterministicMockTCPClientSocket> transport(
|
| - new DeterministicMockTCPClientSocket(NULL, &data));
|
| - data.set_delegate(transport->AsWeakPtr());
|
| -
|
| - TestCompletionCallback callback;
|
| - int rv = transport->Connect(callback.callback());
|
| - ASSERT_EQ(OK, rv);
|
| -
|
| - scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
|
| - socket_handle->SetSocket(transport.Pass());
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| + scoped_ptr<ClientSocketHandle> socket_handle =
|
| + CreateConnectedSocketHandle(&data);
|
|
|
| HttpRequestInfo request_info;
|
| request_info.method = "GET";
|
| @@ -779,12 +689,11 @@ TEST(HttpStreamParser, Websocket101Response) {
|
|
|
| HttpRequestHeaders request_headers;
|
| HttpResponseInfo response_info;
|
| - rv = parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
|
| - &response_info, callback.callback());
|
| - ASSERT_EQ(OK, rv);
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(OK, parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
|
| + &response_info, callback.callback()));
|
|
|
| - rv = parser.ReadResponseHeaders(callback.callback());
|
| - EXPECT_EQ(OK, rv);
|
| + EXPECT_EQ(OK, parser.ReadResponseHeaders(callback.callback()));
|
| ASSERT_TRUE(response_info.headers.get());
|
| EXPECT_EQ(101, response_info.headers->response_code());
|
| EXPECT_TRUE(response_info.headers->HasHeaderValue("Connection", "Upgrade"));
|
| @@ -822,21 +731,9 @@ class SimpleGetRunner {
|
| void SetupParserAndSendRequest() {
|
| reads_.push_back(MockRead(SYNCHRONOUS, 0, sequence_number_++)); // EOF
|
|
|
| - socket_handle_.reset(new ClientSocketHandle);
|
| - data_.reset(new DeterministicSocketData(
|
| - &reads_.front(), reads_.size(), &writes_.front(), writes_.size()));
|
| - data_->set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| - data_->SetStop(reads_.size() + writes_.size());
|
| -
|
| - transport_.reset(new DeterministicMockTCPClientSocket(NULL, data_.get()));
|
| - data_->set_delegate(transport_->AsWeakPtr());
|
| -
|
| - TestCompletionCallback callback;
|
| - int rv = transport_->Connect(callback.callback());
|
| - rv = callback.GetResult(rv);
|
| - ASSERT_EQ(OK, rv);
|
| -
|
| - socket_handle_->SetSocket(transport_.Pass());
|
| + data_.reset(new SequencedSocketData(&reads_.front(), reads_.size(),
|
| + &writes_.front(), writes_.size()));
|
| + socket_handle_ = CreateConnectedSocketHandle(data_.get());
|
|
|
| request_info_.method = "GET";
|
| request_info_.url = GURL("http://localhost");
|
| @@ -845,9 +742,9 @@ class SimpleGetRunner {
|
| parser_.reset(new HttpStreamParser(
|
| socket_handle_.get(), &request_info_, read_buffer(), BoundNetLog()));
|
|
|
| - rv = parser_->SendRequest("GET / HTTP/1.1\r\n", request_headers_,
|
| - &response_info_, callback.callback());
|
| - ASSERT_EQ(OK, rv);
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(OK, parser_->SendRequest("GET / HTTP/1.1\r\n", request_headers_,
|
| + &response_info_, callback.callback()));
|
| }
|
|
|
| void ReadHeaders() {
|
| @@ -878,8 +775,7 @@ class SimpleGetRunner {
|
| std::vector<MockRead> reads_;
|
| std::vector<MockWrite> writes_;
|
| scoped_ptr<ClientSocketHandle> socket_handle_;
|
| - scoped_ptr<DeterministicSocketData> data_;
|
| - scoped_ptr<DeterministicMockTCPClientSocket> transport_;
|
| + scoped_ptr<SequencedSocketData> data_;
|
| scoped_ptr<HttpStreamParser> parser_;
|
| int sequence_number_;
|
| };
|
| @@ -1118,30 +1014,20 @@ TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) {
|
| MockWrite writes[] = {
|
| MockWrite(SYNCHRONOUS, 0,
|
| "GET /foo.html HTTP/1.1\r\n\r\n"),
|
| - MockWrite(SYNCHRONOUS, 1, "1"),
|
| };
|
|
|
| const int kBodySize = 1;
|
| MockRead reads[] = {
|
| - MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
|
| - MockRead(SYNCHRONOUS, 6, "Content-Length: 1\r\n\r\n"),
|
| - MockRead(SYNCHRONOUS, 6, "Connection: Keep-Alive\r\n\r\n"),
|
| - MockRead(SYNCHRONOUS, 7, "1"),
|
| - MockRead(SYNCHRONOUS, 0, 8), // EOF
|
| + MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
|
| + MockRead(SYNCHRONOUS, 2, "Content-Length: 1\r\n\r\n"),
|
| + MockRead(SYNCHRONOUS, 3, "Connection: Keep-Alive\r\n\r\n"),
|
| + MockRead(SYNCHRONOUS, 4, "1"),
|
| + MockRead(SYNCHRONOUS, 0, 5), // EOF
|
| };
|
|
|
| - StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| - arraysize(writes));
|
| - data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| -
|
| - scoped_ptr<MockTCPClientSocket> transport(
|
| - new MockTCPClientSocket(AddressList(), NULL, &data));
|
| -
|
| - TestCompletionCallback callback;
|
| - ASSERT_EQ(OK, transport->Connect(callback.callback()));
|
| -
|
| - scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
|
| - socket_handle->SetSocket(transport.Pass());
|
| + SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
|
| + scoped_ptr<ClientSocketHandle> socket_handle =
|
| + CreateConnectedSocketHandle(&data);
|
|
|
| scoped_ptr<HttpRequestInfo> request_info(new HttpRequestInfo());
|
| request_info->method = "GET";
|
| @@ -1153,6 +1039,7 @@ TEST(HttpStreamParser, ReadAfterUnownedObjectsDestroyed) {
|
|
|
| scoped_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders());
|
| scoped_ptr<HttpResponseInfo> response_info(new HttpResponseInfo());
|
| + TestCompletionCallback callback;
|
| ASSERT_EQ(OK, parser.SendRequest("GET /foo.html HTTP/1.1\r\n",
|
| *request_headers, response_info.get(), callback.callback()));
|
| ASSERT_EQ(OK, parser.ReadResponseHeaders(callback.callback()));
|
|
|