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

Side by Side Diff: base/test/test_mock_time_task_runner.cc

Issue 2657013002: Introduce ThreadTaskRunnerHandle::OverrideForTesting and TestMockTimeTaskRunner::ScopedContext. (Closed)
Patch Set: fix RecentTabHelperTest crash? Created 3 years, 9 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "base/test/test_mock_time_task_runner.h" 5 #include "base/test/test_mock_time_task_runner.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/threading/thread_task_runner_handle.h"
11 #include "base/time/clock.h" 12 #include "base/time/clock.h"
12 #include "base/time/tick_clock.h" 13 #include "base/time/tick_clock.h"
13 14
14 namespace base { 15 namespace base {
15 16
16 namespace { 17 namespace {
17 18
18 // MockTickClock -------------------------------------------------------------- 19 // MockTickClock --------------------------------------------------------------
19 20
20 // TickClock that always returns the then-current mock time ticks of 21 // TickClock that always returns the then-current mock time ticks of
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 114
114 TestMockTimeTaskRunner::TestOrderedPendingTask::~TestOrderedPendingTask() { 115 TestMockTimeTaskRunner::TestOrderedPendingTask::~TestOrderedPendingTask() {
115 } 116 }
116 117
117 TestMockTimeTaskRunner::TestOrderedPendingTask& 118 TestMockTimeTaskRunner::TestOrderedPendingTask&
118 TestMockTimeTaskRunner::TestOrderedPendingTask::operator=( 119 TestMockTimeTaskRunner::TestOrderedPendingTask::operator=(
119 TestOrderedPendingTask&&) = default; 120 TestOrderedPendingTask&&) = default;
120 121
121 // TestMockTimeTaskRunner ----------------------------------------------------- 122 // TestMockTimeTaskRunner -----------------------------------------------------
122 123
124 // TODO(gab): This should also set the SequenceToken for the current thread.
125 // Ref. TestMockTimeTaskRunner::RunsTasksOnCurrentThread().
126 TestMockTimeTaskRunner::ScopedContext::ScopedContext(
127 scoped_refptr<TestMockTimeTaskRunner> scope)
128 : on_destroy_(ThreadTaskRunnerHandle::OverrideForTesting(scope)) {
129 scope->RunUntilIdle();
130 }
131
132 TestMockTimeTaskRunner::ScopedContext::~ScopedContext() = default;
133
123 bool TestMockTimeTaskRunner::TemporalOrder::operator()( 134 bool TestMockTimeTaskRunner::TemporalOrder::operator()(
124 const TestOrderedPendingTask& first_task, 135 const TestOrderedPendingTask& first_task,
125 const TestOrderedPendingTask& second_task) const { 136 const TestOrderedPendingTask& second_task) const {
126 if (first_task.GetTimeToRun() == second_task.GetTimeToRun()) 137 if (first_task.GetTimeToRun() == second_task.GetTimeToRun())
127 return first_task.ordinal > second_task.ordinal; 138 return first_task.ordinal > second_task.ordinal;
128 return first_task.GetTimeToRun() > second_task.GetTimeToRun(); 139 return first_task.GetTimeToRun() > second_task.GetTimeToRun();
129 } 140 }
130 141
131 TestMockTimeTaskRunner::TestMockTimeTaskRunner() 142 TestMockTimeTaskRunner::TestMockTimeTaskRunner()
132 : now_(Time::UnixEpoch()), next_task_ordinal_(0) { 143 : now_(Time::UnixEpoch()), next_task_ordinal_(0) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 DCHECK(thread_checker_.CalledOnValidThread()); 217 DCHECK(thread_checker_.CalledOnValidThread());
207 return tasks_.size(); 218 return tasks_.size();
208 } 219 }
209 220
210 TimeDelta TestMockTimeTaskRunner::NextPendingTaskDelay() const { 221 TimeDelta TestMockTimeTaskRunner::NextPendingTaskDelay() const {
211 DCHECK(thread_checker_.CalledOnValidThread()); 222 DCHECK(thread_checker_.CalledOnValidThread());
212 return tasks_.empty() ? TimeDelta::Max() 223 return tasks_.empty() ? TimeDelta::Max()
213 : tasks_.top().GetTimeToRun() - now_ticks_; 224 : tasks_.top().GetTimeToRun() - now_ticks_;
214 } 225 }
215 226
227 // TODO(gab): Combine |thread_checker_| with a SequenceToken to differentiate
228 // between tasks running in the scope of this TestMockTimeTaskRunner and other
229 // task runners sharing this thread. http://crbug.com/631186
216 bool TestMockTimeTaskRunner::RunsTasksOnCurrentThread() const { 230 bool TestMockTimeTaskRunner::RunsTasksOnCurrentThread() const {
217 return thread_checker_.CalledOnValidThread(); 231 return thread_checker_.CalledOnValidThread();
218 } 232 }
219 233
220 bool TestMockTimeTaskRunner::PostDelayedTask( 234 bool TestMockTimeTaskRunner::PostDelayedTask(
221 const tracked_objects::Location& from_here, 235 const tracked_objects::Location& from_here,
222 const Closure& task, 236 const Closure& task,
223 TimeDelta delay) { 237 TimeDelta delay) {
224 AutoLock scoped_lock(tasks_lock_); 238 AutoLock scoped_lock(tasks_lock_);
225 tasks_.push(TestOrderedPendingTask(from_here, task, now_ticks_, delay, 239 tasks_.push(TestOrderedPendingTask(from_here, task, now_ticks_, delay,
(...skipping 20 matching lines...) Expand all
246 void TestMockTimeTaskRunner::OnAfterTimePassed() { 260 void TestMockTimeTaskRunner::OnAfterTimePassed() {
247 // Empty default implementation. 261 // Empty default implementation.
248 } 262 }
249 263
250 void TestMockTimeTaskRunner::OnAfterTaskRun() { 264 void TestMockTimeTaskRunner::OnAfterTaskRun() {
251 // Empty default implementation. 265 // Empty default implementation.
252 } 266 }
253 267
254 void TestMockTimeTaskRunner::ProcessAllTasksNoLaterThan(TimeDelta max_delta) { 268 void TestMockTimeTaskRunner::ProcessAllTasksNoLaterThan(TimeDelta max_delta) {
255 DCHECK_GE(max_delta, TimeDelta()); 269 DCHECK_GE(max_delta, TimeDelta());
270
271 // Multiple test task runners can share the same thread for determinism in
272 // unit tests. Make sure this TestMockTimeTaskRunner's tasks run in its scope.
273 ScopedClosureRunner undo_override;
274 if (!ThreadTaskRunnerHandle::IsSet() ||
275 ThreadTaskRunnerHandle::Get() != this) {
276 undo_override = ThreadTaskRunnerHandle::OverrideForTesting(this);
277 }
278
256 const TimeTicks original_now_ticks = now_ticks_; 279 const TimeTicks original_now_ticks = now_ticks_;
257 while (!IsElapsingStopped()) { 280 while (!IsElapsingStopped()) {
258 OnBeforeSelectingTask(); 281 OnBeforeSelectingTask();
259 TestPendingTask task_info; 282 TestPendingTask task_info;
260 if (!DequeueNextTask(original_now_ticks, max_delta, &task_info)) 283 if (!DequeueNextTask(original_now_ticks, max_delta, &task_info))
261 break; 284 break;
262 // If tasks were posted with a negative delay, task_info.GetTimeToRun() will 285 // If tasks were posted with a negative delay, task_info.GetTimeToRun() will
263 // be less than |now_ticks_|. ForwardClocksUntilTickTime() takes care of not 286 // be less than |now_ticks_|. ForwardClocksUntilTickTime() takes care of not
264 // moving the clock backwards in this case. 287 // moving the clock backwards in this case.
265 ForwardClocksUntilTickTime(task_info.GetTimeToRun()); 288 ForwardClocksUntilTickTime(task_info.GetTimeToRun());
(...skipping 20 matching lines...) Expand all
286 // It's safe to remove const and consume |task| here, since |task| is not 309 // It's safe to remove const and consume |task| here, since |task| is not
287 // used for ordering the item. 310 // used for ordering the item.
288 *next_task = std::move(const_cast<TestOrderedPendingTask&>(tasks_.top())); 311 *next_task = std::move(const_cast<TestOrderedPendingTask&>(tasks_.top()));
289 tasks_.pop(); 312 tasks_.pop();
290 return true; 313 return true;
291 } 314 }
292 return false; 315 return false;
293 } 316 }
294 317
295 } // namespace base 318 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698