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

Side by Side Diff: base/file_util_unittest.cc

Issue 10756020: Add the methods to change and get a posix file permission to file_util. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fix Created 8 years, 5 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
« base/file_util_posix.cc ('K') | « base/file_util_posix.cc ('k') | no next file » | 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 data.ReparseTag = 0xa0000003; 104 data.ReparseTag = 0xa0000003;
105 if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0, 105 if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0,
106 &returned, NULL)) { 106 &returned, NULL)) {
107 return false; 107 return false;
108 } 108 }
109 return true; 109 return true;
110 } 110 }
111 #endif 111 #endif
112 112
113 #if defined(OS_POSIX) 113 #if defined(OS_POSIX)
114 // Provide a simple way to change the permissions bits on |path| in tests.
115 // ASSERT failures will return, but not stop the test. Caller should wrap
116 // calls to this function in ASSERT_NO_FATAL_FAILURE().
117 void ChangePosixFilePermissions(const FilePath& path, 114 void ChangePosixFilePermissions(const FilePath& path,
satorux1 2012/07/10 06:57:17 function comment is missing. maybe restore the ori
yoshiki 2012/07/10 18:51:36 Done.
118 mode_t mode_bits_to_set, 115 int mode_bits_to_set,
119 mode_t mode_bits_to_clear) { 116 int mode_bits_to_clear) {
120 ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear) 117 ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
121 << "Can't set and clear the same bits."; 118 << "Can't set and clear the same bits.";
122 119
123 struct stat stat_buf; 120 int mode = 0;
124 ASSERT_EQ(0, stat(path.value().c_str(), &stat_buf)); 121 ASSERT_TRUE(file_util::GetPosixFilePermissions(path, &mode));
125 122 mode |= mode_bits_to_set;
126 mode_t updated_mode_bits = stat_buf.st_mode; 123 mode &= ~mode_bits_to_clear;
127 updated_mode_bits |= mode_bits_to_set; 124 ASSERT_TRUE(file_util::SetPosixFilePermissions(path, mode));
128 updated_mode_bits &= ~mode_bits_to_clear;
129
130 ASSERT_EQ(0, chmod(path.value().c_str(), updated_mode_bits));
131 } 125 }
132 #endif // defined(OS_POSIX) 126 #endif // defined(OS_POSIX)
133 127
134 const wchar_t bogus_content[] = L"I'm cannon fodder."; 128 const wchar_t bogus_content[] = L"I'm cannon fodder.";
135 129
136 const file_util::FileEnumerator::FileType FILES_AND_DIRECTORIES = 130 const file_util::FileEnumerator::FileType FILES_AND_DIRECTORIES =
137 static_cast<file_util::FileEnumerator::FileType>( 131 static_cast<file_util::FileEnumerator::FileType>(
138 file_util::FileEnumerator::FILES | 132 file_util::FileEnumerator::FILES |
139 file_util::FileEnumerator::DIRECTORIES); 133 file_util::FileEnumerator::DIRECTORIES);
140 134
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from)) 654 ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
661 << "Failed to create directory symlink."; 655 << "Failed to create directory symlink.";
662 656
663 // Test failures. 657 // Test failures.
664 ASSERT_FALSE(file_util::CreateSymbolicLink(link_to, link_to)); 658 ASSERT_FALSE(file_util::CreateSymbolicLink(link_to, link_to));
665 ASSERT_FALSE(file_util::ReadSymbolicLink(link_to, &result)); 659 ASSERT_FALSE(file_util::ReadSymbolicLink(link_to, &result));
666 FilePath missing = temp_dir_.path().Append(FPL("missing")); 660 FilePath missing = temp_dir_.path().Append(FPL("missing"));
667 ASSERT_FALSE(file_util::ReadSymbolicLink(missing, &result)); 661 ASSERT_FALSE(file_util::ReadSymbolicLink(missing, &result));
668 } 662 }
669 663
670
671 // The following test of NormalizeFilePath() require that we create a symlink. 664 // The following test of NormalizeFilePath() require that we create a symlink.
672 // This can not be done on Windows before Vista. On Vista, creating a symlink 665 // This can not be done on Windows before Vista. On Vista, creating a symlink
673 // requires privilege "SeCreateSymbolicLinkPrivilege". 666 // requires privilege "SeCreateSymbolicLinkPrivilege".
674 // TODO(skerner): Investigate the possibility of giving base_unittests the 667 // TODO(skerner): Investigate the possibility of giving base_unittests the
675 // privileges required to create a symlink. 668 // privileges required to create a symlink.
676 TEST_F(FileUtilTest, NormalizeFilePathSymlinks) { 669 TEST_F(FileUtilTest, NormalizeFilePathSymlinks) {
677 FilePath normalized_path; 670 FilePath normalized_path;
678 671
679 // Link one file to another. 672 // Link one file to another.
680 FilePath link_from = temp_dir_.path().Append(FPL("from_file")); 673 FilePath link_from = temp_dir_.path().Append(FPL("from_file"));
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 CreateTextFile(file_name, bogus_content); 732 CreateTextFile(file_name, bogus_content);
740 ASSERT_TRUE(file_util::PathExists(file_name)); 733 ASSERT_TRUE(file_util::PathExists(file_name));
741 734
742 // Make sure it's deleted 735 // Make sure it's deleted
743 EXPECT_TRUE(file_util::Delete(file_name, true)); 736 EXPECT_TRUE(file_util::Delete(file_name, true));
744 EXPECT_FALSE(file_util::PathExists(file_name)); 737 EXPECT_FALSE(file_util::PathExists(file_name));
745 } 738 }
746 739
747 #if defined(OS_POSIX) 740 #if defined(OS_POSIX)
748 TEST_F(FileUtilTest, DeleteSymlinkToExistentFile) { 741 TEST_F(FileUtilTest, DeleteSymlinkToExistentFile) {
749 // Create a file 742 // Create a file.
750 FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteFile 2.txt")); 743 FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteFile 2.txt"));
751 CreateTextFile(file_name, bogus_content); 744 CreateTextFile(file_name, bogus_content);
752 ASSERT_TRUE(file_util::PathExists(file_name)); 745 ASSERT_TRUE(file_util::PathExists(file_name));
753 746
754 // Create a symlink to the file 747 // Create a symlink to the file.
755 FilePath file_link = temp_dir_.path().Append("file_link_2"); 748 FilePath file_link = temp_dir_.path().Append("file_link_2");
756 ASSERT_TRUE(file_util::CreateSymbolicLink(file_name, file_link)) 749 ASSERT_TRUE(file_util::CreateSymbolicLink(file_name, file_link))
757 << "Failed to create symlink."; 750 << "Failed to create symlink.";
758 751
759 // Delete the symbolic link 752 // Delete the symbolic link.
760 EXPECT_TRUE(file_util::Delete(file_link, false)); 753 EXPECT_TRUE(file_util::Delete(file_link, false));
761 754
762 // Make sure original file is not deleted 755 // Make sure original file is not deleted.
763 EXPECT_FALSE(file_util::PathExists(file_link)); 756 EXPECT_FALSE(file_util::PathExists(file_link));
764 EXPECT_TRUE(file_util::PathExists(file_name)); 757 EXPECT_TRUE(file_util::PathExists(file_name));
765 } 758 }
766 759
767 TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) { 760 TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) {
768 // Create a non-existent file path 761 // Create a non-existent file path.
769 FilePath non_existent = temp_dir_.path().Append(FPL("Test DeleteFile 3.txt")); 762 FilePath non_existent = temp_dir_.path().Append(FPL("Test DeleteFile 3.txt"));
770 EXPECT_FALSE(file_util::PathExists(non_existent)); 763 EXPECT_FALSE(file_util::PathExists(non_existent));
771 764
772 // Create a symlink to the non-existent file 765 // Create a symlink to the non-existent file.
773 FilePath file_link = temp_dir_.path().Append("file_link_3"); 766 FilePath file_link = temp_dir_.path().Append("file_link_3");
774 ASSERT_TRUE(file_util::CreateSymbolicLink(non_existent, file_link)) 767 ASSERT_TRUE(file_util::CreateSymbolicLink(non_existent, file_link))
775 << "Failed to create symlink."; 768 << "Failed to create symlink.";
776 769
777 // Make sure the symbolic link is exist 770 // Make sure the symbolic link is exist.
778 EXPECT_TRUE(file_util::IsLink(file_link)); 771 EXPECT_TRUE(file_util::IsLink(file_link));
779 EXPECT_FALSE(file_util::PathExists(file_link)); 772 EXPECT_FALSE(file_util::PathExists(file_link));
780 773
781 // Delete the symbolic link 774 // Delete the symbolic link.
782 EXPECT_TRUE(file_util::Delete(file_link, false)); 775 EXPECT_TRUE(file_util::Delete(file_link, false));
783 776
784 // Make sure the symbolic link is deleted 777 // Make sure the symbolic link is deleted.
785 EXPECT_FALSE(file_util::IsLink(file_link)); 778 EXPECT_FALSE(file_util::IsLink(file_link));
786 } 779 }
780
781 TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) {
782 // Create a file path.
783 FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt"));
784 EXPECT_FALSE(file_util::PathExists(file_name));
785
786 char buffer[] = "hello";
787 const std::string kData(buffer);
788
789 // Write file.
790 EXPECT_EQ(static_cast<int>(kData.length()),
791 file_util::WriteFile(file_name, kData.c_str(), kData.length()));
satorux1 2012/07/10 06:57:17 c_str() -> data(), as you don't need \0 at the end
yoshiki 2012/07/10 18:51:36 Done.
792 EXPECT_TRUE(file_util::PathExists(file_name));
793
794 // Make sure the file is readable.
795 int32 mode = 0;
796 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
797 EXPECT_TRUE(mode & file_util::FILE_PERMISSION_READ_BY_USER);
798
799 // Get rid of the read permission.
800 EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u));
801 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
802 EXPECT_FALSE(mode & file_util::FILE_PERMISSION_READ_BY_USER);
803 // Make sure the file can't be read.
804 EXPECT_EQ(-1, file_util::ReadFile(file_name, buffer, sizeof(buffer)));
805
806 // Give the read permission.
807 EXPECT_TRUE(file_util::SetPosixFilePermissions(
808 file_name,
809 file_util::FILE_PERMISSION_READ_BY_USER));
810 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
811 EXPECT_TRUE(mode & file_util::FILE_PERMISSION_READ_BY_USER);
812 // Make sure the file can be read.
813 EXPECT_EQ(static_cast<int>(kData.length()),
814 file_util::ReadFile(file_name, buffer, sizeof(buffer)));
815
816 // Delete the file.
817 EXPECT_TRUE(file_util::Delete(file_name, false));
818 EXPECT_FALSE(file_util::PathExists(file_name));
819 }
820
821 TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) {
822 // Create a file path.
823 FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt"));
824 EXPECT_FALSE(file_util::PathExists(file_name));
825
826 char buffer[] = "hello";
827 const std::string kData(buffer);
828
829 // Write file.
830 EXPECT_EQ(static_cast<int>(kData.length()),
831 file_util::WriteFile(file_name, kData.c_str(), kData.length()));
832 EXPECT_TRUE(file_util::PathExists(file_name));
833
834 // Make sure the file is writable.
835 int mode = 0;
836 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
837 EXPECT_TRUE(mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
838 EXPECT_TRUE(file_util::PathIsWritable(file_name));
839
840 // Get rid of the write permission.
841 EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u));
842 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
843 EXPECT_FALSE(mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
844 // Make sure the file can't be write.
845 EXPECT_EQ(-1,
846 file_util::WriteFile(file_name, kData.c_str(), kData.length()));
847 EXPECT_FALSE(file_util::PathIsWritable(file_name));
848
849 // Give read permission.
850 EXPECT_TRUE(file_util::SetPosixFilePermissions(
851 file_name,
852 file_util::FILE_PERMISSION_WRITE_BY_USER));
853 EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode));
854 EXPECT_TRUE(mode & file_util::FILE_PERMISSION_WRITE_BY_USER);
855 // Make sure the file can be write.
856 EXPECT_EQ(static_cast<int>(kData.length()),
857 file_util::WriteFile(file_name, kData.c_str(), kData.length()));
858 EXPECT_TRUE(file_util::PathIsWritable(file_name));
859
860 // Delete the file.
861 EXPECT_TRUE(file_util::Delete(file_name, false));
862 EXPECT_FALSE(file_util::PathExists(file_name));
863 }
864
865 TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) {
866 // Create a directory path.
867 FilePath subdir_path =
868 temp_dir_.path().Append(FPL("PermissionTest1"));
869 file_util::CreateDirectory(subdir_path);
870 ASSERT_TRUE(file_util::PathExists(subdir_path));
871
872 // Create a dummy file to enumerate.
873 FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt"));
874 EXPECT_FALSE(file_util::PathExists(file_name));
875 char buffer[] = "hello";
876 const std::string kData(buffer);
877 EXPECT_EQ(static_cast<int>(kData.length()),
878 file_util::WriteFile(file_name, kData.c_str(), kData.length()));
879 EXPECT_TRUE(file_util::PathExists(file_name));
880
881 // Make sure the directory has the all permissions.
882 int mode = 0;
883 EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
884 EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK,
885 mode & file_util::FILE_PERMISSION_USER_MASK);
886
887 // Get rid of the permissions from the directory.
888 EXPECT_TRUE(file_util::SetPosixFilePermissions(subdir_path, 0u));
889 EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
890 EXPECT_FALSE(mode & file_util::FILE_PERMISSION_USER_MASK);
891
892 // Make sure the file in the directory can't be enumerated.
893 file_util::FileEnumerator f1(subdir_path, true,
894 file_util::FileEnumerator::FILES);
895 EXPECT_TRUE(file_util::PathExists(subdir_path));
896 FindResultCollector c1(f1);
897 EXPECT_EQ(c1.size(), 0);
898 EXPECT_FALSE(file_util::GetPosixFilePermissions(file_name, &mode));
899
900 // Give the permissions to the directory.
901 EXPECT_TRUE(file_util::SetPosixFilePermissions(
902 subdir_path,
903 file_util::FILE_PERMISSION_USER_MASK));
904 EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode));
905 EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK,
906 mode & file_util::FILE_PERMISSION_USER_MASK);
907
908 // Make sure the file in the directory can be enumerated.
909 file_util::FileEnumerator f2(subdir_path, true,
910 file_util::FileEnumerator::FILES);
911 FindResultCollector c2(f2);
912 EXPECT_TRUE(c2.HasFile(file_name));
913 EXPECT_EQ(c2.size(), 1);
914
915 // Delete the file.
916 EXPECT_TRUE(file_util::Delete(subdir_path, true));
917 EXPECT_FALSE(file_util::PathExists(subdir_path));
918 }
919
787 #endif // defined(OS_POSIX) 920 #endif // defined(OS_POSIX)
788 921
789 #if defined(OS_WIN) 922 #if defined(OS_WIN)
790 // Tests that the Delete function works for wild cards, especially 923 // Tests that the Delete function works for wild cards, especially
791 // with the recursion flag. Also coincidentally tests PathExists. 924 // with the recursion flag. Also coincidentally tests PathExists.
792 // TODO(erikkay): see if anyone's actually using this feature of the API 925 // TODO(erikkay): see if anyone's actually using this feature of the API
793 TEST_F(FileUtilTest, DeleteWildCard) { 926 TEST_F(FileUtilTest, DeleteWildCard) {
794 // Create a file and a directory 927 // Create a file and a directory
795 FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteWildCard.txt")); 928 FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteWildCard.txt"));
796 CreateTextFile(file_name, bogus_content); 929 CreateTextFile(file_name, bogus_content);
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 uid_ = stat_buf.st_uid; 2123 uid_ = stat_buf.st_uid;
1991 ok_gids_.insert(stat_buf.st_gid); 2124 ok_gids_.insert(stat_buf.st_gid);
1992 bad_gids_.insert(stat_buf.st_gid + 1); 2125 bad_gids_.insert(stat_buf.st_gid + 1);
1993 2126
1994 ASSERT_EQ(uid_, getuid()); // This process should be the owner. 2127 ASSERT_EQ(uid_, getuid()); // This process should be the owner.
1995 2128
1996 // To ensure that umask settings do not cause the initial state 2129 // To ensure that umask settings do not cause the initial state
1997 // of permissions to be different from what we expect, explicitly 2130 // of permissions to be different from what we expect, explicitly
1998 // set permissions on the directories we create. 2131 // set permissions on the directories we create.
1999 // Make all files and directories non-world-writable. 2132 // Make all files and directories non-world-writable.
2000 mode_t enabled_permissions = 2133
2001 S_IRWXU | // User can read, write, traverse 2134 // Users and group can read, write, traverse
2002 S_IRWXG; // Group can read, write, traverse 2135 int enabled_permissions =
2003 mode_t disabled_permissions = 2136 file_util::FILE_PERMISSION_USER_MASK |
2004 S_IRWXO; // Other users can't read, write, traverse. 2137 file_util::FILE_PERMISSION_GROUP_MASK;
2138 // Other users can't read, write, traverse
2139 int disabled_permissions =
2140 file_util::FILE_PERMISSION_OTHERS_MASK;
2005 2141
2006 ASSERT_NO_FATAL_FAILURE( 2142 ASSERT_NO_FATAL_FAILURE(
2007 ChangePosixFilePermissions( 2143 ChangePosixFilePermissions(
2008 base_dir_, enabled_permissions, disabled_permissions)); 2144 base_dir_, enabled_permissions, disabled_permissions));
2009 ASSERT_NO_FATAL_FAILURE( 2145 ASSERT_NO_FATAL_FAILURE(
2010 ChangePosixFilePermissions( 2146 ChangePosixFilePermissions(
2011 sub_dir_, enabled_permissions, disabled_permissions)); 2147 sub_dir_, enabled_permissions, disabled_permissions));
2012 } 2148 }
2013 2149
2014 FilePath base_dir_; 2150 FilePath base_dir_;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
2318 file_util::VerifyPathControlledByUser( 2454 file_util::VerifyPathControlledByUser(
2319 base_dir_, text_file_, uid_, ok_gids_)); 2455 base_dir_, text_file_, uid_, ok_gids_));
2320 EXPECT_TRUE( 2456 EXPECT_TRUE(
2321 file_util::VerifyPathControlledByUser( 2457 file_util::VerifyPathControlledByUser(
2322 sub_dir_, text_file_, uid_, ok_gids_)); 2458 sub_dir_, text_file_, uid_, ok_gids_));
2323 } 2459 }
2324 2460
2325 #endif // defined(OS_POSIX) 2461 #endif // defined(OS_POSIX)
2326 2462
2327 } // namespace 2463 } // namespace
OLDNEW
« base/file_util_posix.cc ('K') | « base/file_util_posix.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698