15cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell// Copyright 2014 The Chromium OS Authors. All rights reserved.
25cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell// Use of this source code is governed by a BSD-style license that can be
35cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell// found in the LICENSE file.
45cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include "brillo/file_utils.h"
65cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
75cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <sys/stat.h>
85cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <unistd.h>
95cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
105cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <string>
115cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
125cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <base/files/file_util.h>
135cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <base/files/scoped_temp_dir.h>
145cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell#include <gtest/gtest.h>
155cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
169ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
175cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
185cadeae88cd2ab9b4aebf6d880455df602001c90David Pursellclass FileUtilsTest : public testing::Test {
195cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell public:
205cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  FileUtilsTest() {
215cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    CHECK(temp_dir_.CreateUniqueTempDir());
22324b9515118eca1ac9b579af6dd4d9ffc33a023cJay Civelli    file_path_ = temp_dir_.GetPath().Append("test.temp");
235cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  }
245cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
255cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell protected:
265cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  base::FilePath file_path_;
275cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  base::ScopedTempDir temp_dir_;
285cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
295cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  // Writes |contents| to |file_path_|. Pulled into a separate function just
305cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  // to improve readability of tests.
315cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  void WriteFile(const std::string& contents) {
325cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_EQ(contents.length(),
335cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell              base::WriteFile(file_path_, contents.c_str(), contents.length()));
345cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  }
355cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
365cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  // Verifies that the file at |file_path_| exists and contains |contents|.
375cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  void ExpectFileContains(const std::string& contents) {
385cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_TRUE(base::PathExists(file_path_));
395cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    std::string new_contents;
405cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_TRUE(base::ReadFileToString(file_path_, &new_contents));
415cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_EQ(contents, new_contents);
425cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  }
435cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
445cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  // Verifies that the file at |file_path_| has |permissions|.
455cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  void ExpectFilePermissions(int permissions) {
465cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    int actual_permissions;
475cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_TRUE(base::GetPosixFilePermissions(file_path_, &actual_permissions));
485cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell    EXPECT_EQ(permissions, actual_permissions);
495cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  }
505cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell};
515cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
525cadeae88cd2ab9b4aebf6d880455df602001c90David Pursellnamespace {
535cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
545cadeae88cd2ab9b4aebf6d880455df602001c90David Pursellenum {
5505d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko  kPermissions600 =
5605d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko      base::FILE_PERMISSION_READ_BY_USER | base::FILE_PERMISSION_WRITE_BY_USER,
575cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  kPermissions700 = base::FILE_PERMISSION_USER_MASK,
585cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  kPermissions777 = base::FILE_PERMISSION_MASK
595cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell};
605cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
615cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}  // namespace
625cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
635cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileCreate) {
645cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
655cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
665cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFilePermissions(kPermissions600);
675cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
685cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
695cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileCreateThroughUmask) {
705cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  mode_t old_umask = umask(kPermissions777);
715cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
725cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  umask(old_umask);
735cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
745cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFilePermissions(kPermissions600);
755cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
765cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
775cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileCreateDirectoryStructure) {
78324b9515118eca1ac9b579af6dd4d9ffc33a023cJay Civelli  file_path_ = temp_dir_.GetPath().Append("foo/bar/baz/test.temp");
795cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
805cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
815cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
825cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
835cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileExisting) {
845cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  WriteFile("abcd");
855cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
865cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("abcd");
875cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
885cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
895cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileReplaceDirectory) {
905cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(base::CreateDirectory(file_path_));
915cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
925cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_FALSE(base::DirectoryExists(file_path_));
935cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
945cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
955cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
965cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileReplaceSymlink) {
97324b9515118eca1ac9b579af6dd4d9ffc33a023cJay Civelli  base::FilePath symlink_target = temp_dir_.GetPath().Append("target.temp");
985cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(base::CreateSymbolicLink(symlink_target, file_path_));
995cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_));
1005cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_FALSE(base::IsLink(file_path_));
1015cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1025cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1035cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1045cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileReplaceOtherUser) {
1055cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  WriteFile("abcd");
1065cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid() + 1, getegid()));
1075cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1085cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1095cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1105cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileReplaceOtherGroup) {
1115cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  WriteFile("abcd");
1125cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid() + 1));
1135cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1145cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1155cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1165cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileCreateWithAllPermissions) {
1175cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid()));
1185cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1195cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFilePermissions(kPermissions777);
1205cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1215cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1225cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileCreateWithOwnerPermissions) {
1235cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions700, geteuid(), getegid()));
1245cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1255cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFilePermissions(kPermissions700);
1265cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1275cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1285cadeae88cd2ab9b4aebf6d880455df602001c90David PursellTEST_F(FileUtilsTest, TouchFileExistingPermissionsUnchanged) {
1295cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions777, geteuid(), getegid()));
1305cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  EXPECT_TRUE(TouchFile(file_path_, kPermissions700, geteuid(), getegid()));
1315cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFileContains("");
1325cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell  ExpectFilePermissions(kPermissions777);
1335cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell}
1345cadeae88cd2ab9b4aebf6d880455df602001c90David Pursell
1359ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
136