160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt// Copyright 2014 The Chromium Authors. All rights reserved. 260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt// Use of this source code is governed by a BSD-style license that can be 360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt// found in the LICENSE file. 460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include <set> 660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "base/files/file.h" 860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "base/files/file_path.h" 960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "base/files/file_util.h" 1060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "base/files/scoped_temp_dir.h" 1160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "storage/browser/fileapi/native_file_util.h" 1260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt#include "testing/gtest/include/gtest/gtest.h" 1360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 1460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholtusing storage::FileSystemFileUtil; 1560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholtusing storage::FileSystemOperation; 1660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholtusing storage::NativeFileUtil; 1760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 1860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholtnamespace content { 1960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 2060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholtclass NativeFileUtilTest : public testing::Test { 2160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt public: 2260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtilTest() {} 2360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 2460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt virtual void SetUp() { 2560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); 2660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 2760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 2860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt protected: 2960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath Path() { 3060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt return data_dir_.path(); 3160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 3260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 3360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath Path(const char* file_name) { 3460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt return data_dir_.path().AppendASCII(file_name); 3560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 3660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 3760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool FileExists(const base::FilePath& path) { 3860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt return base::PathExists(path) && 3960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt !base::DirectoryExists(path); 4060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 4160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 4260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt int64 GetSize(const base::FilePath& path) { 4360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::File::Info info; 4460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::GetFileInfo(path, &info); 4560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt return info.size; 4660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 4760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 4860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt private: 4960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::ScopedTempDir data_dir_; 5060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 5160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt DISALLOW_COPY_AND_ASSIGN(NativeFileUtilTest); 52538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt}; 5360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 5460177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, CreateCloseAndDeleteFile) { 5560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath file_name = Path("test_file"); 563bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt int flags = base::File::FLAG_WRITE | base::File::FLAG_ASYNC; 573bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt base::File file = 583bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt NativeFileUtil::CreateOrOpen(file_name, base::File::FLAG_CREATE | flags); 593bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt ASSERT_TRUE(file.IsValid()); 6060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(file.created()); 6160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 6260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(base::PathExists(file_name)); 633bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt EXPECT_TRUE(NativeFileUtil::PathExists(file_name)); 6460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(0, GetSize(file_name)); 65538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt file.Close(); 66538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt 6760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt file = NativeFileUtil::CreateOrOpen(file_name, base::File::FLAG_OPEN | flags); 686de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt ASSERT_TRUE(file.IsValid()); 696de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt ASSERT_FALSE(file.created()); 706de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt file.Close(); 716de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt 726de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt ASSERT_EQ(base::File::FILE_OK, 7360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::DeleteFile(file_name)); 7460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(base::PathExists(file_name)); 7560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(NativeFileUtil::PathExists(file_name)); 7660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 7760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 7860177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, EnsureFileExists) { 7960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath file_name = Path("foobar"); 8060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 8160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 8260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(file_name, &created)); 8360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 8460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 8560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(file_name)); 8660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(0, GetSize(file_name)); 8760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 8860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 8960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(file_name, &created)); 9060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(created); 9160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 9260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 9360177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, CreateAndDeleteDirectory) { 9460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath dir_name = Path("test_dir"); 9560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 9660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateDirectory(dir_name, 9760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt false /* exclusive */, 9860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt false /* recursive */)); 9960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 10060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(NativeFileUtil::DirectoryExists(dir_name)); 10160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(base::DirectoryExists(dir_name)); 10260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 10360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_ERROR_EXISTS, 10460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateDirectory(dir_name, 10560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt true /* exclusive */, 1066de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt false /* recursive */)); 10760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 10860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 10960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::DeleteDirectory(dir_name)); 11060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(base::DirectoryExists(dir_name)); 11160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(NativeFileUtil::DirectoryExists(dir_name)); 11260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 11360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 11460177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, TouchFileAndGetFileInfo) { 11560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath file_name = Path("test_file"); 11660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::File::Info native_info; 11760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_ERROR_NOT_FOUND, 11860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::GetFileInfo(file_name, &native_info)); 11960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 12060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 12160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 12260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(file_name, &created)); 12360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 12460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 1253bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt base::File::Info info; 12660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(base::GetFileInfo(file_name, &info)); 12760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 12860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::GetFileInfo(file_name, &native_info)); 12960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(info.size, native_info.size); 13060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(info.is_directory, native_info.is_directory); 1313bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt ASSERT_EQ(info.is_symbolic_link, native_info.is_symbolic_link); 13260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(info.last_modified, native_info.last_modified); 13360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(info.last_accessed, native_info.last_accessed); 13460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(info.creation_time, native_info.creation_time); 13560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 13660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt const base::Time new_accessed = 13760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt info.last_accessed + base::TimeDelta::FromHours(10); 13860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt const base::Time new_modified = 13960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt info.last_modified + base::TimeDelta::FromHours(5); 14060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 14160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_OK, 14260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::Touch(file_name, 14360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt new_accessed, new_modified)); 14460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 14560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(base::GetFileInfo(file_name, &info)); 14660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(new_accessed, info.last_accessed); 14760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(new_modified, info.last_modified); 14860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 14960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 15060177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, CreateFileEnumerator) { 15160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath path_1 = Path("dir1"); 15260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath path_2 = Path("file1"); 15360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath path_11 = Path("dir1").AppendASCII("file11"); 15460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath path_12 = Path("dir1").AppendASCII("dir12"); 15560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath path_121 = 15660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt Path("dir1").AppendASCII("dir12").AppendASCII("file121"); 15760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 15860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateDirectory(path_1, false, false)); 15960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 16060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 16160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(path_2, &created)); 162538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt ASSERT_EQ(base::File::FILE_OK, 163538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt NativeFileUtil::EnsureFileExists(path_11, &created)); 164538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt ASSERT_EQ(base::File::FILE_OK, 165538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt NativeFileUtil::CreateDirectory(path_12, false, false)); 16660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 16760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(path_121, &created)); 168538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt 16960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt { 17060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator = 17160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateFileEnumerator(Path(), false); 17260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt std::set<base::FilePath> set; 17360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_1); 17460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_2); 17560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt for (base::FilePath path = enumerator->Next(); !path.empty(); 17660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt path = enumerator->Next()) 17760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1U, set.erase(path)); 17860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(set.empty()); 17960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt } 18060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 18160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt { 182538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator = 183538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt NativeFileUtil::CreateFileEnumerator(Path(), true); 184538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt std::set<base::FilePath> set; 18560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_1); 186538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt set.insert(path_2); 18760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_11); 18860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_12); 18960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt set.insert(path_121); 19060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt for (base::FilePath path = enumerator->Next(); !path.empty(); 1916de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt path = enumerator->Next()) 1926de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt EXPECT_EQ(1U, set.erase(path)); 1936de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt EXPECT_TRUE(set.empty()); 1946de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt } 1956de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt} 1966de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt 1976de5da079682efd3f8887d3e0a7add7e70a5433dEric AnholtTEST_F(NativeFileUtilTest, Truncate) { 1986de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt base::FilePath file_name = Path("truncated"); 1996de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt bool created = false; 2006de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt ASSERT_EQ(base::File::FILE_OK, 2016de5da079682efd3f8887d3e0a7add7e70a5433dEric Anholt NativeFileUtil::EnsureFileExists(file_name, &created)); 20260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 20360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 20460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 20560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::Truncate(file_name, 1020)); 20660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 20760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(file_name)); 20860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(file_name)); 20960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 21060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 21160177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, CopyFile) { 21260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath from_file = Path("fromfile"); 21360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file1 = Path("tofile1"); 21460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file2 = Path("tofile2"); 21560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt const NativeFileUtil::CopyOrMoveMode nosync = NativeFileUtil::COPY_NOSYNC; 21660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt const NativeFileUtil::CopyOrMoveMode sync = NativeFileUtil::COPY_SYNC; 21760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 21860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 21960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 22060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 22160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 22260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 22360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::Truncate(from_file, 1020)); 22460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 22560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(from_file)); 22660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(from_file)); 227538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt 22860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 229538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt NativeFileUtil::CopyOrMoveFile( 23060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_file1, FileSystemOperation::OPTION_NONE, nosync)); 23160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 232538ba0a36373d7d0bd047e6fc4ef4e6e8d8bb8d7Eric Anholt ASSERT_EQ(base::File::FILE_OK, 23360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 23460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_file2, FileSystemOperation::OPTION_NONE, sync)); 23560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 23660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(from_file)); 23760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(from_file)); 23860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(to_file1)); 23960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(to_file1)); 24036a8c9caafef79524920120286649a0f53fe5228Eric Anholt EXPECT_TRUE(FileExists(to_file2)); 24136a8c9caafef79524920120286649a0f53fe5228Eric Anholt EXPECT_EQ(1020, GetSize(to_file2)); 24236a8c9caafef79524920120286649a0f53fe5228Eric Anholt 24336a8c9caafef79524920120286649a0f53fe5228Eric Anholt base::FilePath dir = Path("dir"); 24460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 24560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateDirectory(dir, false, false)); 24660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(base::DirectoryExists(dir)); 24760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_dir_file = dir.AppendASCII("file"); 24860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 24960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 25060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_dir_file, 25160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, nosync)); 25260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(to_dir_file)); 25360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(to_dir_file)); 25460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 25560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Following tests are error checking. 25660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Source doesn't exist. 25760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 25860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 25960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt Path("nonexists"), Path("file"), 26060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, nosync)); 26160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 26260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Source is not a file. 26360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE, 26460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 26560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt dir, Path("file"), FileSystemOperation::OPTION_NONE, nosync)); 26660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination is not a file. 26760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, 26860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 26960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, dir, FileSystemOperation::OPTION_NONE, nosync)); 27060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination's parent doesn't exist. 27160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 27260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 27360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, Path("nodir").AppendASCII("file"), 27460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, nosync)); 27560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination's parent is a file. 27660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 27760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 27860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, Path("tofile1").AppendASCII("file"), 27960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, nosync)); 28060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 28160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 28260177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, MoveFile) { 28360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath from_file = Path("fromfile"); 28460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file = Path("tofile"); 28560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt const NativeFileUtil::CopyOrMoveMode move = NativeFileUtil::MOVE; 28660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 28760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 28860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 28960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 29060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 29160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, NativeFileUtil::Truncate(from_file, 1020)); 29260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 29360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(from_file)); 29460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(from_file)); 29560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 29660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 29760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 2983bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt from_file, to_file, FileSystemOperation::OPTION_NONE, move)); 29960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 30060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(FileExists(from_file)); 30160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(to_file)); 30260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(to_file)); 30360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 30460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 30560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 30660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(from_file)); 30760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, NativeFileUtil::Truncate(from_file, 1020)); 30860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 30960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath dir = Path("dir"); 31060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 31160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CreateDirectory(dir, false, false)); 31260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(base::DirectoryExists(dir)); 31360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_dir_file = dir.AppendASCII("file"); 31460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 31560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 31660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_dir_file, 31760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, move)); 31860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_FALSE(FileExists(from_file)); 31960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(to_dir_file)); 32060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(1020, GetSize(to_dir_file)); 32160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 32260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Following is error checking. 32360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Source doesn't exist. 32460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 32560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 32660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt Path("nonexists"), Path("file"), 32760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, move)); 32860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 32960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Source is not a file. 33060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE, 33160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 33260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt dir, Path("file"), FileSystemOperation::OPTION_NONE, move)); 33360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 33460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 33560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(from_file)); 33660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination is not a file. 33760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, 33860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 33960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, dir, FileSystemOperation::OPTION_NONE, move)); 34060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 34160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 34260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 34360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(from_file)); 34460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination's parent doesn't exist. 34560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 34660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 34760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, Path("nodir").AppendASCII("file"), 34860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, move)); 34960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Destination's parent is a file. 35060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, 35160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 35260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, Path("tofile1").AppendASCII("file"), 35360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_NONE, move)); 35460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt} 35560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 35660177d5e2aec07ed6386a6935b118a356d58c4ecEric AnholtTEST_F(NativeFileUtilTest, PreserveLastModified) { 35760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath from_file = Path("fromfile"); 35860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file1 = Path("tofile1"); 35960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file2 = Path("tofile2"); 36060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::FilePath to_file3 = Path("tofile3"); 36160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt bool created = false; 36260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 36360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::EnsureFileExists(from_file, &created)); 36460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(created); 36560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_TRUE(FileExists(from_file)); 36660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 36760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::File::Info file_info1; 36860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 36960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::GetFileInfo(from_file, &file_info1)); 3703bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt 3713bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt // Test for copy (nosync). 3723bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt ASSERT_EQ(base::File::FILE_OK, 373c07290ddb2bf3095b9f5a1e0b33697999834fa0eEric Anholt NativeFileUtil::CopyOrMoveFile( 3743bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt from_file, to_file1, 3753bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, 37660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::COPY_NOSYNC)); 37760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 37860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt base::File::Info file_info2; 37960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(to_file1)); 38060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 3813bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt NativeFileUtil::GetFileInfo(to_file1, &file_info2)); 38260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); 3833bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt 38460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Test for copy (sync). 38560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 38660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 38760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_file2, 3883bdccbc3e0185fbca16eada2a76f55c6e3f867b5Eric Anholt FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, 38960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::COPY_SYNC)); 39060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 39160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(to_file2)); 39260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 39360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::GetFileInfo(to_file1, &file_info2)); 39460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); 39560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 39660177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt // Test for move. 39760177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 39860177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::CopyOrMoveFile( 39960177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt from_file, to_file3, 40060177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, 40160177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::MOVE)); 40260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt 40360177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_TRUE(FileExists(to_file3)); 40460177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt ASSERT_EQ(base::File::FILE_OK, 40560177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt NativeFileUtil::GetFileInfo(to_file2, &file_info2)); 406 EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); 407} 408 409} // namespace content 410