Home | History | Annotate | Download | only in brillo
      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_.GetPath().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_.GetPath().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_.GetPath().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