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)