Index: base/file_util_unittest.cc |
diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc |
index 55f2039e4519d23183898a8b7bda990f1860ba6a..11ddc03a5ac3931959fd68eb2173594f33d49fe9 100644 |
--- a/base/file_util_unittest.cc |
+++ b/base/file_util_unittest.cc |
@@ -111,24 +111,6 @@ bool DeleteReparsePoint(HANDLE source) { |
#endif |
#if defined(OS_POSIX) |
-// Provide a simple way to change the permissions bits on |path| in tests. |
-// ASSERT failures will return, but not stop the test. Caller should wrap |
-// calls to this function in ASSERT_NO_FATAL_FAILURE(). |
-void ChangePosixFilePermissions(const FilePath& path, |
- mode_t mode_bits_to_set, |
- mode_t mode_bits_to_clear) { |
- ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear) |
- << "Can't set and clear the same bits."; |
- |
- struct stat stat_buf; |
- ASSERT_EQ(0, stat(path.value().c_str(), &stat_buf)); |
- |
- mode_t updated_mode_bits = stat_buf.st_mode; |
- updated_mode_bits |= mode_bits_to_set; |
- updated_mode_bits &= ~mode_bits_to_clear; |
- |
- ASSERT_EQ(0, chmod(path.value().c_str(), updated_mode_bits)); |
-} |
#endif // defined(OS_POSIX) |
const wchar_t bogus_content[] = L"I'm cannon fodder."; |
@@ -667,7 +649,6 @@ TEST_F(FileUtilTest, CreateAndReadSymlinks) { |
ASSERT_FALSE(file_util::ReadSymbolicLink(missing, &result)); |
} |
- |
// The following test of NormalizeFilePath() require that we create a symlink. |
// This can not be done on Windows before Vista. On Vista, creating a symlink |
// requires privilege "SeCreateSymbolicLinkPrivilege". |
@@ -784,6 +765,150 @@ TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) { |
// Make sure the symbolic link is deleted |
EXPECT_FALSE(file_util::IsLink(file_link)); |
} |
+ |
+TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) { |
+ // Create a file path |
+ FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt")); |
+ EXPECT_FALSE(file_util::PathExists(file_name)); |
+ |
+ char buffer[32] = "hello"; |
+ std::string data(buffer); |
+ |
+ // Write file |
+ EXPECT_EQ(static_cast<int>(data.length()), |
+ file_util::WriteFile(file_name, data.c_str(), data.length())); |
+ EXPECT_TRUE(file_util::PathExists(file_name)); |
+ |
+ // Meke sure the file is readable |
+ int32 mode; |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_READ_BY_USER, |
+ mode & file_util::FILE_PERMISSION_READ_BY_USER); |
+ |
+ // Get rid of the read permission |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_READ_BY_USER); |
+ // Make sure the file can't be read |
+ EXPECT_EQ(-1, file_util::ReadFile(file_name, buffer, sizeof(buffer))); |
+ |
+ // Give the read permission |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions( |
+ file_name, |
+ file_util::FILE_PERMISSION_READ_BY_USER)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_READ_BY_USER, |
+ mode & file_util::FILE_PERMISSION_READ_BY_USER); |
+ // Make sure the file can be read |
+ EXPECT_EQ(static_cast<int>(data.length()), |
+ file_util::ReadFile(file_name, buffer, sizeof(buffer))); |
+ |
+ // Delete the file |
+ EXPECT_TRUE(file_util::Delete(file_name, false)); |
+ EXPECT_FALSE(file_util::PathExists(file_name)); |
+} |
+ |
+TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) { |
+ // Create a file path |
+ FilePath file_name = temp_dir_.path().Append(FPL("Test Readable File.txt")); |
+ EXPECT_FALSE(file_util::PathExists(file_name)); |
+ |
+ char buffer[32] = "hello"; |
+ std::string data(buffer); |
+ |
+ // Write file |
+ EXPECT_EQ(static_cast<int>(data.length()), |
+ file_util::WriteFile(file_name, data.c_str(), data.length())); |
+ EXPECT_TRUE(file_util::PathExists(file_name)); |
+ |
+ // Meke sure the file is writable |
+ int mode; |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_WRITE_BY_USER, |
+ mode & file_util::FILE_PERMISSION_WRITE_BY_USER); |
+ EXPECT_TRUE(file_util::PathIsWritable(file_name)); |
+ |
+ // Get rid of the write permission |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions(file_name, 0u)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_WRITE_BY_USER); |
+ // Make sure the file can't be write |
+ EXPECT_EQ(-1, |
+ file_util::WriteFile(file_name, data.c_str(), data.length())); |
+ EXPECT_FALSE(file_util::PathIsWritable(file_name)); |
+ |
+ // Give read permission |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions( |
+ file_name, |
+ file_util::FILE_PERMISSION_WRITE_BY_USER)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_WRITE_BY_USER, |
+ mode & file_util::FILE_PERMISSION_WRITE_BY_USER); |
+ // Make sure the file can be write |
+ EXPECT_EQ(static_cast<int>(data.length()), |
+ file_util::WriteFile(file_name, data.c_str(), data.length())); |
+ EXPECT_TRUE(file_util::PathIsWritable(file_name)); |
+ |
+ // Delete the file |
+ EXPECT_TRUE(file_util::Delete(file_name, false)); |
+ EXPECT_FALSE(file_util::PathExists(file_name)); |
+} |
+ |
+TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) { |
+ // Create a directory path |
+ FilePath subdir_path = |
+ temp_dir_.path().Append(FPL("PermissionTest1")); |
+ file_util::CreateDirectory(subdir_path); |
+ ASSERT_TRUE(file_util::PathExists(subdir_path)); |
+ |
+ // Create a dummy file to enumerate |
+ FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt")); |
+ EXPECT_FALSE(file_util::PathExists(file_name)); |
+ char buffer[32] = "hello"; |
+ std::string data(buffer); |
+ EXPECT_EQ(static_cast<int>(data.length()), |
+ file_util::WriteFile(file_name, data.c_str(), data.length())); |
+ EXPECT_TRUE(file_util::PathExists(file_name)); |
+ |
+ // Meke sure the file is the all permissions |
+ int mode; |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK, |
+ mode & file_util::FILE_PERMISSION_USER_MASK); |
+ |
+ // Get rid of the permissions from the directory |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions(subdir_path, 0u)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode)); |
+ EXPECT_EQ(0, mode & file_util::FILE_PERMISSION_USER_MASK); |
+ |
+ // Make sure the file in the directory can't be enumerated. |
+ file_util::FileEnumerator f1(subdir_path, true, |
+ file_util::FileEnumerator::FILES); |
+ EXPECT_TRUE(file_util::PathExists(subdir_path)); |
+ FindResultCollector c1(f1); |
+ EXPECT_EQ(c1.size(), 0); |
+ EXPECT_FALSE(file_util::GetPosixFilePermissions(file_name, &mode)); |
+ |
+ // Give the permissions to the directory |
+ EXPECT_TRUE(file_util::SetPosixFilePermissions( |
+ subdir_path, |
+ file_util::FILE_PERMISSION_USER_MASK)); |
+ EXPECT_TRUE(file_util::GetPosixFilePermissions(subdir_path, &mode)); |
+ EXPECT_EQ(file_util::FILE_PERMISSION_USER_MASK, |
+ mode & file_util::FILE_PERMISSION_USER_MASK); |
+ |
+ // Make sure the file in the directory can be enumerated. |
+ file_util::FileEnumerator f2(subdir_path, true, |
+ file_util::FileEnumerator::FILES); |
+ FindResultCollector c2(f2); |
+ EXPECT_TRUE(c2.HasFile(file_name)); |
+ EXPECT_EQ(c2.size(), 1); |
+ |
+ // Delete the file |
+ EXPECT_TRUE(file_util::Delete(subdir_path, true)); |
+ EXPECT_FALSE(file_util::PathExists(subdir_path)); |
+} |
+ |
#endif // defined(OS_POSIX) |
#if defined(OS_WIN) |
@@ -1997,17 +2122,20 @@ class VerifyPathControlledByUserTest : public FileUtilTest { |
// of permissions to be different from what we expect, explicitly |
// set permissions on the directories we create. |
// Make all files and directories non-world-writable. |
- mode_t enabled_permissions = |
- S_IRWXU | // User can read, write, traverse |
- S_IRWXG; // Group can read, write, traverse |
- mode_t disabled_permissions = |
- S_IRWXO; // Other users can't read, write, traverse. |
- |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions( |
+ |
+ // Users and group can read, write, traverse |
+ int enabled_permissions = |
+ file_util::FILE_PERMISSION_USER_MASK | |
+ file_util::FILE_PERMISSION_GROUP_MASK; |
+ // Other users can't read, write, traverse |
+ int disabled_permissions = |
+ file_util::FILE_PERMISSION_OTHERS_MASK; |
+ |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions( |
base_dir_, enabled_permissions, disabled_permissions)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions( |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions( |
sub_dir_, enabled_permissions, disabled_permissions)); |
} |
@@ -2088,12 +2216,12 @@ TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) { |
uid_t bad_uid = uid_ + 1; |
// Make all files and directories non-world-writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util:: ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
// We control these paths. |
EXPECT_TRUE( |
@@ -2131,12 +2259,12 @@ TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) { |
TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) { |
// Make all files and directories writable only by their owner. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP)); |
// Any group is okay because the path is not group-writable. |
EXPECT_TRUE( |
@@ -2174,12 +2302,12 @@ TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) { |
// Make all files and directories writable by their group. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, S_IWGRP, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, S_IWGRP, 0u)); |
// Now |ok_gids_| works, but |bad_gids_| fails. |
EXPECT_TRUE( |
@@ -2224,12 +2352,12 @@ TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) { |
TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
// Make all files and directories non-world-writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
// Initialy, we control all parts of the path. |
EXPECT_TRUE( |
@@ -2243,8 +2371,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
sub_dir_, text_file_, uid_, ok_gids_)); |
// Make base_dir_ world-writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u)); |
EXPECT_FALSE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |
@@ -2256,8 +2384,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
sub_dir_, text_file_, uid_, ok_gids_)); |
// Make sub_dir_ world writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u)); |
EXPECT_FALSE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |
@@ -2269,8 +2397,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
sub_dir_, text_file_, uid_, ok_gids_)); |
// Make text_file_ world writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, S_IWOTH, 0u)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, S_IWOTH, 0u)); |
EXPECT_FALSE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |
@@ -2282,8 +2410,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
sub_dir_, text_file_, uid_, ok_gids_)); |
// Make sub_dir_ non-world writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH)); |
EXPECT_FALSE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |
@@ -2295,8 +2423,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
sub_dir_, text_file_, uid_, ok_gids_)); |
// Make base_dir_ non-world-writable. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH)); |
EXPECT_TRUE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |
@@ -2309,8 +2437,8 @@ TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) { |
// Back to the initial state: Nothing is writable, so every path |
// should pass. |
- ASSERT_NO_FATAL_FAILURE( |
- ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
+ ASSERT_TRUE( |
+ file_util::ChangePosixFilePermissions(text_file_, 0u, S_IWOTH)); |
EXPECT_TRUE( |
file_util::VerifyPathControlledByUser( |
base_dir_, sub_dir_, uid_, ok_gids_)); |