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

Side by Side Diff: chrome/browser/sync_file_system/sync_process_runner_unittest.cc

Issue 386523002: [SyncFS] Refine SyncProcessRunner's throttling algorithm for parallel task support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/sync_file_system/sync_process_runner.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/sync_process_runner.h" 5 #include "chrome/browser/sync_file_system/sync_process_runner.h"
6 6
7 #include <deque>
8
7 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
8 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
9 11
10 namespace sync_file_system { 12 namespace sync_file_system {
11 13
12 namespace { 14 namespace {
13 15
14 class FakeClient : public SyncProcessRunner::Client { 16 class FakeClient : public SyncProcessRunner::Client {
15 public: 17 public:
16 FakeClient() : service_state_(SYNC_SERVICE_RUNNING) {} 18 FakeClient() : service_state_(SYNC_SERVICE_RUNNING) {}
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 DISALLOW_COPY_AND_ASSIGN(FakeTimerHelper); 83 DISALLOW_COPY_AND_ASSIGN(FakeTimerHelper);
82 }; 84 };
83 85
84 class FakeSyncProcessRunner : public SyncProcessRunner { 86 class FakeSyncProcessRunner : public SyncProcessRunner {
85 public: 87 public:
86 FakeSyncProcessRunner(SyncProcessRunner::Client* client, 88 FakeSyncProcessRunner(SyncProcessRunner::Client* client,
87 scoped_ptr<TimerHelper> timer_helper, 89 scoped_ptr<TimerHelper> timer_helper,
88 int max_parallel_task) 90 int max_parallel_task)
89 : SyncProcessRunner("FakeSyncProcess", 91 : SyncProcessRunner("FakeSyncProcess",
90 client, timer_helper.Pass(), 92 client, timer_helper.Pass(),
91 max_parallel_task) { 93 max_parallel_task),
94 max_parallel_task_(max_parallel_task) {
92 } 95 }
93 96
94 virtual void StartSync(const SyncStatusCallback& callback) OVERRIDE { 97 virtual void StartSync(const SyncStatusCallback& callback) OVERRIDE {
95 EXPECT_TRUE(running_task_.is_null()); 98 EXPECT_LT(running_tasks_.size(), max_parallel_task_);
96 running_task_ = callback; 99 running_tasks_.push_back(callback);
97 } 100 }
98 101
99 virtual ~FakeSyncProcessRunner() { 102 virtual ~FakeSyncProcessRunner() {
100 } 103 }
101 104
102 void UpdateChanges(int num_changes) { 105 void UpdateChanges(int num_changes) {
103 OnChangesUpdated(num_changes); 106 OnChangesUpdated(num_changes);
104 } 107 }
105 108
106 void CompleteTask(SyncStatusCode status) { 109 void CompleteTask(SyncStatusCode status) {
107 ASSERT_FALSE(running_task_.is_null()); 110 ASSERT_FALSE(running_tasks_.empty());
108 SyncStatusCallback task = running_task_; 111 SyncStatusCallback task = running_tasks_.front();
109 running_task_.Reset(); 112 running_tasks_.pop_front();
110 task.Run(status); 113 task.Run(status);
111 } 114 }
112 115
113 bool HasRunningTask() const { 116 bool HasRunningTask() const {
114 return !running_task_.is_null(); 117 return !running_tasks_.empty();
115 } 118 }
116 119
117 private: 120 private:
118 SyncStatusCallback running_task_; 121 int64 max_parallel_task_;
122 std::deque<SyncStatusCallback> running_tasks_;
119 123
120 DISALLOW_COPY_AND_ASSIGN(FakeSyncProcessRunner); 124 DISALLOW_COPY_AND_ASSIGN(FakeSyncProcessRunner);
121 }; 125 };
122 126
123 } // namespace 127 } // namespace
124 128
125 TEST(SyncProcessRunnerTest, SingleTaskBasicTest) { 129 TEST(SyncProcessRunnerTest, SingleTaskBasicTest) {
126 FakeClient fake_client; 130 FakeClient fake_client;
127 FakeTimerHelper* fake_timer = new FakeTimerHelper(); 131 FakeTimerHelper* fake_timer = new FakeTimerHelper();
128 FakeSyncProcessRunner fake_runner( 132 FakeSyncProcessRunner fake_runner(
129 &fake_client, 133 &fake_client,
130 scoped_ptr<SyncProcessRunner::TimerHelper>(fake_timer), 134 scoped_ptr<SyncProcessRunner::TimerHelper>(fake_timer),
131 1 /* max_parallel_task */); 135 1 /* max_parallel_task */);
132 136
133 base::TimeTicks base_time = base::TimeTicks::Now(); 137 base::TimeTicks base_time = base::TimeTicks::Now();
134 fake_timer->SetCurrentTime(base_time); 138 fake_timer->SetCurrentTime(base_time);
135 139
136 // SyncProcessRunner is expected not to run a task initially. 140 // SyncProcessRunner is expected not to run a task initially.
137 EXPECT_FALSE(fake_timer->IsRunning()); 141 EXPECT_FALSE(fake_timer->IsRunning());
138 142
139 // As soon as SyncProcessRunner gets a new update, it should start running 143 // As soon as SyncProcessRunner gets a new update, it should start running
140 // the timer to run a synchronization task. 144 // the timer to run a synchronization task.
141 fake_runner.UpdateChanges(100); 145 fake_runner.UpdateChanges(100);
142 EXPECT_TRUE(fake_timer->IsRunning()); 146 EXPECT_TRUE(fake_timer->IsRunning());
143 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds, 147 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds,
144 fake_timer->GetCurrentDelay()); 148 fake_timer->GetCurrentDelay());
145 149
146 // When the time has come, the timer should fire the scheduled task. 150 // When the time has come, the timer should fire the scheduled task.
147 fake_timer->AdvanceToScheduledTime(); 151 fake_timer->AdvanceToScheduledTime();
148 EXPECT_FALSE(fake_timer->IsRunning()); 152 // EXPECT_FALSE(fake_timer->IsRunning());
149 EXPECT_TRUE(fake_runner.HasRunningTask()); 153 EXPECT_TRUE(fake_runner.HasRunningTask());
150 154
151 // Successful completion of the task fires next synchronization task. 155 // Successful completion of the task fires next synchronization task.
152 fake_runner.CompleteTask(SYNC_STATUS_OK); 156 fake_runner.CompleteTask(SYNC_STATUS_OK);
153 EXPECT_TRUE(fake_timer->IsRunning()); 157 EXPECT_TRUE(fake_timer->IsRunning());
154 EXPECT_FALSE(fake_runner.HasRunningTask()); 158 EXPECT_FALSE(fake_runner.HasRunningTask());
155 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds, 159 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds,
156 fake_timer->GetCurrentDelay()); 160 fake_timer->GetCurrentDelay());
157 161
158 // Turn |service_state| to TEMPORARY_UNAVAILABLE and let the task fail. 162 // Turn |service_state| to TEMPORARY_UNAVAILABLE and let the task fail.
(...skipping 20 matching lines...) Expand all
179 183
180 // There's no item to sync anymore, SyncProcessRunner should schedules the 184 // There's no item to sync anymore, SyncProcessRunner should schedules the
181 // next with the longest delay. 185 // next with the longest delay.
182 fake_runner.UpdateChanges(0); 186 fake_runner.UpdateChanges(0);
183 fake_timer->AdvanceToScheduledTime(); 187 fake_timer->AdvanceToScheduledTime();
184 fake_runner.CompleteTask(SYNC_STATUS_OK); 188 fake_runner.CompleteTask(SYNC_STATUS_OK);
185 EXPECT_EQ(SyncProcessRunner::kSyncDelayMaxInMilliseconds, 189 EXPECT_EQ(SyncProcessRunner::kSyncDelayMaxInMilliseconds,
186 fake_timer->GetCurrentDelay()); 190 fake_timer->GetCurrentDelay());
187 } 191 }
188 192
193 TEST(SyncProcessRunnerTest, MultiTaskBasicTest) {
194 FakeClient fake_client;
195 FakeTimerHelper* fake_timer = new FakeTimerHelper();
196 FakeSyncProcessRunner fake_runner(
197 &fake_client,
198 scoped_ptr<SyncProcessRunner::TimerHelper>(fake_timer),
199 2 /* max_parallel_task */);
200
201 base::TimeTicks base_time = base::TimeTicks::Now();
202 fake_timer->SetCurrentTime(base_time);
203
204 EXPECT_FALSE(fake_timer->IsRunning());
205
206 fake_runner.UpdateChanges(100);
207 EXPECT_TRUE(fake_timer->IsRunning());
208 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds,
209 fake_timer->GetCurrentDelay());
210
211 // Even after a task starts running, SyncProcessRunner should schedule next
212 // task until the number of running task reachs the limit.
213 fake_timer->AdvanceToScheduledTime();
214 EXPECT_TRUE(fake_timer->IsRunning());
215 EXPECT_TRUE(fake_runner.HasRunningTask());
216 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds,
217 fake_timer->GetCurrentDelay());
218
219 // After the second task starts running, SyncProcessRunner should stop
220 // scheduling a task.
221 fake_timer->AdvanceToScheduledTime();
222 EXPECT_FALSE(fake_timer->IsRunning());
223 EXPECT_TRUE(fake_runner.HasRunningTask());
224
225 fake_runner.CompleteTask(SYNC_STATUS_OK);
226 EXPECT_TRUE(fake_timer->IsRunning());
227 EXPECT_TRUE(fake_runner.HasRunningTask());
228 fake_runner.CompleteTask(SYNC_STATUS_OK);
229 EXPECT_TRUE(fake_timer->IsRunning());
230 EXPECT_FALSE(fake_runner.HasRunningTask());
231
232 // Turn |service_state| to TEMPORARY_UNAVAILABLE and let the task fail.
233 // |fake_runner| should schedule following tasks with longer delay.
234 fake_timer->AdvanceToScheduledTime();
235 fake_timer->AdvanceToScheduledTime();
236 fake_client.set_service_state(SYNC_SERVICE_TEMPORARY_UNAVAILABLE);
237 fake_runner.CompleteTask(SYNC_STATUS_FAILED);
238 EXPECT_EQ(SyncProcessRunner::kSyncDelaySlowInMilliseconds,
239 fake_timer->GetCurrentDelay());
240
241 // Consecutive error reports shouldn't extend delay immediately.
242 fake_runner.CompleteTask(SYNC_STATUS_FAILED);
243 EXPECT_EQ(SyncProcessRunner::kSyncDelaySlowInMilliseconds,
244 fake_timer->GetCurrentDelay());
245
246 // The next task will run after throttle period is over.
247 // And its failure should extend the throttle period by twice.
248 fake_timer->AdvanceToScheduledTime();
249 EXPECT_EQ(SyncProcessRunner::kSyncDelaySlowInMilliseconds,
250 fake_timer->GetCurrentDelay());
251 fake_runner.CompleteTask(SYNC_STATUS_FAILED);
252 EXPECT_EQ(2 * SyncProcessRunner::kSyncDelaySlowInMilliseconds,
253 fake_timer->GetCurrentDelay());
254
255 // Next successful task should clear the throttling.
256 fake_timer->AdvanceToScheduledTime();
257 fake_client.set_service_state(SYNC_SERVICE_RUNNING);
258 fake_runner.CompleteTask(SYNC_STATUS_OK);
259 EXPECT_EQ(SyncProcessRunner::kSyncDelayFastInMilliseconds,
260 fake_timer->GetCurrentDelay());
261
262 // Then, following failing task should not extend throttling period.
263 fake_timer->AdvanceToScheduledTime();
264 fake_client.set_service_state(SYNC_SERVICE_TEMPORARY_UNAVAILABLE);
265 fake_runner.CompleteTask(SYNC_STATUS_FAILED);
266 EXPECT_EQ(SyncProcessRunner::kSyncDelaySlowInMilliseconds,
267 fake_timer->GetCurrentDelay());
nhiroki 2014/07/14 02:27:06 How about testing DelayMax case, that is, AUTHENTI
tzik 2014/07/14 04:52:04 Done.
268 }
269
189 } // namespace sync_file_system 270 } // namespace sync_file_system
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/sync_process_runner.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698