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

Unified Diff: base/files/file_enumerator_unittest.cc

Issue 2892173003: Add recursive pattern matching for subfolders in file_enumerator. (Closed)
Patch Set: Add recursive pattern matching for subfolders in file_enumerator Created 3 years, 6 months 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 | « base/files/file_enumerator_posix.cc ('k') | base/files/file_enumerator_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/files/file_enumerator_unittest.cc
diff --git a/base/files/file_enumerator_unittest.cc b/base/files/file_enumerator_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..5faa80f76110aea25498e46bf421231af9a88f08
--- /dev/null
+++ b/base/files/file_enumerator_unittest.cc
@@ -0,0 +1,312 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_enumerator.h"
+
+#include <deque>
+#include <utility>
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::ElementsAre;
+using testing::IsEmpty;
+using testing::UnorderedElementsAre;
+
+namespace base {
+namespace {
+
+const FilePath::StringType kEmptyPattern;
+
+const std::vector<FileEnumerator::FolderSearchPolicy> kFolderSearchPolicies{
+ FileEnumerator::FolderSearchPolicy::MATCH_ONLY,
+ FileEnumerator::FolderSearchPolicy::ALL};
+
+std::deque<FilePath> RunEnumerator(
+ const FilePath& root_path,
+ bool recursive,
+ int file_type,
+ const FilePath::StringType& pattern,
+ FileEnumerator::FolderSearchPolicy folder_search_policy) {
+ std::deque<FilePath> rv;
+ FileEnumerator enumerator(root_path, recursive, file_type, pattern,
+ folder_search_policy);
+ for (auto file = enumerator.Next(); !file.empty(); file = enumerator.Next())
+ rv.emplace_back(std::move(file));
+ return rv;
+}
+
+bool CreateDummyFile(const FilePath& path) {
+ return WriteFile(path, "42", sizeof("42")) == sizeof("42");
+}
+
+} // namespace
+
+TEST(FileEnumerator, NotExistingPath) {
+ const FilePath path = FilePath::FromUTF8Unsafe("some_not_existing_path");
+ ASSERT_FALSE(PathExists(path));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files = RunEnumerator(
+ path, true, FileEnumerator::FILES & FileEnumerator::DIRECTORIES,
+ FILE_PATH_LITERAL(""), policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, EmptyFolder) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files =
+ RunEnumerator(temp_dir.GetPath(), true,
+ FileEnumerator::FILES & FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, SingleFileInFolderForFileSearch) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+ const FilePath file = path.AppendASCII("test.txt");
+ ASSERT_TRUE(CreateDummyFile(file));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files = RunEnumerator(
+ temp_dir.GetPath(), true, FileEnumerator::FILES, kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(file));
+ }
+}
+
+TEST(FileEnumerator, SingleFileInFolderForDirSearch) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+ ASSERT_TRUE(CreateDummyFile(path.AppendASCII("test.txt")));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, SingleFileInFolderWithFiltering) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+ const FilePath file = path.AppendASCII("test.txt");
+ ASSERT_TRUE(CreateDummyFile(file));
+
+ for (auto policy : kFolderSearchPolicies) {
+ auto files = RunEnumerator(path, true, FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.txt"), policy);
+ EXPECT_THAT(files, ElementsAre(file));
+
+ files = RunEnumerator(path, true, FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.pdf"), policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, TwoFilesInFolder) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+ const FilePath foo_txt = path.AppendASCII("foo.txt");
+ const FilePath bar_txt = path.AppendASCII("bar.txt");
+ ASSERT_TRUE(CreateDummyFile(foo_txt));
+ ASSERT_TRUE(CreateDummyFile(bar_txt));
+
+ for (auto policy : kFolderSearchPolicies) {
+ auto files = RunEnumerator(path, true, FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.txt"), policy);
+ EXPECT_THAT(files, UnorderedElementsAre(foo_txt, bar_txt));
+
+ files = RunEnumerator(path, true, FileEnumerator::FILES,
+ FILE_PATH_LITERAL("foo*"), policy);
+ EXPECT_THAT(files, ElementsAre(foo_txt));
+
+ files = RunEnumerator(path, true, FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.pdf"), policy);
+ EXPECT_THAT(files, IsEmpty());
+
+ files =
+ RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
+ EXPECT_THAT(files, UnorderedElementsAre(foo_txt, bar_txt));
+ }
+}
+
+TEST(FileEnumerator, SingleFolderInFolderForFileSearch) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+
+ ScopedTempDir temp_subdir;
+ ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files =
+ RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, SingleFolderInFolderForDirSearch) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+
+ ScopedTempDir temp_subdir;
+ ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(temp_subdir.GetPath()));
+ }
+}
+
+TEST(FileEnumerator, TwoFoldersInFolder) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+
+ const FilePath subdir_foo = path.AppendASCII("foo");
+ const FilePath subdir_bar = path.AppendASCII("bar");
+ ASSERT_TRUE(CreateDirectory(subdir_foo));
+ ASSERT_TRUE(CreateDirectory(subdir_bar));
+
+ for (auto policy : kFolderSearchPolicies) {
+ auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, UnorderedElementsAre(subdir_foo, subdir_bar));
+
+ files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
+ FILE_PATH_LITERAL("foo"), policy);
+ EXPECT_THAT(files, ElementsAre(subdir_foo));
+ }
+}
+
+TEST(FileEnumerator, FolderAndFileInFolder) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+
+ ScopedTempDir temp_subdir;
+ ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
+ const FilePath file = path.AppendASCII("test.txt");
+ ASSERT_TRUE(CreateDummyFile(file));
+
+ for (auto policy : kFolderSearchPolicies) {
+ auto files =
+ RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(file));
+
+ files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(temp_subdir.GetPath()));
+
+ files = RunEnumerator(path, true,
+ FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, UnorderedElementsAre(file, temp_subdir.GetPath()));
+ }
+}
+
+TEST(FileEnumerator, FilesInParentFolderAlwaysFirst) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath& path = temp_dir.GetPath();
+
+ ScopedTempDir temp_subdir;
+ ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
+ const FilePath foo_txt = path.AppendASCII("foo.txt");
+ const FilePath bar_txt = temp_subdir.GetPath().AppendASCII("bar.txt");
+ ASSERT_TRUE(CreateDummyFile(foo_txt));
+ ASSERT_TRUE(CreateDummyFile(bar_txt));
+
+ for (auto policy : kFolderSearchPolicies) {
+ const auto files =
+ RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(foo_txt, bar_txt));
+ }
+}
+
+TEST(FileEnumerator, FileInSubfolder) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath subdir = temp_dir.GetPath().AppendASCII("subdir");
+ ASSERT_TRUE(CreateDirectory(subdir));
+
+ const FilePath file = subdir.AppendASCII("test.txt");
+ ASSERT_TRUE(CreateDummyFile(file));
+
+ for (auto policy : kFolderSearchPolicies) {
+ auto files = RunEnumerator(temp_dir.GetPath(), true, FileEnumerator::FILES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, ElementsAre(file));
+
+ files = RunEnumerator(temp_dir.GetPath(), false, FileEnumerator::FILES,
+ kEmptyPattern, policy);
+ EXPECT_THAT(files, IsEmpty());
+ }
+}
+
+TEST(FileEnumerator, FilesInSubfoldersWithFiltering) {
+ ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+ const FilePath test_txt = temp_dir.GetPath().AppendASCII("test.txt");
+ const FilePath subdir_foo = temp_dir.GetPath().AppendASCII("foo_subdir");
+ const FilePath subdir_bar = temp_dir.GetPath().AppendASCII("bar_subdir");
+ const FilePath foo_test = subdir_foo.AppendASCII("test.txt");
+ const FilePath foo_foo = subdir_foo.AppendASCII("foo.txt");
+ const FilePath foo_bar = subdir_foo.AppendASCII("bar.txt");
+ const FilePath bar_test = subdir_bar.AppendASCII("test.txt");
+ const FilePath bar_foo = subdir_bar.AppendASCII("foo.txt");
+ const FilePath bar_bar = subdir_bar.AppendASCII("bar.txt");
+ ASSERT_TRUE(CreateDummyFile(test_txt));
+ ASSERT_TRUE(CreateDirectory(subdir_foo));
+ ASSERT_TRUE(CreateDirectory(subdir_bar));
+ ASSERT_TRUE(CreateDummyFile(foo_test));
+ ASSERT_TRUE(CreateDummyFile(foo_foo));
+ ASSERT_TRUE(CreateDummyFile(foo_bar));
+ ASSERT_TRUE(CreateDummyFile(bar_test));
+ ASSERT_TRUE(CreateDummyFile(bar_foo));
+ ASSERT_TRUE(CreateDummyFile(bar_bar));
+
+ auto files =
+ RunEnumerator(temp_dir.GetPath(), true,
+ FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
+ FILE_PATH_LITERAL("foo*"),
+ FileEnumerator::FolderSearchPolicy::MATCH_ONLY);
+ EXPECT_THAT(files,
+ UnorderedElementsAre(subdir_foo, foo_test, foo_foo, foo_bar));
+
+ files = RunEnumerator(temp_dir.GetPath(), true,
+ FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
+ FILE_PATH_LITERAL("foo*"),
+ FileEnumerator::FolderSearchPolicy::ALL);
+ EXPECT_THAT(files, UnorderedElementsAre(subdir_foo, foo_foo, bar_foo));
+}
+
+} // namespace base
« no previous file with comments | « base/files/file_enumerator_posix.cc ('k') | base/files/file_enumerator_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698