| // Copyright 2015 The Android Open Source Project |
| // |
| // This software is licensed under the terms of the GNU General Public |
| // License version 2, as published by the Free Software Foundation, and |
| // may be copied, distributed, and modified under those terms. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| #include "android/utils/dirscanner.h" |
| |
| #include "android/base/files/PathUtils.h" |
| #include "android/base/misc/StringUtils.h" |
| #include "android/base/testing/TestTempDir.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include <algorithm> |
| |
| #include <fcntl.h> |
| #include <unistd.h> |
| |
| #define ARRAYLEN(x) (sizeof(x)/sizeof(x[0])) |
| |
| using android::base::TestTempDir; |
| using android::base::PathUtils; |
| |
| static void make_subfile(const std::string& dir, const char* file) { |
| std::string path = dir; |
| path.append("/"); |
| path.append(file); |
| int fd = ::open(path.c_str(), O_WRONLY|O_CREAT, 0755); |
| EXPECT_GE(fd, 0); |
| ::close(fd); |
| } |
| |
| TEST(DirScanner, scanEmptyDir) { |
| TestTempDir myDir("DirScannerTest"); |
| DirScanner* scanner = dirScanner_new(myDir.path()); |
| EXPECT_TRUE(scanner); |
| EXPECT_EQ(0, dirScanner_numEntries(scanner)); |
| EXPECT_FALSE(dirScanner_next(scanner)); |
| dirScanner_free(scanner); |
| } |
| |
| TEST(DirScanner, scanNormal) { |
| static const char* const kExpected[] = { |
| "fifth", "first", "fourth", "second", "sixth", "third" |
| }; |
| static const char* const kInput[] = { |
| "first", "second", "third", "fourth", "fifth", "sixth" |
| }; |
| const size_t kCount = ARRAYLEN(kInput); |
| |
| TestTempDir myDir("DirScannerTest"); |
| for (size_t n = 0; n < kCount; ++n) { |
| make_subfile(myDir.path(), kInput[n]); |
| } |
| |
| DirScanner* scanner = dirScanner_new(myDir.path()); |
| EXPECT_TRUE(scanner); |
| EXPECT_EQ(kCount, dirScanner_numEntries(scanner)); |
| |
| std::vector<std::string> entries; |
| for (;;) { |
| const char* entry = dirScanner_next(scanner); |
| if (!entry) { |
| break; |
| } |
| entries.push_back(std::string(entry)); |
| } |
| dirScanner_free(scanner); |
| |
| // There is no guarantee on the order of files returned by |
| // the file system, so sort them here to ensure consistent |
| // comparisons. |
| std::sort(entries.begin(), entries.end()); |
| |
| EXPECT_EQ(kCount, entries.size()); |
| for (size_t n = 0; n < kCount; ++n) { |
| EXPECT_STREQ(kExpected[n], entries[n].c_str()) << "#" << n; |
| } |
| } |
| |
| TEST(DirScanner, scanFull) { |
| static const char* const kExpected[] = { |
| "fifth", "first", "fourth", "second", "sixth", "third" |
| }; |
| static const char* const kInput[] = { |
| "first", "second", "third", "fourth", "fifth", "sixth" |
| }; |
| const size_t kCount = ARRAYLEN(kInput); |
| |
| TestTempDir myDir("DirScannerTest"); |
| for (size_t n = 0; n < kCount; ++n) { |
| make_subfile(myDir.path(), kInput[n]); |
| } |
| |
| DirScanner* scanner = dirScanner_new(myDir.path()); |
| EXPECT_TRUE(scanner); |
| EXPECT_EQ(kCount, dirScanner_numEntries(scanner)); |
| |
| std::vector<std::string> entries; |
| for (;;) { |
| const char* entry = dirScanner_nextFull(scanner); |
| if (!entry) { |
| break; |
| } |
| entries.push_back(std::string(entry)); |
| } |
| dirScanner_free(scanner); |
| |
| // There is no guarantee on the order of files returned by |
| // the file system, so sort them here to ensure consistent |
| // comparisons. |
| std::sort(entries.begin(), entries.end()); |
| |
| EXPECT_EQ(kCount, entries.size()); |
| for (size_t n = 0; n < kCount; ++n) { |
| std::string expected = |
| android::base::PathUtils::addTrailingDirSeparator( |
| std::string(myDir.path())); |
| expected += kExpected[n]; |
| EXPECT_STREQ(expected.c_str(), entries[n].c_str()) << "#" << n; |
| } |
| } |