OLD | NEW |
1 // Copyright (c) 2011 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> |
11 #include <tchar.h> | 11 #include <tchar.h> |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 // Delete the reparse points, and see that NormalizeFilePath() fails | 573 // Delete the reparse points, and see that NormalizeFilePath() fails |
574 // to traverse them. | 574 // to traverse them. |
575 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_a)); | 575 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_a)); |
576 ASSERT_TRUE(DeleteReparsePoint(reparse_to_base_b)); | 576 ASSERT_TRUE(DeleteReparsePoint(reparse_to_base_b)); |
577 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_long)); | 577 ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_long)); |
578 | 578 |
579 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")), | 579 ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")), |
580 &normalized_path)); | 580 &normalized_path)); |
581 } | 581 } |
582 | 582 |
| 583 TEST_F(FileUtilTest, DevicePathToDriveLetter) { |
| 584 // Get a drive letter. |
| 585 std::wstring real_drive_letter = temp_dir_.path().value().substr(0, 2); |
| 586 if (!isalpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) { |
| 587 LOG(ERROR) << "Can't get a drive letter to test with."; |
| 588 return; |
| 589 } |
| 590 |
| 591 // Get the NT style path to that drive. |
| 592 wchar_t device_path[MAX_PATH] = {'\0'}; |
| 593 ASSERT_TRUE( |
| 594 ::QueryDosDevice(real_drive_letter.c_str(), device_path, MAX_PATH)); |
| 595 FilePath actual_device_path(device_path); |
| 596 FilePath win32_path; |
| 597 |
| 598 // Run DevicePathToDriveLetterPath() on the NT style path we got from |
| 599 // QueryDosDevice(). Expect the drive letter we started with. |
| 600 ASSERT_TRUE(file_util::DevicePathToDriveLetterPath(actual_device_path, |
| 601 &win32_path)); |
| 602 ASSERT_EQ(real_drive_letter, win32_path.value()); |
| 603 |
| 604 // Add some directories to the path. Expect those extra path componenets |
| 605 // to be preserved. |
| 606 FilePath kRelativePath(FPL("dir1\\dir2\\file.txt")); |
| 607 ASSERT_TRUE(file_util::DevicePathToDriveLetterPath( |
| 608 actual_device_path.Append(kRelativePath), |
| 609 &win32_path)); |
| 610 EXPECT_EQ(FilePath(real_drive_letter + L"\\").Append(kRelativePath).value(), |
| 611 win32_path.value()); |
| 612 |
| 613 // Deform the real path so that it is invalid by removing the last four |
| 614 // characters. The way windows names devices that are hard disks |
| 615 // (\Device\HardDiskVolume${NUMBER}) guarantees that the string is longer |
| 616 // than three characters. The only way the truncated string could be a |
| 617 // real drive is if more than 10^3 disks are mounted: |
| 618 // \Device\HardDiskVolume10000 would be truncated to \Device\HardDiskVolume1 |
| 619 // Check that DevicePathToDriveLetterPath fails. |
| 620 int path_length = actual_device_path.value().length(); |
| 621 int new_length = path_length - 4; |
| 622 ASSERT_LT(0, new_length); |
| 623 FilePath prefix_of_real_device_path( |
| 624 actual_device_path.value().substr(0, new_length)); |
| 625 ASSERT_FALSE(file_util::DevicePathToDriveLetterPath( |
| 626 prefix_of_real_device_path, |
| 627 &win32_path)); |
| 628 |
| 629 ASSERT_FALSE(file_util::DevicePathToDriveLetterPath( |
| 630 prefix_of_real_device_path.Append(kRelativePath), |
| 631 &win32_path)); |
| 632 |
| 633 // Deform the real path so that it is invalid by adding some characters. For |
| 634 // example, if C: maps to \Device\HardDiskVolume8, then we simulate a |
| 635 // request for the drive letter whose native path is |
| 636 // \Device\HardDiskVolume812345 . We assume such a device does not exist, |
| 637 // because drives are numbered in order and mounting 112345 hard disks will |
| 638 // never happen. |
| 639 const FilePath::StringType kExtraChars = FPL("12345"); |
| 640 |
| 641 FilePath real_device_path_plus_numbers( |
| 642 actual_device_path.value() + kExtraChars); |
| 643 |
| 644 ASSERT_FALSE(file_util::DevicePathToDriveLetterPath( |
| 645 real_device_path_plus_numbers, |
| 646 &win32_path)); |
| 647 |
| 648 ASSERT_FALSE(file_util::DevicePathToDriveLetterPath( |
| 649 real_device_path_plus_numbers.Append(kRelativePath), |
| 650 &win32_path)); |
| 651 } |
| 652 |
583 TEST_F(FileUtilTest, GetPlatformFileInfoForDirectory) { | 653 TEST_F(FileUtilTest, GetPlatformFileInfoForDirectory) { |
584 FilePath empty_dir = temp_dir_.path().Append(FPL("gpfi_test")); | 654 FilePath empty_dir = temp_dir_.path().Append(FPL("gpfi_test")); |
585 ASSERT_TRUE(file_util::CreateDirectory(empty_dir)); | 655 ASSERT_TRUE(file_util::CreateDirectory(empty_dir)); |
586 base::win::ScopedHandle dir( | 656 base::win::ScopedHandle dir( |
587 ::CreateFile(empty_dir.value().c_str(), | 657 ::CreateFile(empty_dir.value().c_str(), |
588 FILE_ALL_ACCESS, | 658 FILE_ALL_ACCESS, |
589 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, | 659 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
590 NULL, | 660 NULL, |
591 OPEN_EXISTING, | 661 OPEN_EXISTING, |
592 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory. | 662 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory. |
(...skipping 1623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2216 file_util::VerifyPathControlledByUser( | 2286 file_util::VerifyPathControlledByUser( |
2217 base_dir_, text_file_, uid_, ok_gids_)); | 2287 base_dir_, text_file_, uid_, ok_gids_)); |
2218 EXPECT_TRUE( | 2288 EXPECT_TRUE( |
2219 file_util::VerifyPathControlledByUser( | 2289 file_util::VerifyPathControlledByUser( |
2220 sub_dir_, text_file_, uid_, ok_gids_)); | 2290 sub_dir_, text_file_, uid_, ok_gids_)); |
2221 } | 2291 } |
2222 | 2292 |
2223 #endif // defined(OS_POSIX) | 2293 #endif // defined(OS_POSIX) |
2224 | 2294 |
2225 } // namespace | 2295 } // namespace |
OLD | NEW |