|  | #include "common/platform/api/quiche_file_utils.h" | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "absl/algorithm/container.h" | 
|  | #include "absl/strings/str_cat.h" | 
|  | #include "absl/strings/strip.h" | 
|  | #include "absl/types/optional.h" | 
|  | #include "common/platform/api/quiche_test.h" | 
|  |  | 
|  | namespace quiche { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | using testing::UnorderedElementsAre; | 
|  | using testing::UnorderedElementsAreArray; | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, ReadFileContents) { | 
|  | std::string path = absl::StrCat(QuicheGetCommonSourcePath(), | 
|  | "/platform/api/testdir/testfile"); | 
|  | absl::optional<std::string> contents = ReadFileContents(path); | 
|  | ASSERT_TRUE(contents.has_value()); | 
|  | EXPECT_EQ(*contents, "This is a test file."); | 
|  | } | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, ReadFileContentsFileNotFound) { | 
|  | std::string path = | 
|  | absl::StrCat(QuicheGetCommonSourcePath(), | 
|  | "/platform/api/testdir/file-that-does-not-exist"); | 
|  | absl::optional<std::string> contents = ReadFileContents(path); | 
|  | EXPECT_FALSE(contents.has_value()); | 
|  | } | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, EnumerateDirectory) { | 
|  | std::string path = | 
|  | absl::StrCat(QuicheGetCommonSourcePath(), "/platform/api/testdir"); | 
|  | std::vector<std::string> dirs; | 
|  | std::vector<std::string> files; | 
|  | bool success = EnumerateDirectory(path, dirs, files); | 
|  | EXPECT_TRUE(success); | 
|  | EXPECT_THAT(files, UnorderedElementsAre("testfile", "README.md")); | 
|  | EXPECT_THAT(dirs, UnorderedElementsAre("a")); | 
|  | } | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, EnumerateDirectoryNoSuchDirectory) { | 
|  | std::string path = absl::StrCat(QuicheGetCommonSourcePath(), | 
|  | "/platform/api/testdir/no-such-directory"); | 
|  | std::vector<std::string> dirs; | 
|  | std::vector<std::string> files; | 
|  | bool success = EnumerateDirectory(path, dirs, files); | 
|  | EXPECT_FALSE(success); | 
|  | } | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, EnumerateDirectoryNotADirectory) { | 
|  | std::string path = absl::StrCat(QuicheGetCommonSourcePath(), | 
|  | "/platform/api/testdir/testfile"); | 
|  | std::vector<std::string> dirs; | 
|  | std::vector<std::string> files; | 
|  | bool success = EnumerateDirectory(path, dirs, files); | 
|  | EXPECT_FALSE(success); | 
|  | } | 
|  |  | 
|  | TEST(QuicheFileUtilsTest, EnumerateDirectoryRecursively) { | 
|  | std::vector<std::string> expected_paths = {"a/b/c/d/e", "a/subdir/testfile", | 
|  | "a/z", "testfile", "README.md"}; | 
|  |  | 
|  | std::string root_path = | 
|  | absl::StrCat(QuicheGetCommonSourcePath(), "/platform/api/testdir"); | 
|  | for (std::string& path : expected_paths) { | 
|  | // For Windows, use Windows path separators. | 
|  | if (JoinPath("a", "b") == "a\\b") { | 
|  | absl::c_replace(path, '/', '\\'); | 
|  | } | 
|  |  | 
|  | path = JoinPath(root_path, path); | 
|  | } | 
|  |  | 
|  | std::vector<std::string> files; | 
|  | bool success = EnumerateDirectoryRecursively(root_path, files); | 
|  | EXPECT_TRUE(success); | 
|  | EXPECT_THAT(files, UnorderedElementsAreArray(expected_paths)); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace quiche |