1 #include "quiche/common/platform/api/quiche_file_utils.h"
2
3 #include <optional>
4 #include <vector>
5
6 #include "absl/algorithm/container.h"
7 #include "absl/strings/str_cat.h"
8 #include "absl/strings/strip.h"
9 #include "quiche/common/platform/api/quiche_test.h"
10
11 namespace quiche {
12 namespace test {
13 namespace {
14
15 using testing::UnorderedElementsAre;
16 using testing::UnorderedElementsAreArray;
17
TEST(QuicheFileUtilsTest,ReadFileContents)18 TEST(QuicheFileUtilsTest, ReadFileContents) {
19 std::string path = absl::StrCat(QuicheGetCommonSourcePath(),
20 "/platform/api/testdir/testfile");
21 std::optional<std::string> contents = ReadFileContents(path);
22 ASSERT_TRUE(contents.has_value());
23 EXPECT_EQ(*contents, "This is a test file.");
24 }
25
TEST(QuicheFileUtilsTest,ReadFileContentsFileNotFound)26 TEST(QuicheFileUtilsTest, ReadFileContentsFileNotFound) {
27 std::string path =
28 absl::StrCat(QuicheGetCommonSourcePath(),
29 "/platform/api/testdir/file-that-does-not-exist");
30 std::optional<std::string> contents = ReadFileContents(path);
31 EXPECT_FALSE(contents.has_value());
32 }
33
TEST(QuicheFileUtilsTest,EnumerateDirectory)34 TEST(QuicheFileUtilsTest, EnumerateDirectory) {
35 std::string path =
36 absl::StrCat(QuicheGetCommonSourcePath(), "/platform/api/testdir");
37 std::vector<std::string> dirs;
38 std::vector<std::string> files;
39 bool success = EnumerateDirectory(path, dirs, files);
40 EXPECT_TRUE(success);
41 EXPECT_THAT(files, UnorderedElementsAre("testfile", "README.md"));
42 EXPECT_THAT(dirs, UnorderedElementsAre("a"));
43 }
44
TEST(QuicheFileUtilsTest,EnumerateDirectoryNoSuchDirectory)45 TEST(QuicheFileUtilsTest, EnumerateDirectoryNoSuchDirectory) {
46 std::string path = absl::StrCat(QuicheGetCommonSourcePath(),
47 "/platform/api/testdir/no-such-directory");
48 std::vector<std::string> dirs;
49 std::vector<std::string> files;
50 bool success = EnumerateDirectory(path, dirs, files);
51 EXPECT_FALSE(success);
52 }
53
TEST(QuicheFileUtilsTest,EnumerateDirectoryNotADirectory)54 TEST(QuicheFileUtilsTest, EnumerateDirectoryNotADirectory) {
55 std::string path = absl::StrCat(QuicheGetCommonSourcePath(),
56 "/platform/api/testdir/testfile");
57 std::vector<std::string> dirs;
58 std::vector<std::string> files;
59 bool success = EnumerateDirectory(path, dirs, files);
60 EXPECT_FALSE(success);
61 }
62
TEST(QuicheFileUtilsTest,EnumerateDirectoryRecursively)63 TEST(QuicheFileUtilsTest, EnumerateDirectoryRecursively) {
64 std::vector<std::string> expected_paths = {"a/b/c/d/e", "a/subdir/testfile",
65 "a/z", "testfile", "README.md"};
66
67 std::string root_path =
68 absl::StrCat(QuicheGetCommonSourcePath(), "/platform/api/testdir");
69 for (std::string& path : expected_paths) {
70 // For Windows, use Windows path separators.
71 if (JoinPath("a", "b") == "a\\b") {
72 absl::c_replace(path, '/', '\\');
73 }
74
75 path = JoinPath(root_path, path);
76 }
77
78 std::vector<std::string> files;
79 bool success = EnumerateDirectoryRecursively(root_path, files);
80 EXPECT_TRUE(success);
81 EXPECT_THAT(files, UnorderedElementsAreArray(expected_paths));
82 }
83
84 } // namespace
85 } // namespace test
86 } // namespace quiche
87