sync_task_manager_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "webkit/common/fileapi/file_system_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAKE_PATH(path)                                       \
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FilePath(fileapi::VirtualPath::GetNormalizedFilePath( \
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL(path))))
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive_backend {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DumbTask(SyncStatusCode status,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const SyncStatusCallback& callback) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(callback, status));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IncrementAndAssign(int expected_before_counter,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int* counter,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        SyncStatusCode* status_out,
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        SyncStatusCode status) {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected_before_counter, *counter);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++(*counter);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *status_out = status;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IncrementAndAssignWithOwnedPointer(T* object,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int* counter,
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        SyncStatusCode* status_out,
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                        SyncStatusCode status) {
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ++(*counter);
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  *status_out = status;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TaskManagerClient
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public SyncTaskManager::Client,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<TaskManagerClient> {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TaskManagerClient(int64 maximum_background_task)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : maybe_schedule_next_task_count_(0),
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        task_scheduled_count_(0),
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        idle_task_scheduled_count_(0),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_operation_status_(SYNC_STATUS_OK) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_manager_.reset(new SyncTaskManager(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AsWeakPtr(), maximum_background_task));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_manager_->Initialize(SYNC_STATUS_OK);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    maybe_schedule_next_task_count_ = 0;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TaskManagerClient() {}
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DriveFileSyncManager::Client overrides.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void MaybeScheduleNextTask() OVERRIDE {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++maybe_schedule_next_task_count_;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyLastOperationStatus(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncStatusCode last_operation_status,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool last_operation_used_network) OVERRIDE {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_operation_status_ = last_operation_status;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RecordTaskLog(scoped_ptr<TaskLogger::TaskLog>) OVERRIDE {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleTask(SyncStatusCode status_to_return,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const SyncStatusCallback& callback) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_manager_->ScheduleTask(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TaskManagerClient::DoTask, AsWeakPtr(),
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   status_to_return, false /* idle */),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncTaskManager::PRIORITY_MED,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleTaskIfIdle(SyncStatusCode status_to_return) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_manager_->ScheduleTaskIfIdle(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TaskManagerClient::DoTask, AsWeakPtr(),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   status_to_return, true /* idle */),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncStatusCallback());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int maybe_schedule_next_task_count() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return maybe_schedule_next_task_count_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int task_scheduled_count() const { return task_scheduled_count_; }
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int idle_task_scheduled_count() const { return idle_task_scheduled_count_; }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncStatusCode last_operation_status() const {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_operation_status_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoTask(SyncStatusCode status_to_return,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bool is_idle_task,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const SyncStatusCallback& callback) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++task_scheduled_count_;
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (is_idle_task)
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ++idle_task_scheduled_count_;
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        FROM_HERE, base::Bind(callback, status_to_return));
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<SyncTaskManager> task_manager_;
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int maybe_schedule_next_task_count_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int task_scheduled_count_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int idle_task_scheduled_count_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncStatusCode last_operation_status_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TaskManagerClient);
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MultihopSyncTask : public ExclusiveTask {
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MultihopSyncTask(bool* task_started,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   bool* task_completed)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : task_started_(task_started),
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        task_completed_(task_completed),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(task_started_);
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(task_completed_);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~MultihopSyncTask() {}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void RunExclusive(const SyncStatusCallback& callback) OVERRIDE {
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(!*task_started_);
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *task_started_ = true;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        FROM_HERE, base::Bind(&MultihopSyncTask::CompleteTask,
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              weak_ptr_factory_.GetWeakPtr(), callback));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CompleteTask(const SyncStatusCallback& callback) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(*task_started_);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!*task_completed_);
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *task_completed_ = true;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(SYNC_STATUS_OK);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* task_started_;
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool* task_completed_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<MultihopSyncTask> weak_ptr_factory_;
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MultihopSyncTask);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class BackgroundTask : public SyncTask {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Stats {
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int64 running_background_task;
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int64 finished_task;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 max_parallel_task;
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    Stats()
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        : running_background_task(0),
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          finished_task(0),
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          max_parallel_task(0) {}
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  BackgroundTask(const std::string& app_id,
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 const base::FilePath& path,
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                 Stats* stats)
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : app_id_(app_id),
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        path_(path),
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        stats_(stats),
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        weak_ptr_factory_(this) {
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~BackgroundTask() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<BlockingFactor> blocking_factor(new BlockingFactor);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocking_factor->app_id = app_id_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocking_factor->paths.push_back(path_);
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncTaskManager::UpdateBlockingFactor(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token.Pass(), blocking_factor.Pass(),
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Bind(&BackgroundTask::RunAsBackgroundTask,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAsBackgroundTask(scoped_ptr<SyncTaskToken> token) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++(stats_->running_background_task);
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (stats_->max_parallel_task < stats_->running_background_task)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      stats_->max_parallel_task = stats_->running_background_task;
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::Bind(&BackgroundTask::CompleteTask,
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   base::Passed(&token)));
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CompleteTask(scoped_ptr<SyncTaskToken> token) {
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ++(stats_->finished_task);
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    --(stats_->running_background_task);
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string app_id_;
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath path_;
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Stats* stats_;
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::WeakPtrFactory<BackgroundTask> weak_ptr_factory_;
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackgroundTask);
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class BlockerUpdateTestHelper : public SyncTask {
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::vector<std::string> Log;
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  BlockerUpdateTestHelper(const std::string& name,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& app_id,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::vector<std::string>& paths,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          Log* log)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : name_(name),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        app_id_(app_id),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        paths_(paths.begin(), paths.end()),
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        log_(log),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        weak_ptr_factory_(this) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BlockerUpdateTestHelper() {
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE {
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    UpdateBlocker(token.Pass());
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void UpdateBlocker(scoped_ptr<SyncTaskToken> token) {
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (paths_.empty()) {
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      log_->push_back(name_ + ": finished");
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK);
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return;
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string updating_to = paths_.front();
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    paths_.pop_front();
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    log_->push_back(name_ + ": updating to " + updating_to);
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<BlockingFactor> blocking_factor(new BlockingFactor);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocking_factor->app_id = app_id_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocking_factor->paths.push_back(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::FilePath(fileapi::VirtualPath::GetNormalizedFilePath(
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            base::FilePath::FromUTF8Unsafe(updating_to))));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncTaskManager::UpdateBlockingFactor(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token.Pass(), blocking_factor.Pass(),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BlockerUpdateTestHelper::UpdateBlockerSoon,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(),
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   updating_to));
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateBlockerSoon(const std::string& updated_to,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         scoped_ptr<SyncTaskToken> token) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log_->push_back(name_ + ": updated to " + updated_to);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&BlockerUpdateTestHelper::UpdateBlocker,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string name_;
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string app_id_;
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::deque<std::string> paths_;
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Log* log_;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<BlockerUpdateTestHelper> weak_ptr_factory_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BlockerUpdateTestHelper);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arbitrary non-default status values for testing.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SyncStatusCode kStatus1 = static_cast<SyncStatusCode>(-1);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SyncStatusCode kStatus2 = static_cast<SyncStatusCode>(-2);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SyncStatusCode kStatus3 = static_cast<SyncStatusCode>(-3);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SyncStatusCode kStatus4 = static_cast<SyncStatusCode>(-4);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SyncStatusCode kStatus5 = static_cast<SyncStatusCode>(-5);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleTask) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop message_loop;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerClient client(0 /* maximum_background_task */);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_count = 0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncStatusCode callback_status = SYNC_STATUS_OK;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client.ScheduleTask(kStatus1, base::Bind(&IncrementAndAssign, 0,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_count,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_status));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunUntilIdle();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(kStatus1, callback_status);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus1, client.last_operation_status());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, callback_count);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.maybe_schedule_next_task_count());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.task_scheduled_count());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, client.idle_task_scheduled_count());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleTwoTasks) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop message_loop;
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TaskManagerClient client(0 /* maximum_background_task */);
3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int callback_count = 0;
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SyncStatusCode callback_status = SYNC_STATUS_OK;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client.ScheduleTask(kStatus1, base::Bind(&IncrementAndAssign, 0,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_count,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_status));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client.ScheduleTask(kStatus2, base::Bind(&IncrementAndAssign, 1,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_count,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &callback_status));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunUntilIdle();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus2, callback_status);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus2, client.last_operation_status());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, callback_count);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.maybe_schedule_next_task_count());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, client.task_scheduled_count());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, client.idle_task_scheduled_count());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleIdleTask) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop message_loop;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerClient client(0 /* maximum_background_task */);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client.ScheduleTaskIfIdle(kStatus1);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunUntilIdle();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus1, client.last_operation_status());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.maybe_schedule_next_task_count());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.task_scheduled_count());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, client.idle_task_scheduled_count());
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleIdleTaskWhileNotIdle) {
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::MessageLoop message_loop;
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TaskManagerClient client(0 /* maximum_background_task */);
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int callback_count = 0;
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode callback_status = SYNC_STATUS_OK;
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  client.ScheduleTask(kStatus1, base::Bind(&IncrementAndAssign, 0,
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           &callback_count,
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           &callback_status));
3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  client.ScheduleTaskIfIdle(kStatus2);
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_loop.RunUntilIdle();
3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Idle task must not have run.
3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kStatus1, callback_status);
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kStatus1, client.last_operation_status());
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, callback_count);
3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, client.maybe_schedule_next_task_count());
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, client.task_scheduled_count());
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, client.idle_task_scheduled_count());
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleAndCancelSyncTask) {
3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::MessageLoop message_loop;
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int callback_count = 0;
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode status = SYNC_STATUS_UNKNOWN;
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool task_started = false;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool task_completed = false;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  {
39423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
39523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 0 /* maximum_background_task */);
39623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    task_manager.Initialize(SYNC_STATUS_OK);
39723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    task_manager.ScheduleSyncTask(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<SyncTask>(new MultihopSyncTask(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &task_started, &task_completed)),
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SyncTaskManager::PRIORITY_MED,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IncrementAndAssign, 0, &callback_count, &status));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
40523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  message_loop.RunUntilIdle();
40623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(0, callback_count);
40723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_UNKNOWN, status);
40823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(task_started);
40923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_FALSE(task_completed);
41023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
41123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
41223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(SyncTaskManagerTest, ScheduleTaskAtPriority) {
41323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::MessageLoop message_loop;
41423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
41523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               0 /* maximum_background_task */);
41623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  task_manager.Initialize(SYNC_STATUS_OK);
41723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callback_count = 0;
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncStatusCode callback_status1 = SYNC_STATUS_OK;
4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode callback_status2 = SYNC_STATUS_OK;
4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode callback_status3 = SYNC_STATUS_OK;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncStatusCode callback_status4 = SYNC_STATUS_OK;
4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode callback_status5 = SYNC_STATUS_OK;
4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This will run first even if its priority is low, since there're no
4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // pending tasks.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleTask(
4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE,
4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(&DumbTask, kStatus1),
4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_LOW,
4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(&IncrementAndAssign, 0, &callback_count, &callback_status1));
4323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This runs last (expected counter == 4).
4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.ScheduleTask(
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE,
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&DumbTask, kStatus2),
4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_LOW,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IncrementAndAssign, 4, &callback_count, &callback_status2));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This runs second (expected counter == 1).
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleTask(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&DumbTask, kStatus3),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncTaskManager::PRIORITY_HIGH,
44523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&IncrementAndAssign, 1, &callback_count, &callback_status3));
44623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
44723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // This runs fourth (expected counter == 3).
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleTask(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DumbTask, kStatus4),
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&IncrementAndAssign, 3, &callback_count, &callback_status4));
4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This runs third (expected counter == 2).
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleTask(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(&DumbTask, kStatus5),
4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_HIGH,
4593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::Bind(&IncrementAndAssign, 2, &callback_count, &callback_status5));
4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  message_loop.RunUntilIdle();
4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kStatus1, callback_status1);
4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kStatus2, callback_status2);
4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(kStatus3, callback_status3);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus4, callback_status4);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStatus5, callback_status5);
4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(5, callback_count);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(SyncTaskManagerTest, BackgroundTask_Sequential) {
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::MessageLoop message_loop;
4733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               10 /* maximum_background_task */);
4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.Initialize(SYNC_STATUS_OK);
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncStatusCode status = SYNC_STATUS_FAILED;
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  BackgroundTask::Stats stats;
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.ScheduleSyncTask(
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE,
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          "app_id", MAKE_PATH("/hoge/fuga"),
4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          &stats)),
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateResultReceiver(&status));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleSyncTask(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "app_id", MAKE_PATH("/hoge"),
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          &stats)),
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateResultReceiver(&status));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleSyncTask(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "app_id", MAKE_PATH("/hoge/fuga/piyo"),
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &stats)),
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateResultReceiver(&status));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunUntilIdle();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, status);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, stats.running_background_task);
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, stats.finished_task);
5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, stats.max_parallel_task);
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncTaskManagerTest, BackgroundTask_Parallel) {
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               10 /* maximum_background_task */);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.Initialize(SYNC_STATUS_OK);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncStatusCode status = SYNC_STATUS_FAILED;
51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BackgroundTask::Stats stats;
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "app_id", MAKE_PATH("/hoge"),
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &stats)),
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateResultReceiver(&status));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "app_id", MAKE_PATH("/fuga"),
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &stats)),
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateResultReceiver(&status));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "app_id", MAKE_PATH("/piyo"),
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &stats)),
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateResultReceiver(&status));
5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop.RunUntilIdle();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, status);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, stats.running_background_task);
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, stats.finished_task);
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, stats.max_parallel_task);
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SyncTaskManagerTest, BackgroundTask_Throttled) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop message_loop;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               2 /* maximum_background_task */);
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  task_manager.Initialize(SYNC_STATUS_OK);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncStatusCode status = SYNC_STATUS_FAILED;
5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  BackgroundTask::Stats stats;
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "app_id", MAKE_PATH("/hoge"),
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &stats)),
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateResultReceiver(&status));
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "app_id", MAKE_PATH("/fuga"),
5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          &stats)),
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateResultReceiver(&status));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task_manager.ScheduleSyncTask(
5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<SyncTask>(new BackgroundTask(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "app_id", MAKE_PATH("/piyo"),
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &stats)),
5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SyncTaskManager::PRIORITY_MED,
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateResultReceiver(&status));
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_loop.RunUntilIdle();
5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, status);
5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, stats.running_background_task);
5873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(3, stats.finished_task);
5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2, stats.max_parallel_task);
5893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(SyncTaskManagerTest, UpdateBlockingFactor) {
5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::MessageLoop message_loop;
5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SyncTaskManager task_manager(base::WeakPtr<SyncTaskManager::Client>(),
5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               10 /* maximum_background_task */);
5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  task_manager.Initialize(SYNC_STATUS_OK);
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncStatusCode status = SYNC_STATUS_FAILED;
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockerUpdateTestHelper::Log log;
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string> paths;
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/foo/bar");
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/foo");
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/hoge/fuga/piyo");
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task_manager.ScheduleSyncTask(
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<SyncTask>(new BlockerUpdateTestHelper(
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "task1", "app_id", paths, &log)),
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SyncTaskManager::PRIORITY_MED,
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateResultReceiver(&status));
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string> paths;
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/foo");
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/foo/bar");
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    paths.push_back("/hoge/fuga/piyo");
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    task_manager.ScheduleSyncTask(
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FROM_HERE,
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<SyncTask>(new BlockerUpdateTestHelper(
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "task2", "app_id", paths, &log)),
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SyncTaskManager::PRIORITY_MED,
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateResultReceiver(&status));
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  message_loop.RunUntilIdle();
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, status);
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(14u, log.size());
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int i = 0;
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // task1 takes "/foo/bar" first.
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updating to /foo/bar", log[i++]);
6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updated to /foo/bar", log[i++]);
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // task1 blocks task2. task2's update should be pending until task1 update.
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updating to /foo", log[i++]);
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // task1 releases "/foo/bar" and tries to take "/foo". Then, pending task2
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // takes "/foo" and blocks task1.
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updating to /foo", log[i++]);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updated to /foo", log[i++]);
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // task2 releases "/foo".
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updating to /foo/bar", log[i++]);
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updated to /foo", log[i++]);
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // task1 releases "/foo".
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updating to /hoge/fuga/piyo", log[i++]);
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: updated to /hoge/fuga/piyo", log[i++]);
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updated to /foo/bar", log[i++]);
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task1: finished", log[i++]);
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updating to /hoge/fuga/piyo", log[i++]);
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: updated to /hoge/fuga/piyo", log[i++]);
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("task2: finished", log[i++]);
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace drive_backend
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace sync_file_system
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)