Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/sync_task_manager_unittest.cc

Issue 334053008: [SyncFS] Make task invocation in SyncTaskRunner async (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698