Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2769)

Unified Diff: chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc

Issue 2551913004: arc: Implement ArcContentFileSystemFileStreamReader offset handling (Closed)
Patch Set: constexpr Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc
index db45af11083b209f65e9060e23229a70813c0f24..41a8862b813b832b7c0053c15e37810981cf9040 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc
@@ -25,9 +25,33 @@ namespace arc {
namespace {
-constexpr char kArcUrl[] = "content://org.chromium.foo/bar";
+// URL which returns a file descriptor of a regular file.
+constexpr char kArcUrlFile[] = "content://org.chromium.foo/file";
+
+// URL which returns a file descriptor of a pipe's read end.
+constexpr char kArcUrlPipe[] = "content://org.chromium.foo/pipe";
+
constexpr char kData[] = "abcdefghijklmnopqrstuvwxyz";
+// Reads data from the reader to fill the buffer.
+bool ReadData(ArcContentFileSystemFileStreamReader* reader,
+ net::IOBufferWithSize* buffer) {
+ auto drainable_buffer =
+ make_scoped_refptr(new net::DrainableIOBuffer(buffer, buffer->size()));
+ while (drainable_buffer->BytesRemaining()) {
+ net::TestCompletionCallback callback;
+ int result = callback.GetResult(
+ reader->Read(drainable_buffer.get(), drainable_buffer->BytesRemaining(),
+ callback.callback()));
+ if (result < 0) {
+ LOG(ERROR) << "Read failed: " << result;
+ return false;
+ }
+ drainable_buffer->DidConsume(result);
+ }
+ return true;
+}
+
class ArcFileSystemInstanceTestImpl : public FakeFileSystemInstance {
public:
explicit ArcFileSystemInstanceTestImpl(const base::FilePath& file_path)
@@ -37,7 +61,7 @@ class ArcFileSystemInstanceTestImpl : public FakeFileSystemInstance {
void GetFileSize(const std::string& url,
const GetFileSizeCallback& callback) override {
- EXPECT_EQ(kArcUrl, url);
+ EXPECT_EQ(kArcUrlFile, url);
base::File::Info info;
EXPECT_TRUE(base::GetFileInfo(file_path_, &info));
base::ThreadTaskRunnerHandle::Get()->PostTask(
@@ -46,13 +70,19 @@ class ArcFileSystemInstanceTestImpl : public FakeFileSystemInstance {
void OpenFileToRead(const std::string& url,
const OpenFileToReadCallback& callback) override {
- EXPECT_EQ(kArcUrl, url);
-
- base::File file(file_path_, base::File::FLAG_OPEN | base::File::FLAG_READ);
- EXPECT_TRUE(file.IsValid());
-
+ base::ScopedFD fd;
+ if (url == kArcUrlFile) {
+ fd = OpenRegularFileToRead();
+ } else if (url == kArcUrlPipe) {
+ fd = OpenPipeToRead();
+ } else {
+ LOG(ERROR) << "Unknown URL: " << url;
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(callback, base::Passed(mojo::ScopedHandle())));
+ return;
+ }
mojo::edk::ScopedPlatformHandle platform_handle(
- mojo::edk::PlatformHandle(file.TakePlatformFile()));
+ mojo::edk::PlatformHandle(fd.release()));
MojoHandle wrapped_handle;
EXPECT_EQ(MOJO_RESULT_OK, mojo::edk::CreatePlatformHandleWrapper(
std::move(platform_handle), &wrapped_handle));
@@ -64,6 +94,35 @@ class ArcFileSystemInstanceTestImpl : public FakeFileSystemInstance {
}
private:
+ // Returns a ScopedFD to read |file_path_|.
+ base::ScopedFD OpenRegularFileToRead() {
+ base::File file(file_path_, base::File::FLAG_OPEN | base::File::FLAG_READ);
+ EXPECT_TRUE(file.IsValid());
+ return base::ScopedFD(file.TakePlatformFile());
+ }
+
+ // Returns a pipe's read end with |file_path_|'s contents written.
+ base::ScopedFD OpenPipeToRead() {
+ // Create a new pipe.
+ int fds[2];
+ if (pipe(fds) != 0) {
+ LOG(ERROR) << "pipe() failed.";
+ return base::ScopedFD();
+ }
+ base::ScopedFD fd_read(fds[0]);
+ base::ScopedFD fd_write(fds[1]);
+ // Put the file's contents to the pipe.
+ std::string contents;
+ if (!base::ReadFileToString(file_path_, &contents) ||
+ !base::WriteFileDescriptor(fd_write.get(), contents.data(),
+ contents.length())) {
+ LOG(ERROR) << "Failed to write the file contents to the pipe";
+ return base::ScopedFD();
+ }
+ // Return the read end.
+ return fd_read;
+ }
+
base::FilePath file_path_;
DISALLOW_COPY_AND_ASSIGN(ArcFileSystemInstanceTestImpl);
@@ -101,27 +160,44 @@ class ArcContentFileSystemFileStreamReaderTest : public testing::Test {
} // namespace
-TEST_F(ArcContentFileSystemFileStreamReaderTest, Read) {
- ArcContentFileSystemFileStreamReader reader(GURL(kArcUrl), 0);
+TEST_F(ArcContentFileSystemFileStreamReaderTest, ReadRegularFile) {
+ ArcContentFileSystemFileStreamReader reader(GURL(kArcUrlFile), 0);
+ auto buffer = make_scoped_refptr(new net::IOBufferWithSize(arraysize(kData)));
+ EXPECT_TRUE(ReadData(&reader, buffer.get()));
+ EXPECT_EQ(base::StringPiece(kData, arraysize(kData)),
+ base::StringPiece(buffer->data(), buffer->size()));
+}
- auto base_buffer =
- make_scoped_refptr(new net::IOBufferWithSize(arraysize(kData)));
- auto drainable_buffer = make_scoped_refptr(
- new net::DrainableIOBuffer(base_buffer.get(), base_buffer->size()));
- while (drainable_buffer->BytesRemaining()) {
- net::TestCompletionCallback callback;
- int result = callback.GetResult(
- reader.Read(drainable_buffer.get(), drainable_buffer->BytesRemaining(),
- callback.callback()));
- ASSERT_GT(result, 0);
- drainable_buffer->DidConsume(result);
- }
+TEST_F(ArcContentFileSystemFileStreamReaderTest, ReadRegularFileWithOffset) {
+ constexpr size_t kOffset = 10;
+ ArcContentFileSystemFileStreamReader reader(GURL(kArcUrlFile), kOffset);
+ auto buffer =
+ make_scoped_refptr(new net::IOBufferWithSize(arraysize(kData) - kOffset));
+ EXPECT_TRUE(ReadData(&reader, buffer.get()));
+ EXPECT_EQ(base::StringPiece(kData + kOffset, arraysize(kData) - kOffset),
+ base::StringPiece(buffer->data(), buffer->size()));
+}
+
+TEST_F(ArcContentFileSystemFileStreamReaderTest, ReadPipe) {
+ ArcContentFileSystemFileStreamReader reader(GURL(kArcUrlPipe), 0);
+ auto buffer = make_scoped_refptr(new net::IOBufferWithSize(arraysize(kData)));
+ EXPECT_TRUE(ReadData(&reader, buffer.get()));
EXPECT_EQ(base::StringPiece(kData, arraysize(kData)),
- base::StringPiece(base_buffer->data(), base_buffer->size()));
+ base::StringPiece(buffer->data(), buffer->size()));
+}
+
+TEST_F(ArcContentFileSystemFileStreamReaderTest, ReadPipeWithOffset) {
+ constexpr size_t kOffset = 10;
+ ArcContentFileSystemFileStreamReader reader(GURL(kArcUrlPipe), kOffset);
+ auto buffer =
+ make_scoped_refptr(new net::IOBufferWithSize(arraysize(kData) - kOffset));
+ EXPECT_TRUE(ReadData(&reader, buffer.get()));
+ EXPECT_EQ(base::StringPiece(kData + kOffset, arraysize(kData) - kOffset),
+ base::StringPiece(buffer->data(), buffer->size()));
}
TEST_F(ArcContentFileSystemFileStreamReaderTest, GetLength) {
- ArcContentFileSystemFileStreamReader reader(GURL(kArcUrl), 0);
+ ArcContentFileSystemFileStreamReader reader(GURL(kArcUrlFile), 0);
net::TestInt64CompletionCallback callback;
EXPECT_EQ(static_cast<int64_t>(arraysize(kData)),
« no previous file with comments | « chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698