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 |