| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/message_loop_proxy.h" | 9 #include "base/message_loop_proxy.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 SyncStatusCode status, | 82 SyncStatusCode status, |
| 83 const SyncFileMetadata& metadata) { | 83 const SyncFileMetadata& metadata) { |
| 84 SCOPED_TRACE(testing::Message() << where.ToString()); | 84 SCOPED_TRACE(testing::Message() << where.ToString()); |
| 85 *status_out = status; | 85 *status_out = status; |
| 86 *metadata_out = metadata; | 86 *metadata_out = metadata; |
| 87 oncompleted.Run(); | 87 oncompleted.Run(); |
| 88 } | 88 } |
| 89 | 89 |
| 90 ACTION_P(MockStatusCallback, status) { | 90 ACTION_P(MockStatusCallback, status) { |
| 91 base::MessageLoopProxy::current()->PostTask( | 91 base::MessageLoopProxy::current()->PostTask( |
| 92 FROM_HERE, base::Bind(arg4, status)); | 92 FROM_HERE, base::Bind(arg3, status)); |
| 93 } | 93 } |
| 94 | 94 |
| 95 ACTION_P2(MockStatusCallbackAndRecordChange, status, changes) { | 95 ACTION_P2(MockStatusCallbackAndRecordChange, status, changes) { |
| 96 base::MessageLoopProxy::current()->PostTask( | 96 base::MessageLoopProxy::current()->PostTask( |
| 97 FROM_HERE, base::Bind(arg4, status)); | 97 FROM_HERE, base::Bind(arg3, status)); |
| 98 changes->push_back(arg0); | 98 changes->push_back(arg0); |
| 99 } | 99 } |
| 100 | 100 |
| 101 } // namespace | 101 } // namespace |
| 102 | 102 |
| 103 class LocalFileSyncServiceTest | 103 class LocalFileSyncServiceTest |
| 104 : public testing::Test, | 104 : public testing::Test, |
| 105 public LocalFileSyncService::Observer { | 105 public LocalFileSyncService::Observer { |
| 106 protected: | 106 protected: |
| 107 LocalFileSyncServiceTest() : num_changes_(0) {} | 107 LocalFileSyncServiceTest() : num_changes_(0) {} |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 StrictMock<MockSyncStatusObserver> status_observer; | 322 StrictMock<MockSyncStatusObserver> status_observer; |
| 323 EXPECT_CALL(status_observer, OnSyncEnabled(kFile)) | 323 EXPECT_CALL(status_observer, OnSyncEnabled(kFile)) |
| 324 .Times(AtLeast(1)); | 324 .Times(AtLeast(1)); |
| 325 file_system_->AddSyncStatusObserver(&status_observer); | 325 file_system_->AddSyncStatusObserver(&status_observer); |
| 326 | 326 |
| 327 // Creates and writes into a file. | 327 // Creates and writes into a file. |
| 328 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kFile)); | 328 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kFile)); |
| 329 EXPECT_EQ(kTestFileDataSize, | 329 EXPECT_EQ(kTestFileDataSize, |
| 330 file_system_->WriteString(kFile, std::string(kTestFileData))); | 330 file_system_->WriteString(kFile, std::string(kTestFileData))); |
| 331 | 331 |
| 332 // Retrieve the file metadata to set up the expected values. | 332 // Retrieve the expected platform_path. |
| 333 base::PlatformFileInfo info; | 333 base::PlatformFileInfo info; |
| 334 FilePath platform_path; | 334 FilePath platform_path; |
| 335 EXPECT_EQ(base::PLATFORM_FILE_OK, | 335 EXPECT_EQ(base::PLATFORM_FILE_OK, |
| 336 file_system_->GetMetadata(kFile, &info, &platform_path)); | 336 file_system_->GetMetadata(kFile, &info, &platform_path)); |
| 337 | 337 |
| 338 ASSERT_FALSE(info.is_directory); | |
| 339 ASSERT_EQ(kTestFileDataSize, info.size); | |
| 340 | |
| 341 fileapi::SyncFileMetadata metadata; | |
| 342 metadata.file_type = fileapi::SYNC_FILE_TYPE_FILE; | |
| 343 metadata.size = info.size; | |
| 344 metadata.last_modified = info.last_modified; | |
| 345 | |
| 346 // The local_change_processor's ApplyLocalChange should be called once | 338 // The local_change_processor's ApplyLocalChange should be called once |
| 347 // with ADD_OR_UPDATE change for TYPE_FILE. | 339 // with ADD_OR_UPDATE change for TYPE_FILE. |
| 348 StrictMock<MockLocalChangeProcessor> local_change_processor; | 340 StrictMock<MockLocalChangeProcessor> local_change_processor; |
| 349 const FileChange change(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 341 const FileChange change(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 350 fileapi::SYNC_FILE_TYPE_FILE); | 342 fileapi::SYNC_FILE_TYPE_FILE); |
| 351 EXPECT_CALL(local_change_processor, | 343 EXPECT_CALL(local_change_processor, |
| 352 ApplyLocalChange(change, platform_path, metadata, kFile, _)) | 344 ApplyLocalChange(change, platform_path, kFile, _)) |
| 353 .WillOnce(MockStatusCallback(fileapi::SYNC_STATUS_OK)); | 345 .WillOnce(MockStatusCallback(fileapi::SYNC_STATUS_OK)); |
| 354 | 346 |
| 355 local_service_->ProcessLocalChange( | 347 local_service_->ProcessLocalChange( |
| 356 &local_change_processor, | 348 &local_change_processor, |
| 357 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), | 349 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), |
| 358 fileapi::SYNC_STATUS_OK, kFile)); | 350 fileapi::SYNC_STATUS_OK, kFile)); |
| 359 | 351 |
| 360 run_loop.Run(); | 352 run_loop.Run(); |
| 361 | 353 |
| 362 file_system_->RemoveSyncStatusObserver(&status_observer); | 354 file_system_->RemoveSyncStatusObserver(&status_observer); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 379 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kFile)); | 371 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kFile)); |
| 380 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->Remove(kFile, false)); | 372 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->Remove(kFile, false)); |
| 381 | 373 |
| 382 // The local_change_processor's ApplyLocalChange should be called once | 374 // The local_change_processor's ApplyLocalChange should be called once |
| 383 // with DELETE change for TYPE_FILE. | 375 // with DELETE change for TYPE_FILE. |
| 384 // The file will NOT exist in the remote side and the processor might | 376 // The file will NOT exist in the remote side and the processor might |
| 385 // return SYNC_FILE_ERROR_NOT_FOUND (as mocked). | 377 // return SYNC_FILE_ERROR_NOT_FOUND (as mocked). |
| 386 StrictMock<MockLocalChangeProcessor> local_change_processor; | 378 StrictMock<MockLocalChangeProcessor> local_change_processor; |
| 387 const FileChange change(FileChange::FILE_CHANGE_DELETE, | 379 const FileChange change(FileChange::FILE_CHANGE_DELETE, |
| 388 fileapi::SYNC_FILE_TYPE_FILE); | 380 fileapi::SYNC_FILE_TYPE_FILE); |
| 389 EXPECT_CALL(local_change_processor, ApplyLocalChange(change, _, _, kFile, _)) | 381 EXPECT_CALL(local_change_processor, ApplyLocalChange(change, _, kFile, _)) |
| 390 .WillOnce(MockStatusCallback(fileapi::SYNC_FILE_ERROR_NOT_FOUND)); | 382 .WillOnce(MockStatusCallback(fileapi::SYNC_FILE_ERROR_NOT_FOUND)); |
| 391 | 383 |
| 392 // The sync should succeed anyway. | 384 // The sync should succeed anyway. |
| 393 local_service_->ProcessLocalChange( | 385 local_service_->ProcessLocalChange( |
| 394 &local_change_processor, | 386 &local_change_processor, |
| 395 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), | 387 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), |
| 396 fileapi::SYNC_STATUS_OK, kFile)); | 388 fileapi::SYNC_STATUS_OK, kFile)); |
| 397 | 389 |
| 398 run_loop.Run(); | 390 run_loop.Run(); |
| 399 | 391 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->Remove(kPath, false)); | 442 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->Remove(kPath, false)); |
| 451 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateDirectory(kPath)); | 443 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateDirectory(kPath)); |
| 452 | 444 |
| 453 // Creates one more file. | 445 // Creates one more file. |
| 454 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kOther)); | 446 EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_->CreateFile(kOther)); |
| 455 | 447 |
| 456 // The local_change_processor's ApplyLocalChange will be called | 448 // The local_change_processor's ApplyLocalChange will be called |
| 457 // twice for FILE_TYPE and FILE_DIRECTORY. | 449 // twice for FILE_TYPE and FILE_DIRECTORY. |
| 458 StrictMock<MockLocalChangeProcessor> local_change_processor; | 450 StrictMock<MockLocalChangeProcessor> local_change_processor; |
| 459 std::vector<FileChange> changes; | 451 std::vector<FileChange> changes; |
| 460 EXPECT_CALL(local_change_processor, ApplyLocalChange(_, _, _, kPath, _)) | 452 EXPECT_CALL(local_change_processor, ApplyLocalChange(_, _, kPath, _)) |
| 461 .Times(2) | 453 .Times(2) |
| 462 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, | 454 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, |
| 463 &changes)) | 455 &changes)) |
| 464 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, | 456 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, |
| 465 &changes)); | 457 &changes)); |
| 466 | 458 |
| 467 local_service_->ProcessLocalChange( | 459 local_service_->ProcessLocalChange( |
| 468 &local_change_processor, | 460 &local_change_processor, |
| 469 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), | 461 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), |
| 470 fileapi::SYNC_STATUS_OK, kPath)); | 462 fileapi::SYNC_STATUS_OK, kPath)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 } | 531 } |
| 540 | 532 |
| 541 EXPECT_EQ(1, GetNumChangesInTracker()); | 533 EXPECT_EQ(1, GetNumChangesInTracker()); |
| 542 file_system_->GetChangedURLsInTracker(&urlset); | 534 file_system_->GetChangedURLsInTracker(&urlset); |
| 543 EXPECT_EQ(1U, urlset.size()); | 535 EXPECT_EQ(1U, urlset.size()); |
| 544 EXPECT_TRUE(urlset.find(kURL) != urlset.end()); | 536 EXPECT_TRUE(urlset.find(kURL) != urlset.end()); |
| 545 | 537 |
| 546 // Next local sync should pick up the recorded change. | 538 // Next local sync should pick up the recorded change. |
| 547 StrictMock<MockLocalChangeProcessor> local_change_processor; | 539 StrictMock<MockLocalChangeProcessor> local_change_processor; |
| 548 std::vector<FileChange> changes; | 540 std::vector<FileChange> changes; |
| 549 EXPECT_CALL(local_change_processor, ApplyLocalChange(_, _, _, kURL, _)) | 541 EXPECT_CALL(local_change_processor, ApplyLocalChange(_, _, kURL, _)) |
| 550 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, | 542 .WillOnce(MockStatusCallbackAndRecordChange(fileapi::SYNC_STATUS_OK, |
| 551 &changes)); | 543 &changes)); |
| 552 { | 544 { |
| 553 base::RunLoop run_loop; | 545 base::RunLoop run_loop; |
| 554 local_service_->ProcessLocalChange( | 546 local_service_->ProcessLocalChange( |
| 555 &local_change_processor, | 547 &local_change_processor, |
| 556 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), | 548 base::Bind(&OnSyncCompleted, FROM_HERE, run_loop.QuitClosure(), |
| 557 fileapi::SYNC_STATUS_OK, kURL)); | 549 fileapi::SYNC_STATUS_OK, kURL)); |
| 558 run_loop.Run(); | 550 run_loop.Run(); |
| 559 } | 551 } |
| 560 | 552 |
| 561 EXPECT_EQ(1U, changes.size()); | 553 EXPECT_EQ(1U, changes.size()); |
| 562 EXPECT_EQ(change, changes[0]); | 554 EXPECT_EQ(change, changes[0]); |
| 563 } | 555 } |
| 564 | 556 |
| 565 // TODO(kinuko): Add tests for multiple file changes and multiple | 557 // TODO(kinuko): Add tests for multiple file changes and multiple |
| 566 // FileSystemContexts. | 558 // FileSystemContexts. |
| 567 | 559 |
| 568 } // namespace sync_file_system | 560 } // namespace sync_file_system |
| OLD | NEW |