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

Side by Side Diff: base/file_util_unittest.cc

Issue 20610004: Base: FileEnumerator should not follow reparse points. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Skip test for XP Created 7 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/files/file_enumerator_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <windows.h> 8 #include <windows.h>
9 #include <shellapi.h> 9 #include <shellapi.h>
10 #include <shlobj.h> 10 #include <shlobj.h>
(...skipping 12 matching lines...) Expand all
23 #include "base/files/scoped_temp_dir.h" 23 #include "base/files/scoped_temp_dir.h"
24 #include "base/path_service.h" 24 #include "base/path_service.h"
25 #include "base/strings/utf_string_conversions.h" 25 #include "base/strings/utf_string_conversions.h"
26 #include "base/test/test_file_util.h" 26 #include "base/test/test_file_util.h"
27 #include "base/threading/platform_thread.h" 27 #include "base/threading/platform_thread.h"
28 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "testing/platform_test.h" 29 #include "testing/platform_test.h"
30 30
31 #if defined(OS_WIN) 31 #if defined(OS_WIN)
32 #include "base/win/scoped_handle.h" 32 #include "base/win/scoped_handle.h"
33 #include "base/win/windows_version.h"
33 #endif 34 #endif
34 35
35 // This macro helps avoid wrapped lines in the test structs. 36 // This macro helps avoid wrapped lines in the test structs.
36 #define FPL(x) FILE_PATH_LITERAL(x) 37 #define FPL(x) FILE_PATH_LITERAL(x)
37 38
38 using base::DirectoryExists; 39 using base::DirectoryExists;
39 using base::FileEnumerator; 40 using base::FileEnumerator;
40 using base::FilePath; 41 using base::FilePath;
41 using base::PathIsWritable; 42 using base::PathIsWritable;
42 using base::TextContentsEqual; 43 using base::TextContentsEqual;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 bool DeleteReparsePoint(HANDLE source) { 110 bool DeleteReparsePoint(HANDLE source) {
110 DWORD returned; 111 DWORD returned;
111 REPARSE_DATA_BUFFER data = {0}; 112 REPARSE_DATA_BUFFER data = {0};
112 data.ReparseTag = 0xa0000003; 113 data.ReparseTag = 0xa0000003;
113 if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0, 114 if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0,
114 &returned, NULL)) { 115 &returned, NULL)) {
115 return false; 116 return false;
116 } 117 }
117 return true; 118 return true;
118 } 119 }
120
121 // Manages a reparse point for a test.
122 class ReparsePoint {
123 public:
124 // Creates a reparse point from |source| (an empty directory) to |target|.
125 ReparsePoint(const FilePath& source, const FilePath& target) {
126 dir_.Set(
127 ::CreateFile(source.value().c_str(),
128 FILE_ALL_ACCESS,
129 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
130 NULL,
131 OPEN_EXISTING,
132 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
133 NULL));
134 created_ = dir_.IsValid() && SetReparsePoint(dir_, target);
135 }
136
137 ~ReparsePoint() {
138 if (created_)
139 DeleteReparsePoint(dir_);
140 }
141
142 bool IsValid() { return created_; }
143
144 private:
145 base::win::ScopedHandle dir_;
146 bool created_;
147 DISALLOW_COPY_AND_ASSIGN(ReparsePoint);
148 };
149
119 #endif 150 #endif
120 151
121 #if defined(OS_POSIX) 152 #if defined(OS_POSIX)
122 // Provide a simple way to change the permissions bits on |path| in tests. 153 // Provide a simple way to change the permissions bits on |path| in tests.
123 // ASSERT failures will return, but not stop the test. Caller should wrap 154 // ASSERT failures will return, but not stop the test. Caller should wrap
124 // calls to this function in ASSERT_NO_FATAL_FAILURE(). 155 // calls to this function in ASSERT_NO_FATAL_FAILURE().
125 void ChangePosixFilePermissions(const FilePath& path, 156 void ChangePosixFilePermissions(const FilePath& path,
126 int mode_bits_to_set, 157 int mode_bits_to_set,
127 int mode_bits_to_clear) { 158 int mode_bits_to_clear) {
128 ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear) 159 ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 455
425 FilePath sub_long = deep_file.DirName(); 456 FilePath sub_long = deep_file.DirName();
426 ASSERT_TRUE(file_util::CreateDirectory(sub_long)); 457 ASSERT_TRUE(file_util::CreateDirectory(sub_long));
427 CreateTextFile(deep_file, bogus_content); 458 CreateTextFile(deep_file, bogus_content);
428 459
429 FilePath base_b = temp_dir_.path().Append(FPL("base_b")); 460 FilePath base_b = temp_dir_.path().Append(FPL("base_b"));
430 ASSERT_TRUE(file_util::CreateDirectory(base_b)); 461 ASSERT_TRUE(file_util::CreateDirectory(base_b));
431 462
432 FilePath to_sub_a = base_b.Append(FPL("to_sub_a")); 463 FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
433 ASSERT_TRUE(file_util::CreateDirectory(to_sub_a)); 464 ASSERT_TRUE(file_util::CreateDirectory(to_sub_a));
434 base::win::ScopedHandle reparse_to_sub_a( 465 FilePath normalized_path;
435 ::CreateFile(to_sub_a.value().c_str(), 466 {
436 FILE_ALL_ACCESS, 467 ReparsePoint reparse_to_sub_a(to_sub_a, sub_a);
437 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 468 ASSERT_TRUE(reparse_to_sub_a.IsValid());
438 NULL,
439 OPEN_EXISTING,
440 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
441 NULL));
442 ASSERT_TRUE(reparse_to_sub_a.IsValid());
443 ASSERT_TRUE(SetReparsePoint(reparse_to_sub_a, sub_a));
444 469
445 FilePath to_base_b = base_b.Append(FPL("to_base_b")); 470 FilePath to_base_b = base_b.Append(FPL("to_base_b"));
446 ASSERT_TRUE(file_util::CreateDirectory(to_base_b)); 471 ASSERT_TRUE(file_util::CreateDirectory(to_base_b));
447 base::win::ScopedHandle reparse_to_base_b( 472 ReparsePoint reparse_to_base_b(to_base_b, base_b);
448 ::CreateFile(to_base_b.value().c_str(), 473 ASSERT_TRUE(reparse_to_base_b.IsValid());
449 FILE_ALL_ACCESS,
450 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
451 NULL,
452 OPEN_EXISTING,
453 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
454 NULL));
455 ASSERT_TRUE(reparse_to_base_b.IsValid());
456 ASSERT_TRUE(SetReparsePoint(reparse_to_base_b, base_b));
457 474
458 FilePath to_sub_long = base_b.Append(FPL("to_sub_long")); 475 FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
459 ASSERT_TRUE(file_util::CreateDirectory(to_sub_long)); 476 ASSERT_TRUE(file_util::CreateDirectory(to_sub_long));
460 base::win::ScopedHandle reparse_to_sub_long( 477 ReparsePoint reparse_to_sub_long(to_sub_long, sub_long);
461 ::CreateFile(to_sub_long.value().c_str(), 478 ASSERT_TRUE(reparse_to_sub_long.IsValid());
462 FILE_ALL_ACCESS,
463 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
464 NULL,
465 OPEN_EXISTING,
466 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
467 NULL));
468 ASSERT_TRUE(reparse_to_sub_long.IsValid());
469 ASSERT_TRUE(SetReparsePoint(reparse_to_sub_long, sub_long));
470 479
471 // Normalize a junction free path: base_a\sub_a\file.txt . 480 // Normalize a junction free path: base_a\sub_a\file.txt .
472 FilePath normalized_path; 481 ASSERT_TRUE(file_util::NormalizeFilePath(file_txt, &normalized_path));
473 ASSERT_TRUE(file_util::NormalizeFilePath(file_txt, &normalized_path)); 482 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
474 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
475 483
476 // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude 484 // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
477 // the junction to_sub_a. 485 // the junction to_sub_a.
478 ASSERT_TRUE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")), 486 ASSERT_TRUE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
479 &normalized_path)); 487 &normalized_path));
480 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str()); 488 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
481 489
482 // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be 490 // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
483 // normalized to exclude junctions to_base_b and to_sub_a . 491 // normalized to exclude junctions to_base_b and to_sub_a .
484 ASSERT_TRUE(file_util::NormalizeFilePath(base_b.Append(FPL("to_base_b")) 492 ASSERT_TRUE(file_util::NormalizeFilePath(base_b.Append(FPL("to_base_b"))
485 .Append(FPL("to_base_b")) 493 .Append(FPL("to_base_b"))
486 .Append(FPL("to_sub_a")) 494 .Append(FPL("to_sub_a"))
487 .Append(FPL("file.txt")), 495 .Append(FPL("file.txt")),
488 &normalized_path)); 496 &normalized_path));
489 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str()); 497 ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
490 498
491 // A long enough path will cause NormalizeFilePath() to fail. Make a long 499 // A long enough path will cause NormalizeFilePath() to fail. Make a long
492 // path using to_base_b many times, and check that paths long enough to fail 500 // path using to_base_b many times, and check that paths long enough to fail
493 // do not cause a crash. 501 // do not cause a crash.
494 FilePath long_path = base_b; 502 FilePath long_path = base_b;
495 const int kLengthLimit = MAX_PATH + 200; 503 const int kLengthLimit = MAX_PATH + 200;
496 while (long_path.value().length() <= kLengthLimit) { 504 while (long_path.value().length() <= kLengthLimit) {
497 long_path = long_path.Append(FPL("to_base_b")); 505 long_path = long_path.Append(FPL("to_base_b"));
506 }
507 long_path = long_path.Append(FPL("to_sub_a"))
508 .Append(FPL("file.txt"));
509
510 ASSERT_FALSE(file_util::NormalizeFilePath(long_path, &normalized_path));
511
512 // Normalizing the junction to deep.txt should fail, because the expanded
513 // path to deep.txt is longer than MAX_PATH.
514 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_long.Append(deep_txt),
515 &normalized_path));
516
517 // Delete the reparse points, and see that NormalizeFilePath() fails
518 // to traverse them.
498 } 519 }
499 long_path = long_path.Append(FPL("to_sub_a"))
500 .Append(FPL("file.txt"));
501
502 ASSERT_FALSE(file_util::NormalizeFilePath(long_path, &normalized_path));
503
504 // Normalizing the junction to deep.txt should fail, because the expanded
505 // path to deep.txt is longer than MAX_PATH.
506 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_long.Append(deep_txt),
507 &normalized_path));
508
509 // Delete the reparse points, and see that NormalizeFilePath() fails
510 // to traverse them.
511 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_a));
512 ASSERT_TRUE(DeleteReparsePoint(reparse_to_base_b));
513 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_long));
514 520
515 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")), 521 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
516 &normalized_path)); 522 &normalized_path));
517 } 523 }
518 524
519 TEST_F(FileUtilTest, DevicePathToDriveLetter) { 525 TEST_F(FileUtilTest, DevicePathToDriveLetter) {
520 // Get a drive letter. 526 // Get a drive letter.
521 std::wstring real_drive_letter = temp_dir_.path().value().substr(0, 2); 527 std::wstring real_drive_letter = temp_dir_.path().value().substr(0, 2);
522 if (!isalpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) { 528 if (!isalpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) {
523 LOG(ERROR) << "Can't get a drive letter to test with."; 529 LOG(ERROR) << "Can't get a drive letter to test with.";
(...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1814 EXPECT_TRUE(base::PathExists(test_path)); 1820 EXPECT_TRUE(base::PathExists(test_path));
1815 EXPECT_FALSE(DirectoryExists(test_path)); 1821 EXPECT_FALSE(DirectoryExists(test_path));
1816 EXPECT_TRUE(base::DeleteFile(test_path, false)); 1822 EXPECT_TRUE(base::DeleteFile(test_path, false));
1817 1823
1818 EXPECT_TRUE(base::DeleteFile(test_root, true)); 1824 EXPECT_TRUE(base::DeleteFile(test_root, true));
1819 } 1825 }
1820 1826
1821 TEST_F(FileUtilTest, FileEnumeratorTest) { 1827 TEST_F(FileUtilTest, FileEnumeratorTest) {
1822 // Test an empty directory. 1828 // Test an empty directory.
1823 FileEnumerator f0(temp_dir_.path(), true, FILES_AND_DIRECTORIES); 1829 FileEnumerator f0(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1824 EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL("")); 1830 EXPECT_EQ(f0.Next().value(), FPL(""));
1825 EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL("")); 1831 EXPECT_EQ(f0.Next().value(), FPL(""));
1826 1832
1827 // Test an empty directory, non-recursively, including "..". 1833 // Test an empty directory, non-recursively, including "..".
1828 FileEnumerator f0_dotdot(temp_dir_.path(), false, 1834 FileEnumerator f0_dotdot(temp_dir_.path(), false,
1829 FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT); 1835 FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
1830 EXPECT_EQ(temp_dir_.path().Append(FILE_PATH_LITERAL("..")).value(), 1836 EXPECT_EQ(temp_dir_.path().Append(FPL("..")).value(),
1831 f0_dotdot.Next().value()); 1837 f0_dotdot.Next().value());
1832 EXPECT_EQ(FILE_PATH_LITERAL(""), 1838 EXPECT_EQ(FPL(""), f0_dotdot.Next().value());
1833 f0_dotdot.Next().value());
1834 1839
1835 // create the directories 1840 // create the directories
1836 FilePath dir1 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir1")); 1841 FilePath dir1 = temp_dir_.path().Append(FPL("dir1"));
1837 EXPECT_TRUE(file_util::CreateDirectory(dir1)); 1842 EXPECT_TRUE(file_util::CreateDirectory(dir1));
1838 FilePath dir2 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir2")); 1843 FilePath dir2 = temp_dir_.path().Append(FPL("dir2"));
1839 EXPECT_TRUE(file_util::CreateDirectory(dir2)); 1844 EXPECT_TRUE(file_util::CreateDirectory(dir2));
1840 FilePath dir2inner = dir2.Append(FILE_PATH_LITERAL("inner")); 1845 FilePath dir2inner = dir2.Append(FPL("inner"));
1841 EXPECT_TRUE(file_util::CreateDirectory(dir2inner)); 1846 EXPECT_TRUE(file_util::CreateDirectory(dir2inner));
1842 1847
1843 // create the files 1848 // create the files
1844 FilePath dir2file = dir2.Append(FILE_PATH_LITERAL("dir2file.txt")); 1849 FilePath dir2file = dir2.Append(FPL("dir2file.txt"));
1845 CreateTextFile(dir2file, std::wstring()); 1850 CreateTextFile(dir2file, std::wstring());
1846 FilePath dir2innerfile = dir2inner.Append(FILE_PATH_LITERAL("innerfile.txt")); 1851 FilePath dir2innerfile = dir2inner.Append(FPL("innerfile.txt"));
1847 CreateTextFile(dir2innerfile, std::wstring()); 1852 CreateTextFile(dir2innerfile, std::wstring());
1848 FilePath file1 = temp_dir_.path().Append(FILE_PATH_LITERAL("file1.txt")); 1853 FilePath file1 = temp_dir_.path().Append(FPL("file1.txt"));
1849 CreateTextFile(file1, std::wstring()); 1854 CreateTextFile(file1, std::wstring());
1850 FilePath file2_rel = dir2.Append(FilePath::kParentDirectory) 1855 FilePath file2_rel = dir2.Append(FilePath::kParentDirectory)
1851 .Append(FILE_PATH_LITERAL("file2.txt")); 1856 .Append(FPL("file2.txt"));
1852 CreateTextFile(file2_rel, std::wstring()); 1857 CreateTextFile(file2_rel, std::wstring());
1853 FilePath file2_abs = temp_dir_.path().Append(FILE_PATH_LITERAL("file2.txt")); 1858 FilePath file2_abs = temp_dir_.path().Append(FPL("file2.txt"));
1854 1859
1855 // Only enumerate files. 1860 // Only enumerate files.
1856 FileEnumerator f1(temp_dir_.path(), true, FileEnumerator::FILES); 1861 FileEnumerator f1(temp_dir_.path(), true, FileEnumerator::FILES);
1857 FindResultCollector c1(f1); 1862 FindResultCollector c1(f1);
1858 EXPECT_TRUE(c1.HasFile(file1)); 1863 EXPECT_TRUE(c1.HasFile(file1));
1859 EXPECT_TRUE(c1.HasFile(file2_abs)); 1864 EXPECT_TRUE(c1.HasFile(file2_abs));
1860 EXPECT_TRUE(c1.HasFile(dir2file)); 1865 EXPECT_TRUE(c1.HasFile(dir2file));
1861 EXPECT_TRUE(c1.HasFile(dir2innerfile)); 1866 EXPECT_TRUE(c1.HasFile(dir2innerfile));
1862 EXPECT_EQ(c1.size(), 4); 1867 EXPECT_EQ(c1.size(), 4);
1863 1868
(...skipping 13 matching lines...) Expand all
1877 EXPECT_TRUE(c2_non_recursive.HasFile(dir2)); 1882 EXPECT_TRUE(c2_non_recursive.HasFile(dir2));
1878 EXPECT_EQ(c2_non_recursive.size(), 2); 1883 EXPECT_EQ(c2_non_recursive.size(), 2);
1879 1884
1880 // Only enumerate directories, non-recursively, including "..". 1885 // Only enumerate directories, non-recursively, including "..".
1881 FileEnumerator f2_dotdot(temp_dir_.path(), false, 1886 FileEnumerator f2_dotdot(temp_dir_.path(), false,
1882 FileEnumerator::DIRECTORIES | 1887 FileEnumerator::DIRECTORIES |
1883 FileEnumerator::INCLUDE_DOT_DOT); 1888 FileEnumerator::INCLUDE_DOT_DOT);
1884 FindResultCollector c2_dotdot(f2_dotdot); 1889 FindResultCollector c2_dotdot(f2_dotdot);
1885 EXPECT_TRUE(c2_dotdot.HasFile(dir1)); 1890 EXPECT_TRUE(c2_dotdot.HasFile(dir1));
1886 EXPECT_TRUE(c2_dotdot.HasFile(dir2)); 1891 EXPECT_TRUE(c2_dotdot.HasFile(dir2));
1887 EXPECT_TRUE(c2_dotdot.HasFile( 1892 EXPECT_TRUE(c2_dotdot.HasFile(temp_dir_.path().Append(FPL(".."))));
1888 temp_dir_.path().Append(FILE_PATH_LITERAL(".."))));
1889 EXPECT_EQ(c2_dotdot.size(), 3); 1893 EXPECT_EQ(c2_dotdot.size(), 3);
1890 1894
1891 // Enumerate files and directories. 1895 // Enumerate files and directories.
1892 FileEnumerator f3(temp_dir_.path(), true, FILES_AND_DIRECTORIES); 1896 FileEnumerator f3(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1893 FindResultCollector c3(f3); 1897 FindResultCollector c3(f3);
1894 EXPECT_TRUE(c3.HasFile(dir1)); 1898 EXPECT_TRUE(c3.HasFile(dir1));
1895 EXPECT_TRUE(c3.HasFile(dir2)); 1899 EXPECT_TRUE(c3.HasFile(dir2));
1896 EXPECT_TRUE(c3.HasFile(file1)); 1900 EXPECT_TRUE(c3.HasFile(file1));
1897 EXPECT_TRUE(c3.HasFile(file2_abs)); 1901 EXPECT_TRUE(c3.HasFile(file2_abs));
1898 EXPECT_TRUE(c3.HasFile(dir2file)); 1902 EXPECT_TRUE(c3.HasFile(dir2file));
1899 EXPECT_TRUE(c3.HasFile(dir2inner)); 1903 EXPECT_TRUE(c3.HasFile(dir2inner));
1900 EXPECT_TRUE(c3.HasFile(dir2innerfile)); 1904 EXPECT_TRUE(c3.HasFile(dir2innerfile));
1901 EXPECT_EQ(c3.size(), 7); 1905 EXPECT_EQ(c3.size(), 7);
1902 1906
1903 // Non-recursive operation. 1907 // Non-recursive operation.
1904 FileEnumerator f4(temp_dir_.path(), false, FILES_AND_DIRECTORIES); 1908 FileEnumerator f4(temp_dir_.path(), false, FILES_AND_DIRECTORIES);
1905 FindResultCollector c4(f4); 1909 FindResultCollector c4(f4);
1906 EXPECT_TRUE(c4.HasFile(dir2)); 1910 EXPECT_TRUE(c4.HasFile(dir2));
1907 EXPECT_TRUE(c4.HasFile(dir2)); 1911 EXPECT_TRUE(c4.HasFile(dir2));
1908 EXPECT_TRUE(c4.HasFile(file1)); 1912 EXPECT_TRUE(c4.HasFile(file1));
1909 EXPECT_TRUE(c4.HasFile(file2_abs)); 1913 EXPECT_TRUE(c4.HasFile(file2_abs));
1910 EXPECT_EQ(c4.size(), 4); 1914 EXPECT_EQ(c4.size(), 4);
1911 1915
1912 // Enumerate with a pattern. 1916 // Enumerate with a pattern.
1913 FileEnumerator f5(temp_dir_.path(), true, FILES_AND_DIRECTORIES, 1917 FileEnumerator f5(temp_dir_.path(), true, FILES_AND_DIRECTORIES, FPL("dir*"));
1914 FILE_PATH_LITERAL("dir*"));
1915 FindResultCollector c5(f5); 1918 FindResultCollector c5(f5);
1916 EXPECT_TRUE(c5.HasFile(dir1)); 1919 EXPECT_TRUE(c5.HasFile(dir1));
1917 EXPECT_TRUE(c5.HasFile(dir2)); 1920 EXPECT_TRUE(c5.HasFile(dir2));
1918 EXPECT_TRUE(c5.HasFile(dir2file)); 1921 EXPECT_TRUE(c5.HasFile(dir2file));
1919 EXPECT_TRUE(c5.HasFile(dir2inner)); 1922 EXPECT_TRUE(c5.HasFile(dir2inner));
1920 EXPECT_TRUE(c5.HasFile(dir2innerfile)); 1923 EXPECT_TRUE(c5.HasFile(dir2innerfile));
1921 EXPECT_EQ(c5.size(), 5); 1924 EXPECT_EQ(c5.size(), 5);
1922 1925
1926 #if defined(OS_WIN)
1927 {
1928 // Make dir1 point to dir2.
1929 ReparsePoint reparse_point(dir1, dir2);
1930 EXPECT_TRUE(reparse_point.IsValid());
1931
1932 if ((base::win::GetVersion() >= base::win::VERSION_VISTA)) {
1933 // There can be a delay for the enumeration code to see the change on
1934 // the file system so skip this test for XP.
1935 // Enumerate the reparse point.
1936 FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
1937 FindResultCollector c6(f6);
1938 FilePath inner2 = dir1.Append(FPL("inner"));
1939 EXPECT_TRUE(c6.HasFile(inner2));
1940 EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
1941 EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
1942 EXPECT_EQ(c6.size(), 3);
1943 }
1944
1945 // No changes for non recursive operation.
1946 FileEnumerator f7(temp_dir_.path(), false, FILES_AND_DIRECTORIES);
1947 FindResultCollector c7(f7);
1948 EXPECT_TRUE(c7.HasFile(dir2));
1949 EXPECT_TRUE(c7.HasFile(dir2));
1950 EXPECT_TRUE(c7.HasFile(file1));
1951 EXPECT_TRUE(c7.HasFile(file2_abs));
1952 EXPECT_EQ(c7.size(), 4);
1953
1954 // Should not enumerate inside dir1 when using recursion.
1955 FileEnumerator f8(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1956 FindResultCollector c8(f8);
1957 EXPECT_TRUE(c8.HasFile(dir1));
1958 EXPECT_TRUE(c8.HasFile(dir2));
1959 EXPECT_TRUE(c8.HasFile(file1));
1960 EXPECT_TRUE(c8.HasFile(file2_abs));
1961 EXPECT_TRUE(c8.HasFile(dir2file));
1962 EXPECT_TRUE(c8.HasFile(dir2inner));
1963 EXPECT_TRUE(c8.HasFile(dir2innerfile));
1964 EXPECT_EQ(c8.size(), 7);
1965 }
1966 #endif
1967
1923 // Make sure the destructor closes the find handle while in the middle of a 1968 // Make sure the destructor closes the find handle while in the middle of a
1924 // query to allow TearDown to delete the directory. 1969 // query to allow TearDown to delete the directory.
1925 FileEnumerator f6(temp_dir_.path(), true, FILES_AND_DIRECTORIES); 1970 FileEnumerator f9(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1926 EXPECT_FALSE(f6.Next().value().empty()); // Should have found something 1971 EXPECT_FALSE(f9.Next().value().empty()); // Should have found something
1927 // (we don't care what). 1972 // (we don't care what).
1928 } 1973 }
1929 1974
1930 TEST_F(FileUtilTest, AppendToFile) { 1975 TEST_F(FileUtilTest, AppendToFile) {
1931 FilePath data_dir = 1976 FilePath data_dir =
1932 temp_dir_.path().Append(FILE_PATH_LITERAL("FilePathTest")); 1977 temp_dir_.path().Append(FILE_PATH_LITERAL("FilePathTest"));
1933 1978
1934 // Create a fresh, empty copy of this directory. 1979 // Create a fresh, empty copy of this directory.
1935 if (base::PathExists(data_dir)) { 1980 if (base::PathExists(data_dir)) {
1936 ASSERT_TRUE(base::DeleteFile(data_dir, true)); 1981 ASSERT_TRUE(base::DeleteFile(data_dir, true));
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
2372 file_util::VerifyPathControlledByUser( 2417 file_util::VerifyPathControlledByUser(
2373 base_dir_, text_file_, uid_, ok_gids_)); 2418 base_dir_, text_file_, uid_, ok_gids_));
2374 EXPECT_TRUE( 2419 EXPECT_TRUE(
2375 file_util::VerifyPathControlledByUser( 2420 file_util::VerifyPathControlledByUser(
2376 sub_dir_, text_file_, uid_, ok_gids_)); 2421 sub_dir_, text_file_, uid_, ok_gids_));
2377 } 2422 }
2378 2423
2379 #endif // defined(OS_POSIX) 2424 #endif // defined(OS_POSIX)
2380 2425
2381 } // namespace 2426 } // namespace
OLDNEW
« no previous file with comments | « no previous file | base/files/file_enumerator_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698