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