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

Side by Side Diff: content/browser/startup_task_runner_unittest.cc

Issue 22691002: Allow overlapping sync and async startup requests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Allow multiple overlapping startup requests - update to merge with nyquist@'s patch Created 7 years, 4 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/browser/startup_task_runner.h" 5 #include "content/browser/startup_task_runner.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 virtual ~TaskRunnerProxy() {} 109 virtual ~TaskRunnerProxy() {}
110 }; 110 };
111 111
112 TEST_F(StartupTaskRunnerTest, SynchronousExecution) { 112 TEST_F(StartupTaskRunnerTest, SynchronousExecution) {
113 MockTaskRunner mock_runner; 113 MockTaskRunner mock_runner;
114 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner); 114 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner);
115 115
116 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0); 116 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0);
117 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0); 117 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0);
118 118
119 scoped_refptr<StartupTaskRunner> runner = 119 scoped_ptr<StartupTaskRunner> runner(
Yaron 2013/08/22 06:00:26 Nit: why not allocate on stack?
aberent 2013/08/23 11:40:21 Done.
120 new StartupTaskRunner(false, base::Bind(&Observer), proxy); 120 new StartupTaskRunner(base::Bind(&Observer), proxy));
121 121
122 StartupTask task1 = 122 StartupTask task1 =
123 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this)); 123 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this));
124 runner->AddTask(task1); 124 runner->AddTask(task1);
125 EXPECT_EQ(GetLastTask(), 0); 125 EXPECT_EQ(GetLastTask(), 0);
126 StartupTask task2 = 126 StartupTask task2 =
127 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this)); 127 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this));
128 runner->AddTask(task2); 128 runner->AddTask(task2);
129 129
130 // Nothing should run until we tell them to. 130 // Nothing should run until we tell them to.
131 EXPECT_EQ(GetLastTask(), 0); 131 EXPECT_EQ(GetLastTask(), 0);
132 runner->StartRunningTasks(); 132 runner->RunAllTasksNow();
133 133
134 // On an immediate StartupTaskRunner the tasks should now all have run. 134 // On an immediate StartupTaskRunner the tasks should now all have run.
135 EXPECT_EQ(GetLastTask(), 2); 135 EXPECT_EQ(GetLastTask(), 2);
136 136
137 EXPECT_TRUE(observer_called); 137 EXPECT_TRUE(observer_called);
138 EXPECT_EQ(observer_result, 0); 138 EXPECT_EQ(observer_result, 0);
139 } 139 }
140 140
141 TEST_F(StartupTaskRunnerTest, NullObserver) { 141 TEST_F(StartupTaskRunnerTest, NullObserver) {
142 MockTaskRunner mock_runner; 142 MockTaskRunner mock_runner;
143 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner); 143 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner);
144 144
145 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0); 145 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0);
146 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0); 146 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0);
147 147
148 scoped_refptr<StartupTaskRunner> runner = 148 scoped_ptr<StartupTaskRunner> runner(
149 new StartupTaskRunner(false, base::Callback<void(int)>(), proxy); 149 new StartupTaskRunner(base::Callback<void(int)>(), proxy));
150 150
151 StartupTask task1 = 151 StartupTask task1 =
152 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this)); 152 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this));
153 runner->AddTask(task1); 153 runner->AddTask(task1);
154 EXPECT_EQ(GetLastTask(), 0); 154 EXPECT_EQ(GetLastTask(), 0);
155 StartupTask task2 = 155 StartupTask task2 =
156 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this)); 156 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this));
157 runner->AddTask(task2); 157 runner->AddTask(task2);
158 158
159 // Nothing should run until we tell them to. 159 // Nothing should run until we tell them to.
160 EXPECT_EQ(GetLastTask(), 0); 160 EXPECT_EQ(GetLastTask(), 0);
161 runner->StartRunningTasks(); 161 runner->RunAllTasksNow();
162 162
163 // On an immediate StartupTaskRunner the tasks should now all have run. 163 // On an immediate StartupTaskRunner the tasks should now all have run.
164 EXPECT_EQ(GetLastTask(), 2); 164 EXPECT_EQ(GetLastTask(), 2);
165 165
166 EXPECT_FALSE(observer_called); 166 EXPECT_FALSE(observer_called);
167 } 167 }
168 168
169 TEST_F(StartupTaskRunnerTest, SynchronousExecutionFailedTask) { 169 TEST_F(StartupTaskRunnerTest, SynchronousExecutionFailedTask) {
170 MockTaskRunner mock_runner; 170 MockTaskRunner mock_runner;
171 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner); 171 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner);
172 172
173 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0); 173 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0);
174 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0); 174 EXPECT_CALL(mock_runner, PostNonNestableDelayedTask(_, _, _)).Times(0);
175 175
176 scoped_refptr<StartupTaskRunner> runner = 176 scoped_ptr<StartupTaskRunner> runner(
177 new StartupTaskRunner(false, base::Bind(&Observer), proxy); 177 new StartupTaskRunner(base::Bind(&Observer), proxy));
178 178
179 StartupTask task3 = 179 StartupTask task3 =
180 base::Bind(&StartupTaskRunnerTest::FailingTask, base::Unretained(this)); 180 base::Bind(&StartupTaskRunnerTest::FailingTask, base::Unretained(this));
181 runner->AddTask(task3); 181 runner->AddTask(task3);
182 EXPECT_EQ(GetLastTask(), 0); 182 EXPECT_EQ(GetLastTask(), 0);
183 StartupTask task2 = 183 StartupTask task2 =
184 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this)); 184 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this));
185 runner->AddTask(task2); 185 runner->AddTask(task2);
186 186
187 // Nothing should run until we tell them to. 187 // Nothing should run until we tell them to.
188 EXPECT_EQ(GetLastTask(), 0); 188 EXPECT_EQ(GetLastTask(), 0);
189 runner->StartRunningTasks(); 189 runner->RunAllTasksNow();
190 190
191 // Only the first task should have run, since it failed 191 // Only the first task should have run, since it failed
192 EXPECT_EQ(GetLastTask(), 3); 192 EXPECT_EQ(GetLastTask(), 3);
193 193
194 EXPECT_TRUE(observer_called); 194 EXPECT_TRUE(observer_called);
195 EXPECT_EQ(observer_result, 1); 195 EXPECT_EQ(observer_result, 1);
196 } 196 }
197 197
198 TEST_F(StartupTaskRunnerTest, AsynchronousExecution) { 198 TEST_F(StartupTaskRunnerTest, AsynchronousExecution) {
199 199
200 MockTaskRunner mock_runner; 200 MockTaskRunner mock_runner;
201 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner); 201 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner);
202 202
203 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0); 203 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0);
204 EXPECT_CALL( 204 EXPECT_CALL(
205 mock_runner, 205 mock_runner,
206 PostNonNestableDelayedTask(_, _, base::TimeDelta::FromMilliseconds(0))) 206 PostNonNestableDelayedTask(_, _, base::TimeDelta::FromMilliseconds(0)))
207 .Times(testing::Between(2, 3)) 207 .Times(testing::Between(2, 3))
208 .WillRepeatedly(WithArg<1>(Invoke(SaveTaskArg))); 208 .WillRepeatedly(WithArg<1>(Invoke(SaveTaskArg)));
209 209
210 scoped_refptr<StartupTaskRunner> runner = 210 scoped_ptr<StartupTaskRunner> runner(
211 new StartupTaskRunner(true, base::Bind(&Observer), proxy); 211 new StartupTaskRunner(base::Bind(&Observer), proxy));
212 212
213 StartupTask task1 = 213 StartupTask task1 =
214 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this)); 214 base::Bind(&StartupTaskRunnerTest::Task1, base::Unretained(this));
215 runner->AddTask(task1); 215 runner->AddTask(task1);
216 StartupTask task2 = 216 StartupTask task2 =
217 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this)); 217 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this));
218 runner->AddTask(task2); 218 runner->AddTask(task2);
219 219
220 // Nothing should run until we tell them to. 220 // Nothing should run until we tell them to.
221 EXPECT_EQ(GetLastTask(), 0); 221 EXPECT_EQ(GetLastTask(), 0);
222 runner->StartRunningTasks(); 222 runner->StartRunningTasksAsync();
223 223
224 // No tasks should have run yet, since we the message loop hasn't run. 224 // No tasks should have run yet, since we the message loop hasn't run.
225 EXPECT_EQ(GetLastTask(), 0); 225 EXPECT_EQ(GetLastTask(), 0);
226 226
227 // Fake the actual message loop. Each time a task is run a new task should 227 // Fake the actual message loop. Each time a task is run a new task should
228 // be added to the queue, hence updating "task". The loop should actually run 228 // be added to the queue, hence updating "task". The loop should actually run
229 // at most 3 times (once for each task plus possibly once for the observer), 229 // at most 3 times (once for each task plus possibly once for the observer),
230 // the "4" is a backstop. 230 // the "4" is a backstop.
231 for (int i = 0; i < 4 && !observer_called; i++) { 231 for (int i = 0; i < 4 && !observer_called; i++) {
232 task.Run(); 232 task.Run();
233 EXPECT_EQ(i + 1, GetLastTask()); 233 EXPECT_EQ(i + 1, GetLastTask());
234 } 234 }
235 EXPECT_TRUE(observer_called); 235 EXPECT_TRUE(observer_called);
236 EXPECT_EQ(observer_result, 0); 236 EXPECT_EQ(observer_result, 0);
237 } 237 }
238 238
239 TEST_F(StartupTaskRunnerTest, AsynchronousExecutionFailedTask) { 239 TEST_F(StartupTaskRunnerTest, AsynchronousExecutionFailedTask) {
240 240
241 MockTaskRunner mock_runner; 241 MockTaskRunner mock_runner;
242 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner); 242 scoped_refptr<TaskRunnerProxy> proxy = new TaskRunnerProxy(&mock_runner);
243 243
244 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0); 244 EXPECT_CALL(mock_runner, PostDelayedTask(_, _, _)).Times(0);
245 EXPECT_CALL( 245 EXPECT_CALL(
246 mock_runner, 246 mock_runner,
247 PostNonNestableDelayedTask(_, _, base::TimeDelta::FromMilliseconds(0))) 247 PostNonNestableDelayedTask(_, _, base::TimeDelta::FromMilliseconds(0)))
248 .Times(testing::Between(1, 2)) 248 .Times(testing::Between(1, 2))
249 .WillRepeatedly(WithArg<1>(Invoke(SaveTaskArg))); 249 .WillRepeatedly(WithArg<1>(Invoke(SaveTaskArg)));
250 250
251 scoped_refptr<StartupTaskRunner> runner = 251 scoped_ptr<StartupTaskRunner> runner(
252 new StartupTaskRunner(true, base::Bind(&Observer), proxy); 252 new StartupTaskRunner(base::Bind(&Observer), proxy));
253 253
254 StartupTask task3 = 254 StartupTask task3 =
255 base::Bind(&StartupTaskRunnerTest::FailingTask, base::Unretained(this)); 255 base::Bind(&StartupTaskRunnerTest::FailingTask, base::Unretained(this));
256 runner->AddTask(task3); 256 runner->AddTask(task3);
257 StartupTask task2 = 257 StartupTask task2 =
258 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this)); 258 base::Bind(&StartupTaskRunnerTest::Task2, base::Unretained(this));
259 runner->AddTask(task2); 259 runner->AddTask(task2);
260 260
261 // Nothing should run until we tell them to. 261 // Nothing should run until we tell them to.
262 EXPECT_EQ(GetLastTask(), 0); 262 EXPECT_EQ(GetLastTask(), 0);
263 runner->StartRunningTasks(); 263 runner->StartRunningTasksAsync();
264 264
265 // No tasks should have run yet, since we the message loop hasn't run. 265 // No tasks should have run yet, since we the message loop hasn't run.
266 EXPECT_EQ(GetLastTask(), 0); 266 EXPECT_EQ(GetLastTask(), 0);
267 267
268 // Fake the actual message loop. Each time a task is run a new task should 268 // Fake the actual message loop. Each time a task is run a new task should
269 // be added to the queue, hence updating "task". The loop should actually run 269 // be added to the queue, hence updating "task". The loop should actually run
270 // at most twice (once for the failed task plus possibly once for the 270 // at most twice (once for the failed task plus possibly once for the
271 // observer), the "4" is a backstop. 271 // observer), the "4" is a backstop.
272 for (int i = 0; i < 4 && !observer_called; i++) { 272 for (int i = 0; i < 4 && !observer_called; i++) {
273 task.Run(); 273 task.Run();
274 } 274 }
275 EXPECT_EQ(GetLastTask(), 3); 275 EXPECT_EQ(GetLastTask(), 3);
276 276
277 EXPECT_TRUE(observer_called); 277 EXPECT_TRUE(observer_called);
278 EXPECT_EQ(observer_result, 1); 278 EXPECT_EQ(observer_result, 1);
279 } 279 }
280 } // namespace 280 } // namespace
281 } // namespace content 281 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698