| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/fake_remote_change_processor.h" | 5 #include "chrome/browser/sync_file_system/fake_remote_change_processor.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
| 12 #include "chrome/browser/sync_file_system/file_change.h" | 12 #include "chrome/browser/sync_file_system/file_change.h" |
| 13 #include "chrome/browser/sync_file_system/sync_file_metadata.h" | 13 #include "chrome/browser/sync_file_system/sync_file_metadata.h" |
| 14 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" | 14 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "webkit/browser/fileapi/file_system_url.h" | 16 #include "storage/browser/fileapi/file_system_url.h" |
| 17 #include "webkit/common/fileapi/file_system_util.h" | 17 #include "storage/common/fileapi/file_system_util.h" |
| 18 | 18 |
| 19 namespace sync_file_system { | 19 namespace sync_file_system { |
| 20 | 20 |
| 21 FakeRemoteChangeProcessor::FakeRemoteChangeProcessor() { | 21 FakeRemoteChangeProcessor::FakeRemoteChangeProcessor() { |
| 22 } | 22 } |
| 23 | 23 |
| 24 FakeRemoteChangeProcessor::~FakeRemoteChangeProcessor() { | 24 FakeRemoteChangeProcessor::~FakeRemoteChangeProcessor() { |
| 25 } | 25 } |
| 26 | 26 |
| 27 void FakeRemoteChangeProcessor::PrepareForProcessRemoteChange( | 27 void FakeRemoteChangeProcessor::PrepareForProcessRemoteChange( |
| 28 const fileapi::FileSystemURL& url, | 28 const storage::FileSystemURL& url, |
| 29 const PrepareChangeCallback& callback) { | 29 const PrepareChangeCallback& callback) { |
| 30 SyncFileMetadata local_metadata; | 30 SyncFileMetadata local_metadata; |
| 31 | 31 |
| 32 if (fileapi::VirtualPath::IsRootPath(url.path())) { | 32 if (storage::VirtualPath::IsRootPath(url.path())) { |
| 33 // Origin root directory case. | 33 // Origin root directory case. |
| 34 local_metadata = SyncFileMetadata( | 34 local_metadata = SyncFileMetadata( |
| 35 SYNC_FILE_TYPE_DIRECTORY, 0, base::Time::Now()); | 35 SYNC_FILE_TYPE_DIRECTORY, 0, base::Time::Now()); |
| 36 } | 36 } |
| 37 | 37 |
| 38 URLToFileMetadata::iterator found_metadata = local_file_metadata_.find(url); | 38 URLToFileMetadata::iterator found_metadata = local_file_metadata_.find(url); |
| 39 if (found_metadata != local_file_metadata_.end()) | 39 if (found_metadata != local_file_metadata_.end()) |
| 40 local_metadata = found_metadata->second; | 40 local_metadata = found_metadata->second; |
| 41 | 41 |
| 42 // Override |local_metadata| by applied changes. | 42 // Override |local_metadata| by applied changes. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 59 | 59 |
| 60 base::ThreadTaskRunnerHandle::Get()->PostTask( | 60 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 61 FROM_HERE, | 61 FROM_HERE, |
| 62 base::Bind(callback, SYNC_STATUS_OK, | 62 base::Bind(callback, SYNC_STATUS_OK, |
| 63 local_metadata, change_list)); | 63 local_metadata, change_list)); |
| 64 } | 64 } |
| 65 | 65 |
| 66 void FakeRemoteChangeProcessor::ApplyRemoteChange( | 66 void FakeRemoteChangeProcessor::ApplyRemoteChange( |
| 67 const FileChange& change, | 67 const FileChange& change, |
| 68 const base::FilePath& local_path, | 68 const base::FilePath& local_path, |
| 69 const fileapi::FileSystemURL& url, | 69 const storage::FileSystemURL& url, |
| 70 const SyncStatusCallback& callback) { | 70 const SyncStatusCallback& callback) { |
| 71 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 71 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 72 base::FilePath ancestor = fileapi::VirtualPath::DirName(url.path()); | 72 base::FilePath ancestor = storage::VirtualPath::DirName(url.path()); |
| 73 while (true) { | 73 while (true) { |
| 74 fileapi::FileSystemURL ancestor_url = | 74 storage::FileSystemURL ancestor_url = |
| 75 CreateSyncableFileSystemURL(url.origin(), ancestor); | 75 CreateSyncableFileSystemURL(url.origin(), ancestor); |
| 76 if (!ancestor_url.is_valid()) | 76 if (!ancestor_url.is_valid()) |
| 77 break; | 77 break; |
| 78 | 78 |
| 79 URLToFileChangeList::iterator found_list = | 79 URLToFileChangeList::iterator found_list = |
| 80 local_changes_.find(ancestor_url); | 80 local_changes_.find(ancestor_url); |
| 81 if (found_list != local_changes_.end()) { | 81 if (found_list != local_changes_.end()) { |
| 82 const FileChange& local_change = found_list->second.back(); | 82 const FileChange& local_change = found_list->second.back(); |
| 83 if (local_change.IsAddOrUpdate() && | 83 if (local_change.IsAddOrUpdate() && |
| 84 local_change.file_type() != SYNC_FILE_TYPE_DIRECTORY) { | 84 local_change.file_type() != SYNC_FILE_TYPE_DIRECTORY) { |
| 85 status = SYNC_FILE_ERROR_NOT_A_DIRECTORY; | 85 status = SYNC_FILE_ERROR_NOT_A_DIRECTORY; |
| 86 break; | 86 break; |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 base::FilePath ancestor_parent = fileapi::VirtualPath::DirName(ancestor); | 90 base::FilePath ancestor_parent = storage::VirtualPath::DirName(ancestor); |
| 91 if (ancestor == ancestor_parent) | 91 if (ancestor == ancestor_parent) |
| 92 break; | 92 break; |
| 93 ancestor = ancestor_parent; | 93 ancestor = ancestor_parent; |
| 94 } | 94 } |
| 95 if (status == SYNC_STATUS_UNKNOWN) { | 95 if (status == SYNC_STATUS_UNKNOWN) { |
| 96 applied_changes_[url].push_back(change); | 96 applied_changes_[url].push_back(change); |
| 97 status = SYNC_STATUS_OK; | 97 status = SYNC_STATUS_OK; |
| 98 } | 98 } |
| 99 base::ThreadTaskRunnerHandle::Get()->PostTask( | 99 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 100 FROM_HERE, base::Bind(callback, status)); | 100 FROM_HERE, base::Bind(callback, status)); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void FakeRemoteChangeProcessor::FinalizeRemoteSync( | 103 void FakeRemoteChangeProcessor::FinalizeRemoteSync( |
| 104 const fileapi::FileSystemURL& url, | 104 const storage::FileSystemURL& url, |
| 105 bool clear_local_changes, | 105 bool clear_local_changes, |
| 106 const base::Closure& completion_callback) { | 106 const base::Closure& completion_callback) { |
| 107 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, completion_callback); | 107 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, completion_callback); |
| 108 } | 108 } |
| 109 | 109 |
| 110 void FakeRemoteChangeProcessor::RecordFakeLocalChange( | 110 void FakeRemoteChangeProcessor::RecordFakeLocalChange( |
| 111 const fileapi::FileSystemURL& url, | 111 const storage::FileSystemURL& url, |
| 112 const FileChange& change, | 112 const FileChange& change, |
| 113 const SyncStatusCallback& callback) { | 113 const SyncStatusCallback& callback) { |
| 114 local_changes_[url].Update(change); | 114 local_changes_[url].Update(change); |
| 115 base::ThreadTaskRunnerHandle::Get()->PostTask( | 115 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 116 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | 116 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); |
| 117 } | 117 } |
| 118 | 118 |
| 119 void FakeRemoteChangeProcessor::UpdateLocalFileMetadata( | 119 void FakeRemoteChangeProcessor::UpdateLocalFileMetadata( |
| 120 const fileapi::FileSystemURL& url, | 120 const storage::FileSystemURL& url, |
| 121 const FileChange& change) { | 121 const FileChange& change) { |
| 122 if (change.IsAddOrUpdate()) { | 122 if (change.IsAddOrUpdate()) { |
| 123 local_file_metadata_[url] = SyncFileMetadata( | 123 local_file_metadata_[url] = SyncFileMetadata( |
| 124 change.file_type(), 100 /* size */, base::Time::Now()); | 124 change.file_type(), 100 /* size */, base::Time::Now()); |
| 125 } else { | 125 } else { |
| 126 local_file_metadata_.erase(url); | 126 local_file_metadata_.erase(url); |
| 127 } | 127 } |
| 128 local_changes_[url].Update(change); | 128 local_changes_[url].Update(change); |
| 129 } | 129 } |
| 130 | 130 |
| 131 void FakeRemoteChangeProcessor::ClearLocalChanges( | 131 void FakeRemoteChangeProcessor::ClearLocalChanges( |
| 132 const fileapi::FileSystemURL& url) { | 132 const storage::FileSystemURL& url) { |
| 133 local_changes_.erase(url); | 133 local_changes_.erase(url); |
| 134 } | 134 } |
| 135 | 135 |
| 136 const FakeRemoteChangeProcessor::URLToFileChangesMap& | 136 const FakeRemoteChangeProcessor::URLToFileChangesMap& |
| 137 FakeRemoteChangeProcessor::GetAppliedRemoteChanges() const { | 137 FakeRemoteChangeProcessor::GetAppliedRemoteChanges() const { |
| 138 return applied_changes_; | 138 return applied_changes_; |
| 139 } | 139 } |
| 140 | 140 |
| 141 void FakeRemoteChangeProcessor::VerifyConsistency( | 141 void FakeRemoteChangeProcessor::VerifyConsistency( |
| 142 const URLToFileChangesMap& expected_changes) { | 142 const URLToFileChangesMap& expected_changes) { |
| 143 EXPECT_EQ(expected_changes.size(), applied_changes_.size()); | 143 EXPECT_EQ(expected_changes.size(), applied_changes_.size()); |
| 144 for (URLToFileChangesMap::const_iterator itr = applied_changes_.begin(); | 144 for (URLToFileChangesMap::const_iterator itr = applied_changes_.begin(); |
| 145 itr != applied_changes_.end(); ++itr) { | 145 itr != applied_changes_.end(); ++itr) { |
| 146 const fileapi::FileSystemURL& url = itr->first; | 146 const storage::FileSystemURL& url = itr->first; |
| 147 URLToFileChangesMap::const_iterator found = expected_changes.find(url); | 147 URLToFileChangesMap::const_iterator found = expected_changes.find(url); |
| 148 if (found == expected_changes.end()) { | 148 if (found == expected_changes.end()) { |
| 149 EXPECT_TRUE(found != expected_changes.end()) | 149 EXPECT_TRUE(found != expected_changes.end()) |
| 150 << "Change not expected for " << url.DebugString(); | 150 << "Change not expected for " << url.DebugString(); |
| 151 continue; | 151 continue; |
| 152 } | 152 } |
| 153 | 153 |
| 154 const std::vector<FileChange>& applied = itr->second; | 154 const std::vector<FileChange>& applied = itr->second; |
| 155 const std::vector<FileChange>& expected = found->second; | 155 const std::vector<FileChange>& expected = found->second; |
| 156 | 156 |
| 157 if (applied.empty() || expected.empty()) { | 157 if (applied.empty() || expected.empty()) { |
| 158 EXPECT_TRUE(!applied.empty()); | 158 EXPECT_TRUE(!applied.empty()); |
| 159 EXPECT_TRUE(!expected.empty()); | 159 EXPECT_TRUE(!expected.empty()); |
| 160 continue; | 160 continue; |
| 161 } | 161 } |
| 162 | 162 |
| 163 EXPECT_EQ(expected.size(), applied.size()); | 163 EXPECT_EQ(expected.size(), applied.size()); |
| 164 | 164 |
| 165 for (size_t i = 0; i < applied.size() && i < expected.size(); ++i) { | 165 for (size_t i = 0; i < applied.size() && i < expected.size(); ++i) { |
| 166 EXPECT_EQ(expected[i], applied[i]) | 166 EXPECT_EQ(expected[i], applied[i]) |
| 167 << url.DebugString() | 167 << url.DebugString() |
| 168 << " expected:" << expected[i].DebugString() | 168 << " expected:" << expected[i].DebugString() |
| 169 << " applied:" << applied[i].DebugString(); | 169 << " applied:" << applied[i].DebugString(); |
| 170 } | 170 } |
| 171 } | 171 } |
| 172 } | 172 } |
| 173 | 173 |
| 174 } // namespace sync_file_system | 174 } // namespace sync_file_system |
| OLD | NEW |