1 // Copyright 2014 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "brillo/file_utils.h" 6 7 #include <sys/stat.h> 8 #include <unistd.h> 9 10 #include <string> 11 12 #include <base/files/file_util.h> 13 #include <base/files/scoped_temp_dir.h> 14 #include <gtest/gtest.h> 15 16 namespace brillo { 17 18 class FileUtilsTest : public testing::Test { 19 public: 20 FileUtilsTest() { 21 CHECK(temp_dir_.CreateUniqueTempDir()); 22 file_path_ = temp_dir_.path().Append("test.temp"); 23 } 24 25 protected: 26 base::FilePath file_path_; 27 base::ScopedTempDir temp_dir_; 28 29 // Writes |contents| to |file_path_|. Pulled into a separate function just 30 // to improve readability of tests. 31 void WriteFile(const std::string& contents) { 32 EXPECT_EQ(contents.length(), 33 base::WriteFile(file_path_, contents.c_str(), contents.length())); 34 } 35 36 // Verifies that the file at |file_path_| exists and contains |contents|. 37 void ExpectFileContains(const std::string& contents) { 38 EXPECT_TRUE(base::PathExists(file_path_)); 39 std::string new_contents; 40 EXPECT_TRUE(base::ReadFileToString(file_path_, &new_contents)); 41 EXPECT_EQ(contents, new_contents); 42 } 43 44 // Verifies that the file at |file_path_| has |permissions|. 45 void ExpectFilePermissions(int permissions) { 46 int actual_permissions; 47 EXPECT_TRUE(base::GetPosixFilePermissions(file_path_, &actual_permissions)); 48 EXPECT_EQ(permissions, actual_permissions); 49 } 50 }; 51 52 namespace { 53 54 enum { 55 kPermissions600 = 56 base::FILE_PERMISSION_READ_BY_USER | base::FILE_PERMISSION_WRITE_BY_USER, 57 kPermissions700 = base::FILE_PERMISSION_USER_MASK, 58 kPermissions777 = base::FILE_PERMISSION_MASK 59 }; 60 61 } // namespace 62 63 TEST_F(FileUtilsTest, TouchFileCreate) { 64 EXPECT_TRUE(TouchFile(file_path_)); 65 ExpectFileContains(""); 66 ExpectFilePermissions(kPermissions600); 67 } 68 69 TEST_F(FileUtilsTest, TouchFileCreateThroughUmask) { 70 mode_t old_umask = umask(kPermissions777); 71 EXPECT_TRUE(TouchFile(file_path_)); 72 umask(old_umask); 73 ExpectFileContains(""); 74 ExpectFilePermissions(kPermissions600); 75 } 76 77 TEST_F(FileUtilsTest, TouchFileCreateDirectoryStructure) { 78 file_path_ = temp_dir_.path().Append("foo/bar/baz/test.temp"); 79 EXPECT_TRUE(TouchFile(file_path_)); 80 ExpectFileContains(""); 81 } 82 83 TEST_F(FileUtilsTest, TouchFileExisting) { 84 WriteFile("abcd"); 85 EXPECT_TRUE(TouchFile(file_path_)); 86 ExpectFileContains("abcd"); 87 } 88 89 TEST_F(FileUtilsTest, TouchFileReplaceDirectory) { 90 EXPECT_TRUE(base::CreateDirectory(file_path_)); 91 EXPECT_TRUE(TouchFile(file_path_)); 92 EXPECT_FALSE(base::DirectoryExists(file_path_)); 93 ExpectFileContains(""); 94 } 95 96 TEST_F(FileUtilsTest, TouchFileReplaceSymlink) { 97 base::FilePath symlink_target = temp_dir_.path().Append("target.temp"); 98 EXPECT_TRUE(base::CreateSymbolicLink(symlink_target, file_path_)); 99 EXPECT_TRUE(TouchFile(file_path_)); 100 EXPECT_FALSE(base::IsLink(file_path_)); 101 ExpectFileContains(""); 102 } 103 104 TEST_F(FileUtilsTest, TouchFileReplaceOtherUser) { 105 WriteFile("abcd"); 106 EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid() + 1, getegid())); 107 ExpectFileContains(""); 108 } 109 110 TEST_F(FileUtilsTest, TouchFileReplaceOtherGroup) { 111 WriteFile("abcd"); 112 EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid() + 1)); 113 ExpectFileContains(""); 114 } 115 116 TEST_F(FileUtilsTest, TouchFileCreateWithAllPermissions) { 117 EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid())); 118 ExpectFileContains(""); 119 ExpectFilePermissions(kPermissions777); 120 } 121 122 TEST_F(FileUtilsTest, TouchFileCreateWithOwnerPermissions) { 123 EXPECT_TRUE(TouchFile(file_path_, kPermissions700, geteuid(), getegid())); 124 ExpectFileContains(""); 125 ExpectFilePermissions(kPermissions700); 126 } 127 128 TEST_F(FileUtilsTest, TouchFileExistingPermissionsUnchanged) { 129 EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid())); 130 EXPECT_TRUE(TouchFile(file_path_, kPermissions700, geteuid(), getegid())); 131 ExpectFileContains(""); 132 ExpectFilePermissions(kPermissions777); 133 } 134 135 } // namespace brillo 136