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 e264f86f6c5316faeca70b0f9149ee0dff1c9010..c53ec8d16e2544e513409658d36e668dbd83cf5c 100644 |
--- a/net/http/http_stream_parser_unittest.cc |
+++ b/net/http/http_stream_parser_unittest.cc |
@@ -112,10 +112,21 @@ TEST(HttpStreamParser, DataReadErrorSynchronous) { |
ReadErrorUploadDataStream upload_data_stream( |
ReadErrorUploadDataStream::FailureMode::SYNC); |
+ |
+ // Test upload progress before init. |
+ UploadProgress progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ |
ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback(), |
BoundNetLog()), |
IsOk()); |
+ // Test upload progress after init. |
+ progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ |
HttpRequestInfo request; |
request.method = "POST"; |
request.url = GURL("http://localhost"); |
@@ -134,6 +145,10 @@ TEST(HttpStreamParser, DataReadErrorSynchronous) { |
callback.callback()); |
EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
+ progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ |
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
} |
@@ -171,10 +186,96 @@ TEST(HttpStreamParser, DataReadErrorAsynchronous) { |
callback.callback()); |
EXPECT_THAT(result, IsError(ERR_IO_PENDING)); |
+ UploadProgress progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ |
EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
+ |
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
} |
+class InitAsyncUploadDataStream : public ChunkedUploadDataStream { |
+ public: |
+ explicit InitAsyncUploadDataStream(int64_t identifier) |
+ : ChunkedUploadDataStream(identifier), weak_factory_(this) {} |
+ |
+ private: |
+ void CompleteInit() { UploadDataStream::OnInitCompleted(OK); } |
+ |
+ int InitInternal(const BoundNetLog& net_log) override { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&InitAsyncUploadDataStream::CompleteInit, |
+ weak_factory_.GetWeakPtr())); |
+ return ERR_IO_PENDING; |
+ } |
+ |
+ base::WeakPtrFactory<InitAsyncUploadDataStream> weak_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InitAsyncUploadDataStream); |
+}; |
+ |
+TEST(HttpStreamParser, InitAsynchronousUploadDataStream) { |
+ InitAsyncUploadDataStream upload_data_stream(0); |
+ |
+ TestCompletionCallback callback; |
+ int result = upload_data_stream.Init(callback.callback(), BoundNetLog()); |
+ ASSERT_THAT(result, IsError(ERR_IO_PENDING)); |
+ |
+ // Should be empty progress while initialization is in progress. |
+ UploadProgress progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ EXPECT_THAT(callback.GetResult(result), IsOk()); |
+ |
+ // Initialization complete. |
+ progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+ |
+ HttpRequestInfo request; |
+ request.method = "POST"; |
+ request.url = GURL("http://localhost"); |
+ request.upload_data_stream = &upload_data_stream; |
+ |
+ static const char kChunk[] = "Chunk 1"; |
+ MockWrite writes[] = { |
+ MockWrite(ASYNC, 0, "POST / HTTP/1.1\r\n"), |
+ MockWrite(ASYNC, 1, "Transfer-Encoding: chunked\r\n\r\n"), |
+ MockWrite(ASYNC, 2, "7\r\nChunk 1\r\n"), |
+ }; |
+ |
+ SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
+ std::unique_ptr<ClientSocketHandle> socket_handle = |
+ CreateConnectedSocketHandle(&data); |
+ |
+ scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
+ HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
+ BoundNetLog()); |
+ |
+ HttpRequestHeaders headers; |
+ headers.SetHeader("Transfer-Encoding", "chunked"); |
+ |
+ HttpResponseInfo response; |
+ TestCompletionCallback callback1; |
+ int result1 = parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
+ callback1.callback()); |
+ EXPECT_EQ(ERR_IO_PENDING, result1); |
+ base::RunLoop().RunUntilIdle(); |
+ upload_data_stream.AppendData(kChunk, arraysize(kChunk) - 1, true); |
+ |
+ // Check progress after read completes. |
+ progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(7u, progress.position()); |
+ |
+ // Check progress after reset. |
+ upload_data_stream.Reset(); |
+ progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(0u, progress.position()); |
+} |
+ |
// The empty payload is how the last chunk is encoded. |
TEST(HttpStreamParser, EncodeChunk_EmptyPayload) { |
char output[kOutputSize]; |
@@ -477,6 +578,10 @@ TEST(HttpStreamParser, SentBytesPost) { |
callback.callback())); |
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
+ |
+ UploadProgress progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(12u, progress.size()); |
+ EXPECT_EQ(12u, progress.position()); |
} |
TEST(HttpStreamParser, SentBytesChunkedPostError) { |
@@ -524,6 +629,10 @@ TEST(HttpStreamParser, SentBytesChunkedPostError) { |
EXPECT_THAT(callback.WaitForResult(), IsError(ERR_FAILED)); |
EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
+ |
+ UploadProgress progress = upload_data_stream.GetUploadProgress(); |
+ EXPECT_EQ(0u, progress.size()); |
+ EXPECT_EQ(14u, progress.position()); |
} |
// Test to ensure the HttpStreamParser state machine does not get confused |