| Index: chrome/browser/chromeos/drive/file_write_helper_unittest.cc
|
| diff --git a/chrome/browser/chromeos/drive/file_write_helper_unittest.cc b/chrome/browser/chromeos/drive/file_write_helper_unittest.cc
|
| index bd02b55343dbce837f248937db9dbd87ea9551bb..bb68996d5fa71873c0f6448c181c209a1f43d646 100644
|
| --- a/chrome/browser/chromeos/drive/file_write_helper_unittest.cc
|
| +++ b/chrome/browser/chromeos/drive/file_write_helper_unittest.cc
|
| @@ -7,43 +7,65 @@
|
| #include "base/bind.h"
|
| #include "base/message_loop.h"
|
| #include "base/threading/thread_restrictions.h"
|
| -#include "chrome/browser/chromeos/drive/mock_file_system.h"
|
| +#include "chrome/browser/chromeos/drive/dummy_file_system.h"
|
| #include "chrome/browser/chromeos/drive/test_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| -using ::testing::StrictMock;
|
| -using ::testing::_;
|
| -
|
| namespace drive {
|
|
|
| namespace {
|
|
|
| -ACTION_P(MockCreateFile, error) {
|
| - DCHECK(!arg2.is_null());
|
| - arg2.Run(error);
|
| -}
|
| +const base::FilePath::CharType kDrivePath[] =
|
| + FILE_PATH_LITERAL("drive/root/file.txt");
|
| +const base::FilePath::CharType kInvalidPath[] =
|
| + FILE_PATH_LITERAL("drive/invalid/path");
|
| +const base::FilePath::CharType kLocalPath[] =
|
| + FILE_PATH_LITERAL("/tmp/local.txt");
|
|
|
| -ACTION_P2(MockOpenFile, error, local_path) {
|
| - DCHECK(!arg1.is_null());
|
| - arg1.Run(error, local_path);
|
| -}
|
| +class TestFileSystem : public DummyFileSystem {
|
| + public:
|
| + // Mimics CreateFile. It always succeeds unless kInvalidPath is passed.
|
| + virtual void CreateFile(const base::FilePath& file_path,
|
| + bool is_exclusive,
|
| + const FileOperationCallback& callback) OVERRIDE {
|
| + if (file_path == base::FilePath(kInvalidPath)) {
|
| + callback.Run(FILE_ERROR_ACCESS_DENIED);
|
| + return;
|
| + }
|
| + created.insert(file_path);
|
| + callback.Run(FILE_ERROR_OK);
|
| + }
|
|
|
| -ACTION_P(MockCloseFile, error) {
|
| - DCHECK(!arg1.is_null());
|
| - arg1.Run(error);
|
| -}
|
| + // Mimics OpenFile. It fails if the |file_path| is a path that is not
|
| + // passed to CreateFile before. This tests that FileWriteHelper always
|
| + // ensures file existence before trying to open. It also fails if the
|
| + // path is already opened, to match the behavior of real FileSystem.
|
| + virtual void OpenFile(const base::FilePath& file_path,
|
| + const OpenFileCallback& callback) OVERRIDE {
|
| + // Files failed to create should never be opened.
|
| + EXPECT_TRUE(created.count(file_path));
|
| + created.erase(file_path);
|
| + if (opened.count(file_path)) {
|
| + callback.Run(FILE_ERROR_IN_USE, base::FilePath());
|
| + } else {
|
| + opened.insert(file_path);
|
| + callback.Run(FILE_ERROR_OK, base::FilePath(kLocalPath));
|
| + }
|
| + }
|
|
|
| -void RecordOpenFileCallbackArguments(FileError* error,
|
| - base::FilePath* path,
|
| - FileError error_arg,
|
| - const base::FilePath& path_arg) {
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| - *error = error_arg;
|
| - *path = path_arg;
|
| -}
|
| + // Mimics CloseFile. It fails if it is passed a path not OpenFile'd.
|
| + virtual void CloseFile(const base::FilePath& file_path,
|
| + const FileOperationCallback& callback) OVERRIDE {
|
| + // Files failed to open should never be closed.
|
| + EXPECT_TRUE(opened.count(file_path));
|
| + opened.erase(file_path);
|
| + callback.Run(FILE_ERROR_OK);
|
| + }
|
| + std::set<base::FilePath> created;
|
| + std::set<base::FilePath> opened;
|
| +};
|
|
|
| } // namespace
|
|
|
| @@ -51,74 +73,69 @@ class FileWriteHelperTest : public testing::Test {
|
| public:
|
| FileWriteHelperTest()
|
| : ui_thread_(content::BrowserThread::UI, &message_loop_),
|
| - mock_file_system_(new StrictMock<MockFileSystem>) {
|
| + test_file_system_(new TestFileSystem) {
|
| }
|
|
|
| protected:
|
| MessageLoopForUI message_loop_;
|
| content::TestBrowserThread ui_thread_;
|
| - scoped_ptr< StrictMock<MockFileSystem> > mock_file_system_;
|
| + scoped_ptr<TestFileSystem> test_file_system_;
|
| };
|
|
|
| TEST_F(FileWriteHelperTest, PrepareFileForWritingSuccess) {
|
| - const base::FilePath kDrivePath(FILE_PATH_LITERAL("/drive/file.txt"));
|
| - const base::FilePath kLocalPath(FILE_PATH_LITERAL("/tmp/dummy.txt"));
|
| -
|
| - EXPECT_CALL(*mock_file_system_, CreateFile(kDrivePath, false, _))
|
| - .WillOnce(MockCreateFile(FILE_ERROR_OK));
|
| - EXPECT_CALL(*mock_file_system_, OpenFile(kDrivePath, _))
|
| - .WillOnce(MockOpenFile(FILE_ERROR_OK, kLocalPath));
|
| - EXPECT_CALL(*mock_file_system_, CloseFile(kDrivePath, _))
|
| - .WillOnce(MockCloseFile(FILE_ERROR_OK));
|
| -
|
| - FileWriteHelper file_write_helper(mock_file_system_.get());
|
| + FileWriteHelper file_write_helper(test_file_system_.get());
|
| FileError error = FILE_ERROR_FAILED;
|
| base::FilePath path;
|
| + // The file should successfully be opened.
|
| file_write_helper.PrepareWritableFileAndRun(
|
| - kDrivePath, base::Bind(&RecordOpenFileCallbackArguments, &error, &path));
|
| + base::FilePath(kDrivePath),
|
| + google_apis::test_util::CreateCopyResultCallback(&error, &path));
|
| google_apis::test_util::RunBlockingPoolTask();
|
|
|
| EXPECT_EQ(FILE_ERROR_OK, error);
|
| - EXPECT_EQ(kLocalPath, path);
|
| + EXPECT_EQ(kLocalPath, path.value());
|
| }
|
|
|
| TEST_F(FileWriteHelperTest, PrepareFileForWritingCreateFail) {
|
| - const base::FilePath kDrivePath(FILE_PATH_LITERAL("/drive/file.txt"));
|
| -
|
| - EXPECT_CALL(*mock_file_system_, CreateFile(kDrivePath, false, _))
|
| - .WillOnce(MockCreateFile(FILE_ERROR_ACCESS_DENIED));
|
| - EXPECT_CALL(*mock_file_system_, OpenFile(_, _)).Times(0);
|
| - EXPECT_CALL(*mock_file_system_, CloseFile(_, _)).Times(0);
|
| -
|
| - FileWriteHelper file_write_helper(mock_file_system_.get());
|
| + FileWriteHelper file_write_helper(test_file_system_.get());
|
| FileError error = FILE_ERROR_FAILED;
|
| base::FilePath path;
|
| + // Access to kInvalidPath should fail, and FileWriteHelper should not try to
|
| + // open or close the file.
|
| file_write_helper.PrepareWritableFileAndRun(
|
| - kDrivePath, base::Bind(&RecordOpenFileCallbackArguments, &error, &path));
|
| + base::FilePath(kInvalidPath),
|
| + google_apis::test_util::CreateCopyResultCallback(&error, &path));
|
| google_apis::test_util::RunBlockingPoolTask();
|
|
|
| EXPECT_EQ(FILE_ERROR_ACCESS_DENIED, error);
|
| - EXPECT_EQ(base::FilePath(), path);
|
| + EXPECT_TRUE(path.empty());
|
| }
|
|
|
| TEST_F(FileWriteHelperTest, PrepareFileForWritingOpenFail) {
|
| - const base::FilePath kDrivePath(FILE_PATH_LITERAL("/drive/file.txt"));
|
| -
|
| - EXPECT_CALL(*mock_file_system_, CreateFile(kDrivePath, false, _))
|
| - .WillOnce(MockCreateFile(FILE_ERROR_OK));
|
| - EXPECT_CALL(*mock_file_system_, OpenFile(kDrivePath, _))
|
| - .WillOnce(MockOpenFile(FILE_ERROR_IN_USE, base::FilePath()));
|
| - EXPECT_CALL(*mock_file_system_, CloseFile(_, _)).Times(0);
|
| -
|
| - FileWriteHelper file_write_helper(mock_file_system_.get());
|
| + // Externally open the path beforehand.
|
| FileError error = FILE_ERROR_FAILED;
|
| base::FilePath path;
|
| + test_file_system_->CreateFile(
|
| + base::FilePath(kDrivePath),
|
| + false,
|
| + google_apis::test_util::CreateCopyResultCallback(&error));
|
| + ASSERT_EQ(FILE_ERROR_OK, error);
|
| + error = FILE_ERROR_FAILED;
|
| + test_file_system_->OpenFile(
|
| + base::FilePath(kDrivePath),
|
| + google_apis::test_util::CreateCopyResultCallback(&error, &path));
|
| + ASSERT_EQ(FILE_ERROR_OK, error);
|
| +
|
| + // Run FileWriteHelper on a file already opened in somewhere else.
|
| + // It should fail to open the file, and should not try to close it.
|
| + FileWriteHelper file_write_helper(test_file_system_.get());
|
| file_write_helper.PrepareWritableFileAndRun(
|
| - kDrivePath, base::Bind(&RecordOpenFileCallbackArguments, &error, &path));
|
| + base::FilePath(kDrivePath),
|
| + google_apis::test_util::CreateCopyResultCallback(&error, &path));
|
| google_apis::test_util::RunBlockingPoolTask();
|
|
|
| EXPECT_EQ(FILE_ERROR_IN_USE, error);
|
| - EXPECT_EQ(base::FilePath(), path);
|
| + EXPECT_TRUE(path.empty());
|
| }
|
|
|
| } // namespace drive
|
|
|