| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <stack> | 6 #include <stack> |
| 7 | 7 |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "chrome/browser/sync_file_system/sync_file_system_test_util.h" | 27 #include "chrome/browser/sync_file_system/sync_file_system_test_util.h" |
| 28 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" | 28 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" |
| 29 #include "chrome/test/base/testing_profile.h" | 29 #include "chrome/test/base/testing_profile.h" |
| 30 #include "content/public/test/test_browser_thread.h" | 30 #include "content/public/test/test_browser_thread.h" |
| 31 #include "content/public/test/test_browser_thread_bundle.h" | 31 #include "content/public/test/test_browser_thread_bundle.h" |
| 32 #include "extensions/common/extension.h" | 32 #include "extensions/common/extension.h" |
| 33 #include "google_apis/drive/drive_api_parser.h" | 33 #include "google_apis/drive/drive_api_parser.h" |
| 34 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 35 #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" | 35 #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" |
| 36 #include "third_party/leveldatabase/src/include/leveldb/env.h" | 36 #include "third_party/leveldatabase/src/include/leveldb/env.h" |
| 37 #include "webkit/browser/fileapi/file_system_context.h" | 37 #include "storage/browser/fileapi/file_system_context.h" |
| 38 | 38 |
| 39 #define FPL(a) FILE_PATH_LITERAL(a) | 39 #define FPL(a) FILE_PATH_LITERAL(a) |
| 40 | 40 |
| 41 namespace sync_file_system { | 41 namespace sync_file_system { |
| 42 namespace drive_backend { | 42 namespace drive_backend { |
| 43 | 43 |
| 44 typedef fileapi::FileSystemOperation::FileEntryList FileEntryList; | 44 typedef storage::FileSystemOperation::FileEntryList FileEntryList; |
| 45 | 45 |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 template <typename T> | 48 template <typename T> |
| 49 void SetValueAndCallClosure(const base::Closure& closure, | 49 void SetValueAndCallClosure(const base::Closure& closure, |
| 50 T* arg_out, | 50 T* arg_out, |
| 51 T arg) { | 51 T arg) { |
| 52 *arg_out = base::internal::CallbackForward(arg); | 52 *arg_out = base::internal::CallbackForward(arg); |
| 53 closure.Run(); | 53 closure.Run(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 void SetSyncStatusAndUrl(const base::Closure& closure, | 56 void SetSyncStatusAndUrl(const base::Closure& closure, |
| 57 SyncStatusCode* status_out, | 57 SyncStatusCode* status_out, |
| 58 fileapi::FileSystemURL* url_out, | 58 storage::FileSystemURL* url_out, |
| 59 SyncStatusCode status, | 59 SyncStatusCode status, |
| 60 const fileapi::FileSystemURL& url) { | 60 const storage::FileSystemURL& url) { |
| 61 *status_out = status; | 61 *status_out = status; |
| 62 *url_out = url; | 62 *url_out = url; |
| 63 closure.Run(); | 63 closure.Run(); |
| 64 } | 64 } |
| 65 | 65 |
| 66 } // namespace | 66 } // namespace |
| 67 | 67 |
| 68 class DriveBackendSyncTest : public testing::Test, | 68 class DriveBackendSyncTest : public testing::Test, |
| 69 public LocalFileSyncService::Observer, | 69 public LocalFileSyncService::Observer, |
| 70 public RemoteFileSyncService::Observer { | 70 public RemoteFileSyncService::Observer { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 | 158 |
| 159 virtual void OnRemoteChangeQueueUpdated(int64 pending_changes_hint) OVERRIDE { | 159 virtual void OnRemoteChangeQueueUpdated(int64 pending_changes_hint) OVERRIDE { |
| 160 pending_remote_changes_ = pending_changes_hint; | 160 pending_remote_changes_ = pending_changes_hint; |
| 161 } | 161 } |
| 162 | 162 |
| 163 virtual void OnLocalChangeAvailable(int64 pending_changes_hint) OVERRIDE { | 163 virtual void OnLocalChangeAvailable(int64 pending_changes_hint) OVERRIDE { |
| 164 pending_local_changes_ = pending_changes_hint; | 164 pending_local_changes_ = pending_changes_hint; |
| 165 } | 165 } |
| 166 | 166 |
| 167 protected: | 167 protected: |
| 168 fileapi::FileSystemURL CreateURL(const std::string& app_id, | 168 storage::FileSystemURL CreateURL(const std::string& app_id, |
| 169 const base::FilePath::StringType& path) { | 169 const base::FilePath::StringType& path) { |
| 170 return CreateURL(app_id, base::FilePath(path)); | 170 return CreateURL(app_id, base::FilePath(path)); |
| 171 } | 171 } |
| 172 | 172 |
| 173 fileapi::FileSystemURL CreateURL(const std::string& app_id, | 173 storage::FileSystemURL CreateURL(const std::string& app_id, |
| 174 const base::FilePath& path) { | 174 const base::FilePath& path) { |
| 175 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 175 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 176 return CreateSyncableFileSystemURL(origin, path); | 176 return CreateSyncableFileSystemURL(origin, path); |
| 177 } | 177 } |
| 178 | 178 |
| 179 bool GetAppRootFolderID(const std::string& app_id, | 179 bool GetAppRootFolderID(const std::string& app_id, |
| 180 std::string* folder_id) { | 180 std::string* folder_id) { |
| 181 base::RunLoop run_loop; | 181 base::RunLoop run_loop; |
| 182 bool success = false; | 182 bool success = false; |
| 183 FileTracker tracker; | 183 FileTracker tracker; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 const base::FilePath::StringType& path) { | 266 const base::FilePath::StringType& path) { |
| 267 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); | 267 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); |
| 268 EXPECT_EQ(base::File::FILE_OK, | 268 EXPECT_EQ(base::File::FILE_OK, |
| 269 file_systems_[app_id]->CreateDirectory( | 269 file_systems_[app_id]->CreateDirectory( |
| 270 CreateURL(app_id, path))); | 270 CreateURL(app_id, path))); |
| 271 } | 271 } |
| 272 | 272 |
| 273 void AddOrUpdateLocalFile(const std::string& app_id, | 273 void AddOrUpdateLocalFile(const std::string& app_id, |
| 274 const base::FilePath::StringType& path, | 274 const base::FilePath::StringType& path, |
| 275 const std::string& content) { | 275 const std::string& content) { |
| 276 fileapi::FileSystemURL url(CreateURL(app_id, path)); | 276 storage::FileSystemURL url(CreateURL(app_id, path)); |
| 277 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); | 277 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); |
| 278 EXPECT_EQ(base::File::FILE_OK, file_systems_[app_id]->CreateFile(url)); | 278 EXPECT_EQ(base::File::FILE_OK, file_systems_[app_id]->CreateFile(url)); |
| 279 int64 bytes_written = file_systems_[app_id]->WriteString(url, content); | 279 int64 bytes_written = file_systems_[app_id]->WriteString(url, content); |
| 280 EXPECT_EQ(static_cast<int64>(content.size()), bytes_written); | 280 EXPECT_EQ(static_cast<int64>(content.size()), bytes_written); |
| 281 base::RunLoop().RunUntilIdle(); | 281 base::RunLoop().RunUntilIdle(); |
| 282 } | 282 } |
| 283 | 283 |
| 284 void UpdateLocalFile(const std::string& app_id, | 284 void UpdateLocalFile(const std::string& app_id, |
| 285 const base::FilePath::StringType& path, | 285 const base::FilePath::StringType& path, |
| 286 const std::string& content) { | 286 const std::string& content) { |
| 287 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); | 287 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); |
| 288 int64 bytes_written = file_systems_[app_id]->WriteString( | 288 int64 bytes_written = file_systems_[app_id]->WriteString( |
| 289 CreateURL(app_id, path), content); | 289 CreateURL(app_id, path), content); |
| 290 EXPECT_EQ(static_cast<int64>(content.size()), bytes_written); | 290 EXPECT_EQ(static_cast<int64>(content.size()), bytes_written); |
| 291 base::RunLoop().RunUntilIdle(); | 291 base::RunLoop().RunUntilIdle(); |
| 292 } | 292 } |
| 293 | 293 |
| 294 void RemoveLocal(const std::string& app_id, | 294 void RemoveLocal(const std::string& app_id, |
| 295 const base::FilePath::StringType& path) { | 295 const base::FilePath::StringType& path) { |
| 296 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); | 296 ASSERT_TRUE(ContainsKey(file_systems_, app_id)); |
| 297 EXPECT_EQ(base::File::FILE_OK, | 297 EXPECT_EQ(base::File::FILE_OK, |
| 298 file_systems_[app_id]->Remove( | 298 file_systems_[app_id]->Remove( |
| 299 CreateURL(app_id, path), | 299 CreateURL(app_id, path), |
| 300 true /* recursive */)); | 300 true /* recursive */)); |
| 301 base::RunLoop().RunUntilIdle(); | 301 base::RunLoop().RunUntilIdle(); |
| 302 } | 302 } |
| 303 | 303 |
| 304 SyncStatusCode ProcessLocalChange() { | 304 SyncStatusCode ProcessLocalChange() { |
| 305 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 305 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 306 fileapi::FileSystemURL url; | 306 storage::FileSystemURL url; |
| 307 base::RunLoop run_loop; | 307 base::RunLoop run_loop; |
| 308 local_sync_service_->ProcessLocalChange(base::Bind( | 308 local_sync_service_->ProcessLocalChange(base::Bind( |
| 309 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); | 309 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); |
| 310 run_loop.Run(); | 310 run_loop.Run(); |
| 311 return status; | 311 return status; |
| 312 } | 312 } |
| 313 | 313 |
| 314 SyncStatusCode ProcessRemoteChange() { | 314 SyncStatusCode ProcessRemoteChange() { |
| 315 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 315 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 316 fileapi::FileSystemURL url; | 316 storage::FileSystemURL url; |
| 317 base::RunLoop run_loop; | 317 base::RunLoop run_loop; |
| 318 remote_sync_service_->ProcessRemoteChange(base::Bind( | 318 remote_sync_service_->ProcessRemoteChange(base::Bind( |
| 319 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); | 319 &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url)); |
| 320 run_loop.Run(); | 320 run_loop.Run(); |
| 321 return status; | 321 return status; |
| 322 } | 322 } |
| 323 | 323 |
| 324 int64 GetLargestChangeID() { | 324 int64 GetLargestChangeID() { |
| 325 scoped_ptr<google_apis::AboutResource> about_resource; | 325 scoped_ptr<google_apis::AboutResource> about_resource; |
| 326 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 326 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 folder_id, &remote_entries)); | 455 folder_id, &remote_entries)); |
| 456 std::map<std::string, const google_apis::ResourceEntry*> | 456 std::map<std::string, const google_apis::ResourceEntry*> |
| 457 remote_entry_by_title; | 457 remote_entry_by_title; |
| 458 for (size_t i = 0; i < remote_entries.size(); ++i) { | 458 for (size_t i = 0; i < remote_entries.size(); ++i) { |
| 459 google_apis::ResourceEntry* remote_entry = remote_entries[i]; | 459 google_apis::ResourceEntry* remote_entry = remote_entries[i]; |
| 460 EXPECT_FALSE(ContainsKey(remote_entry_by_title, remote_entry->title())) | 460 EXPECT_FALSE(ContainsKey(remote_entry_by_title, remote_entry->title())) |
| 461 << "title: " << remote_entry->title(); | 461 << "title: " << remote_entry->title(); |
| 462 remote_entry_by_title[remote_entry->title()] = remote_entry; | 462 remote_entry_by_title[remote_entry->title()] = remote_entry; |
| 463 } | 463 } |
| 464 | 464 |
| 465 fileapi::FileSystemURL url(CreateURL(app_id, path)); | 465 storage::FileSystemURL url(CreateURL(app_id, path)); |
| 466 FileEntryList local_entries; | 466 FileEntryList local_entries; |
| 467 EXPECT_EQ(base::File::FILE_OK, | 467 EXPECT_EQ(base::File::FILE_OK, |
| 468 file_system->ReadDirectory(url, &local_entries)); | 468 file_system->ReadDirectory(url, &local_entries)); |
| 469 for (FileEntryList::iterator itr = local_entries.begin(); | 469 for (FileEntryList::iterator itr = local_entries.begin(); |
| 470 itr != local_entries.end(); | 470 itr != local_entries.end(); |
| 471 ++itr) { | 471 ++itr) { |
| 472 const fileapi::DirectoryEntry& local_entry = *itr; | 472 const storage::DirectoryEntry& local_entry = *itr; |
| 473 fileapi::FileSystemURL entry_url( | 473 storage::FileSystemURL entry_url( |
| 474 CreateURL(app_id, path.Append(local_entry.name))); | 474 CreateURL(app_id, path.Append(local_entry.name))); |
| 475 std::string title = | 475 std::string title = |
| 476 fileapi::VirtualPath::BaseName(entry_url.path()).AsUTF8Unsafe(); | 476 storage::VirtualPath::BaseName(entry_url.path()).AsUTF8Unsafe(); |
| 477 SCOPED_TRACE(testing::Message() << "Verifying entry: " << title); | 477 SCOPED_TRACE(testing::Message() << "Verifying entry: " << title); |
| 478 | 478 |
| 479 ASSERT_TRUE(ContainsKey(remote_entry_by_title, title)); | 479 ASSERT_TRUE(ContainsKey(remote_entry_by_title, title)); |
| 480 const google_apis::ResourceEntry& remote_entry = | 480 const google_apis::ResourceEntry& remote_entry = |
| 481 *remote_entry_by_title[title]; | 481 *remote_entry_by_title[title]; |
| 482 if (local_entry.is_directory) { | 482 if (local_entry.is_directory) { |
| 483 ASSERT_TRUE(remote_entry.is_folder()); | 483 ASSERT_TRUE(remote_entry.is_folder()); |
| 484 VerifyConsistencyForFolder(app_id, entry_url.path(), | 484 VerifyConsistencyForFolder(app_id, entry_url.path(), |
| 485 remote_entry.resource_id(), | 485 remote_entry.resource_id(), |
| 486 file_system); | 486 file_system); |
| 487 } else { | 487 } else { |
| 488 ASSERT_TRUE(remote_entry.is_file()); | 488 ASSERT_TRUE(remote_entry.is_file()); |
| 489 VerifyConsistencyForFile(app_id, entry_url.path(), | 489 VerifyConsistencyForFile(app_id, entry_url.path(), |
| 490 remote_entry.resource_id(), | 490 remote_entry.resource_id(), |
| 491 file_system); | 491 file_system); |
| 492 } | 492 } |
| 493 remote_entry_by_title.erase(title); | 493 remote_entry_by_title.erase(title); |
| 494 } | 494 } |
| 495 | 495 |
| 496 EXPECT_TRUE(remote_entry_by_title.empty()); | 496 EXPECT_TRUE(remote_entry_by_title.empty()); |
| 497 } | 497 } |
| 498 | 498 |
| 499 void VerifyConsistencyForFile(const std::string& app_id, | 499 void VerifyConsistencyForFile(const std::string& app_id, |
| 500 const base::FilePath& path, | 500 const base::FilePath& path, |
| 501 const std::string& file_id, | 501 const std::string& file_id, |
| 502 CannedSyncableFileSystem* file_system) { | 502 CannedSyncableFileSystem* file_system) { |
| 503 fileapi::FileSystemURL url(CreateURL(app_id, path)); | 503 storage::FileSystemURL url(CreateURL(app_id, path)); |
| 504 std::string file_content; | 504 std::string file_content; |
| 505 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 505 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 506 fake_drive_service_helper_->ReadFile(file_id, &file_content)); | 506 fake_drive_service_helper_->ReadFile(file_id, &file_content)); |
| 507 EXPECT_EQ(base::File::FILE_OK, | 507 EXPECT_EQ(base::File::FILE_OK, |
| 508 file_system->VerifyFile(url, file_content)); | 508 file_system->VerifyFile(url, file_content)); |
| 509 } | 509 } |
| 510 | 510 |
| 511 size_t CountApp() { | 511 size_t CountApp() { |
| 512 return file_systems_.size(); | 512 return file_systems_.size(); |
| 513 } | 513 } |
| 514 | 514 |
| 515 size_t CountLocalFile(const std::string& app_id) { | 515 size_t CountLocalFile(const std::string& app_id) { |
| 516 if (!ContainsKey(file_systems_, app_id)) | 516 if (!ContainsKey(file_systems_, app_id)) |
| 517 return 0; | 517 return 0; |
| 518 | 518 |
| 519 CannedSyncableFileSystem* file_system = file_systems_[app_id]; | 519 CannedSyncableFileSystem* file_system = file_systems_[app_id]; |
| 520 std::stack<base::FilePath> folders; | 520 std::stack<base::FilePath> folders; |
| 521 folders.push(base::FilePath()); // root folder | 521 folders.push(base::FilePath()); // root folder |
| 522 | 522 |
| 523 size_t result = 1; | 523 size_t result = 1; |
| 524 while (!folders.empty()) { | 524 while (!folders.empty()) { |
| 525 fileapi::FileSystemURL url(CreateURL(app_id, folders.top())); | 525 storage::FileSystemURL url(CreateURL(app_id, folders.top())); |
| 526 folders.pop(); | 526 folders.pop(); |
| 527 | 527 |
| 528 FileEntryList entries; | 528 FileEntryList entries; |
| 529 EXPECT_EQ(base::File::FILE_OK, | 529 EXPECT_EQ(base::File::FILE_OK, |
| 530 file_system->ReadDirectory(url, &entries)); | 530 file_system->ReadDirectory(url, &entries)); |
| 531 for (FileEntryList::iterator itr = entries.begin(); | 531 for (FileEntryList::iterator itr = entries.begin(); |
| 532 itr != entries.end(); ++itr) { | 532 itr != entries.end(); ++itr) { |
| 533 ++result; | 533 ++result; |
| 534 if (itr->is_directory) | 534 if (itr->is_directory) |
| 535 folders.push(url.path().Append(itr->name)); | 535 folders.push(url.path().Append(itr->name)); |
| (...skipping 1188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 | 1724 |
| 1725 EXPECT_EQ(1u, CountApp()); | 1725 EXPECT_EQ(1u, CountApp()); |
| 1726 EXPECT_EQ(1u, CountLocalFile(app_id)); | 1726 EXPECT_EQ(1u, CountLocalFile(app_id)); |
| 1727 | 1727 |
| 1728 EXPECT_EQ(2u, CountMetadata()); | 1728 EXPECT_EQ(2u, CountMetadata()); |
| 1729 EXPECT_EQ(2u, CountTracker()); | 1729 EXPECT_EQ(2u, CountTracker()); |
| 1730 } | 1730 } |
| 1731 | 1731 |
| 1732 } // namespace drive_backend | 1732 } // namespace drive_backend |
| 1733 } // namespace sync_file_system | 1733 } // namespace sync_file_system |
| OLD | NEW |