| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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> |
| 11 #endif | 11 #endif |
| 12 | 12 |
| 13 #include <fstream> | 13 #include <fstream> |
| 14 #include <iostream> | 14 #include <iostream> |
| 15 #include <set> | 15 #include <set> |
| 16 | 16 |
| 17 #include "base/base_paths.h" | 17 #include "base/base_paths.h" |
| 18 #include "base/file_path.h" |
| 18 #include "base/file_util.h" | 19 #include "base/file_util.h" |
| 19 #include "base/logging.h" | 20 #include "base/logging.h" |
| 20 #include "base/path_service.h" | 21 #include "base/path_service.h" |
| 21 #include "base/platform_test.h" | 22 #include "base/platform_test.h" |
| 22 #include "base/string_util.h" | 23 #include "base/string_util.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| 27 // file_util winds up using autoreleased objects on the Mac, so this needs | 28 // file_util winds up using autoreleased objects on the Mac, so this needs |
| 28 // to be a PlatformTest | 29 // to be a PlatformTest |
| 29 class FileUtilTest : public PlatformTest { | 30 class FileUtilTest : public PlatformTest { |
| 30 protected: | 31 protected: |
| 31 virtual void SetUp() { | 32 virtual void SetUp() { |
| 32 PlatformTest::SetUp(); | 33 PlatformTest::SetUp(); |
| 33 // Name a subdirectory of the temp directory. | 34 // Name a subdirectory of the temp directory. |
| 34 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &test_dir_)); | 35 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &test_dir_)); |
| 35 file_util::AppendToPath(&test_dir_, L"FileUtilTest"); | 36 test_dir_ = test_dir_.Append(FILE_PATH_LITERAL("FileUtilTest")); |
| 36 | 37 |
| 37 // Create a fresh, empty copy of this directory. | 38 // Create a fresh, empty copy of this directory. |
| 38 file_util::Delete(test_dir_, true); | 39 file_util::Delete(test_dir_, true); |
| 39 file_util::CreateDirectory(test_dir_.c_str()); | 40 file_util::CreateDirectory(test_dir_); |
| 40 } | 41 } |
| 41 virtual void TearDown() { | 42 virtual void TearDown() { |
| 42 PlatformTest::TearDown(); | 43 PlatformTest::TearDown(); |
| 43 // Clean up test directory | 44 // Clean up test directory |
| 44 ASSERT_TRUE(file_util::Delete(test_dir_, true)); | 45 ASSERT_TRUE(file_util::Delete(test_dir_, true)); |
| 45 ASSERT_FALSE(file_util::PathExists(test_dir_)); | 46 ASSERT_FALSE(file_util::PathExists(test_dir_)); |
| 46 } | 47 } |
| 47 | 48 |
| 48 // the path to temporary directory used to contain the test operations | 49 // the path to temporary directory used to contain the test operations |
| 49 std::wstring test_dir_; | 50 FilePath test_dir_; |
| 50 }; | 51 }; |
| 51 | 52 |
| 52 // Collects all the results from the given file enumerator, and provides an | 53 // Collects all the results from the given file enumerator, and provides an |
| 53 // interface to query whether a given file is present. | 54 // interface to query whether a given file is present. |
| 54 class FindResultCollector { | 55 class FindResultCollector { |
| 55 public: | 56 public: |
| 56 FindResultCollector(file_util::FileEnumerator& enumerator) { | 57 FindResultCollector(file_util::FileEnumerator& enumerator) { |
| 57 std::wstring cur_file; | 58 std::wstring cur_file; |
| 58 while (!(cur_file = enumerator.Next()).empty()) { | 59 while (!(cur_file = enumerator.Next()).empty()) { |
| 60 FilePath::StringType path = FilePath::FromWStringHack(cur_file).value(); |
| 59 // The file should not be returned twice. | 61 // The file should not be returned twice. |
| 60 EXPECT_TRUE(files_.end() == files_.find(cur_file)) | 62 EXPECT_TRUE(files_.end() == files_.find(path)) |
| 61 << "Same file returned twice"; | 63 << "Same file returned twice"; |
| 62 | 64 |
| 63 // Save for later. | 65 // Save for later. |
| 64 files_.insert(cur_file); | 66 files_.insert(path); |
| 65 } | 67 } |
| 66 } | 68 } |
| 67 | 69 |
| 68 // Returns true if the enumerator found the file. | 70 // Returns true if the enumerator found the file. |
| 69 bool HasFile(const std::wstring& file) const { | 71 bool HasFile(const FilePath& file) const { |
| 70 return files_.find(file) != files_.end(); | 72 return files_.find(file.value()) != files_.end(); |
| 71 } | 73 } |
| 72 | 74 |
| 73 int size() { | 75 int size() { |
| 74 return static_cast<int>(files_.size()); | 76 return static_cast<int>(files_.size()); |
| 75 } | 77 } |
| 76 | 78 |
| 77 private: | 79 private: |
| 78 std::set<std::wstring> files_; | 80 std::set<FilePath::StringType> files_; |
| 79 }; | 81 }; |
| 80 | 82 |
| 81 // Simple function to dump some text into a new file. | 83 // Simple function to dump some text into a new file. |
| 82 void CreateTextFile(const std::wstring& filename, | 84 void CreateTextFile(const FilePath& filename, |
| 83 const std::wstring& contents) { | 85 const std::wstring& contents) { |
| 84 std::ofstream file; | 86 std::ofstream file; |
| 85 file.open(WideToUTF8(filename).c_str()); | 87 file.open(WideToUTF8(filename.ToWStringHack()).c_str()); |
| 86 ASSERT_TRUE(file.is_open()); | 88 ASSERT_TRUE(file.is_open()); |
| 87 file << contents; | 89 file << contents; |
| 88 file.close(); | 90 file.close(); |
| 89 } | 91 } |
| 90 | 92 |
| 91 // Simple function to take out some text from a file. | 93 // Simple function to take out some text from a file. |
| 92 std::wstring ReadTextFile(const std::wstring& filename) { | 94 std::wstring ReadTextFile(const FilePath& filename) { |
| 93 wchar_t contents[64]; | 95 wchar_t contents[64]; |
| 94 std::wifstream file; | 96 std::wifstream file; |
| 95 file.open(WideToUTF8(filename).c_str()); | 97 file.open(WideToUTF8(filename.ToWStringHack()).c_str()); |
| 96 EXPECT_TRUE(file.is_open()); | 98 EXPECT_TRUE(file.is_open()); |
| 97 file.getline(contents, 64); | 99 file.getline(contents, 64); |
| 98 file.close(); | 100 file.close(); |
| 99 return std::wstring(contents); | 101 return std::wstring(contents); |
| 100 } | 102 } |
| 101 | 103 |
| 102 #if defined(OS_WIN) | 104 #if defined(OS_WIN) |
| 103 uint64 FileTimeAsUint64(const FILETIME& ft) { | 105 uint64 FileTimeAsUint64(const FILETIME& ft) { |
| 104 ULARGE_INTEGER u; | 106 ULARGE_INTEGER u; |
| 105 u.LowPart = ft.dwLowDateTime; | 107 u.LowPart = ft.dwLowDateTime; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 const std::wstring parent = | 305 const std::wstring parent = |
| 304 file_util::GetDirectoryFromPath(dir.full_path); | 306 file_util::GetDirectoryFromPath(dir.full_path); |
| 305 EXPECT_EQ(dir.directory, parent); | 307 EXPECT_EQ(dir.directory, parent); |
| 306 } | 308 } |
| 307 } | 309 } |
| 308 | 310 |
| 309 // TODO(erikkay): implement | 311 // TODO(erikkay): implement |
| 310 #if defined OS_WIN | 312 #if defined OS_WIN |
| 311 TEST_F(FileUtilTest, CountFilesCreatedAfter) { | 313 TEST_F(FileUtilTest, CountFilesCreatedAfter) { |
| 312 // Create old file (that we don't want to count) | 314 // Create old file (that we don't want to count) |
| 313 std::wstring old_file_name = test_dir_; | 315 FilePath old_file_name = test_dir_.Append(L"Old File.txt"); |
| 314 file_util::AppendToPath(&old_file_name, L"Old File.txt"); | |
| 315 CreateTextFile(old_file_name, L"Just call me Mr. Creakybits"); | 316 CreateTextFile(old_file_name, L"Just call me Mr. Creakybits"); |
| 316 | 317 |
| 317 // Age to perfection | 318 // Age to perfection |
| 318 Sleep(100); | 319 Sleep(100); |
| 319 | 320 |
| 320 // Establish our cutoff time | 321 // Establish our cutoff time |
| 321 FILETIME test_start_time; | 322 FILETIME test_start_time; |
| 322 GetSystemTimeAsFileTime(&test_start_time); | 323 GetSystemTimeAsFileTime(&test_start_time); |
| 323 EXPECT_EQ(0, file_util::CountFilesCreatedAfter(test_dir_, test_start_time)); | 324 EXPECT_EQ(0, file_util::CountFilesCreatedAfter(test_dir_.value(), |
| 325 test_start_time)); |
| 324 | 326 |
| 325 // Create a new file (that we do want to count) | 327 // Create a new file (that we do want to count) |
| 326 std::wstring new_file_name = test_dir_; | 328 FilePath new_file_name = test_dir_.Append(L"New File.txt"); |
| 327 file_util::AppendToPath(&new_file_name, L"New File.txt"); | |
| 328 CreateTextFile(new_file_name, L"Waaaaaaaaaaaaaah."); | 329 CreateTextFile(new_file_name, L"Waaaaaaaaaaaaaah."); |
| 329 | 330 |
| 330 // We should see only the new file. | 331 // We should see only the new file. |
| 331 EXPECT_EQ(1, file_util::CountFilesCreatedAfter(test_dir_, test_start_time)); | 332 EXPECT_EQ(1, file_util::CountFilesCreatedAfter(test_dir_.value(), |
| 333 test_start_time)); |
| 332 | 334 |
| 333 // Delete new file, we should see no files after cutoff now | 335 // Delete new file, we should see no files after cutoff now |
| 334 EXPECT_TRUE(file_util::Delete(new_file_name, false)); | 336 EXPECT_TRUE(file_util::Delete(new_file_name, false)); |
| 335 EXPECT_EQ(0, file_util::CountFilesCreatedAfter(test_dir_, test_start_time)); | 337 EXPECT_EQ(0, file_util::CountFilesCreatedAfter(test_dir_.value(), |
| 338 test_start_time)); |
| 336 } | 339 } |
| 337 #endif | 340 #endif |
| 338 | 341 |
| 339 // Tests that the Delete function works as expected, especially | 342 // Tests that the Delete function works as expected, especially |
| 340 // the recursion flag. Also coincidentally tests PathExists. | 343 // the recursion flag. Also coincidentally tests PathExists. |
| 341 TEST_F(FileUtilTest, Delete) { | 344 TEST_F(FileUtilTest, Delete) { |
| 342 // Create a file | 345 // Create a file |
| 343 std::wstring file_name = test_dir_; | 346 FilePath file_name = test_dir_.Append(FILE_PATH_LITERAL("Test File.txt")); |
| 344 file_util::AppendToPath(&file_name, L"Test File.txt"); | |
| 345 CreateTextFile(file_name, L"I'm cannon fodder."); | 347 CreateTextFile(file_name, L"I'm cannon fodder."); |
| 346 | 348 |
| 347 ASSERT_TRUE(file_util::PathExists(file_name)); | 349 ASSERT_TRUE(file_util::PathExists(file_name)); |
| 348 | 350 |
| 349 std::wstring subdir_path = test_dir_; | 351 FilePath subdir_path = test_dir_.Append(FILE_PATH_LITERAL("Subdirectory")); |
| 350 file_util::AppendToPath(&subdir_path, L"Subdirectory"); | 352 file_util::CreateDirectory(subdir_path); |
| 351 file_util::CreateDirectory(subdir_path.c_str()); | |
| 352 | 353 |
| 353 ASSERT_TRUE(file_util::PathExists(subdir_path)); | 354 ASSERT_TRUE(file_util::PathExists(subdir_path)); |
| 354 | 355 |
| 355 std::wstring directory_contents = test_dir_; | 356 FilePath directory_contents = test_dir_; |
| 356 #if defined(OS_WIN) | 357 #if defined(OS_WIN) |
| 357 // TODO(erikkay): see if anyone's actually using this feature of the API | 358 // TODO(erikkay): see if anyone's actually using this feature of the API |
| 358 file_util::AppendToPath(&directory_contents, L"*"); | 359 directory_contents = directory_contents.Append(FILE_PATH_LITERAL("*")); |
| 359 | |
| 360 // Delete non-recursively and check that only the file is deleted | 360 // Delete non-recursively and check that only the file is deleted |
| 361 ASSERT_TRUE(file_util::Delete(directory_contents, false)); | 361 ASSERT_TRUE(file_util::Delete(directory_contents, false)); |
| 362 EXPECT_FALSE(file_util::PathExists(file_name)); | 362 EXPECT_FALSE(file_util::PathExists(file_name)); |
| 363 EXPECT_TRUE(file_util::PathExists(subdir_path)); | 363 EXPECT_TRUE(file_util::PathExists(subdir_path)); |
| 364 #endif | 364 #endif |
| 365 | 365 |
| 366 // Delete recursively and make sure all contents are deleted | 366 // Delete recursively and make sure all contents are deleted |
| 367 ASSERT_TRUE(file_util::Delete(directory_contents, true)); | 367 ASSERT_TRUE(file_util::Delete(directory_contents, true)); |
| 368 EXPECT_FALSE(file_util::PathExists(file_name)); | 368 EXPECT_FALSE(file_util::PathExists(file_name)); |
| 369 EXPECT_FALSE(file_util::PathExists(subdir_path)); | 369 EXPECT_FALSE(file_util::PathExists(subdir_path)); |
| 370 } | 370 } |
| 371 | 371 |
| 372 TEST_F(FileUtilTest, Move) { | 372 TEST_F(FileUtilTest, Move) { |
| 373 // Create a directory | 373 // Create a directory |
| 374 std::wstring dir_name_from(test_dir_); | 374 FilePath dir_name_from = |
| 375 file_util::AppendToPath(&dir_name_from, L"Move_From_Subdir"); | 375 test_dir_.Append(FILE_PATH_LITERAL("Move_From_Subdir")); |
| 376 file_util::CreateDirectory(dir_name_from.c_str()); | 376 file_util::CreateDirectory(dir_name_from); |
| 377 ASSERT_TRUE(file_util::PathExists(dir_name_from)); | 377 ASSERT_TRUE(file_util::PathExists(dir_name_from)); |
| 378 | 378 |
| 379 // Create a file under the directory | 379 // Create a file under the directory |
| 380 std::wstring file_name_from(dir_name_from); | 380 FilePath file_name_from = |
| 381 file_util::AppendToPath(&file_name_from, L"Move_Test_File.txt"); | 381 dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt")); |
| 382 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); | 382 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); |
| 383 ASSERT_TRUE(file_util::PathExists(file_name_from)); | 383 ASSERT_TRUE(file_util::PathExists(file_name_from)); |
| 384 | 384 |
| 385 // Move the directory | 385 // Move the directory |
| 386 std::wstring dir_name_to(test_dir_); | 386 FilePath dir_name_to = test_dir_.Append(FILE_PATH_LITERAL("Move_To_Subdir")); |
| 387 file_util::AppendToPath(&dir_name_to, L"Move_To_Subdir"); | 387 FilePath file_name_to = |
| 388 std::wstring file_name_to(dir_name_to); | 388 dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt")); |
| 389 file_util::AppendToPath(&file_name_to, L"Move_Test_File.txt"); | |
| 390 | 389 |
| 391 ASSERT_FALSE(file_util::PathExists(dir_name_to)); | 390 ASSERT_FALSE(file_util::PathExists(dir_name_to)); |
| 392 | 391 |
| 393 EXPECT_TRUE(file_util::Move(dir_name_from, dir_name_to)); | 392 EXPECT_TRUE(file_util::Move(dir_name_from, dir_name_to)); |
| 394 | 393 |
| 395 // Check everything has been moved. | 394 // Check everything has been moved. |
| 396 EXPECT_FALSE(file_util::PathExists(dir_name_from)); | 395 EXPECT_FALSE(file_util::PathExists(dir_name_from)); |
| 397 EXPECT_FALSE(file_util::PathExists(file_name_from)); | 396 EXPECT_FALSE(file_util::PathExists(file_name_from)); |
| 398 EXPECT_TRUE(file_util::PathExists(dir_name_to)); | 397 EXPECT_TRUE(file_util::PathExists(dir_name_to)); |
| 399 EXPECT_TRUE(file_util::PathExists(file_name_to)); | 398 EXPECT_TRUE(file_util::PathExists(file_name_to)); |
| 400 } | 399 } |
| 401 | 400 |
| 402 TEST_F(FileUtilTest, CopyDirectoryRecursively) { | 401 TEST_F(FileUtilTest, CopyDirectoryRecursively) { |
| 403 // Create a directory. | 402 // Create a directory. |
| 404 std::wstring dir_name_from(test_dir_); | 403 FilePath dir_name_from = |
| 405 file_util::AppendToPath(&dir_name_from, L"Copy_From_Subdir"); | 404 test_dir_.Append(FILE_PATH_LITERAL("Copy_From_Subdir")); |
| 406 file_util::CreateDirectory(dir_name_from.c_str()); | 405 file_util::CreateDirectory(dir_name_from); |
| 407 ASSERT_TRUE(file_util::PathExists(dir_name_from)); | 406 ASSERT_TRUE(file_util::PathExists(dir_name_from)); |
| 408 | 407 |
| 409 // Create a file under the directory. | 408 // Create a file under the directory. |
| 410 std::wstring file_name_from(dir_name_from); | 409 FilePath file_name_from = |
| 411 file_util::AppendToPath(&file_name_from, L"Copy_Test_File.txt"); | 410 dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 412 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); | 411 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); |
| 413 ASSERT_TRUE(file_util::PathExists(file_name_from)); | 412 ASSERT_TRUE(file_util::PathExists(file_name_from)); |
| 414 | 413 |
| 415 // Create a subdirectory. | 414 // Create a subdirectory. |
| 416 std::wstring subdir_name_from(dir_name_from); | 415 FilePath subdir_name_from = |
| 417 file_util::AppendToPath(&subdir_name_from, L"Subdir"); | 416 dir_name_from.Append(FILE_PATH_LITERAL("Subdir")); |
| 418 file_util::CreateDirectory(subdir_name_from.c_str()); | 417 file_util::CreateDirectory(subdir_name_from); |
| 419 ASSERT_TRUE(file_util::PathExists(subdir_name_from)); | 418 ASSERT_TRUE(file_util::PathExists(subdir_name_from)); |
| 420 | 419 |
| 421 // Create a file under the subdirectory. | 420 // Create a file under the subdirectory. |
| 422 std::wstring file_name2_from(subdir_name_from); | 421 FilePath file_name2_from = |
| 423 file_util::AppendToPath(&file_name2_from, L"Copy_Test_File.txt"); | 422 subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 424 CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle"); | 423 CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle"); |
| 425 ASSERT_TRUE(file_util::PathExists(file_name2_from)); | 424 ASSERT_TRUE(file_util::PathExists(file_name2_from)); |
| 426 | 425 |
| 427 // Copy the directory recursively. | 426 // Copy the directory recursively. |
| 428 std::wstring dir_name_to(test_dir_); | 427 FilePath dir_name_to = |
| 429 file_util::AppendToPath(&dir_name_to, L"Copy_To_Subdir"); | 428 test_dir_.Append(FILE_PATH_LITERAL("Copy_To_Subdir")); |
| 430 std::wstring file_name_to(dir_name_to); | 429 FilePath file_name_to = |
| 431 file_util::AppendToPath(&file_name_to, L"Copy_Test_File.txt"); | 430 dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 432 std::wstring subdir_name_to(dir_name_to); | 431 FilePath subdir_name_to = |
| 433 file_util::AppendToPath(&subdir_name_to, L"Subdir"); | 432 dir_name_to.Append(FILE_PATH_LITERAL("Subdir")); |
| 434 std::wstring file_name2_to(subdir_name_to); | 433 FilePath file_name2_to = |
| 435 file_util::AppendToPath(&file_name2_to, L"Copy_Test_File.txt"); | 434 subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 436 | 435 |
| 437 ASSERT_FALSE(file_util::PathExists(dir_name_to)); | 436 ASSERT_FALSE(file_util::PathExists(dir_name_to)); |
| 438 | 437 |
| 439 EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, true)); | 438 EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, true)); |
| 440 | 439 |
| 441 // Check everything has been copied. | 440 // Check everything has been copied. |
| 442 EXPECT_TRUE(file_util::PathExists(dir_name_from)); | 441 EXPECT_TRUE(file_util::PathExists(dir_name_from)); |
| 443 EXPECT_TRUE(file_util::PathExists(file_name_from)); | 442 EXPECT_TRUE(file_util::PathExists(file_name_from)); |
| 444 EXPECT_TRUE(file_util::PathExists(subdir_name_from)); | 443 EXPECT_TRUE(file_util::PathExists(subdir_name_from)); |
| 445 EXPECT_TRUE(file_util::PathExists(file_name2_from)); | 444 EXPECT_TRUE(file_util::PathExists(file_name2_from)); |
| 446 EXPECT_TRUE(file_util::PathExists(dir_name_to)); | 445 EXPECT_TRUE(file_util::PathExists(dir_name_to)); |
| 447 EXPECT_TRUE(file_util::PathExists(file_name_to)); | 446 EXPECT_TRUE(file_util::PathExists(file_name_to)); |
| 448 EXPECT_TRUE(file_util::PathExists(subdir_name_to)); | 447 EXPECT_TRUE(file_util::PathExists(subdir_name_to)); |
| 449 EXPECT_TRUE(file_util::PathExists(file_name2_to)); | 448 EXPECT_TRUE(file_util::PathExists(file_name2_to)); |
| 450 } | 449 } |
| 451 | 450 |
| 452 TEST_F(FileUtilTest, CopyDirectory) { | 451 TEST_F(FileUtilTest, CopyDirectory) { |
| 453 // Create a directory. | 452 // Create a directory. |
| 454 std::wstring dir_name_from(test_dir_); | 453 FilePath dir_name_from = |
| 455 file_util::AppendToPath(&dir_name_from, L"Copy_From_Subdir"); | 454 test_dir_.Append(FILE_PATH_LITERAL("Copy_From_Subdir")); |
| 456 file_util::CreateDirectory(dir_name_from.c_str()); | 455 file_util::CreateDirectory(dir_name_from); |
| 457 ASSERT_TRUE(file_util::PathExists(dir_name_from)); | 456 ASSERT_TRUE(file_util::PathExists(dir_name_from)); |
| 458 | 457 |
| 459 // Create a file under the directory. | 458 // Create a file under the directory. |
| 460 std::wstring file_name_from(dir_name_from); | 459 FilePath file_name_from = |
| 461 file_util::AppendToPath(&file_name_from, L"Copy_Test_File.txt"); | 460 dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 462 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); | 461 CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle"); |
| 463 ASSERT_TRUE(file_util::PathExists(file_name_from)); | 462 ASSERT_TRUE(file_util::PathExists(file_name_from)); |
| 464 | 463 |
| 465 // Create a subdirectory. | 464 // Create a subdirectory. |
| 466 std::wstring subdir_name_from(dir_name_from); | 465 FilePath subdir_name_from = |
| 467 file_util::AppendToPath(&subdir_name_from, L"Subdir"); | 466 dir_name_from.Append(FILE_PATH_LITERAL("Subdir")); |
| 468 file_util::CreateDirectory(subdir_name_from.c_str()); | 467 file_util::CreateDirectory(subdir_name_from); |
| 469 ASSERT_TRUE(file_util::PathExists(subdir_name_from)); | 468 ASSERT_TRUE(file_util::PathExists(subdir_name_from)); |
| 470 | 469 |
| 471 // Create a file under the subdirectory. | 470 // Create a file under the subdirectory. |
| 472 std::wstring file_name2_from(subdir_name_from); | 471 FilePath file_name2_from = |
| 473 file_util::AppendToPath(&file_name2_from, L"Copy_Test_File.txt"); | 472 subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 474 CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle"); | 473 CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle"); |
| 475 ASSERT_TRUE(file_util::PathExists(file_name2_from)); | 474 ASSERT_TRUE(file_util::PathExists(file_name2_from)); |
| 476 | 475 |
| 477 // Copy the directory not recursively. | 476 // Copy the directory not recursively. |
| 478 std::wstring dir_name_to(test_dir_); | 477 FilePath dir_name_to = |
| 479 file_util::AppendToPath(&dir_name_to, L"Copy_To_Subdir"); | 478 test_dir_.Append(FILE_PATH_LITERAL("Copy_To_Subdir")); |
| 480 std::wstring file_name_to(dir_name_to); | 479 FilePath file_name_to = |
| 481 file_util::AppendToPath(&file_name_to, L"Copy_Test_File.txt"); | 480 dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 482 std::wstring subdir_name_to(dir_name_to); | 481 FilePath subdir_name_to = |
| 483 file_util::AppendToPath(&subdir_name_to, L"Subdir"); | 482 dir_name_to.Append(FILE_PATH_LITERAL("Subdir")); |
| 484 | 483 |
| 485 ASSERT_FALSE(file_util::PathExists(dir_name_to)); | 484 ASSERT_FALSE(file_util::PathExists(dir_name_to)); |
| 486 | 485 |
| 487 EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, false)); | 486 EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, false)); |
| 488 | 487 |
| 489 // Check everything has been copied. | 488 // Check everything has been copied. |
| 490 EXPECT_TRUE(file_util::PathExists(dir_name_from)); | 489 EXPECT_TRUE(file_util::PathExists(dir_name_from)); |
| 491 EXPECT_TRUE(file_util::PathExists(file_name_from)); | 490 EXPECT_TRUE(file_util::PathExists(file_name_from)); |
| 492 EXPECT_TRUE(file_util::PathExists(subdir_name_from)); | 491 EXPECT_TRUE(file_util::PathExists(subdir_name_from)); |
| 493 EXPECT_TRUE(file_util::PathExists(file_name2_from)); | 492 EXPECT_TRUE(file_util::PathExists(file_name2_from)); |
| 494 EXPECT_TRUE(file_util::PathExists(dir_name_to)); | 493 EXPECT_TRUE(file_util::PathExists(dir_name_to)); |
| 495 EXPECT_TRUE(file_util::PathExists(file_name_to)); | 494 EXPECT_TRUE(file_util::PathExists(file_name_to)); |
| 496 EXPECT_FALSE(file_util::PathExists(subdir_name_to)); | 495 EXPECT_FALSE(file_util::PathExists(subdir_name_to)); |
| 497 } | 496 } |
| 498 | 497 |
| 499 TEST_F(FileUtilTest, CopyFile) { | 498 TEST_F(FileUtilTest, CopyFile) { |
| 500 // Create a directory | 499 // Create a directory |
| 501 std::wstring dir_name_from(test_dir_); | 500 FilePath dir_name_from = |
| 502 file_util::AppendToPath(&dir_name_from, L"Copy_From_Subdir"); | 501 test_dir_.Append(FILE_PATH_LITERAL("Copy_From_Subdir")); |
| 503 file_util::CreateDirectory(dir_name_from.c_str()); | 502 file_util::CreateDirectory(dir_name_from); |
| 504 ASSERT_TRUE(file_util::PathExists(dir_name_from)); | 503 ASSERT_TRUE(file_util::PathExists(dir_name_from)); |
| 505 | 504 |
| 506 // Create a file under the directory | 505 // Create a file under the directory |
| 507 std::wstring file_name_from(dir_name_from); | 506 FilePath file_name_from = |
| 508 file_util::AppendToPath(&file_name_from, L"Copy_Test_File.txt"); | 507 dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt")); |
| 509 const std::wstring file_contents(L"Gooooooooooooooooooooogle"); | 508 const std::wstring file_contents(L"Gooooooooooooooooooooogle"); |
| 510 CreateTextFile(file_name_from, file_contents); | 509 CreateTextFile(file_name_from, file_contents); |
| 511 ASSERT_TRUE(file_util::PathExists(file_name_from)); | 510 ASSERT_TRUE(file_util::PathExists(file_name_from)); |
| 512 | 511 |
| 513 // Copy the file. | 512 // Copy the file. |
| 514 std::wstring dest_file(dir_name_from); | 513 FilePath dest_file = dir_name_from.Append(FILE_PATH_LITERAL("DestFile.txt")); |
| 515 file_util::AppendToPath(&dest_file, L"DestFile.txt"); | |
| 516 ASSERT_TRUE(file_util::CopyFile(file_name_from, dest_file)); | 514 ASSERT_TRUE(file_util::CopyFile(file_name_from, dest_file)); |
| 517 | 515 |
| 518 // Copy the file to another location using '..' in the path. | 516 // Copy the file to another location using '..' in the path. |
| 519 std::wstring dest_file2(dir_name_from); | 517 std::wstring dest_file2(dir_name_from.ToWStringHack()); |
| 520 file_util::AppendToPath(&dest_file2, L".."); | 518 file_util::AppendToPath(&dest_file2, L".."); |
| 521 file_util::AppendToPath(&dest_file2, L"DestFile.txt"); | 519 file_util::AppendToPath(&dest_file2, L"DestFile.txt"); |
| 522 ASSERT_TRUE(file_util::CopyFile(file_name_from, dest_file2)); | 520 ASSERT_TRUE(file_util::CopyFile(file_name_from, |
| 523 std::wstring dest_file2_test(dir_name_from); | 521 FilePath::FromWStringHack(dest_file2))); |
| 522 std::wstring dest_file2_test(dir_name_from.ToWStringHack()); |
| 524 file_util::UpOneDirectory(&dest_file2_test); | 523 file_util::UpOneDirectory(&dest_file2_test); |
| 525 file_util::AppendToPath(&dest_file2_test, L"DestFile.txt"); | 524 file_util::AppendToPath(&dest_file2_test, L"DestFile.txt"); |
| 526 | 525 |
| 527 // Check everything has been copied. | 526 // Check everything has been copied. |
| 528 EXPECT_TRUE(file_util::PathExists(file_name_from)); | 527 EXPECT_TRUE(file_util::PathExists(file_name_from)); |
| 529 EXPECT_TRUE(file_util::PathExists(dest_file)); | 528 EXPECT_TRUE(file_util::PathExists(dest_file)); |
| 530 const std::wstring read_contents = ReadTextFile(dest_file); | 529 const std::wstring read_contents = ReadTextFile(dest_file); |
| 531 EXPECT_EQ(file_contents, read_contents); | 530 EXPECT_EQ(file_contents, read_contents); |
| 532 EXPECT_TRUE(file_util::PathExists(dest_file2_test)); | 531 EXPECT_TRUE(file_util::PathExists( |
| 533 EXPECT_TRUE(file_util::PathExists(dest_file2)); | 532 FilePath::FromWStringHack(dest_file2_test))); |
| 533 EXPECT_TRUE(file_util::PathExists(FilePath::FromWStringHack(dest_file2))); |
| 534 } | 534 } |
| 535 | 535 |
| 536 // TODO(erikkay): implement | 536 // TODO(erikkay): implement |
| 537 #if defined(OS_WIN) | 537 #if defined(OS_WIN) |
| 538 TEST_F(FileUtilTest, GetFileCreationLocalTime) { | 538 TEST_F(FileUtilTest, GetFileCreationLocalTime) { |
| 539 std::wstring file_name = test_dir_; | 539 FilePath file_name = test_dir_.Append(L"Test File.txt"); |
| 540 file_util::AppendToPath(&file_name, L"Test File.txt"); | |
| 541 | 540 |
| 542 SYSTEMTIME start_time; | 541 SYSTEMTIME start_time; |
| 543 GetLocalTime(&start_time); | 542 GetLocalTime(&start_time); |
| 544 Sleep(100); | 543 Sleep(100); |
| 545 CreateTextFile(file_name, L"New file!"); | 544 CreateTextFile(file_name, L"New file!"); |
| 546 Sleep(100); | 545 Sleep(100); |
| 547 SYSTEMTIME end_time; | 546 SYSTEMTIME end_time; |
| 548 GetLocalTime(&end_time); | 547 GetLocalTime(&end_time); |
| 549 | 548 |
| 550 SYSTEMTIME file_creation_time; | 549 SYSTEMTIME file_creation_time; |
| 551 file_util::GetFileCreationLocalTime(file_name, &file_creation_time); | 550 file_util::GetFileCreationLocalTime(file_name.value(), &file_creation_time); |
| 552 | 551 |
| 553 FILETIME start_filetime; | 552 FILETIME start_filetime; |
| 554 SystemTimeToFileTime(&start_time, &start_filetime); | 553 SystemTimeToFileTime(&start_time, &start_filetime); |
| 555 FILETIME end_filetime; | 554 FILETIME end_filetime; |
| 556 SystemTimeToFileTime(&end_time, &end_filetime); | 555 SystemTimeToFileTime(&end_time, &end_filetime); |
| 557 FILETIME file_creation_filetime; | 556 FILETIME file_creation_filetime; |
| 558 SystemTimeToFileTime(&file_creation_time, &file_creation_filetime); | 557 SystemTimeToFileTime(&file_creation_time, &file_creation_filetime); |
| 559 | 558 |
| 560 EXPECT_EQ(-1, CompareFileTime(&start_filetime, &file_creation_filetime)) << | 559 EXPECT_EQ(-1, CompareFileTime(&start_filetime, &file_creation_filetime)) << |
| 561 "start time: " << FileTimeAsUint64(start_filetime) << ", " << | 560 "start time: " << FileTimeAsUint64(start_filetime) << ", " << |
| 562 "creation time: " << FileTimeAsUint64(file_creation_filetime); | 561 "creation time: " << FileTimeAsUint64(file_creation_filetime); |
| 563 | 562 |
| 564 EXPECT_EQ(-1, CompareFileTime(&file_creation_filetime, &end_filetime)) << | 563 EXPECT_EQ(-1, CompareFileTime(&file_creation_filetime, &end_filetime)) << |
| 565 "creation time: " << FileTimeAsUint64(file_creation_filetime) << ", " << | 564 "creation time: " << FileTimeAsUint64(file_creation_filetime) << ", " << |
| 566 "end time: " << FileTimeAsUint64(end_filetime); | 565 "end time: " << FileTimeAsUint64(end_filetime); |
| 567 | 566 |
| 568 ASSERT_TRUE(DeleteFile(file_name.c_str())); | 567 ASSERT_TRUE(DeleteFile(file_name.value().c_str())); |
| 569 } | 568 } |
| 570 #endif | 569 #endif |
| 571 | 570 |
| 572 // file_util winds up using autoreleased objects on the Mac, so this needs | 571 // file_util winds up using autoreleased objects on the Mac, so this needs |
| 573 // to be a PlatformTest | 572 // to be a PlatformTest. |
| 574 typedef PlatformTest ReadOnlyFileUtilTest; | 573 typedef PlatformTest ReadOnlyFileUtilTest; |
| 575 | 574 |
| 576 TEST_F(ReadOnlyFileUtilTest, ContentsEqual) { | 575 TEST_F(ReadOnlyFileUtilTest, ContentsEqual) { |
| 577 std::wstring data_dir; | 576 FilePath data_dir; |
| 578 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir)); | 577 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir)); |
| 579 file_util::AppendToPath(&data_dir, L"base"); | 578 data_dir = data_dir.Append(FILE_PATH_LITERAL("base")) |
| 580 file_util::AppendToPath(&data_dir, L"data"); | 579 .Append(FILE_PATH_LITERAL("data")) |
| 581 file_util::AppendToPath(&data_dir, L"file_util_unittest"); | 580 .Append(FILE_PATH_LITERAL("file_util_unittest")); |
| 582 ASSERT_TRUE(file_util::PathExists(data_dir)); | 581 ASSERT_TRUE(file_util::PathExists(data_dir)); |
| 583 | 582 |
| 584 std::wstring original_file = data_dir; | 583 FilePath original_file = |
| 585 file_util::AppendToPath(&original_file, L"original.txt"); | 584 data_dir.Append(FILE_PATH_LITERAL("original.txt")); |
| 586 std::wstring same_file = data_dir; | 585 FilePath same_file = |
| 587 file_util::AppendToPath(&same_file, L"same.txt"); | 586 data_dir.Append(FILE_PATH_LITERAL("same.txt")); |
| 588 std::wstring same_length_file = data_dir; | 587 FilePath same_length_file = |
| 589 file_util::AppendToPath(&same_length_file, L"same_length.txt"); | 588 data_dir.Append(FILE_PATH_LITERAL("same_length.txt")); |
| 590 std::wstring different_file = data_dir; | 589 FilePath different_file = |
| 591 file_util::AppendToPath(&different_file, L"different.txt"); | 590 data_dir.Append(FILE_PATH_LITERAL("different.txt")); |
| 592 std::wstring different_first_file = data_dir; | 591 FilePath different_first_file = |
| 593 file_util::AppendToPath(&different_first_file, L"different_first.txt"); | 592 data_dir.Append(FILE_PATH_LITERAL("different_first.txt")); |
| 594 std::wstring different_last_file = data_dir; | 593 FilePath different_last_file = |
| 595 file_util::AppendToPath(&different_last_file, L"different_last.txt"); | 594 data_dir.Append(FILE_PATH_LITERAL("different_last.txt")); |
| 596 std::wstring empty1_file = data_dir; | 595 FilePath empty1_file = |
| 597 file_util::AppendToPath(&empty1_file, L"empty1.txt"); | 596 data_dir.Append(FILE_PATH_LITERAL("empty1.txt")); |
| 598 std::wstring empty2_file = data_dir; | 597 FilePath empty2_file = |
| 599 file_util::AppendToPath(&empty2_file, L"empty2.txt"); | 598 data_dir.Append(FILE_PATH_LITERAL("empty2.txt")); |
| 600 std::wstring shortened_file = data_dir; | 599 FilePath shortened_file = |
| 601 file_util::AppendToPath(&shortened_file, L"shortened.txt"); | 600 data_dir.Append(FILE_PATH_LITERAL("shortened.txt")); |
| 602 std::wstring binary_file = data_dir; | 601 FilePath binary_file = |
| 603 file_util::AppendToPath(&binary_file, L"binary_file.bin"); | 602 data_dir.Append(FILE_PATH_LITERAL("binary_file.bin")); |
| 604 std::wstring binary_file_same = data_dir; | 603 FilePath binary_file_same = |
| 605 file_util::AppendToPath(&binary_file_same, L"binary_file_same.bin"); | 604 data_dir.Append(FILE_PATH_LITERAL("binary_file_same.bin")); |
| 606 std::wstring binary_file_diff = data_dir; | 605 FilePath binary_file_diff = |
| 607 file_util::AppendToPath(&binary_file_diff, L"binary_file_diff.bin"); | 606 data_dir.Append(FILE_PATH_LITERAL("binary_file_diff.bin")); |
| 608 | 607 |
| 609 EXPECT_TRUE(file_util::ContentsEqual(original_file, original_file)); | 608 EXPECT_TRUE(file_util::ContentsEqual(original_file, original_file)); |
| 610 EXPECT_TRUE(file_util::ContentsEqual(original_file, same_file)); | 609 EXPECT_TRUE(file_util::ContentsEqual(original_file, same_file)); |
| 611 EXPECT_FALSE(file_util::ContentsEqual(original_file, same_length_file)); | 610 EXPECT_FALSE(file_util::ContentsEqual(original_file, same_length_file)); |
| 612 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_file)); | 611 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_file)); |
| 613 EXPECT_FALSE(file_util::ContentsEqual(L"bogusname", L"bogusname")); | 612 EXPECT_FALSE(file_util::ContentsEqual(L"bogusname", L"bogusname")); |
| 614 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_first_file)); | 613 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_first_file)); |
| 615 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_last_file)); | 614 EXPECT_FALSE(file_util::ContentsEqual(original_file, different_last_file)); |
| 616 EXPECT_TRUE(file_util::ContentsEqual(empty1_file, empty2_file)); | 615 EXPECT_TRUE(file_util::ContentsEqual(empty1_file, empty2_file)); |
| 617 EXPECT_FALSE(file_util::ContentsEqual(original_file, shortened_file)); | 616 EXPECT_FALSE(file_util::ContentsEqual(original_file, shortened_file)); |
| 618 EXPECT_FALSE(file_util::ContentsEqual(shortened_file, original_file)); | 617 EXPECT_FALSE(file_util::ContentsEqual(shortened_file, original_file)); |
| 619 EXPECT_TRUE(file_util::ContentsEqual(binary_file, binary_file_same)); | 618 EXPECT_TRUE(file_util::ContentsEqual(binary_file, binary_file_same)); |
| 620 EXPECT_FALSE(file_util::ContentsEqual(binary_file, binary_file_diff)); | 619 EXPECT_FALSE(file_util::ContentsEqual(binary_file, binary_file_diff)); |
| 621 } | 620 } |
| 622 | 621 |
| 623 // We don't need equivalent functionality outside of Windows. | 622 // We don't need equivalent functionality outside of Windows. |
| 624 #if defined(OS_WIN) | 623 #if defined(OS_WIN) |
| 625 TEST_F(FileUtilTest, ResolveShortcutTest) { | 624 TEST_F(FileUtilTest, ResolveShortcutTest) { |
| 626 std::wstring target_file = test_dir_; | 625 FilePath target_file = test_dir_.Append(L"Target.txt"); |
| 627 file_util::AppendToPath(&target_file, L"Target.txt"); | |
| 628 CreateTextFile(target_file, L"This is the target."); | 626 CreateTextFile(target_file, L"This is the target."); |
| 629 | 627 |
| 630 std::wstring link_file = test_dir_; | 628 FilePath link_file = test_dir_.Append(L"Link.lnk"); |
| 631 file_util::AppendToPath(&link_file, L"Link.lnk"); | |
| 632 | 629 |
| 633 HRESULT result; | 630 HRESULT result; |
| 634 IShellLink *shell = NULL; | 631 IShellLink *shell = NULL; |
| 635 IPersistFile *persist = NULL; | 632 IPersistFile *persist = NULL; |
| 636 | 633 |
| 637 CoInitialize(NULL); | 634 CoInitialize(NULL); |
| 638 // Temporarily create a shortcut for test | 635 // Temporarily create a shortcut for test |
| 639 result = CoCreateInstance(CLSID_ShellLink, NULL, | 636 result = CoCreateInstance(CLSID_ShellLink, NULL, |
| 640 CLSCTX_INPROC_SERVER, IID_IShellLink, | 637 CLSCTX_INPROC_SERVER, IID_IShellLink, |
| 641 reinterpret_cast<LPVOID*>(&shell)); | 638 reinterpret_cast<LPVOID*>(&shell)); |
| 642 EXPECT_TRUE(SUCCEEDED(result)); | 639 EXPECT_TRUE(SUCCEEDED(result)); |
| 643 result = shell->QueryInterface(IID_IPersistFile, | 640 result = shell->QueryInterface(IID_IPersistFile, |
| 644 reinterpret_cast<LPVOID*>(&persist)); | 641 reinterpret_cast<LPVOID*>(&persist)); |
| 645 EXPECT_TRUE(SUCCEEDED(result)); | 642 EXPECT_TRUE(SUCCEEDED(result)); |
| 646 result = shell->SetPath(target_file.c_str()); | 643 result = shell->SetPath(target_file.value().c_str()); |
| 647 EXPECT_TRUE(SUCCEEDED(result)); | 644 EXPECT_TRUE(SUCCEEDED(result)); |
| 648 result = shell->SetDescription(L"ResolveShortcutTest"); | 645 result = shell->SetDescription(L"ResolveShortcutTest"); |
| 649 EXPECT_TRUE(SUCCEEDED(result)); | 646 EXPECT_TRUE(SUCCEEDED(result)); |
| 650 result = persist->Save(link_file.c_str(), TRUE); | 647 result = persist->Save(link_file.value().c_str(), TRUE); |
| 651 EXPECT_TRUE(SUCCEEDED(result)); | 648 EXPECT_TRUE(SUCCEEDED(result)); |
| 652 if (persist) | 649 if (persist) |
| 653 persist->Release(); | 650 persist->Release(); |
| 654 if (shell) | 651 if (shell) |
| 655 shell->Release(); | 652 shell->Release(); |
| 656 | 653 |
| 657 bool is_solved; | 654 bool is_solved; |
| 658 is_solved = file_util::ResolveShortcut(&link_file); | 655 std::wstring link_file_str = link_file.value(); |
| 656 is_solved = file_util::ResolveShortcut(&link_file_str); |
| 659 EXPECT_TRUE(is_solved); | 657 EXPECT_TRUE(is_solved); |
| 660 std::wstring contents; | 658 std::wstring contents; |
| 661 contents = ReadTextFile(link_file); | 659 contents = ReadTextFile(FilePath(link_file_str)); |
| 662 EXPECT_EQ(L"This is the target.", contents); | 660 EXPECT_EQ(L"This is the target.", contents); |
| 663 | 661 |
| 664 // Cleaning | 662 // Cleaning |
| 665 DeleteFile(target_file.c_str()); | 663 DeleteFile(target_file.value().c_str()); |
| 666 DeleteFile(link_file.c_str()); | 664 DeleteFile(link_file_str.c_str()); |
| 667 CoUninitialize(); | 665 CoUninitialize(); |
| 668 } | 666 } |
| 669 | 667 |
| 670 TEST_F(FileUtilTest, CreateShortcutTest) { | 668 TEST_F(FileUtilTest, CreateShortcutTest) { |
| 671 const wchar_t file_contents[] = L"This is another target."; | 669 const wchar_t file_contents[] = L"This is another target."; |
| 672 std::wstring target_file = test_dir_; | 670 FilePath target_file = test_dir_.Append(L"Target1.txt"); |
| 673 file_util::AppendToPath(&target_file, L"Target1.txt"); | |
| 674 CreateTextFile(target_file, file_contents); | 671 CreateTextFile(target_file, file_contents); |
| 675 | 672 |
| 676 std::wstring link_file = test_dir_; | 673 FilePath link_file = test_dir_.Append(L"Link1.lnk"); |
| 677 file_util::AppendToPath(&link_file, L"Link1.lnk"); | |
| 678 | 674 |
| 679 CoInitialize(NULL); | 675 CoInitialize(NULL); |
| 680 EXPECT_TRUE(file_util::CreateShortcutLink(target_file.c_str(), | 676 EXPECT_TRUE(file_util::CreateShortcutLink(target_file.value().c_str(), |
| 681 link_file.c_str(), | 677 link_file.value().c_str(), |
| 682 NULL, NULL, NULL, NULL, 0)); | 678 NULL, NULL, NULL, NULL, 0)); |
| 683 std::wstring resolved_name = link_file; | 679 std::wstring resolved_name = link_file.value(); |
| 684 EXPECT_TRUE(file_util::ResolveShortcut(&resolved_name)); | 680 EXPECT_TRUE(file_util::ResolveShortcut(&resolved_name)); |
| 685 std::wstring read_contents = ReadTextFile(resolved_name); | 681 std::wstring read_contents = ReadTextFile(FilePath(resolved_name)); |
| 686 EXPECT_EQ(file_contents, read_contents); | 682 EXPECT_EQ(file_contents, read_contents); |
| 687 | 683 |
| 688 DeleteFile(target_file.c_str()); | 684 DeleteFile(target_file.value().c_str()); |
| 689 DeleteFile(link_file.c_str()); | 685 DeleteFile(link_file.value().c_str()); |
| 690 CoUninitialize(); | 686 CoUninitialize(); |
| 691 } | 687 } |
| 692 #endif | 688 #endif |
| 693 | 689 |
| 694 TEST_F(FileUtilTest, CreateTemporaryFileNameTest) { | 690 TEST_F(FileUtilTest, CreateTemporaryFileNameTest) { |
| 695 std::wstring temp_file; | 691 std::wstring temp_file; |
| 696 file_util::CreateTemporaryFileName(&temp_file); | 692 file_util::CreateTemporaryFileName(&temp_file); |
| 697 EXPECT_TRUE(file_util::PathExists(temp_file)); | 693 EXPECT_TRUE(file_util::PathExists(temp_file)); |
| 698 EXPECT_TRUE(file_util::Delete(temp_file, false)); | 694 EXPECT_TRUE(file_util::Delete(temp_file, false)); |
| 699 } | 695 } |
| 700 | 696 |
| 701 TEST_F(FileUtilTest, CreateNewTempDirectoryTest) { | 697 TEST_F(FileUtilTest, CreateNewTempDirectoryTest) { |
| 702 std::wstring temp_dir; | 698 std::wstring temp_dir; |
| 703 file_util::CreateNewTempDirectory(std::wstring(), &temp_dir); | 699 file_util::CreateNewTempDirectory(std::wstring(), &temp_dir); |
| 704 EXPECT_TRUE(file_util::PathExists(temp_dir)); | 700 EXPECT_TRUE(file_util::PathExists(temp_dir)); |
| 705 EXPECT_TRUE(file_util::Delete(temp_dir, false)); | 701 EXPECT_TRUE(file_util::Delete(temp_dir, false)); |
| 706 } | 702 } |
| 707 | 703 |
| 708 TEST_F(FileUtilTest, CreateDirectoryTest) { | 704 TEST_F(FileUtilTest, CreateDirectoryTest) { |
| 709 std::wstring test_root = test_dir_; | 705 FilePath test_root = |
| 710 file_util::AppendToPath(&test_root, L"create_directory_test"); | 706 test_dir_.Append(FILE_PATH_LITERAL("create_directory_test")); |
| 711 std::wstring test_path(test_root); | |
| 712 #if defined(OS_WIN) | 707 #if defined(OS_WIN) |
| 713 file_util::AppendToPath(&test_path, L"dir\\tree\\likely\\doesnt\\exist\\"); | 708 FilePath test_path = |
| 709 test_root.Append(FILE_PATH_LITERAL("dir\\tree\\likely\\doesnt\\exist\\")); |
| 714 #elif defined(OS_POSIX) | 710 #elif defined(OS_POSIX) |
| 715 file_util::AppendToPath(&test_path, L"dir/tree/likely/doesnt/exist/"); | 711 FilePath test_path = |
| 712 test_root.Append(FILE_PATH_LITERAL("dir/tree/likely/doesnt/exist/")); |
| 716 #endif | 713 #endif |
| 717 | 714 |
| 718 EXPECT_FALSE(file_util::PathExists(test_path)); | 715 EXPECT_FALSE(file_util::PathExists(test_path)); |
| 719 EXPECT_TRUE(file_util::CreateDirectory(test_path)); | 716 EXPECT_TRUE(file_util::CreateDirectory(test_path)); |
| 720 EXPECT_TRUE(file_util::PathExists(test_path)); | 717 EXPECT_TRUE(file_util::PathExists(test_path)); |
| 721 // CreateDirectory returns true if the DirectoryExists returns true. | 718 // CreateDirectory returns true if the DirectoryExists returns true. |
| 722 EXPECT_TRUE(file_util::CreateDirectory(test_path)); | 719 EXPECT_TRUE(file_util::CreateDirectory(test_path)); |
| 723 | 720 |
| 724 // Doesn't work to create it on top of a non-dir | 721 // Doesn't work to create it on top of a non-dir |
| 725 file_util::AppendToPath(&test_path, L"foobar.txt"); | 722 test_path = test_path.Append(FILE_PATH_LITERAL("foobar.txt")); |
| 726 EXPECT_FALSE(file_util::PathExists(test_path)); | 723 EXPECT_FALSE(file_util::PathExists(test_path)); |
| 727 CreateTextFile(test_path, L"test file"); | 724 CreateTextFile(test_path, L"test file"); |
| 728 EXPECT_TRUE(file_util::PathExists(test_path)); | 725 EXPECT_TRUE(file_util::PathExists(test_path)); |
| 729 EXPECT_FALSE(file_util::CreateDirectory(test_path)); | 726 EXPECT_FALSE(file_util::CreateDirectory(test_path)); |
| 730 | 727 |
| 731 EXPECT_TRUE(file_util::Delete(test_root, true)); | 728 EXPECT_TRUE(file_util::Delete(test_root, true)); |
| 732 EXPECT_FALSE(file_util::PathExists(test_root)); | 729 EXPECT_FALSE(file_util::PathExists(test_root)); |
| 733 EXPECT_FALSE(file_util::PathExists(test_path)); | 730 EXPECT_FALSE(file_util::PathExists(test_path)); |
| 734 } | 731 } |
| 735 | 732 |
| 736 TEST_F(FileUtilTest, DetectDirectoryTest) { | 733 TEST_F(FileUtilTest, DetectDirectoryTest) { |
| 737 // Check a directory | 734 // Check a directory |
| 738 std::wstring test_root = test_dir_; | 735 FilePath test_root = |
| 739 file_util::AppendToPath(&test_root, L"detect_directory_test"); | 736 test_dir_.Append(FILE_PATH_LITERAL("detect_directory_test")); |
| 740 EXPECT_FALSE(file_util::PathExists(test_root)); | 737 EXPECT_FALSE(file_util::PathExists(test_root)); |
| 741 EXPECT_TRUE(file_util::CreateDirectory(test_root)); | 738 EXPECT_TRUE(file_util::CreateDirectory(test_root)); |
| 742 EXPECT_TRUE(file_util::PathExists(test_root)); | 739 EXPECT_TRUE(file_util::PathExists(test_root)); |
| 743 EXPECT_TRUE(file_util::DirectoryExists(test_root)); | 740 EXPECT_TRUE(file_util::DirectoryExists(test_root)); |
| 744 | 741 |
| 745 // Check a file | 742 // Check a file |
| 746 std::wstring test_path(test_root); | 743 FilePath test_path = |
| 747 file_util::AppendToPath(&test_path, L"foobar.txt"); | 744 test_root.Append(FILE_PATH_LITERAL("foobar.txt")); |
| 748 EXPECT_FALSE(file_util::PathExists(test_path)); | 745 EXPECT_FALSE(file_util::PathExists(test_path)); |
| 749 CreateTextFile(test_path, L"test file"); | 746 CreateTextFile(test_path, L"test file"); |
| 750 EXPECT_TRUE(file_util::PathExists(test_path)); | 747 EXPECT_TRUE(file_util::PathExists(test_path)); |
| 751 EXPECT_FALSE(file_util::DirectoryExists(test_path)); | 748 EXPECT_FALSE(file_util::DirectoryExists(test_path)); |
| 752 EXPECT_TRUE(file_util::Delete(test_path, false)); | 749 EXPECT_TRUE(file_util::Delete(test_path, false)); |
| 753 | 750 |
| 754 EXPECT_TRUE(file_util::Delete(test_root, true)); | 751 EXPECT_TRUE(file_util::Delete(test_root, true)); |
| 755 } | 752 } |
| 756 | 753 |
| 757 static const struct goodbad_pair { | 754 static const struct goodbad_pair { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 file_util::AppendToPath(&path, L"foo.bar"); | 823 file_util::AppendToPath(&path, L"foo.bar"); |
| 827 file_util::AppendToPath(&path, L"foo"); | 824 file_util::AppendToPath(&path, L"foo"); |
| 828 // '/foo.bar/foo' with extension '.baz' | 825 // '/foo.bar/foo' with extension '.baz' |
| 829 std::wstring result_path = path; | 826 std::wstring result_path = path; |
| 830 file_util::ReplaceExtension(&result_path, L".baz"); | 827 file_util::ReplaceExtension(&result_path, L".baz"); |
| 831 EXPECT_EQ(path + L".baz", result_path); | 828 EXPECT_EQ(path + L".baz", result_path); |
| 832 } | 829 } |
| 833 | 830 |
| 834 TEST_F(FileUtilTest, FileEnumeratorTest) { | 831 TEST_F(FileUtilTest, FileEnumeratorTest) { |
| 835 // Test an empty directory. | 832 // Test an empty directory. |
| 836 file_util::FileEnumerator f0(test_dir_, true, | 833 file_util::FileEnumerator f0(test_dir_.ToWStringHack(), true, |
| 837 file_util::FileEnumerator::FILES_AND_DIRECTORIES); | 834 file_util::FileEnumerator::FILES_AND_DIRECTORIES); |
| 838 EXPECT_EQ(f0.Next(), L""); | 835 EXPECT_EQ(f0.Next(), L""); |
| 839 EXPECT_EQ(f0.Next(), L""); | 836 EXPECT_EQ(f0.Next(), L""); |
| 840 | 837 |
| 841 // create the directories | 838 // create the directories |
| 842 std::wstring dir1 = test_dir_; | 839 FilePath dir1 = test_dir_.Append(FILE_PATH_LITERAL("dir1")); |
| 843 file_util::AppendToPath(&dir1, L"dir1"); | |
| 844 EXPECT_TRUE(file_util::CreateDirectory(dir1)); | 840 EXPECT_TRUE(file_util::CreateDirectory(dir1)); |
| 845 std::wstring dir2 = test_dir_; | 841 FilePath dir2 = test_dir_.Append(FILE_PATH_LITERAL("dir2")); |
| 846 file_util::AppendToPath(&dir2, L"dir2"); | |
| 847 EXPECT_TRUE(file_util::CreateDirectory(dir2)); | 842 EXPECT_TRUE(file_util::CreateDirectory(dir2)); |
| 848 std::wstring dir2inner = dir2; | 843 FilePath dir2inner = dir2.Append(FILE_PATH_LITERAL("inner")); |
| 849 file_util::AppendToPath(&dir2inner, L"inner"); | |
| 850 EXPECT_TRUE(file_util::CreateDirectory(dir2inner)); | 844 EXPECT_TRUE(file_util::CreateDirectory(dir2inner)); |
| 851 | 845 |
| 852 // create the files | 846 // create the files |
| 853 std::wstring dir2file = dir2; | 847 FilePath dir2file = dir2.Append(FILE_PATH_LITERAL("dir2file.txt")); |
| 854 file_util::AppendToPath(&dir2file, L"dir2file.txt"); | |
| 855 CreateTextFile(dir2file, L""); | 848 CreateTextFile(dir2file, L""); |
| 856 std::wstring dir2innerfile = dir2inner; | 849 FilePath dir2innerfile = dir2inner.Append(FILE_PATH_LITERAL("innerfile.txt")); |
| 857 file_util::AppendToPath(&dir2innerfile, L"innerfile.txt"); | |
| 858 CreateTextFile(dir2innerfile, L""); | 850 CreateTextFile(dir2innerfile, L""); |
| 859 std::wstring file1 = test_dir_; | 851 FilePath file1 = test_dir_.Append(FILE_PATH_LITERAL("file1.txt")); |
| 860 file_util::AppendToPath(&file1, L"file1.txt"); | |
| 861 CreateTextFile(file1, L""); | 852 CreateTextFile(file1, L""); |
| 862 std::wstring file2_rel = dir2; | 853 FilePath file2_rel = |
| 863 file_util::AppendToPath(&file2_rel, L".."); | 854 dir2.Append(FilePath::kParentDirectory) |
| 864 file_util::AppendToPath(&file2_rel, L"file2.txt"); | 855 .Append(FILE_PATH_LITERAL("file2.txt")); |
| 865 CreateTextFile(file2_rel, L""); | 856 CreateTextFile(file2_rel, L""); |
| 866 std::wstring file2_abs = test_dir_; | 857 FilePath file2_abs = test_dir_.Append(FILE_PATH_LITERAL("file2.txt")); |
| 867 file_util::AppendToPath(&file2_abs, L"file2.txt"); | |
| 868 | 858 |
| 869 // Only enumerate files. | 859 // Only enumerate files. |
| 870 file_util::FileEnumerator f1(test_dir_, true, | 860 file_util::FileEnumerator f1(test_dir_.ToWStringHack(), true, |
| 871 file_util::FileEnumerator::FILES); | 861 file_util::FileEnumerator::FILES); |
| 872 FindResultCollector c1(f1); | 862 FindResultCollector c1(f1); |
| 873 EXPECT_TRUE(c1.HasFile(file1)); | 863 EXPECT_TRUE(c1.HasFile(file1)); |
| 874 EXPECT_TRUE(c1.HasFile(file2_abs)); | 864 EXPECT_TRUE(c1.HasFile(file2_abs)); |
| 875 EXPECT_TRUE(c1.HasFile(dir2file)); | 865 EXPECT_TRUE(c1.HasFile(dir2file)); |
| 876 EXPECT_TRUE(c1.HasFile(dir2innerfile)); | 866 EXPECT_TRUE(c1.HasFile(dir2innerfile)); |
| 877 EXPECT_EQ(c1.size(), 4); | 867 EXPECT_EQ(c1.size(), 4); |
| 878 | 868 |
| 879 // Only enumerate directories. | 869 // Only enumerate directories. |
| 880 file_util::FileEnumerator f2(test_dir_, true, | 870 file_util::FileEnumerator f2(test_dir_.ToWStringHack(), true, |
| 881 file_util::FileEnumerator::DIRECTORIES); | 871 file_util::FileEnumerator::DIRECTORIES); |
| 882 FindResultCollector c2(f2); | 872 FindResultCollector c2(f2); |
| 883 EXPECT_TRUE(c2.HasFile(dir1)); | 873 EXPECT_TRUE(c2.HasFile(dir1)); |
| 884 EXPECT_TRUE(c2.HasFile(dir2)); | 874 EXPECT_TRUE(c2.HasFile(dir2)); |
| 885 EXPECT_TRUE(c2.HasFile(dir2inner)); | 875 EXPECT_TRUE(c2.HasFile(dir2inner)); |
| 886 EXPECT_EQ(c2.size(), 3); | 876 EXPECT_EQ(c2.size(), 3); |
| 887 | 877 |
| 888 // Only enumerate directories non-recursively. | 878 // Only enumerate directories non-recursively. |
| 889 file_util::FileEnumerator f2_non_recursive( | 879 file_util::FileEnumerator f2_non_recursive( |
| 890 test_dir_, false, file_util::FileEnumerator::DIRECTORIES); | 880 test_dir_.ToWStringHack(), false, file_util::FileEnumerator::DIRECTORIES); |
| 891 FindResultCollector c2_non_recursive(f2_non_recursive); | 881 FindResultCollector c2_non_recursive(f2_non_recursive); |
| 892 EXPECT_TRUE(c2_non_recursive.HasFile(dir1)); | 882 EXPECT_TRUE(c2_non_recursive.HasFile(dir1)); |
| 893 EXPECT_TRUE(c2_non_recursive.HasFile(dir2)); | 883 EXPECT_TRUE(c2_non_recursive.HasFile(dir2)); |
| 894 EXPECT_EQ(c2_non_recursive.size(), 2); | 884 EXPECT_EQ(c2_non_recursive.size(), 2); |
| 895 | 885 |
| 896 // Enumerate files and directories. | 886 // Enumerate files and directories. |
| 897 file_util::FileEnumerator f3(test_dir_, true, | 887 file_util::FileEnumerator f3(test_dir_.ToWStringHack(), true, |
| 898 file_util::FileEnumerator::FILES_AND_DIRECTORIES); | 888 file_util::FileEnumerator::FILES_AND_DIRECTORIES); |
| 899 FindResultCollector c3(f3); | 889 FindResultCollector c3(f3); |
| 900 EXPECT_TRUE(c3.HasFile(dir1)); | 890 EXPECT_TRUE(c3.HasFile(dir1)); |
| 901 EXPECT_TRUE(c3.HasFile(dir2)); | 891 EXPECT_TRUE(c3.HasFile(dir2)); |
| 902 EXPECT_TRUE(c3.HasFile(file1)); | 892 EXPECT_TRUE(c3.HasFile(file1)); |
| 903 EXPECT_TRUE(c3.HasFile(file2_abs)); | 893 EXPECT_TRUE(c3.HasFile(file2_abs)); |
| 904 EXPECT_TRUE(c3.HasFile(dir2file)); | 894 EXPECT_TRUE(c3.HasFile(dir2file)); |
| 905 EXPECT_TRUE(c3.HasFile(dir2inner)); | 895 EXPECT_TRUE(c3.HasFile(dir2inner)); |
| 906 EXPECT_TRUE(c3.HasFile(dir2innerfile)); | 896 EXPECT_TRUE(c3.HasFile(dir2innerfile)); |
| 907 EXPECT_EQ(c3.size(), 7); | 897 EXPECT_EQ(c3.size(), 7); |
| 908 | 898 |
| 909 // Non-recursive operation. | 899 // Non-recursive operation. |
| 910 file_util::FileEnumerator f4(test_dir_, false, | 900 file_util::FileEnumerator f4(test_dir_.ToWStringHack(), false, |
| 911 file_util::FileEnumerator::FILES_AND_DIRECTORIES); | 901 file_util::FileEnumerator::FILES_AND_DIRECTORIES); |
| 912 FindResultCollector c4(f4); | 902 FindResultCollector c4(f4); |
| 913 EXPECT_TRUE(c4.HasFile(dir2)); | 903 EXPECT_TRUE(c4.HasFile(dir2)); |
| 914 EXPECT_TRUE(c4.HasFile(dir2)); | 904 EXPECT_TRUE(c4.HasFile(dir2)); |
| 915 EXPECT_TRUE(c4.HasFile(file1)); | 905 EXPECT_TRUE(c4.HasFile(file1)); |
| 916 EXPECT_TRUE(c4.HasFile(file2_abs)); | 906 EXPECT_TRUE(c4.HasFile(file2_abs)); |
| 917 EXPECT_EQ(c4.size(), 4); | 907 EXPECT_EQ(c4.size(), 4); |
| 918 | 908 |
| 919 // Enumerate with a pattern. | 909 // Enumerate with a pattern. |
| 920 file_util::FileEnumerator f5(test_dir_, true, | 910 file_util::FileEnumerator f5(test_dir_.ToWStringHack(), true, |
| 921 file_util::FileEnumerator::FILES_AND_DIRECTORIES, L"dir*"); | 911 file_util::FileEnumerator::FILES_AND_DIRECTORIES, L"dir*"); |
| 922 FindResultCollector c5(f5); | 912 FindResultCollector c5(f5); |
| 923 EXPECT_TRUE(c5.HasFile(dir1)); | 913 EXPECT_TRUE(c5.HasFile(dir1)); |
| 924 EXPECT_TRUE(c5.HasFile(dir2)); | 914 EXPECT_TRUE(c5.HasFile(dir2)); |
| 925 EXPECT_TRUE(c5.HasFile(dir2file)); | 915 EXPECT_TRUE(c5.HasFile(dir2file)); |
| 926 EXPECT_TRUE(c5.HasFile(dir2inner)); | 916 EXPECT_TRUE(c5.HasFile(dir2inner)); |
| 927 EXPECT_TRUE(c5.HasFile(dir2innerfile)); | 917 EXPECT_TRUE(c5.HasFile(dir2innerfile)); |
| 928 EXPECT_EQ(c5.size(), 5); | 918 EXPECT_EQ(c5.size(), 5); |
| 929 | 919 |
| 930 // Make sure the destructor closes the find handle while in the middle of a | 920 // Make sure the destructor closes the find handle while in the middle of a |
| 931 // query to allow TearDown to delete the directory. | 921 // query to allow TearDown to delete the directory. |
| 932 file_util::FileEnumerator f6(test_dir_, true, | 922 file_util::FileEnumerator f6(test_dir_.ToWStringHack(), true, |
| 933 file_util::FileEnumerator::FILES_AND_DIRECTORIES); | 923 file_util::FileEnumerator::FILES_AND_DIRECTORIES); |
| 934 EXPECT_FALSE(f6.Next().empty()); // Should have found something | 924 EXPECT_FALSE(f6.Next().empty()); // Should have found something |
| 935 // (we don't care what). | 925 // (we don't care what). |
| 936 } | 926 } |
| 937 | 927 |
| 938 } // namespace | 928 } // namespace |
| OLD | NEW |