Index: chrome/browser/chromeos/drive/file_system/update_operation_unittest.cc |
diff --git a/chrome/browser/chromeos/drive/file_system/update_operation_unittest.cc b/chrome/browser/chromeos/drive/file_system/update_operation_unittest.cc |
index 78835e3e36c6cf62589c8bc90dcfda4f6680b956..8a3b42851cf88e2fd46bae13dffd49a48921413c 100644 |
--- a/chrome/browser/chromeos/drive/file_system/update_operation_unittest.cc |
+++ b/chrome/browser/chromeos/drive/file_system/update_operation_unittest.cc |
@@ -5,6 +5,8 @@ |
#include "chrome/browser/chromeos/drive/file_system/update_operation.h" |
#include "base/callback_helpers.h" |
+#include "base/file_util.h" |
+#include "base/md5.h" |
#include "base/task_runner_util.h" |
#include "chrome/browser/chromeos/drive/file_cache.h" |
#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h" |
@@ -20,72 +22,68 @@ namespace file_system { |
class UpdateOperationTest : public OperationTestBase { |
protected: |
virtual void SetUp() OVERRIDE { |
- OperationTestBase::SetUp(); |
- operation_.reset(new UpdateOperation(blocking_task_runner(), |
- observer(), |
- scheduler(), |
- metadata(), |
- cache())); |
- } |
- |
- scoped_ptr<UpdateOperation> operation_; |
+ OperationTestBase::SetUp(); |
+ operation_.reset(new UpdateOperation(blocking_task_runner(), |
+ observer(), |
+ scheduler(), |
+ metadata(), |
+ cache())); |
+ } |
+ |
+ // Stores |content| to the cache and mark it as dirty. |
+ FileError StoreAndMarkDirty(const std::string& local_id, |
+ const std::string& content) { |
+ base::FilePath path; |
+ if (!base::CreateTemporaryFileInDir(temp_dir(), &path) || |
+ !google_apis::test_util::WriteStringToFile(path, content)) |
+ return FILE_ERROR_FAILED; |
+ |
+ // Store the file to cache. |
+ FileError error = FILE_ERROR_FAILED; |
+ base::PostTaskAndReplyWithResult( |
+ blocking_task_runner(), |
+ FROM_HERE, |
+ base::Bind(&internal::FileCache::Store, |
+ base::Unretained(cache()), |
+ local_id, base::MD5String(content), path, |
+ internal::FileCache::FILE_OPERATION_COPY), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ test_util::RunBlockingPoolTask(); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ |
+ // Add the dirty bit. |
+ error = FILE_ERROR_FAILED; |
+ scoped_ptr<base::ScopedClosureRunner> file_closer; |
+ base::PostTaskAndReplyWithResult( |
+ blocking_task_runner(), |
+ FROM_HERE, |
+ base::Bind(&internal::FileCache::OpenForWrite, |
+ base::Unretained(cache()), |
+ local_id, |
+ &file_closer), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ test_util::RunBlockingPoolTask(); |
+ return error; |
+ } |
+ |
+ scoped_ptr<UpdateOperation> operation_; |
}; |
-TEST_F(UpdateOperationTest, UpdateFileByLocalId_PersistentFile) { |
+TEST_F(UpdateOperationTest, UpdateFileByLocalId) { |
const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
const std::string kResourceId("file:2_file_resource_id"); |
- const std::string kMd5("3b4382ebefec6e743578c76bbd0575ce"); |
- |
- const base::FilePath kTestFile = temp_dir().Append(FILE_PATH_LITERAL("foo")); |
- const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
- google_apis::test_util::WriteStringToFile(kTestFile, kTestFileContent); |
const std::string local_id = GetLocalId(kFilePath); |
EXPECT_FALSE(local_id.empty()); |
- // Pin the file so it'll be store in "persistent" directory. |
hashimoto
2014/01/16 05:47:31
Removing this "persistent" part as it seems obsole
|
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::FileCache::Pin, |
- base::Unretained(cache()), |
- local_id), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- test_util::RunBlockingPoolTask(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // First store a file to cache. |
- error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::FileCache::Store, |
- base::Unretained(cache()), |
- local_id, kMd5, kTestFile, |
- internal::FileCache::FILE_OPERATION_COPY), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- test_util::RunBlockingPoolTask(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Add the dirty bit. |
- error = FILE_ERROR_FAILED; |
- scoped_ptr<base::ScopedClosureRunner> file_closer; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::FileCache::OpenForWrite, |
- base::Unretained(cache()), |
- local_id, |
- &file_closer), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- test_util::RunBlockingPoolTask(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
+ const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
+ EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
int64 original_changestamp = fake_service()->largest_changestamp(); |
// The callback will be called upon completion of UpdateFileByLocalId(). |
- error = FILE_ERROR_FAILED; |
+ FileError error = FILE_ERROR_FAILED; |
operation_->UpdateFileByLocalId( |
local_id, |
ClientContext(USER_INITIATED), |
@@ -139,46 +137,17 @@ TEST_F(UpdateOperationTest, UpdateFileByLocalId_NonexistentFile) { |
TEST_F(UpdateOperationTest, UpdateFileByLocalId_Md5) { |
const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
const std::string kResourceId("file:2_file_resource_id"); |
- const std::string kMd5("3b4382ebefec6e743578c76bbd0575ce"); |
- |
- const base::FilePath kTestFile = temp_dir().Append(FILE_PATH_LITERAL("foo")); |
- const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
- google_apis::test_util::WriteStringToFile(kTestFile, kTestFileContent); |
const std::string local_id = GetLocalId(kFilePath); |
EXPECT_FALSE(local_id.empty()); |
- // First store a file to cache. |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::FileCache::Store, |
- base::Unretained(cache()), |
- local_id, kMd5, kTestFile, |
- internal::FileCache::FILE_OPERATION_COPY), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- test_util::RunBlockingPoolTask(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Add the dirty bit. |
- error = FILE_ERROR_FAILED; |
- scoped_ptr<base::ScopedClosureRunner> file_closer; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::FileCache::OpenForWrite, |
- base::Unretained(cache()), |
- local_id, |
- &file_closer), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- test_util::RunBlockingPoolTask(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
+ const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
+ EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
int64 original_changestamp = fake_service()->largest_changestamp(); |
// The callback will be called upon completion of UpdateFileByLocalId(). |
- error = FILE_ERROR_FAILED; |
+ FileError error = FILE_ERROR_FAILED; |
operation_->UpdateFileByLocalId( |
local_id, |
ClientContext(USER_INITIATED), |
@@ -218,6 +187,7 @@ TEST_F(UpdateOperationTest, UpdateFileByLocalId_Md5) { |
EXPECT_FALSE(cache_entry.is_dirty()); |
// Again mark the cache file dirty. |
+ scoped_ptr<base::ScopedClosureRunner> file_closer; |
error = FILE_ERROR_FAILED; |
base::PostTaskAndReplyWithResult( |
blocking_task_runner(), |
@@ -289,5 +259,81 @@ TEST_F(UpdateOperationTest, UpdateFileByLocalId_Md5) { |
EXPECT_LE(original_changestamp, fake_service()->largest_changestamp()); |
} |
+TEST_F(UpdateOperationTest, UpdateFileByLocalId_OpenedForWrite) { |
+ const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
+ const std::string kResourceId("file:2_file_resource_id"); |
+ |
+ const std::string local_id = GetLocalId(kFilePath); |
+ EXPECT_FALSE(local_id.empty()); |
+ |
+ const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
+ EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
+ |
+ // Emulate a situation where someone is writing to the file. |
+ scoped_ptr<base::ScopedClosureRunner> file_closer; |
+ FileError error = FILE_ERROR_FAILED; |
+ base::PostTaskAndReplyWithResult( |
+ blocking_task_runner(), |
+ FROM_HERE, |
+ base::Bind(&internal::FileCache::OpenForWrite, |
+ base::Unretained(cache()), |
+ local_id, |
+ &file_closer), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ test_util::RunBlockingPoolTask(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // Update. This should not clear the dirty bit. |
+ error = FILE_ERROR_FAILED; |
+ operation_->UpdateFileByLocalId( |
+ local_id, |
+ ClientContext(USER_INITIATED), |
+ UpdateOperation::RUN_CONTENT_CHECK, |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ test_util::RunBlockingPoolTask(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // Make sure that the cache is still dirty. |
+ bool success = false; |
+ FileCacheEntry cache_entry; |
+ base::PostTaskAndReplyWithResult( |
+ blocking_task_runner(), |
+ FROM_HERE, |
+ base::Bind(&internal::FileCache::GetCacheEntry, |
+ base::Unretained(cache()), |
+ local_id, |
+ &cache_entry), |
+ google_apis::test_util::CreateCopyResultCallback(&success)); |
+ test_util::RunBlockingPoolTask(); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRUE(cache_entry.is_dirty()); |
+ |
+ // Close the file. |
+ file_closer.reset(); |
+ |
+ // Update. This should clear the dirty bit. |
+ error = FILE_ERROR_FAILED; |
+ operation_->UpdateFileByLocalId( |
+ local_id, |
+ ClientContext(USER_INITIATED), |
+ UpdateOperation::RUN_CONTENT_CHECK, |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ test_util::RunBlockingPoolTask(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // Make sure that the cache is no longer dirty. |
+ base::PostTaskAndReplyWithResult( |
+ blocking_task_runner(), |
+ FROM_HERE, |
+ base::Bind(&internal::FileCache::GetCacheEntry, |
+ base::Unretained(cache()), |
+ local_id, |
+ &cache_entry), |
+ google_apis::test_util::CreateCopyResultCallback(&success)); |
+ test_util::RunBlockingPoolTask(); |
+ EXPECT_TRUE(success); |
+ EXPECT_FALSE(cache_entry.is_dirty()); |
+} |
+ |
} // namespace file_system |
} // namespace drive |