| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/files/file_util_proxy.h" |
| |
| #include "base/bind.h" |
| #include "base/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/threading/thread.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| |
| class FileUtilProxyTest : public testing::Test { |
| public: |
| FileUtilProxyTest() |
| : file_thread_("FileUtilProxyTestFileThread"), |
| error_(File::FILE_OK), |
| created_(false), |
| bytes_written_(-1), |
| weak_factory_(this) {} |
| |
| virtual void SetUp() OVERRIDE { |
| ASSERT_TRUE(dir_.CreateUniqueTempDir()); |
| ASSERT_TRUE(file_thread_.Start()); |
| } |
| |
| void DidFinish(File::Error error) { |
| error_ = error; |
| MessageLoop::current()->QuitWhenIdle(); |
| } |
| |
| void DidGetFileInfo(File::Error error, |
| const File::Info& file_info) { |
| error_ = error; |
| file_info_ = file_info; |
| MessageLoop::current()->QuitWhenIdle(); |
| } |
| |
| protected: |
| TaskRunner* file_task_runner() const { |
| return file_thread_.message_loop_proxy().get(); |
| } |
| const FilePath& test_dir_path() const { return dir_.path(); } |
| const FilePath test_path() const { return dir_.path().AppendASCII("test"); } |
| |
| MessageLoopForIO message_loop_; |
| Thread file_thread_; |
| |
| ScopedTempDir dir_; |
| File::Error error_; |
| bool created_; |
| FilePath path_; |
| File::Info file_info_; |
| std::vector<char> buffer_; |
| int bytes_written_; |
| WeakPtrFactory<FileUtilProxyTest> weak_factory_; |
| }; |
| |
| |
| TEST_F(FileUtilProxyTest, GetFileInfo_File) { |
| // Setup. |
| ASSERT_EQ(4, WriteFile(test_path(), "test", 4)); |
| File::Info expected_info; |
| GetFileInfo(test_path(), &expected_info); |
| |
| // Run. |
| FileUtilProxy::GetFileInfo( |
| file_task_runner(), |
| test_path(), |
| Bind(&FileUtilProxyTest::DidGetFileInfo, weak_factory_.GetWeakPtr())); |
| MessageLoop::current()->Run(); |
| |
| // Verify. |
| EXPECT_EQ(File::FILE_OK, error_); |
| EXPECT_EQ(expected_info.size, file_info_.size); |
| EXPECT_EQ(expected_info.is_directory, file_info_.is_directory); |
| EXPECT_EQ(expected_info.is_symbolic_link, file_info_.is_symbolic_link); |
| EXPECT_EQ(expected_info.last_modified, file_info_.last_modified); |
| EXPECT_EQ(expected_info.last_accessed, file_info_.last_accessed); |
| EXPECT_EQ(expected_info.creation_time, file_info_.creation_time); |
| } |
| |
| TEST_F(FileUtilProxyTest, GetFileInfo_Directory) { |
| // Setup. |
| ASSERT_TRUE(base::CreateDirectory(test_path())); |
| File::Info expected_info; |
| GetFileInfo(test_path(), &expected_info); |
| |
| // Run. |
| FileUtilProxy::GetFileInfo( |
| file_task_runner(), |
| test_path(), |
| Bind(&FileUtilProxyTest::DidGetFileInfo, weak_factory_.GetWeakPtr())); |
| MessageLoop::current()->Run(); |
| |
| // Verify. |
| EXPECT_EQ(File::FILE_OK, error_); |
| EXPECT_EQ(expected_info.size, file_info_.size); |
| EXPECT_EQ(expected_info.is_directory, file_info_.is_directory); |
| EXPECT_EQ(expected_info.is_symbolic_link, file_info_.is_symbolic_link); |
| EXPECT_EQ(expected_info.last_modified, file_info_.last_modified); |
| EXPECT_EQ(expected_info.last_accessed, file_info_.last_accessed); |
| EXPECT_EQ(expected_info.creation_time, file_info_.creation_time); |
| } |
| |
| TEST_F(FileUtilProxyTest, Touch) { |
| ASSERT_EQ(4, WriteFile(test_path(), "test", 4)); |
| Time last_accessed_time = Time::Now() - TimeDelta::FromDays(12345); |
| Time last_modified_time = Time::Now() - TimeDelta::FromHours(98765); |
| |
| FileUtilProxy::Touch( |
| file_task_runner(), |
| test_path(), |
| last_accessed_time, |
| last_modified_time, |
| Bind(&FileUtilProxyTest::DidFinish, weak_factory_.GetWeakPtr())); |
| MessageLoop::current()->Run(); |
| EXPECT_EQ(File::FILE_OK, error_); |
| |
| File::Info info; |
| GetFileInfo(test_path(), &info); |
| |
| // The returned values may only have the seconds precision, so we cast |
| // the double values to int here. |
| EXPECT_EQ(static_cast<int>(last_modified_time.ToDoubleT()), |
| static_cast<int>(info.last_modified.ToDoubleT())); |
| EXPECT_EQ(static_cast<int>(last_accessed_time.ToDoubleT()), |
| static_cast<int>(info.last_accessed.ToDoubleT())); |
| } |
| |
| } // namespace base |