Chromium Code Reviews| 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 89e75be300804654d7118c78b41db007dbf557be..c6f050523f3ddcd9dc6b57836e4b04a66a5243d7 100644 |
| --- a/net/http/http_stream_parser_unittest.cc |
| +++ b/net/http/http_stream_parser_unittest.cc |
| @@ -46,6 +46,8 @@ const size_t kOutputSize = 1024; // Just large enough for this test. |
| const size_t kMaxPayloadSize = |
| kOutputSize - HttpStreamParser::kChunkHeaderFooterSize; |
| +const bool kAsynchronously = true; |
|
mmenke
2016/05/24 17:13:47
I'd suggest using an enum, and making the enum a p
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + |
| // Helper method to create a connected ClientSocketHandle using |data|. |
| // Modifies |data|. |
| std::unique_ptr<ClientSocketHandle> CreateConnectedSocketHandle( |
| @@ -63,6 +65,118 @@ std::unique_ptr<ClientSocketHandle> CreateConnectedSocketHandle( |
| return socket_handle; |
| } |
| +class ElementsUploadDataStreamError : public ElementsUploadDataStream { |
|
mmenke
2016/05/24 17:13:47
Also, this is an UploadDataStream with a read erro
mmenke
2016/05/24 17:13:47
This should inherit from UploadDataStream, instead
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + public: |
| + ElementsUploadDataStreamError( |
| + std::vector<std::unique_ptr<UploadElementReader>> element_readers, |
| + int64_t identifier, |
| + bool async = false) |
|
mmenke
2016/05/24 17:13:48
There's a preference not to use default values, in
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + : ElementsUploadDataStream(std::move(element_readers), identifier) { |
| + async_ = async; |
| + } |
| + |
| + int ReadInternal(IOBuffer* buf, int buf_len) override { |
| + if (async_) |
| + return ERR_IO_PENDING; |
|
mmenke
2016/05/24 17:13:47
For the async case, suggest instead:
base::Thread
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + return ERR_FILE_READ_FAIL; |
|
mmenke
2016/05/24 17:13:48
This can be any error, per my suggestion not to ad
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + } |
| + |
| + void CompleteRead(int result) { |
|
mmenke
2016/05/24 17:13:47
Don't think this should take an argument, since Re
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + ElementsUploadDataStream::OnReadCompleted(result); |
| + } |
| + |
| + private: |
| + bool IsInMemory() const override { return false; } |
|
mmenke
2016/05/24 17:13:47
nit: This should be up with the other override me
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + bool async_; |
|
mmenke
2016/05/24 17:13:47
nit:
DISALLOW_COPY_AND_ASSIGN(ElementsUploadDataS
mmenke
2016/05/24 17:13:47
nit: const
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| +}; |
| + |
| +TEST(HttpStreamParser, DataReadErrorSynchronous) { |
| + MockWrite writes[] = { |
| + MockWrite(SYNCHRONOUS, 0, "POST / HTTP/1.1\r\n"), |
| + MockWrite(SYNCHRONOUS, 1, "Content-Length: 12\r\n\r\n"), |
| + }; |
| + |
| + SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| + std::unique_ptr<ClientSocketHandle> socket_handle = |
| + CreateConnectedSocketHandle(&data); |
| + |
| + std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| + |
| + // "hello world!" shouldn't be read nor sent. |
| + // ElementsUploadDataStreamError::ReadInternal() emulates either pending IO |
| + // or ERR_FILE_READ_FAIL |
| + element_readers.push_back( |
| + base::WrapUnique(new UploadBytesElementReader("hello world!", 12))); |
| + ElementsUploadDataStreamError upload_data_stream(std::move(element_readers), |
| + 0); |
| + ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); |
| + |
| + HttpRequestInfo request; |
| + request.method = "POST"; |
| + request.url = GURL("http://localhost"); |
| + request.upload_data_stream = &upload_data_stream; |
| + |
| + scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| + HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| + BoundNetLog()); |
| + |
| + HttpRequestHeaders headers; |
| + headers.SetHeader("Content-Length", "12"); |
| + |
| + HttpResponseInfo response; |
| + TestCompletionCallback callback; |
| + EXPECT_EQ(ERR_FILE_READ_FAIL, |
| + parser.SendRequest("POST / HTTP/1.1\r\n", headers, &response, |
| + callback.callback())); |
|
mmenke
2016/05/24 17:13:47
This works, and is correct, but I suggest instead:
maksims (do not use this acc)
2016/05/25 07:13:38
Done.
|
| + |
| + EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| +} |
| + |
| +TEST(HttpStreamParser, DataReadErrorAsynchronous) { |
| + MockWrite writes[] = { |
| + MockWrite(ASYNC, 0, "POST / HTTP/1.1\r\n"), |
| + MockWrite(ASYNC, 1, "Content-Length: 12\r\n\r\n"), |
| + }; |
| + |
| + SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); |
| + std::unique_ptr<ClientSocketHandle> socket_handle = |
| + CreateConnectedSocketHandle(&data); |
| + |
| + std::vector<std::unique_ptr<UploadElementReader>> element_readers; |
| + |
| + // "hello world!" shouldn't be read nor sent. |
| + // ElementsUploadDataStreamError::ReadInternal() emulates either pending IO |
| + // or ERR_FILE_READ_FAIL |
| + element_readers.push_back( |
| + base::WrapUnique(new UploadBytesElementReader("hello world!", 12))); |
| + ElementsUploadDataStreamError upload_data_stream(std::move(element_readers), |
| + 0, kAsynchronously); |
| + ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); |
| + |
| + HttpRequestInfo request; |
| + request.method = "POST"; |
| + request.url = GURL("http://localhost"); |
| + request.upload_data_stream = &upload_data_stream; |
| + |
| + scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer); |
| + HttpStreamParser parser(socket_handle.get(), &request, read_buffer.get(), |
| + BoundNetLog()); |
| + |
| + HttpRequestHeaders headers; |
| + headers.SetHeader("Content-Length", "12"); |
| + |
| + DLOG(ERROR) << "TUT"; |
|
mmenke
2016/05/24 17:13:48
Remove debugging code.
|
| + HttpResponseInfo response; |
| + TestCompletionCallback callback; |
| + EXPECT_EQ(ERR_IO_PENDING, parser.SendRequest("POST / HTTP/1.1\r\n", headers, |
| + &response, callback.callback())); |
| + |
| + base::RunLoop().RunUntilIdle(); |
| + upload_data_stream.CompleteRead(ERR_FILE_READ_FAIL); |
| + EXPECT_EQ(ERR_FILE_READ_FAIL, callback.WaitForResult()); |
| + EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), parser.sent_bytes()); |
| +} |
| + |
| // The empty payload is how the last chunk is encoded. |
| TEST(HttpStreamParser, EncodeChunk_EmptyPayload) { |
| char output[kOutputSize]; |