From 6727eda33875601bcbab49e649efad19dfb74091 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 26 Sep 2018 16:25:35 -0700 Subject: [PATCH 1/2] Add GetFileSize to filesystem.h --- .../src/firebase/firestore/util/filesystem.h | 6 +++++ .../firestore/util/filesystem_posix.cc | 11 +++++++++ .../firestore/util/filesystem_test.cc | 24 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/Firestore/core/src/firebase/firestore/util/filesystem.h b/Firestore/core/src/firebase/firestore/util/filesystem.h index bef66137beb..19505de4032 100644 --- a/Firestore/core/src/firebase/firestore/util/filesystem.h +++ b/Firestore/core/src/firebase/firestore/util/filesystem.h @@ -72,6 +72,12 @@ Status RecursivelyDelete(const Path& path); */ Path TempDir(); +/** + * On success, sets `size` to be the size in bytes of the file specified by + * `path`. + */ +Status GetFileSize(const Path& path, off_t* size); + /** * Implements an iterator over the contents of a directory. Initializes to the * first entry in the directory. diff --git a/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc b/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc index 6d3048f45bf..eeeef84e520 100644 --- a/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc +++ b/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc @@ -95,6 +95,17 @@ Path TempDir() { } #endif // !defined(__APPLE__) +Status GetFileSize(const Path& path, off_t* size) { + struct stat st; + if (stat(path.c_str(), &st) == 0) { + *size = st.st_size; + return Status::OK(); + } else { + return Status::FromErrno( + errno, StringFormat("Failed to stat file: %s", path.ToUtf8String())); + } +} + namespace detail { Status CreateDir(const Path& path) { diff --git a/Firestore/core/test/firebase/firestore/util/filesystem_test.cc b/Firestore/core/test/firebase/firestore/util/filesystem_test.cc index 7dba108db0e..2f3e59b9a8e 100644 --- a/Firestore/core/test/firebase/firestore/util/filesystem_test.cc +++ b/Firestore/core/test/firebase/firestore/util/filesystem_test.cc @@ -45,6 +45,15 @@ static Path TestFilename() { return Path::FromUtf8("firestore-testing-" + CreateAutoId()); } +static void WriteBytesToFile(const Path& path, int byte_count) { + std::string bytes(byte_count, 'a'); + std::ofstream out{path.native_value()}; + ASSERT_TRUE(out.good()); + out << bytes; + out.close(); + ASSERT_TRUE(out.good()); +} + #define ASSERT_NOT_FOUND(expression) \ do { \ ASSERT_EQ(FirestoreErrorCode::NotFound, (expression).code()); \ @@ -236,6 +245,21 @@ TEST(FilesystemTest, RecursivelyDeletePreservesPeers) { EXPECT_OK(RecursivelyDelete(root_dir)); } +TEST(FilesystemTest, GetFileSize) { + Path file = Path::JoinUtf8(TempDir(), TestFilename()); + off_t size; + ASSERT_NOT_FOUND(GetFileSize(file, &size)); + Touch(file); + ASSERT_OK(GetFileSize(file, &size)); + ASSERT_EQ(0, size); + + WriteBytesToFile(file, 100); + ASSERT_OK(GetFileSize(file, &size)); + ASSERT_EQ(100, size); + + EXPECT_OK(RecursivelyDelete(file)); +} + } // namespace util } // namespace firestore } // namespace firebase From 5a7e2959ad72f179608937085001ca0c0b80b99a Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 1 Oct 2018 10:41:02 -0700 Subject: [PATCH 2/2] Switch to StatusOr, initialize struct, GetFileSize -> FileSize --- .../core/src/firebase/firestore/util/filesystem.h | 5 +++-- .../firebase/firestore/util/filesystem_posix.cc | 11 +++++------ .../firebase/firestore/util/filesystem_test.cc | 15 ++++++++------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Firestore/core/src/firebase/firestore/util/filesystem.h b/Firestore/core/src/firebase/firestore/util/filesystem.h index 19505de4032..fcbf51fc886 100644 --- a/Firestore/core/src/firebase/firestore/util/filesystem.h +++ b/Firestore/core/src/firebase/firestore/util/filesystem.h @@ -21,6 +21,7 @@ #include "Firestore/core/src/firebase/firestore/util/path.h" #include "Firestore/core/src/firebase/firestore/util/status.h" +#include "Firestore/core/src/firebase/firestore/util/statusor.h" namespace firebase { namespace firestore { @@ -73,10 +74,10 @@ Status RecursivelyDelete(const Path& path); Path TempDir(); /** - * On success, sets `size` to be the size in bytes of the file specified by + * On success, returns the size in bytes of the file specified by * `path`. */ -Status GetFileSize(const Path& path, off_t* size); +StatusOr FileSize(const Path& path); /** * Implements an iterator over the contents of a directory. Initializes to the diff --git a/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc b/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc index eeeef84e520..a8040cbd873 100644 --- a/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc +++ b/Firestore/core/src/firebase/firestore/util/filesystem_posix.cc @@ -95,14 +95,13 @@ Path TempDir() { } #endif // !defined(__APPLE__) -Status GetFileSize(const Path& path, off_t* size) { - struct stat st; +StatusOr FileSize(const Path& path) { + struct stat st {}; if (stat(path.c_str(), &st) == 0) { - *size = st.st_size; - return Status::OK(); + return StatusOr(st.st_size); } else { - return Status::FromErrno( - errno, StringFormat("Failed to stat file: %s", path.ToUtf8String())); + return StatusOr(Status::FromErrno( + errno, StringFormat("Failed to stat file: %s", path.ToUtf8String()))); } } diff --git a/Firestore/core/test/firebase/firestore/util/filesystem_test.cc b/Firestore/core/test/firebase/firestore/util/filesystem_test.cc index 2f3e59b9a8e..98b3924d1dd 100644 --- a/Firestore/core/test/firebase/firestore/util/filesystem_test.cc +++ b/Firestore/core/test/firebase/firestore/util/filesystem_test.cc @@ -245,17 +245,18 @@ TEST(FilesystemTest, RecursivelyDeletePreservesPeers) { EXPECT_OK(RecursivelyDelete(root_dir)); } -TEST(FilesystemTest, GetFileSize) { +TEST(FilesystemTest, FileSize) { Path file = Path::JoinUtf8(TempDir(), TestFilename()); - off_t size; - ASSERT_NOT_FOUND(GetFileSize(file, &size)); + ASSERT_NOT_FOUND(FileSize(file).status()); Touch(file); - ASSERT_OK(GetFileSize(file, &size)); - ASSERT_EQ(0, size); + StatusOr result = FileSize(file); + ASSERT_OK(result.status()); + ASSERT_EQ(0, result.ValueOrDie()); WriteBytesToFile(file, 100); - ASSERT_OK(GetFileSize(file, &size)); - ASSERT_EQ(100, size); + result = FileSize(file); + ASSERT_OK(result.status()); + ASSERT_EQ(100, result.ValueOrDie()); EXPECT_OK(RecursivelyDelete(file)); }