Chromium Code Reviews| 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 <deque> | 5 #include <deque> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 class TaskManagerClient | 53 class TaskManagerClient |
| 54 : public SyncTaskManager::Client, | 54 : public SyncTaskManager::Client, |
| 55 public base::SupportsWeakPtr<TaskManagerClient> { | 55 public base::SupportsWeakPtr<TaskManagerClient> { |
| 56 public: | 56 public: |
| 57 explicit TaskManagerClient(int64 maximum_background_task) | 57 explicit TaskManagerClient(int64 maximum_background_task) |
| 58 : maybe_schedule_next_task_count_(0), | 58 : maybe_schedule_next_task_count_(0), |
| 59 task_scheduled_count_(0), | 59 task_scheduled_count_(0), |
| 60 idle_task_scheduled_count_(0), | 60 idle_task_scheduled_count_(0), |
| 61 last_operation_status_(SYNC_STATUS_OK) { | 61 last_operation_status_(SYNC_STATUS_OK) { |
| 62 task_manager_.reset(new SyncTaskManager( | 62 task_manager_.reset(new SyncTaskManager( |
| 63 AsWeakPtr(), maximum_background_task)); | 63 AsWeakPtr(), maximum_background_task, |
| 64 base::MessageLoopProxy::current())); | |
| 64 task_manager_->Initialize(SYNC_STATUS_OK); | 65 task_manager_->Initialize(SYNC_STATUS_OK); |
| 66 base::MessageLoop::current()->RunUntilIdle(); | |
| 65 maybe_schedule_next_task_count_ = 0; | 67 maybe_schedule_next_task_count_ = 0; |
| 66 } | 68 } |
| 67 virtual ~TaskManagerClient() {} | 69 virtual ~TaskManagerClient() {} |
| 68 | 70 |
| 69 // DriveFileSyncManager::Client overrides. | 71 // DriveFileSyncManager::Client overrides. |
| 70 virtual void MaybeScheduleNextTask() OVERRIDE { | 72 virtual void MaybeScheduleNextTask() OVERRIDE { |
| 71 ++maybe_schedule_next_task_count_; | 73 ++maybe_schedule_next_task_count_; |
| 72 } | 74 } |
| 73 virtual void NotifyLastOperationStatus( | 75 virtual void NotifyLastOperationStatus( |
| 74 SyncStatusCode last_operation_status, | 76 SyncStatusCode last_operation_status, |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 base::MessageLoop message_loop; | 388 base::MessageLoop message_loop; |
| 387 | 389 |
| 388 int callback_count = 0; | 390 int callback_count = 0; |
| 389 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 391 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 390 | 392 |
| 391 bool task_started = false; | 393 bool task_started = false; |
| 392 bool task_completed = false; | 394 bool task_completed = false; |
| 393 | 395 |
| 394 { | 396 { |
| 395 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 397 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 396 0 /* maximum_background_task */); | 398 0 /* maximum_background_task */, |
| 399 base::MessageLoopProxy::current()); | |
| 397 task_manager.Initialize(SYNC_STATUS_OK); | 400 task_manager.Initialize(SYNC_STATUS_OK); |
| 401 message_loop.RunUntilIdle(); | |
| 398 task_manager.ScheduleSyncTask( | 402 task_manager.ScheduleSyncTask( |
| 399 FROM_HERE, | 403 FROM_HERE, |
| 400 scoped_ptr<SyncTask>(new MultihopSyncTask( | 404 scoped_ptr<SyncTask>(new MultihopSyncTask( |
| 401 &task_started, &task_completed)), | 405 &task_started, &task_completed)), |
| 402 SyncTaskManager::PRIORITY_MED, | 406 SyncTaskManager::PRIORITY_MED, |
| 403 base::Bind(&IncrementAndAssign, 0, &callback_count, &status)); | 407 base::Bind(&IncrementAndAssign, 0, &callback_count, &status)); |
| 404 } | 408 } |
| 409 message_loop.RunUntilIdle(); | |
| 405 | 410 |
| 406 message_loop.RunUntilIdle(); | |
| 407 EXPECT_EQ(0, callback_count); | 411 EXPECT_EQ(0, callback_count); |
| 408 EXPECT_EQ(SYNC_STATUS_UNKNOWN, status); | 412 EXPECT_EQ(SYNC_STATUS_UNKNOWN, status); |
| 409 EXPECT_TRUE(task_started); | 413 EXPECT_TRUE(task_started); |
| 410 EXPECT_FALSE(task_completed); | 414 EXPECT_FALSE(task_completed); |
| 411 } | 415 } |
| 412 | 416 |
| 413 TEST(SyncTaskManagerTest, ScheduleTaskAtPriority) { | 417 TEST(SyncTaskManagerTest, ScheduleTaskAtPriority) { |
| 414 base::MessageLoop message_loop; | 418 base::MessageLoop message_loop; |
| 415 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 419 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 416 0 /* maximum_background_task */); | 420 0 /* maximum_background_task */, |
| 421 base::MessageLoopProxy::current()); | |
| 417 task_manager.Initialize(SYNC_STATUS_OK); | 422 task_manager.Initialize(SYNC_STATUS_OK); |
| 423 message_loop.RunUntilIdle(); | |
| 418 | 424 |
| 419 int callback_count = 0; | 425 int callback_count = 0; |
| 420 SyncStatusCode callback_status1 = SYNC_STATUS_OK; | 426 SyncStatusCode callback_status1 = SYNC_STATUS_OK; |
| 421 SyncStatusCode callback_status2 = SYNC_STATUS_OK; | 427 SyncStatusCode callback_status2 = SYNC_STATUS_OK; |
| 422 SyncStatusCode callback_status3 = SYNC_STATUS_OK; | 428 SyncStatusCode callback_status3 = SYNC_STATUS_OK; |
| 423 SyncStatusCode callback_status4 = SYNC_STATUS_OK; | 429 SyncStatusCode callback_status4 = SYNC_STATUS_OK; |
| 424 SyncStatusCode callback_status5 = SYNC_STATUS_OK; | 430 SyncStatusCode callback_status5 = SYNC_STATUS_OK; |
| 425 | 431 |
| 426 // This will run first even if its priority is low, since there're no | 432 // This will run first even if its priority is low, since there're no |
| 427 // pending tasks. | 433 // pending tasks. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 EXPECT_EQ(kStatus2, callback_status2); | 471 EXPECT_EQ(kStatus2, callback_status2); |
| 466 EXPECT_EQ(kStatus3, callback_status3); | 472 EXPECT_EQ(kStatus3, callback_status3); |
| 467 EXPECT_EQ(kStatus4, callback_status4); | 473 EXPECT_EQ(kStatus4, callback_status4); |
| 468 EXPECT_EQ(kStatus5, callback_status5); | 474 EXPECT_EQ(kStatus5, callback_status5); |
| 469 EXPECT_EQ(5, callback_count); | 475 EXPECT_EQ(5, callback_count); |
| 470 } | 476 } |
| 471 | 477 |
| 472 TEST(SyncTaskManagerTest, BackgroundTask_Sequential) { | 478 TEST(SyncTaskManagerTest, BackgroundTask_Sequential) { |
| 473 base::MessageLoop message_loop; | 479 base::MessageLoop message_loop; |
| 474 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 480 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 475 10 /* maximum_background_task */); | 481 10 /* maximum_background_task */, |
| 482 base::MessageLoopProxy::current()); | |
| 476 task_manager.Initialize(SYNC_STATUS_OK); | 483 task_manager.Initialize(SYNC_STATUS_OK); |
| 477 | 484 |
| 478 SyncStatusCode status = SYNC_STATUS_FAILED; | 485 SyncStatusCode status = SYNC_STATUS_FAILED; |
| 479 BackgroundTask::Stats stats; | 486 BackgroundTask::Stats stats; |
| 480 task_manager.ScheduleSyncTask( | 487 task_manager.ScheduleSyncTask( |
| 481 FROM_HERE, | 488 FROM_HERE, |
| 482 scoped_ptr<SyncTask>(new BackgroundTask( | 489 scoped_ptr<SyncTask>(new BackgroundTask( |
| 483 "app_id", MAKE_PATH("/hoge/fuga"), | 490 "app_id", MAKE_PATH("/hoge/fuga"), |
| 484 &stats)), | 491 &stats)), |
| 485 SyncTaskManager::PRIORITY_MED, | 492 SyncTaskManager::PRIORITY_MED, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 505 | 512 |
| 506 EXPECT_EQ(SYNC_STATUS_OK, status); | 513 EXPECT_EQ(SYNC_STATUS_OK, status); |
| 507 EXPECT_EQ(0, stats.running_background_task); | 514 EXPECT_EQ(0, stats.running_background_task); |
| 508 EXPECT_EQ(3, stats.finished_task); | 515 EXPECT_EQ(3, stats.finished_task); |
| 509 EXPECT_EQ(1, stats.max_parallel_task); | 516 EXPECT_EQ(1, stats.max_parallel_task); |
| 510 } | 517 } |
| 511 | 518 |
| 512 TEST(SyncTaskManagerTest, BackgroundTask_Parallel) { | 519 TEST(SyncTaskManagerTest, BackgroundTask_Parallel) { |
| 513 base::MessageLoop message_loop; | 520 base::MessageLoop message_loop; |
| 514 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 521 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 515 10 /* maximum_background_task */); | 522 10 /* maximum_background_task */, |
| 523 base::MessageLoopProxy::current()); | |
| 516 task_manager.Initialize(SYNC_STATUS_OK); | 524 task_manager.Initialize(SYNC_STATUS_OK); |
| 517 | 525 |
| 518 SyncStatusCode status = SYNC_STATUS_FAILED; | 526 SyncStatusCode status = SYNC_STATUS_FAILED; |
| 519 BackgroundTask::Stats stats; | 527 BackgroundTask::Stats stats; |
| 520 task_manager.ScheduleSyncTask( | 528 task_manager.ScheduleSyncTask( |
| 521 FROM_HERE, | 529 FROM_HERE, |
| 522 scoped_ptr<SyncTask>(new BackgroundTask( | 530 scoped_ptr<SyncTask>(new BackgroundTask( |
| 523 "app_id", MAKE_PATH("/hoge"), | 531 "app_id", MAKE_PATH("/hoge"), |
| 524 &stats)), | 532 &stats)), |
| 525 SyncTaskManager::PRIORITY_MED, | 533 SyncTaskManager::PRIORITY_MED, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 545 | 553 |
| 546 EXPECT_EQ(SYNC_STATUS_OK, status); | 554 EXPECT_EQ(SYNC_STATUS_OK, status); |
| 547 EXPECT_EQ(0, stats.running_background_task); | 555 EXPECT_EQ(0, stats.running_background_task); |
| 548 EXPECT_EQ(3, stats.finished_task); | 556 EXPECT_EQ(3, stats.finished_task); |
| 549 EXPECT_EQ(3, stats.max_parallel_task); | 557 EXPECT_EQ(3, stats.max_parallel_task); |
| 550 } | 558 } |
| 551 | 559 |
| 552 TEST(SyncTaskManagerTest, BackgroundTask_Throttled) { | 560 TEST(SyncTaskManagerTest, BackgroundTask_Throttled) { |
| 553 base::MessageLoop message_loop; | 561 base::MessageLoop message_loop; |
| 554 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 562 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 555 2 /* maximum_background_task */); | 563 2 /* maximum_background_task */, |
| 564 base::MessageLoopProxy::current()); | |
| 556 task_manager.Initialize(SYNC_STATUS_OK); | 565 task_manager.Initialize(SYNC_STATUS_OK); |
| 557 | 566 |
| 558 SyncStatusCode status = SYNC_STATUS_FAILED; | 567 SyncStatusCode status = SYNC_STATUS_FAILED; |
| 559 BackgroundTask::Stats stats; | 568 BackgroundTask::Stats stats; |
| 560 task_manager.ScheduleSyncTask( | 569 task_manager.ScheduleSyncTask( |
| 561 FROM_HERE, | 570 FROM_HERE, |
| 562 scoped_ptr<SyncTask>(new BackgroundTask( | 571 scoped_ptr<SyncTask>(new BackgroundTask( |
| 563 "app_id", MAKE_PATH("/hoge"), | 572 "app_id", MAKE_PATH("/hoge"), |
| 564 &stats)), | 573 &stats)), |
| 565 SyncTaskManager::PRIORITY_MED, | 574 SyncTaskManager::PRIORITY_MED, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 585 | 594 |
| 586 EXPECT_EQ(SYNC_STATUS_OK, status); | 595 EXPECT_EQ(SYNC_STATUS_OK, status); |
| 587 EXPECT_EQ(0, stats.running_background_task); | 596 EXPECT_EQ(0, stats.running_background_task); |
| 588 EXPECT_EQ(3, stats.finished_task); | 597 EXPECT_EQ(3, stats.finished_task); |
| 589 EXPECT_EQ(2, stats.max_parallel_task); | 598 EXPECT_EQ(2, stats.max_parallel_task); |
| 590 } | 599 } |
| 591 | 600 |
| 592 TEST(SyncTaskManagerTest, UpdateBlockingFactor) { | 601 TEST(SyncTaskManagerTest, UpdateBlockingFactor) { |
| 593 base::MessageLoop message_loop; | 602 base::MessageLoop message_loop; |
| 594 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), | 603 SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(), |
| 595 10 /* maximum_background_task */); | 604 10 /* maximum_background_task */, |
| 605 base::MessageLoopProxy::current()); | |
| 596 task_manager.Initialize(SYNC_STATUS_OK); | 606 task_manager.Initialize(SYNC_STATUS_OK); |
| 597 | 607 |
| 598 SyncStatusCode status = SYNC_STATUS_FAILED; | 608 SyncStatusCode status1 = SYNC_STATUS_FAILED; |
| 609 SyncStatusCode status2 = SYNC_STATUS_FAILED; | |
| 599 BlockerUpdateTestHelper::Log log; | 610 BlockerUpdateTestHelper::Log log; |
| 600 | 611 |
| 601 { | 612 { |
| 602 std::vector<std::string> paths; | 613 std::vector<std::string> paths; |
| 603 paths.push_back("/foo/bar"); | 614 paths.push_back("/foo/bar"); |
| 604 paths.push_back("/foo"); | 615 paths.push_back("/foo"); |
| 605 paths.push_back("/hoge/fuga/piyo"); | 616 paths.push_back("/hoge/fuga/piyo"); |
| 606 task_manager.ScheduleSyncTask( | 617 task_manager.ScheduleSyncTask( |
| 607 FROM_HERE, | 618 FROM_HERE, |
| 608 scoped_ptr<SyncTask>(new BlockerUpdateTestHelper( | 619 scoped_ptr<SyncTask>(new BlockerUpdateTestHelper( |
| 609 "task1", "app_id", paths, &log)), | 620 "task1", "app_id", paths, &log)), |
| 610 SyncTaskManager::PRIORITY_MED, | 621 SyncTaskManager::PRIORITY_MED, |
| 611 CreateResultReceiver(&status)); | 622 CreateResultReceiver(&status1)); |
| 612 } | 623 } |
| 613 | 624 |
| 614 { | 625 { |
| 615 std::vector<std::string> paths; | 626 std::vector<std::string> paths; |
| 616 paths.push_back("/foo"); | 627 paths.push_back("/foo"); |
| 617 paths.push_back("/foo/bar"); | 628 paths.push_back("/foo/bar"); |
| 618 paths.push_back("/hoge/fuga/piyo"); | 629 paths.push_back("/hoge/fuga/piyo"); |
| 619 task_manager.ScheduleSyncTask( | 630 task_manager.ScheduleSyncTask( |
| 620 FROM_HERE, | 631 FROM_HERE, |
| 621 scoped_ptr<SyncTask>(new BlockerUpdateTestHelper( | 632 scoped_ptr<SyncTask>(new BlockerUpdateTestHelper( |
| 622 "task2", "app_id", paths, &log)), | 633 "task2", "app_id", paths, &log)), |
| 623 SyncTaskManager::PRIORITY_MED, | 634 SyncTaskManager::PRIORITY_MED, |
| 624 CreateResultReceiver(&status)); | 635 CreateResultReceiver(&status2)); |
| 625 } | 636 } |
| 626 | 637 |
| 627 message_loop.RunUntilIdle(); | 638 message_loop.RunUntilIdle(); |
| 628 | 639 |
| 629 EXPECT_EQ(SYNC_STATUS_OK, status); | 640 EXPECT_EQ(SYNC_STATUS_OK, status1); |
| 641 EXPECT_EQ(SYNC_STATUS_OK, status2); | |
| 630 | 642 |
| 631 ASSERT_EQ(14u, log.size()); | 643 ASSERT_EQ(14u, log.size()); |
| 632 int i = 0; | 644 int i = 0; |
| 633 | 645 |
| 634 // task1 takes "/foo/bar" first. | 646 // task1 takes "/foo/bar" first. |
| 635 EXPECT_EQ("task1: updating to /foo/bar", log[i++]); | 647 EXPECT_EQ("task1: updating to /foo/bar", log[i++]); |
| 636 EXPECT_EQ("task1: updated to /foo/bar", log[i++]); | |
| 637 | 648 |
| 638 // task1 blocks task2. task2's update should be pending until task1 update. | 649 // task1 blocks task2. task2's update should be pending until task1 update. |
|
peria
2014/06/18 06:58:00
The following code expects different behaviors fro
tzik
2014/06/19 04:04:56
Updated the comment: "be pending" -> "not complete
| |
| 639 EXPECT_EQ("task2: updating to /foo", log[i++]); | 650 EXPECT_EQ("task2: updating to /foo", log[i++]); |
| 651 EXPECT_EQ("task1: updated to /foo/bar", log[i++]); | |
| 640 | 652 |
| 641 // task1 releases "/foo/bar" and tries to take "/foo". Then, pending task2 | 653 // task1 releases "/foo/bar" and tries to take "/foo". Then, pending task2 |
| 642 // takes "/foo" and blocks task1. | 654 // takes "/foo" and blocks task1. |
| 643 EXPECT_EQ("task1: updating to /foo", log[i++]); | 655 EXPECT_EQ("task1: updating to /foo", log[i++]); |
| 644 EXPECT_EQ("task2: updated to /foo", log[i++]); | 656 EXPECT_EQ("task2: updated to /foo", log[i++]); |
| 645 | 657 |
| 646 // task2 releases "/foo". | 658 // task2 releases "/foo". |
| 647 EXPECT_EQ("task2: updating to /foo/bar", log[i++]); | 659 EXPECT_EQ("task2: updating to /foo/bar", log[i++]); |
| 648 EXPECT_EQ("task1: updated to /foo", log[i++]); | 660 EXPECT_EQ("task1: updated to /foo", log[i++]); |
| 649 | 661 |
| 650 // task1 releases "/foo". | 662 // task1 releases "/foo". |
| 651 EXPECT_EQ("task1: updating to /hoge/fuga/piyo", log[i++]); | 663 EXPECT_EQ("task1: updating to /hoge/fuga/piyo", log[i++]); |
| 652 EXPECT_EQ("task1: updated to /hoge/fuga/piyo", log[i++]); | 664 EXPECT_EQ("task1: updated to /hoge/fuga/piyo", log[i++]); |
| 653 EXPECT_EQ("task2: updated to /foo/bar", log[i++]); | 665 EXPECT_EQ("task2: updated to /foo/bar", log[i++]); |
| 654 | 666 |
| 655 EXPECT_EQ("task1: finished", log[i++]); | 667 EXPECT_EQ("task1: finished", log[i++]); |
| 656 | 668 |
| 657 EXPECT_EQ("task2: updating to /hoge/fuga/piyo", log[i++]); | 669 EXPECT_EQ("task2: updating to /hoge/fuga/piyo", log[i++]); |
| 658 EXPECT_EQ("task2: updated to /hoge/fuga/piyo", log[i++]); | 670 EXPECT_EQ("task2: updated to /hoge/fuga/piyo", log[i++]); |
| 659 EXPECT_EQ("task2: finished", log[i++]); | 671 EXPECT_EQ("task2: finished", log[i++]); |
| 660 } | 672 } |
| 661 | 673 |
| 662 } // namespace drive_backend | 674 } // namespace drive_backend |
| 663 } // namespace sync_file_system | 675 } // namespace sync_file_system |
| OLD | NEW |