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