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 |