Commit c0004f13 authored by Chris Mumford's avatar Chris Mumford Committed by Commit Bot

Improved errors returned from FileDataPipeProducer.

If a file read failed only MOJO_RESULT_ABORTED was returned.
This change does a best effort mapping of base::File::Error
values to the MojoResult value.

Bug: none
Change-Id: Iead2b3ce3b790960d5796ceeb15cfa1ff9c80741
Reviewed-on: https://chromium-review.googlesource.com/804615
Commit-Queue: Chris Mumford <cmumford@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#521543}
parent 2feabf47
...@@ -28,6 +28,27 @@ namespace { ...@@ -28,6 +28,27 @@ namespace {
// 64 MB chunks whenever a producer is writable. // 64 MB chunks whenever a producer is writable.
constexpr uint32_t kDefaultMaxReadSize = 64 * 1024 * 1024; constexpr uint32_t kDefaultMaxReadSize = 64 * 1024 * 1024;
MojoResult FileErrorToMojoResult(base::File::Error error) {
switch (error) {
case base::File::FILE_OK:
return MOJO_RESULT_OK;
case base::File::FILE_ERROR_EXISTS:
return MOJO_RESULT_ALREADY_EXISTS;
case base::File::FILE_ERROR_NOT_FOUND:
return MOJO_RESULT_NOT_FOUND;
case base::File::FILE_ERROR_SECURITY:
case base::File::FILE_ERROR_ACCESS_DENIED:
return MOJO_RESULT_PERMISSION_DENIED;
case base::File::FILE_ERROR_TOO_MANY_OPENED:
case base::File::FILE_ERROR_NO_MEMORY:
return MOJO_RESULT_RESOURCE_EXHAUSTED;
case base::File::FILE_ERROR_ABORT:
return MOJO_RESULT_ABORTED;
default:
return MOJO_RESULT_UNKNOWN;
}
}
} // namespace } // namespace
class FileDataPipeProducer::FileSequenceState class FileDataPipeProducer::FileSequenceState
...@@ -74,6 +95,10 @@ class FileDataPipeProducer::FileSequenceState ...@@ -74,6 +95,10 @@ class FileDataPipeProducer::FileSequenceState
~FileSequenceState() = default; ~FileSequenceState() = default;
void StartFromFileOnFileSequence(base::File file, size_t max_bytes) { void StartFromFileOnFileSequence(base::File file, size_t max_bytes) {
if (file.error_details() != base::File::FILE_OK) {
Finish(FileErrorToMojoResult(file.error_details()));
return;
}
file_ = std::move(file); file_ = std::move(file);
max_bytes_ = max_bytes; max_bytes_ = max_bytes;
TransferSomeBytes(); TransferSomeBytes();
...@@ -138,11 +163,18 @@ class FileDataPipeProducer::FileSequenceState ...@@ -138,11 +163,18 @@ class FileDataPipeProducer::FileSequenceState
std::min(static_cast<size_t>(size), max_bytes_remaining)); std::min(static_cast<size_t>(size), max_bytes_remaining));
int read_size = file_.ReadAtCurrentPos(static_cast<char*>(pipe_buffer), int read_size = file_.ReadAtCurrentPos(static_cast<char*>(pipe_buffer),
attempted_read_size); attempted_read_size);
base::File::Error read_error;
if (read_size < 0) {
read_error = base::File::GetLastFileError();
DCHECK_NE(base::File::FILE_OK, read_error);
} else {
read_error = base::File::FILE_OK;
}
producer_handle_->EndWriteData( producer_handle_->EndWriteData(
read_size >= 0 ? static_cast<uint32_t>(read_size) : 0); read_size >= 0 ? static_cast<uint32_t>(read_size) : 0);
if (read_size < 0) { if (read_size < 0) {
Finish(MOJO_RESULT_ABORTED); Finish(FileErrorToMojoResult(read_error));
return; return;
} }
......
...@@ -180,6 +180,24 @@ TEST_F(FileDataPipeProducerTest, WriteFromFilePartial) { ...@@ -180,6 +180,24 @@ TEST_F(FileDataPipeProducerTest, WriteFromFilePartial) {
EXPECT_EQ(kTestString.substr(0, kBytesToWrite), reader.data()); EXPECT_EQ(kTestString.substr(0, kBytesToWrite), reader.data());
} }
TEST_F(FileDataPipeProducerTest, WriteFromInvalidFile) {
base::FilePath path(FILE_PATH_LITERAL("<nonexistent-file>"));
constexpr size_t kBytesToWrite = 7;
base::RunLoop loop;
DataPipe pipe(kBytesToWrite);
DataPipeReader reader(std::move(pipe.consumer_handle), kBytesToWrite,
loop.QuitClosure());
base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
WriteFromFileThenCloseWriter(
base::MakeUnique<FileDataPipeProducer>(std::move(pipe.producer_handle)),
std::move(file), kBytesToWrite);
loop.Run();
EXPECT_EQ(0UL, reader.data().size());
}
TEST_F(FileDataPipeProducerTest, WriteFromPath) { TEST_F(FileDataPipeProducerTest, WriteFromPath) {
const std::string kTestStringFragment = "Hello, world!"; const std::string kTestStringFragment = "Hello, world!";
constexpr size_t kNumRepetitions = 1000; constexpr size_t kNumRepetitions = 1000;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment