1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/task/sequence_manager/sequence_manager_impl.h"
6
7 #include <stddef.h>
8 #include <memory>
9 #include <string>
10 #include <tuple>
11 #include <utility>
12 #include <vector>
13
14 #include "base/auto_reset.h"
15 #include "base/cancelable_callback.h"
16 #include "base/functional/bind.h"
17 #include "base/functional/callback.h"
18 #include "base/functional/callback_forward.h"
19 #include "base/functional/callback_helpers.h"
20 #include "base/location.h"
21 #include "base/memory/raw_ptr.h"
22 #include "base/memory/ref_counted_memory.h"
23 #include "base/memory/scoped_refptr.h"
24 #include "base/message_loop/message_pump_default.h"
25 #include "base/message_loop/message_pump_type.h"
26 #include "base/run_loop.h"
27 #include "base/strings/strcat.h"
28 #include "base/strings/string_number_conversions.h"
29 #include "base/strings/stringprintf.h"
30 #include "base/synchronization/waitable_event.h"
31 #include "base/task/current_thread.h"
32 #include "base/task/sequence_manager/sequence_manager.h"
33 #include "base/task/sequence_manager/task_queue.h"
34 #include "base/task/sequence_manager/task_queue_impl.h"
35 #include "base/task/sequence_manager/task_queue_selector.h"
36 #include "base/task/sequence_manager/tasks.h"
37 #include "base/task/sequence_manager/test/mock_time_domain.h"
38 #include "base/task/sequence_manager/test/mock_time_message_pump.h"
39 #include "base/task/sequence_manager/test/sequence_manager_for_test.h"
40 #include "base/task/sequence_manager/test/test_task_time_observer.h"
41 #include "base/task/sequence_manager/thread_controller_with_message_pump_impl.h"
42 #include "base/task/sequence_manager/work_queue.h"
43 #include "base/task/sequence_manager/work_queue_sets.h"
44 #include "base/task/single_thread_task_runner.h"
45 #include "base/task/task_features.h"
46 #include "base/test/bind.h"
47 #include "base/test/mock_callback.h"
48 #include "base/test/null_task_runner.h"
49 #include "base/test/scoped_feature_list.h"
50 #include "base/test/simple_test_tick_clock.h"
51 #include "base/test/task_environment.h"
52 #include "base/test/test_mock_time_task_runner.h"
53 #include "base/test/test_simple_task_runner.h"
54 #include "base/threading/sequence_local_storage_slot.h"
55 #include "base/threading/thread.h"
56 #include "base/time/time.h"
57 #include "base/trace_event/base_tracing.h"
58 #include "base/tracing_buildflags.h"
59 #include "build/build_config.h"
60 #include "testing/gmock/include/gmock/gmock.h"
61
62 #if BUILDFLAG(ENABLE_BASE_TRACING)
63 #include "base/test/trace_event_analyzer.h"
64 #include "third_party/abseil-cpp/absl/types/optional.h"
65 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
66
67 using base::sequence_manager::EnqueueOrder;
68 using testing::_;
69 using testing::AnyNumber;
70 using testing::Contains;
71 using testing::ElementsAre;
72 using testing::ElementsAreArray;
73 using testing::HasSubstr;
74 using testing::Mock;
75 using testing::Not;
76 using testing::Return;
77 using testing::StrictMock;
78 using testing::UnorderedElementsAre;
79
80 namespace base {
81 namespace sequence_manager {
82 namespace internal {
83
84 namespace {
85
86 enum class RunnerType {
87 kMockTaskRunner,
88 kMessagePump,
89 };
90
91 enum class WakeUpType {
92 kDefault,
93 kAlign,
94 };
95
96 enum class TestQueuePriority : TaskQueue::QueuePriority {
97 kControlPriority = 0,
98 kHighestPriority = 1,
99 kVeryHighPriority = 2,
100 kHighPriority = 3,
101
102 kNormalPriority = 4,
103 kDefaultPriority = kNormalPriority,
104
105 kLowPriority = 5,
106 kBestEffortPriority = 6,
107 kQueuePriorityCount = 7,
108 kFirstQueuePriority = kControlPriority,
109 };
110
ToString(RunnerType type)111 std::string ToString(RunnerType type) {
112 switch (type) {
113 case RunnerType::kMockTaskRunner:
114 return "kMockTaskRunner";
115 case RunnerType::kMessagePump:
116 return "kMessagePump";
117 }
118 }
119
ToString(WakeUpType type)120 std::string ToString(WakeUpType type) {
121 switch (type) {
122 case WakeUpType::kDefault:
123 return "";
124 case WakeUpType::kAlign:
125 return "AlignedWakeUps";
126 }
127 }
128
GetTestNameSuffix(const testing::TestParamInfo<std::tuple<RunnerType,WakeUpType>> & info)129 std::string GetTestNameSuffix(
130 const testing::TestParamInfo<std::tuple<RunnerType, WakeUpType>>& info) {
131 return StrCat({"With", ToString(std::get<0>(info.param)).substr(1),
132 ToString(std::get<1>(info.param))});
133 }
134
PrintTo(const RunnerType type,std::ostream * os)135 void PrintTo(const RunnerType type, std::ostream* os) {
136 *os << ToString(type);
137 }
138
GetTaskQueueImpl(TaskQueue * task_queue)139 TaskQueueImpl* GetTaskQueueImpl(TaskQueue* task_queue) {
140 return static_cast<TaskQueueImpl*>(task_queue);
141 }
142
143 constexpr TimeDelta kLeeway = kDefaultLeeway;
144
145 using MockTask = MockCallback<base::RepeatingCallback<void()>>;
146
147 // This class abstracts the details of how the SequenceManager runs tasks.
148 // Subclasses will use a MockTaskRunner, a MessageLoop or a MockMessagePump. We
149 // can then have common tests for all the scenarios by just using this
150 // interface.
151 class Fixture {
152 public:
153 virtual ~Fixture() = default;
154 virtual void AdvanceMockTickClock(TimeDelta delta) = 0;
155 virtual const TickClock* mock_tick_clock() const = 0;
156 virtual TimeTicks NextPendingTaskTime() const = 0;
157 // Keeps advancing time as needed to run tasks up to the specified limit.
158 virtual void FastForwardBy(TimeDelta delta) = 0;
159 // Keeps advancing time as needed to run tasks until no more tasks are
160 // available.
161 virtual void FastForwardUntilNoTasksRemain() = 0;
162 virtual void RunDoWorkOnce() = 0;
163 virtual SequenceManagerForTest* sequence_manager() const = 0;
164 virtual void DestroySequenceManager() = 0;
165 virtual int GetNowTicksCallCount() = 0;
166 virtual TimeTicks FromStartAligned(TimeDelta delta) const = 0;
167 };
168
169 class CallCountingTickClock : public TickClock {
170 public:
CallCountingTickClock(RepeatingCallback<TimeTicks ()> now_callback)171 explicit CallCountingTickClock(RepeatingCallback<TimeTicks()> now_callback)
172 : now_callback_(std::move(now_callback)) {}
CallCountingTickClock(TickClock * clock)173 explicit CallCountingTickClock(TickClock* clock)
174 : CallCountingTickClock(
175 BindLambdaForTesting([clock]() { return clock->NowTicks(); })) {}
176
177 ~CallCountingTickClock() override = default;
178
NowTicks() const179 TimeTicks NowTicks() const override {
180 ++now_call_count_;
181 return now_callback_.Run();
182 }
183
Reset()184 void Reset() { now_call_count_.store(0); }
185
now_call_count() const186 int now_call_count() const { return now_call_count_; }
187
188 private:
189 const RepeatingCallback<TimeTicks()> now_callback_;
190 mutable std::atomic<int> now_call_count_{0};
191 };
192
193 class FixtureWithMockTaskRunner final : public Fixture {
194 public:
FixtureWithMockTaskRunner()195 FixtureWithMockTaskRunner()
196 : test_task_runner_(MakeRefCounted<TestMockTimeTaskRunner>(
197 TestMockTimeTaskRunner::Type::kBoundToThread)),
198 call_counting_clock_(BindRepeating(&TestMockTimeTaskRunner::NowTicks,
199 test_task_runner_)),
200 sequence_manager_(SequenceManagerForTest::Create(
201 nullptr,
202 SingleThreadTaskRunner::GetCurrentDefault(),
203 mock_tick_clock(),
204 SequenceManager::Settings::Builder()
205 .SetMessagePumpType(MessagePumpType::DEFAULT)
206 .SetRandomisedSamplingEnabled(false)
207 .SetTickClock(mock_tick_clock())
208 .SetPrioritySettings(SequenceManager::PrioritySettings(
209 TestQueuePriority::kQueuePriorityCount,
210 TestQueuePriority::kDefaultPriority))
211 .Build())) {
212 // A null clock triggers some assertions.
213 AdvanceMockTickClock(Milliseconds(1));
214 start_time_ = test_task_runner_->NowTicks();
215
216 // The SequenceManager constructor calls Now() once for setting up
217 // housekeeping.
218 EXPECT_EQ(1, GetNowTicksCallCount());
219 call_counting_clock_.Reset();
220 }
221
AdvanceMockTickClock(TimeDelta delta)222 void AdvanceMockTickClock(TimeDelta delta) override {
223 test_task_runner_->AdvanceMockTickClock(delta);
224 }
225
mock_tick_clock() const226 const TickClock* mock_tick_clock() const override {
227 return &call_counting_clock_;
228 }
229
NextPendingTaskTime() const230 TimeTicks NextPendingTaskTime() const override {
231 return test_task_runner_->NowTicks() +
232 test_task_runner_->NextPendingTaskDelay();
233 }
234
FastForwardBy(TimeDelta delta)235 void FastForwardBy(TimeDelta delta) override {
236 test_task_runner_->FastForwardBy(delta);
237 }
238
FastForwardUntilNoTasksRemain()239 void FastForwardUntilNoTasksRemain() override {
240 test_task_runner_->FastForwardUntilNoTasksRemain();
241 }
242
RunDoWorkOnce()243 void RunDoWorkOnce() override {
244 EXPECT_EQ(test_task_runner_->GetPendingTaskCount(), 1u);
245 // We should only run tasks already posted by that moment.
246 RunLoop run_loop;
247 test_task_runner_->PostTask(FROM_HERE, run_loop.QuitClosure());
248 // TestMockTimeTaskRunner will fast-forward mock clock if necessary.
249 run_loop.Run();
250 }
251
test_task_runner() const252 scoped_refptr<TestMockTimeTaskRunner> test_task_runner() const {
253 return test_task_runner_;
254 }
255
sequence_manager() const256 SequenceManagerForTest* sequence_manager() const override {
257 return sequence_manager_.get();
258 }
259
DestroySequenceManager()260 void DestroySequenceManager() override { sequence_manager_.reset(); }
261
GetNowTicksCallCount()262 int GetNowTicksCallCount() override {
263 return call_counting_clock_.now_call_count();
264 }
265
FromStartAligned(TimeDelta delta) const266 TimeTicks FromStartAligned(TimeDelta delta) const override {
267 return start_time_ + delta;
268 }
269
270 private:
271 scoped_refptr<TestMockTimeTaskRunner> test_task_runner_;
272 CallCountingTickClock call_counting_clock_;
273 std::unique_ptr<SequenceManagerForTest> sequence_manager_;
274 TimeTicks start_time_;
275 };
276
277 class FixtureWithMockMessagePump : public Fixture {
278 public:
FixtureWithMockMessagePump(WakeUpType wake_up_type)279 explicit FixtureWithMockMessagePump(WakeUpType wake_up_type)
280 : call_counting_clock_(&mock_clock_), wake_up_type_(wake_up_type) {
281 if (wake_up_type_ == WakeUpType::kAlign) {
282 feature_list_.InitWithFeatures(
283 {kAlignWakeUps, kExplicitHighResolutionTimerWin}, {});
284 } else {
285 feature_list_.InitWithFeatures(
286 {}, {kAlignWakeUps, kExplicitHighResolutionTimerWin});
287 }
288 // A null clock triggers some assertions.
289 mock_clock_.Advance(Milliseconds(1));
290
291 auto pump = std::make_unique<MockTimeMessagePump>(&mock_clock_);
292 pump_ = pump.get();
293 auto settings = SequenceManager::Settings::Builder()
294 .SetMessagePumpType(MessagePumpType::DEFAULT)
295 .SetRandomisedSamplingEnabled(false)
296 .SetTickClock(mock_tick_clock())
297 .SetPrioritySettings(SequenceManager::PrioritySettings(
298 TestQueuePriority::kQueuePriorityCount,
299 TestQueuePriority::kDefaultPriority))
300 .Build();
301 auto thread_controller =
302 std::make_unique<ThreadControllerWithMessagePumpImpl>(std::move(pump),
303 settings);
304 MessagePump::InitializeFeatures();
305 ThreadControllerWithMessagePumpImpl::InitializeFeatures();
306 sequence_manager_ = SequenceManagerForTest::Create(
307 std::move(thread_controller), std::move(settings));
308 sequence_manager_->SetDefaultTaskRunner(MakeRefCounted<NullTaskRunner>());
309 start_time_ = mock_clock_.NowTicks();
310
311 // The SequenceManager constructor calls Now() once for setting up
312 // housekeeping.
313 EXPECT_EQ(1, GetNowTicksCallCount());
314 call_counting_clock_.Reset();
315 }
~FixtureWithMockMessagePump()316 ~FixtureWithMockMessagePump() override {
317 ThreadControllerWithMessagePumpImpl::ResetFeatures();
318 }
319
AdvanceMockTickClock(TimeDelta delta)320 void AdvanceMockTickClock(TimeDelta delta) override {
321 mock_clock_.Advance(delta);
322 }
323
mock_tick_clock() const324 const TickClock* mock_tick_clock() const override {
325 return &call_counting_clock_;
326 }
327
NextPendingTaskTime() const328 TimeTicks NextPendingTaskTime() const override {
329 return pump_->next_wake_up_time();
330 }
331
FastForwardBy(TimeDelta delta)332 void FastForwardBy(TimeDelta delta) override {
333 pump_->SetAllowTimeToAutoAdvanceUntil(mock_tick_clock()->NowTicks() +
334 delta);
335 pump_->SetStopWhenMessagePumpIsIdle(true);
336 RunLoop().Run();
337 pump_->SetStopWhenMessagePumpIsIdle(false);
338 }
339
FastForwardUntilNoTasksRemain()340 void FastForwardUntilNoTasksRemain() override {
341 pump_->SetAllowTimeToAutoAdvanceUntil(TimeTicks::Max());
342 pump_->SetStopWhenMessagePumpIsIdle(true);
343 RunLoop().Run();
344 pump_->SetStopWhenMessagePumpIsIdle(false);
345 pump_->SetAllowTimeToAutoAdvanceUntil(mock_tick_clock()->NowTicks());
346 }
347
RunDoWorkOnce()348 void RunDoWorkOnce() override {
349 pump_->SetQuitAfterDoWork(true);
350 RunLoop().Run();
351 pump_->SetQuitAfterDoWork(false);
352 }
353
sequence_manager() const354 SequenceManagerForTest* sequence_manager() const override {
355 return sequence_manager_.get();
356 }
357
DestroySequenceManager()358 void DestroySequenceManager() override {
359 pump_ = nullptr;
360 sequence_manager_.reset();
361 }
362
GetNowTicksCallCount()363 int GetNowTicksCallCount() override {
364 return call_counting_clock_.now_call_count();
365 }
366
FromStartAligned(TimeDelta delta) const367 TimeTicks FromStartAligned(TimeDelta delta) const override {
368 if (wake_up_type_ == WakeUpType::kAlign) {
369 return (start_time_ + delta).SnappedToNextTick(TimeTicks(), kLeeway);
370 }
371 return start_time_ + delta;
372 }
373
374 private:
375 base::test::ScopedFeatureList feature_list_;
376 SimpleTestTickClock mock_clock_;
377 CallCountingTickClock call_counting_clock_;
378
379 // Must outlive `pump_`.
380 std::unique_ptr<SequenceManagerForTest> sequence_manager_;
381
382 raw_ptr<MockTimeMessagePump> pump_ = nullptr;
383 WakeUpType wake_up_type_;
384 TimeTicks start_time_;
385 };
386
387 // Convenience wrapper around the fixtures so that we can use parametrized tests
388 // instead of templated ones. The latter would be more verbose as all method
389 // calls to the fixture would need to be like this->method()
390 class SequenceManagerTest
391 : public testing::TestWithParam<std::tuple<RunnerType, WakeUpType>>,
392 public Fixture {
393 public:
SequenceManagerTest()394 SequenceManagerTest() {
395 switch (GetUnderlyingRunnerType()) {
396 case RunnerType::kMockTaskRunner:
397 fixture_ = std::make_unique<FixtureWithMockTaskRunner>();
398 break;
399 case RunnerType::kMessagePump:
400 fixture_ =
401 std::make_unique<FixtureWithMockMessagePump>(GetWakeUpType());
402 break;
403 }
404 }
405
CreateTaskQueue(TaskQueue::Spec spec=TaskQueue::Spec (QueueName::TEST_TQ))406 TaskQueue::Handle CreateTaskQueue(
407 TaskQueue::Spec spec = TaskQueue::Spec(QueueName::TEST_TQ)) {
408 return sequence_manager()->CreateTaskQueue(spec);
409 }
410
CreateTaskQueues(size_t num_queues)411 std::vector<TaskQueue::Handle> CreateTaskQueues(size_t num_queues) {
412 std::vector<TaskQueue::Handle> queues;
413 for (size_t i = 0; i < num_queues; i++)
414 queues.push_back(CreateTaskQueue());
415 return queues;
416 }
417
RunUntilManagerIsIdle(RepeatingClosure per_run_time_callback)418 void RunUntilManagerIsIdle(RepeatingClosure per_run_time_callback) {
419 for (;;) {
420 // Advance time if we've run out of immediate work to do.
421 if (!sequence_manager()->HasImmediateWork()) {
422 LazyNow lazy_now(mock_tick_clock());
423 auto wake_up = sequence_manager()->GetNextDelayedWakeUp();
424 if (wake_up.has_value()) {
425 AdvanceMockTickClock(wake_up->time - lazy_now.Now());
426 per_run_time_callback.Run();
427 } else {
428 break;
429 }
430 }
431 RunLoop().RunUntilIdle();
432 }
433 }
434
dummy_key()435 debug::CrashKeyString* dummy_key() { return &dummy_key_; }
436
AdvanceMockTickClock(TimeDelta delta)437 void AdvanceMockTickClock(TimeDelta delta) override {
438 fixture_->AdvanceMockTickClock(delta);
439 }
440
mock_tick_clock() const441 const TickClock* mock_tick_clock() const override {
442 return fixture_->mock_tick_clock();
443 }
444
NextPendingTaskTime() const445 TimeTicks NextPendingTaskTime() const override {
446 return fixture_->NextPendingTaskTime();
447 }
448
FastForwardBy(TimeDelta delta)449 void FastForwardBy(TimeDelta delta) override {
450 fixture_->FastForwardBy(delta);
451 }
452
FastForwardUntilNoTasksRemain()453 void FastForwardUntilNoTasksRemain() override {
454 fixture_->FastForwardUntilNoTasksRemain();
455 }
456
RunDoWorkOnce()457 void RunDoWorkOnce() override { fixture_->RunDoWorkOnce(); }
458
sequence_manager() const459 SequenceManagerForTest* sequence_manager() const override {
460 return fixture_->sequence_manager();
461 }
462
DestroySequenceManager()463 void DestroySequenceManager() override { fixture_->DestroySequenceManager(); }
464
GetNowTicksCallCount()465 int GetNowTicksCallCount() override {
466 return fixture_->GetNowTicksCallCount();
467 }
468
GetUnderlyingRunnerType()469 RunnerType GetUnderlyingRunnerType() { return std::get<0>(GetParam()); }
GetWakeUpType()470 WakeUpType GetWakeUpType() { return std::get<1>(GetParam()); }
471
FromStartAligned(TimeDelta delta) const472 TimeTicks FromStartAligned(TimeDelta delta) const override {
473 return fixture_->FromStartAligned(delta);
474 }
475
476 private:
477 debug::CrashKeyString dummy_key_{"dummy", debug::CrashKeySize::Size64};
478 std::unique_ptr<Fixture> fixture_;
479 };
480
GetTestTypes()481 auto GetTestTypes() {
482 return testing::Values(
483 std::make_tuple(RunnerType::kMessagePump, WakeUpType::kDefault),
484 #if !BUILDFLAG(IS_WIN)
485 std::make_tuple(RunnerType::kMessagePump, WakeUpType::kAlign),
486 #endif
487 std::make_tuple(RunnerType::kMockTaskRunner, WakeUpType::kDefault));
488 }
489
490 INSTANTIATE_TEST_SUITE_P(All,
491 SequenceManagerTest,
492 GetTestTypes(),
493 GetTestNameSuffix);
494
PostFromNestedRunloop(scoped_refptr<SingleThreadTaskRunner> runner,std::vector<std::pair<OnceClosure,bool>> * tasks)495 void PostFromNestedRunloop(scoped_refptr<SingleThreadTaskRunner> runner,
496 std::vector<std::pair<OnceClosure, bool>>* tasks) {
497 for (std::pair<OnceClosure, bool>& pair : *tasks) {
498 if (pair.second) {
499 runner->PostTask(FROM_HERE, std::move(pair.first));
500 } else {
501 runner->PostNonNestableTask(FROM_HERE, std::move(pair.first));
502 }
503 }
504 RunLoop(RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
505 }
506
NopTask()507 void NopTask() {}
508
509 class TestCountUsesTimeSource : public TickClock {
510 public:
511 TestCountUsesTimeSource() = default;
512 TestCountUsesTimeSource(const TestCountUsesTimeSource&) = delete;
513 TestCountUsesTimeSource& operator=(const TestCountUsesTimeSource&) = delete;
514 ~TestCountUsesTimeSource() override = default;
515
NowTicks() const516 TimeTicks NowTicks() const override {
517 now_calls_count_++;
518 // Don't return 0, as it triggers some assertions.
519 return TimeTicks() + Seconds(1);
520 }
521
now_calls_count() const522 int now_calls_count() const { return now_calls_count_; }
523
524 private:
525 mutable int now_calls_count_ = 0;
526 };
527
528 class QueueTimeTaskObserver : public TaskObserver {
529 public:
WillProcessTask(const PendingTask & pending_task,bool was_blocked_or_low_priority)530 void WillProcessTask(const PendingTask& pending_task,
531 bool was_blocked_or_low_priority) override {
532 queue_times_.push_back(pending_task.queue_time);
533 }
DidProcessTask(const PendingTask & pending_task)534 void DidProcessTask(const PendingTask& pending_task) override {}
queue_times() const535 std::vector<TimeTicks> queue_times() const { return queue_times_; }
536
537 private:
538 std::vector<TimeTicks> queue_times_;
539 };
540
541 } // namespace
542
TEST_P(SequenceManagerTest,GetCorrectTaskRunnerForCurrentTask)543 TEST_P(SequenceManagerTest, GetCorrectTaskRunnerForCurrentTask) {
544 auto queue = CreateTaskQueue();
545
546 queue->task_runner()->PostTask(
547 FROM_HERE, BindLambdaForTesting([&]() {
548 EXPECT_EQ(queue->task_runner(),
549 sequence_manager()->GetTaskRunnerForCurrentTask());
550 }));
551
552 RunLoop().RunUntilIdle();
553 }
554
TEST_P(SequenceManagerTest,NowNotCalledIfUnneeded)555 TEST_P(SequenceManagerTest, NowNotCalledIfUnneeded) {
556 sequence_manager()->SetWorkBatchSize(6);
557
558 auto queues = CreateTaskQueues(3u);
559
560 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
561 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
562 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
563 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
564 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
565 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
566
567 RunLoop().RunUntilIdle();
568
569 EXPECT_EQ(0, GetNowTicksCallCount());
570 }
571
TEST_P(SequenceManagerTest,NowCalledMinimumNumberOfTimesToComputeTaskDurations)572 TEST_P(SequenceManagerTest,
573 NowCalledMinimumNumberOfTimesToComputeTaskDurations) {
574 TestTaskTimeObserver time_observer;
575 sequence_manager()->SetWorkBatchSize(6);
576 sequence_manager()->AddTaskTimeObserver(&time_observer);
577
578 auto queues = CreateTaskQueues(3u);
579
580 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
581 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
582 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
583 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
584 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
585 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
586
587 RunLoop().RunUntilIdle();
588 // Now is called when we start work and then for each task when it's
589 // completed. 1 + 6 = 7 calls.
590 EXPECT_EQ(7, GetNowTicksCallCount());
591 }
592
TEST_P(SequenceManagerTest,NowCalledMinimumNumberOfTimesToComputeTaskDurationsDelayedFenceAllowed)593 TEST_P(SequenceManagerTest,
594 NowCalledMinimumNumberOfTimesToComputeTaskDurationsDelayedFenceAllowed) {
595 TestTaskTimeObserver time_observer;
596 sequence_manager()->SetWorkBatchSize(6);
597 sequence_manager()->AddTaskTimeObserver(&time_observer);
598
599 std::vector<TaskQueue::Handle> queues;
600 for (size_t i = 0; i < 3; i++) {
601 queues.push_back(CreateTaskQueue(
602 TaskQueue::Spec(QueueName::TEST_TQ).SetDelayedFencesAllowed(true)));
603 }
604
605 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
606 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
607 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
608 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
609 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
610 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
611
612 RunLoop().RunUntilIdle();
613 // Now is called each time a task is queued, when first task is started
614 // running, and when a task is completed. 1 + 6 * 2 = 13 calls.
615 EXPECT_EQ(13, GetNowTicksCallCount());
616 }
617
NullTask()618 void NullTask() {}
619
TestTask(uint64_t value,std::vector<EnqueueOrder> * out_result)620 void TestTask(uint64_t value, std::vector<EnqueueOrder>* out_result) {
621 out_result->push_back(EnqueueOrder::FromIntForTesting(value));
622 }
623
DisableQueueTestTask(uint64_t value,std::vector<EnqueueOrder> * out_result,TaskQueue::QueueEnabledVoter * voter)624 void DisableQueueTestTask(uint64_t value,
625 std::vector<EnqueueOrder>* out_result,
626 TaskQueue::QueueEnabledVoter* voter) {
627 out_result->push_back(EnqueueOrder::FromIntForTesting(value));
628 voter->SetVoteToEnable(false);
629 }
630
TEST_P(SequenceManagerTest,SingleQueuePosting)631 TEST_P(SequenceManagerTest, SingleQueuePosting) {
632 auto queue = CreateTaskQueue();
633
634 std::vector<EnqueueOrder> run_order;
635 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
636 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
637 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
638
639 RunLoop().RunUntilIdle();
640 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
641 }
642
TEST_P(SequenceManagerTest,MultiQueuePosting)643 TEST_P(SequenceManagerTest, MultiQueuePosting) {
644 auto queues = CreateTaskQueues(3u);
645
646 std::vector<EnqueueOrder> run_order;
647 queues[0]->task_runner()->PostTask(FROM_HERE,
648 BindOnce(&TestTask, 1, &run_order));
649 queues[0]->task_runner()->PostTask(FROM_HERE,
650 BindOnce(&TestTask, 2, &run_order));
651 queues[1]->task_runner()->PostTask(FROM_HERE,
652 BindOnce(&TestTask, 3, &run_order));
653 queues[1]->task_runner()->PostTask(FROM_HERE,
654 BindOnce(&TestTask, 4, &run_order));
655 queues[2]->task_runner()->PostTask(FROM_HERE,
656 BindOnce(&TestTask, 5, &run_order));
657 queues[2]->task_runner()->PostTask(FROM_HERE,
658 BindOnce(&TestTask, 6, &run_order));
659
660 RunLoop().RunUntilIdle();
661 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u, 6u));
662 }
663
TEST_P(SequenceManagerTest,NonNestableTaskPosting)664 TEST_P(SequenceManagerTest, NonNestableTaskPosting) {
665 auto queue = CreateTaskQueue();
666
667 std::vector<EnqueueOrder> run_order;
668 queue->task_runner()->PostNonNestableTask(FROM_HERE,
669 BindOnce(&TestTask, 1, &run_order));
670
671 RunLoop().RunUntilIdle();
672 EXPECT_THAT(run_order, ElementsAre(1u));
673 }
674
TEST_P(SequenceManagerTest,NonNestableTaskExecutesInExpectedOrder)675 TEST_P(SequenceManagerTest, NonNestableTaskExecutesInExpectedOrder) {
676 auto queue = CreateTaskQueue();
677
678 std::vector<EnqueueOrder> run_order;
679 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
680 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
681 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
682 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order));
683 queue->task_runner()->PostNonNestableTask(FROM_HERE,
684 BindOnce(&TestTask, 5, &run_order));
685
686 RunLoop().RunUntilIdle();
687 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u));
688 }
689
TEST_P(SequenceManagerTest,NonNestableTasksDoesntExecuteInNestedLoop)690 TEST_P(SequenceManagerTest, NonNestableTasksDoesntExecuteInNestedLoop) {
691 // TestMockTimeTaskRunner doesn't support nested loops.
692 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
693 return;
694 auto queue = CreateTaskQueue();
695
696 std::vector<EnqueueOrder> run_order;
697 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
698 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
699
700 std::vector<std::pair<OnceClosure, bool>> tasks_to_post_from_nested_loop;
701 tasks_to_post_from_nested_loop.push_back(
702 std::make_pair(BindOnce(&TestTask, 3, &run_order), false));
703 tasks_to_post_from_nested_loop.push_back(
704 std::make_pair(BindOnce(&TestTask, 4, &run_order), false));
705 tasks_to_post_from_nested_loop.push_back(
706 std::make_pair(BindOnce(&TestTask, 5, &run_order), true));
707 tasks_to_post_from_nested_loop.push_back(
708 std::make_pair(BindOnce(&TestTask, 6, &run_order), true));
709
710 queue->task_runner()->PostTask(
711 FROM_HERE, BindOnce(&PostFromNestedRunloop, queue->task_runner(),
712 Unretained(&tasks_to_post_from_nested_loop)));
713
714 RunLoop().RunUntilIdle();
715 // Note we expect tasks 3 & 4 to run last because they're non-nestable.
716 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 5u, 6u, 3u, 4u));
717 }
718
TEST_P(SequenceManagerTest,NonNestableTasksShutdownQueue)719 TEST_P(SequenceManagerTest, NonNestableTasksShutdownQueue) {
720 // TestMockTimeTaskRunner doesn't support nested loops.
721 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner) {
722 return;
723 }
724 auto queue = CreateTaskQueue();
725
726 std::vector<EnqueueOrder> run_order;
727
728 std::vector<std::pair<OnceClosure, bool>> tasks_to_post_from_nested_loop;
729 tasks_to_post_from_nested_loop.emplace_back(
730 BindOnce(&TestTask, 1, &run_order), false);
731 tasks_to_post_from_nested_loop.emplace_back(
732 BindOnce(&TestTask, 2, &run_order), true);
733 tasks_to_post_from_nested_loop.emplace_back(
734 BindLambdaForTesting([&queue]() { queue.reset(); }), true);
735
736 queue->task_runner()->PostTask(
737 FROM_HERE, BindOnce(&PostFromNestedRunloop, queue->task_runner(),
738 Unretained(&tasks_to_post_from_nested_loop)));
739
740 RunLoop().RunUntilIdle();
741 // We don't expect task 1 to run because the queue was shutdown.
742 EXPECT_THAT(run_order, ElementsAre(2u));
743 }
744
TEST_P(SequenceManagerTest,NonNestableTaskQueueTimeShiftsToEndOfNestedLoop)745 TEST_P(SequenceManagerTest, NonNestableTaskQueueTimeShiftsToEndOfNestedLoop) {
746 // TestMockTimeTaskRunner doesn't support nested loops.
747 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
748 return;
749
750 auto queue = CreateTaskQueue();
751
752 QueueTimeTaskObserver observer;
753 sequence_manager()->AddTaskObserver(&observer);
754 sequence_manager()->SetAddQueueTimeToTasks(true);
755
756 RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
757
758 const TimeTicks start_time = mock_tick_clock()->NowTicks();
759
760 constexpr auto kTimeSpentInNestedLoop = Seconds(1);
761 constexpr auto kTimeInTaskAfterNestedLoop = Seconds(3);
762
763 // 1) Run task 1
764 // 2) Enter a nested loop
765 // 3) Run task 3
766 // 4) Advance time by 1 second
767 // 5) Run task 5
768 // 6) Exit nested loop
769 // 7) Run task 7 (non-nestable)
770 // 8) Advance time by 3 seconds (non-nestable)
771 // 9) Run task 9 (non-nestable)
772 // Steps 7-9 are expected to run last and have had their queue time adjusted
773 // to 6 (task 8 shouldn't affect task 9's queue time).
774 std::vector<EnqueueOrder> run_order;
775 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
776 queue->task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
777 TestTask(2, &run_order);
778 nested_run_loop.Run();
779 }));
780 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
781 queue->task_runner()->PostNonNestableTask(FROM_HERE,
782 BindOnce(&TestTask, 7, &run_order));
783 queue->task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
784 TestTask(4, &run_order);
785 AdvanceMockTickClock(kTimeSpentInNestedLoop);
786 }));
787 queue->task_runner()->PostNonNestableTask(
788 FROM_HERE, BindLambdaForTesting([&]() {
789 TestTask(8, &run_order);
790 AdvanceMockTickClock(kTimeInTaskAfterNestedLoop);
791 }));
792 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 5, &run_order));
793 queue->task_runner()->PostNonNestableTask(FROM_HERE,
794 BindOnce(&TestTask, 9, &run_order));
795 queue->task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
796 TestTask(6, &run_order);
797 nested_run_loop.Quit();
798 }));
799
800 RunLoop().RunUntilIdle();
801
802 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u));
803
804 const TimeTicks expected_adjusted_queueing_time =
805 start_time + kTimeSpentInNestedLoop;
806 EXPECT_THAT(
807 observer.queue_times(),
808 ElementsAre(start_time, start_time, start_time, start_time, start_time,
809 start_time, expected_adjusted_queueing_time,
810 expected_adjusted_queueing_time,
811 expected_adjusted_queueing_time));
812
813 sequence_manager()->RemoveTaskObserver(&observer);
814 }
815
816 namespace {
817
InsertFenceAndPostTestTask(int id,std::vector<EnqueueOrder> * run_order,TaskQueue * task_queue,SequenceManagerForTest * manager)818 void InsertFenceAndPostTestTask(int id,
819 std::vector<EnqueueOrder>* run_order,
820 TaskQueue* task_queue,
821 SequenceManagerForTest* manager) {
822 run_order->push_back(EnqueueOrder::FromIntForTesting(id));
823 task_queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
824 task_queue->task_runner()->PostTask(FROM_HERE,
825 BindOnce(&TestTask, id + 1, run_order));
826
827 // Force reload of immediate work queue. In real life the same effect can be
828 // achieved with cross-thread posting.
829 manager->ReloadEmptyWorkQueues();
830 }
831
832 } // namespace
833
TEST_P(SequenceManagerTest,TaskQueueDisabledFromNestedLoop)834 TEST_P(SequenceManagerTest, TaskQueueDisabledFromNestedLoop) {
835 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
836 return;
837 auto queue = CreateTaskQueue();
838 std::vector<EnqueueOrder> run_order;
839
840 std::vector<std::pair<OnceClosure, bool>> tasks_to_post_from_nested_loop;
841
842 tasks_to_post_from_nested_loop.push_back(
843 std::make_pair(BindOnce(&TestTask, 1, &run_order), false));
844 tasks_to_post_from_nested_loop.push_back(
845 std::make_pair(BindOnce(&InsertFenceAndPostTestTask, 2, &run_order,
846 queue.get(), sequence_manager()),
847 true));
848
849 queue->task_runner()->PostTask(
850 FROM_HERE, BindOnce(&PostFromNestedRunloop, queue->task_runner(),
851 Unretained(&tasks_to_post_from_nested_loop)));
852 RunLoop().RunUntilIdle();
853
854 // Task 1 shouldn't run first due to it being non-nestable and queue gets
855 // blocked after task 2. Task 1 runs after existing nested message loop
856 // due to being posted before inserting a fence.
857 // This test checks that breaks when nestable task is pushed into a redo
858 // queue.
859 EXPECT_THAT(run_order, ElementsAre(2u, 1u));
860
861 queue->RemoveFence();
862 RunLoop().RunUntilIdle();
863 EXPECT_THAT(run_order, ElementsAre(2u, 1u, 3u));
864 }
865
TEST_P(SequenceManagerTest,HasTaskToRunImmediatelyOrReadyDelayedTask_ImmediateTask)866 TEST_P(SequenceManagerTest,
867 HasTaskToRunImmediatelyOrReadyDelayedTask_ImmediateTask) {
868 auto queue = CreateTaskQueue();
869
870 std::vector<EnqueueOrder> run_order;
871 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
872 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
873 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
874
875 // Move the task into the |immediate_work_queue|.
876 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->immediate_work_queue()->Empty());
877 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
878 queue->CreateQueueEnabledVoter();
879 voter->SetVoteToEnable(false);
880 RunLoop().RunUntilIdle();
881 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->immediate_work_queue()->Empty());
882 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
883
884 // Run the task, making the queue empty.
885 voter->SetVoteToEnable(true);
886 RunLoop().RunUntilIdle();
887 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
888 }
889
TEST_P(SequenceManagerTest,HasTaskToRunImmediatelyOrReadyDelayedTask_DelayedTask)890 TEST_P(SequenceManagerTest,
891 HasTaskToRunImmediatelyOrReadyDelayedTask_DelayedTask) {
892 auto queue = CreateTaskQueue();
893
894 std::vector<EnqueueOrder> run_order;
895 TimeDelta delay(Milliseconds(10));
896 queue->task_runner()->PostDelayedTask(
897 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
898 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
899 AdvanceMockTickClock(delay);
900 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
901
902 // Move the task into the |delayed_work_queue|.
903 LazyNow lazy_now(mock_tick_clock());
904 sequence_manager()->MoveReadyDelayedTasksToWorkQueues(&lazy_now);
905 sequence_manager()->ScheduleWork();
906 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->delayed_work_queue()->Empty());
907 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
908
909 // Run the task, making the queue empty.
910 RunLoop().RunUntilIdle();
911 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->delayed_work_queue()->Empty());
912 }
913
TEST_P(SequenceManagerTest,DelayedTaskPosting)914 TEST_P(SequenceManagerTest, DelayedTaskPosting) {
915 auto queue = CreateTaskQueue();
916
917 std::vector<EnqueueOrder> run_order;
918 TimeDelta delay(Milliseconds(10));
919 queue->task_runner()->PostDelayedTask(
920 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
921 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
922 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
923 EXPECT_TRUE(run_order.empty());
924
925 // The task doesn't run before the delay has completed.
926 FastForwardBy(Milliseconds(9));
927 EXPECT_TRUE(run_order.empty());
928
929 // After the delay has completed, the task runs normally.
930 FastForwardBy(Milliseconds(1));
931 EXPECT_THAT(run_order, ElementsAre(1u));
932 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
933 }
934
TEST_P(SequenceManagerTest,DelayedTaskAtPosting)935 TEST_P(SequenceManagerTest, DelayedTaskAtPosting) {
936 auto queue = CreateTaskQueue();
937
938 std::vector<EnqueueOrder> run_order;
939 constexpr TimeDelta kDelay(Milliseconds(10));
940 auto handle = queue->task_runner()->PostCancelableDelayedTaskAt(
941 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
942 BindOnce(&TestTask, 1, &run_order),
943 sequence_manager()->NowTicks() + kDelay,
944 subtle::DelayPolicy::kFlexibleNoSooner);
945 EXPECT_EQ(FromStartAligned(kDelay), NextPendingTaskTime());
946 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
947 EXPECT_TRUE(run_order.empty());
948
949 // The task doesn't run before the delay has completed.
950 FastForwardBy(kDelay - Milliseconds(1));
951 EXPECT_TRUE(run_order.empty());
952
953 // After the delay has completed, the task runs normally.
954 FastForwardBy(Milliseconds(1));
955 EXPECT_THAT(run_order, ElementsAre(1u));
956 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
957 }
958
TEST_P(SequenceManagerTest,DelayedTaskAtPosting_FlexiblePreferEarly)959 TEST_P(SequenceManagerTest, DelayedTaskAtPosting_FlexiblePreferEarly) {
960 auto queue = CreateTaskQueue();
961
962 TimeTicks start_time = sequence_manager()->NowTicks();
963 std::vector<EnqueueOrder> run_order;
964 constexpr TimeDelta kDelay(Milliseconds(20));
965 auto handle = queue->task_runner()->PostCancelableDelayedTaskAt(
966 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
967 BindOnce(&TestTask, 1, &run_order),
968 sequence_manager()->NowTicks() + kDelay,
969 subtle::DelayPolicy::kFlexiblePreferEarly);
970 TimeTicks expected_run_time = start_time + kDelay;
971 if (GetWakeUpType() == WakeUpType::kAlign) {
972 expected_run_time =
973 (start_time + kDelay - kLeeway).SnappedToNextTick(TimeTicks(), kLeeway);
974 }
975 EXPECT_EQ(expected_run_time, NextPendingTaskTime());
976 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
977 EXPECT_TRUE(run_order.empty());
978 LazyNow lazy_now(mock_tick_clock());
979 EXPECT_EQ((WakeUp{start_time + kDelay, kLeeway, WakeUpResolution::kLow,
980 subtle::DelayPolicy::kFlexiblePreferEarly}),
981 sequence_manager()->GetPendingWakeUp(&lazy_now));
982
983 // The task doesn't run before the delay has completed.
984 FastForwardBy(kDelay - kLeeway - Milliseconds(1));
985 EXPECT_TRUE(run_order.empty());
986
987 // After the delay has completed, the task runs normally.
988 FastForwardBy(kLeeway + Milliseconds(1));
989 EXPECT_THAT(run_order, ElementsAre(1u));
990 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
991 }
992
TEST_P(SequenceManagerTest,DelayedTaskAtPosting_MixedDelayPolicy)993 TEST_P(SequenceManagerTest, DelayedTaskAtPosting_MixedDelayPolicy) {
994 auto queue = CreateTaskQueue();
995
996 TimeTicks start_time = sequence_manager()->NowTicks();
997 std::vector<EnqueueOrder> run_order;
998 auto handle1 = queue->task_runner()->PostCancelableDelayedTaskAt(
999 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1000 BindOnce(&TestTask, 2, &run_order),
1001 sequence_manager()->NowTicks() + Milliseconds(8),
1002 subtle::DelayPolicy::kFlexibleNoSooner);
1003 auto handle2 = queue->task_runner()->PostCancelableDelayedTaskAt(
1004 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1005 BindOnce(&TestTask, 1, &run_order),
1006 sequence_manager()->NowTicks() + Milliseconds(10),
1007 subtle::DelayPolicy::kPrecise);
1008 EXPECT_EQ(start_time + Milliseconds(10), NextPendingTaskTime());
1009 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
1010 EXPECT_TRUE(run_order.empty());
1011 LazyNow lazy_now(mock_tick_clock());
1012 EXPECT_EQ((WakeUp{start_time + Milliseconds(10), kLeeway,
1013 WakeUpResolution::kLow, subtle::DelayPolicy::kPrecise}),
1014 sequence_manager()->GetPendingWakeUp(&lazy_now));
1015
1016 // The task doesn't run before the delay has completed.
1017 FastForwardBy(Milliseconds(10) - Milliseconds(1));
1018 EXPECT_TRUE(run_order.empty());
1019
1020 // After the delay has completed, the task runs normally.
1021 FastForwardBy(Milliseconds(1));
1022 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1023 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
1024 }
1025
TEST_P(SequenceManagerTest,DelayedTaskAtPosting_Immediate)1026 TEST_P(SequenceManagerTest, DelayedTaskAtPosting_Immediate) {
1027 auto queue = CreateTaskQueue();
1028
1029 std::vector<EnqueueOrder> run_order;
1030 auto handle = queue->task_runner()->PostCancelableDelayedTaskAt(
1031 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1032 BindOnce(&TestTask, 1, &run_order), TimeTicks(),
1033 subtle::DelayPolicy::kFlexibleNoSooner);
1034 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->HasTaskToRunImmediately());
1035 EXPECT_TRUE(run_order.empty());
1036
1037 // The task runs immediately.
1038 RunLoop().RunUntilIdle();
1039 EXPECT_THAT(run_order, ElementsAre(1u));
1040 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
1041 }
1042
TEST(SequenceManagerTestWithMockTaskRunner,DelayedTaskExecutedInOneMessageLoopTask)1043 TEST(SequenceManagerTestWithMockTaskRunner,
1044 DelayedTaskExecutedInOneMessageLoopTask) {
1045 FixtureWithMockTaskRunner fixture;
1046 auto queue = fixture.sequence_manager()->CreateTaskQueue(
1047 TaskQueue::Spec(QueueName::TEST_TQ));
1048
1049 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
1050 Milliseconds(10));
1051 RunLoop().RunUntilIdle();
1052 EXPECT_EQ(1u, fixture.test_task_runner()->GetPendingTaskCount());
1053 fixture.FastForwardUntilNoTasksRemain();
1054 EXPECT_EQ(0u, fixture.test_task_runner()->GetPendingTaskCount());
1055 }
1056
TEST_P(SequenceManagerTest,DelayedTaskPosting_MultipleTasks_DecendingOrder)1057 TEST_P(SequenceManagerTest, DelayedTaskPosting_MultipleTasks_DecendingOrder) {
1058 auto queue = CreateTaskQueue();
1059
1060 std::vector<EnqueueOrder> run_order;
1061 queue->task_runner()->PostDelayedTask(
1062 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(10));
1063
1064 queue->task_runner()->PostDelayedTask(
1065 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(8));
1066
1067 queue->task_runner()->PostDelayedTask(
1068 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(5));
1069
1070 EXPECT_EQ(FromStartAligned(Milliseconds(5)), NextPendingTaskTime());
1071
1072 FastForwardBy(Milliseconds(5));
1073 EXPECT_THAT(run_order, ElementsAre(3u));
1074 EXPECT_EQ(FromStartAligned(Milliseconds(8)), NextPendingTaskTime());
1075
1076 FastForwardBy(Milliseconds(3));
1077 EXPECT_THAT(run_order, ElementsAre(3u, 2u));
1078 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
1079
1080 FastForwardBy(Milliseconds(2));
1081 EXPECT_THAT(run_order, ElementsAre(3u, 2u, 1u));
1082 }
1083
TEST_P(SequenceManagerTest,DelayedTaskAtPosting_MultipleTasks_DescendingOrder)1084 TEST_P(SequenceManagerTest,
1085 DelayedTaskAtPosting_MultipleTasks_DescendingOrder) {
1086 auto queue = CreateTaskQueue();
1087
1088 std::vector<EnqueueOrder> run_order;
1089 auto handle1 = queue->task_runner()->PostCancelableDelayedTaskAt(
1090 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1091 BindOnce(&TestTask, 1, &run_order),
1092 sequence_manager()->NowTicks() + Milliseconds(10),
1093 subtle::DelayPolicy::kFlexibleNoSooner);
1094
1095 queue->task_runner()->PostDelayedTask(
1096 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(8));
1097
1098 auto handle2 = queue->task_runner()->PostCancelableDelayedTaskAt(
1099 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1100 BindOnce(&TestTask, 3, &run_order),
1101 sequence_manager()->NowTicks() + Milliseconds(5),
1102 subtle::DelayPolicy::kFlexibleNoSooner);
1103
1104 EXPECT_EQ(FromStartAligned(Milliseconds(5)), NextPendingTaskTime());
1105
1106 FastForwardBy(Milliseconds(5));
1107 EXPECT_THAT(run_order, ElementsAre(3u));
1108 EXPECT_EQ(FromStartAligned(Milliseconds(8)), NextPendingTaskTime());
1109
1110 FastForwardBy(Milliseconds(3));
1111 EXPECT_THAT(run_order, ElementsAre(3u, 2u));
1112 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
1113
1114 FastForwardBy(Milliseconds(2));
1115 EXPECT_THAT(run_order, ElementsAre(3u, 2u, 1u));
1116 }
1117
TEST_P(SequenceManagerTest,DelayedTaskPosting_MultipleTasks_AscendingOrder)1118 TEST_P(SequenceManagerTest, DelayedTaskPosting_MultipleTasks_AscendingOrder) {
1119 auto queue = CreateTaskQueue();
1120
1121 std::vector<EnqueueOrder> run_order;
1122 queue->task_runner()->PostDelayedTask(
1123 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(1));
1124
1125 queue->task_runner()->PostDelayedTask(
1126 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(5));
1127
1128 queue->task_runner()->PostDelayedTask(
1129 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(10));
1130
1131 EXPECT_EQ(FromStartAligned(Milliseconds(1)), NextPendingTaskTime());
1132
1133 FastForwardBy(Milliseconds(1));
1134 EXPECT_THAT(run_order, ElementsAre(1u));
1135 EXPECT_EQ(FromStartAligned(Milliseconds(5)), NextPendingTaskTime());
1136
1137 FastForwardBy(Milliseconds(4));
1138 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1139 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
1140
1141 FastForwardBy(Milliseconds(5));
1142 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
1143 }
1144
TEST_P(SequenceManagerTest,DelayedTaskAtPosting_MultipleTasks_AscendingOrder)1145 TEST_P(SequenceManagerTest, DelayedTaskAtPosting_MultipleTasks_AscendingOrder) {
1146 auto queue = CreateTaskQueue();
1147
1148 std::vector<EnqueueOrder> run_order;
1149 auto handle1 = queue->task_runner()->PostCancelableDelayedTaskAt(
1150 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1151 BindOnce(&TestTask, 1, &run_order),
1152 sequence_manager()->NowTicks() + Milliseconds(1),
1153 subtle::DelayPolicy::kFlexibleNoSooner);
1154
1155 queue->task_runner()->PostDelayedTask(
1156 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(5));
1157
1158 auto handle2 = queue->task_runner()->PostCancelableDelayedTaskAt(
1159 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1160 BindOnce(&TestTask, 3, &run_order),
1161 sequence_manager()->NowTicks() + Milliseconds(10),
1162 subtle::DelayPolicy::kFlexibleNoSooner);
1163
1164 EXPECT_EQ(FromStartAligned(Milliseconds(1)), NextPendingTaskTime());
1165
1166 FastForwardBy(Milliseconds(1));
1167 EXPECT_THAT(run_order, ElementsAre(1u));
1168 EXPECT_EQ(FromStartAligned(Milliseconds(5)), NextPendingTaskTime());
1169
1170 FastForwardBy(Milliseconds(4));
1171 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1172 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
1173
1174 FastForwardBy(Milliseconds(5));
1175 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
1176 }
1177
TEST(SequenceManagerTestWithMockTaskRunner,PostDelayedTask_SharesUnderlyingDelayedTasks)1178 TEST(SequenceManagerTestWithMockTaskRunner,
1179 PostDelayedTask_SharesUnderlyingDelayedTasks) {
1180 FixtureWithMockTaskRunner fixture;
1181 auto queue = fixture.sequence_manager()->CreateTaskQueue(
1182 TaskQueue::Spec(QueueName::TEST_TQ));
1183
1184 std::vector<EnqueueOrder> run_order;
1185 TimeDelta delay(Milliseconds(10));
1186 queue->task_runner()->PostDelayedTask(
1187 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
1188 queue->task_runner()->PostDelayedTask(
1189 FROM_HERE, BindOnce(&TestTask, 2, &run_order), delay);
1190 queue->task_runner()->PostDelayedTask(
1191 FROM_HERE, BindOnce(&TestTask, 3, &run_order), delay);
1192
1193 EXPECT_EQ(1u, fixture.test_task_runner()->GetPendingTaskCount());
1194 }
1195
TEST(SequenceManagerTestWithMockTaskRunner,CrossThreadTaskPostingToDisabledQueueDoesntScheduleWork)1196 TEST(SequenceManagerTestWithMockTaskRunner,
1197 CrossThreadTaskPostingToDisabledQueueDoesntScheduleWork) {
1198 FixtureWithMockTaskRunner fixture;
1199 auto queue = fixture.sequence_manager()->CreateTaskQueue(
1200 TaskQueue::Spec(QueueName::TEST_TQ));
1201 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1202 queue->CreateQueueEnabledVoter();
1203 voter->SetVoteToEnable(false);
1204
1205 WaitableEvent done_event;
1206 Thread thread("TestThread");
1207 thread.Start();
1208 thread.task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
1209 // Should not schedule a DoWork.
1210 queue->task_runner()->PostTask(
1211 FROM_HERE, BindOnce(&NopTask));
1212 done_event.Signal();
1213 }));
1214 done_event.Wait();
1215 thread.Stop();
1216
1217 EXPECT_EQ(0u, fixture.test_task_runner()->GetPendingTaskCount());
1218
1219 // But if the queue becomes re-enabled it does schedule work.
1220 voter->SetVoteToEnable(true);
1221 EXPECT_EQ(1u, fixture.test_task_runner()->GetPendingTaskCount());
1222 }
1223
TEST(SequenceManagerTestWithMockTaskRunner,CrossThreadTaskPostingToBlockedQueueDoesntScheduleWork)1224 TEST(SequenceManagerTestWithMockTaskRunner,
1225 CrossThreadTaskPostingToBlockedQueueDoesntScheduleWork) {
1226 FixtureWithMockTaskRunner fixture;
1227 auto queue = fixture.sequence_manager()->CreateTaskQueue(
1228 TaskQueue::Spec(QueueName::TEST_TQ));
1229 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1230
1231 WaitableEvent done_event;
1232 Thread thread("TestThread");
1233 thread.Start();
1234 thread.task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
1235 // Should not schedule a DoWork.
1236 queue->task_runner()->PostTask(
1237 FROM_HERE, BindOnce(&NopTask));
1238 done_event.Signal();
1239 }));
1240 done_event.Wait();
1241 thread.Stop();
1242
1243 EXPECT_EQ(0u, fixture.test_task_runner()->GetPendingTaskCount());
1244
1245 // But if the queue becomes unblocked it does schedule work.
1246 queue->RemoveFence();
1247 EXPECT_EQ(1u, fixture.test_task_runner()->GetPendingTaskCount());
1248 }
1249
1250 namespace {
1251
1252 class TestObject {
1253 public:
~TestObject()1254 ~TestObject() { destructor_count__++; }
1255
Run()1256 void Run() { FAIL() << "TestObject::Run should not be called"; }
1257
1258 static int destructor_count__;
1259 };
1260
1261 int TestObject::destructor_count__ = 0;
1262
1263 } // namespace
1264
TEST_P(SequenceManagerTest,PendingDelayedTasksRemovedOnShutdown)1265 TEST_P(SequenceManagerTest, PendingDelayedTasksRemovedOnShutdown) {
1266 auto queue = CreateTaskQueue();
1267
1268 TestObject::destructor_count__ = 0;
1269
1270 TimeDelta delay(Milliseconds(10));
1271 queue->task_runner()->PostDelayedTask(
1272 FROM_HERE, BindOnce(&TestObject::Run, Owned(new TestObject())), delay);
1273 queue->task_runner()->PostTask(
1274 FROM_HERE, BindOnce(&TestObject::Run, Owned(new TestObject())));
1275
1276 DestroySequenceManager();
1277
1278 EXPECT_EQ(2, TestObject::destructor_count__);
1279 }
1280
TEST_P(SequenceManagerTest,InsertAndRemoveFence)1281 TEST_P(SequenceManagerTest, InsertAndRemoveFence) {
1282 auto queue = CreateTaskQueue();
1283 StrictMock<MockTask> task;
1284
1285 // Posting a task when pumping is disabled doesn't result in work getting
1286 // posted.
1287 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1288 queue->task_runner()->PostTask(FROM_HERE, task.Get());
1289 EXPECT_CALL(task, Run).Times(0);
1290 RunLoop().RunUntilIdle();
1291
1292 // However polling still works.
1293 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
1294
1295 // After removing the fence the task runs normally.
1296 queue->RemoveFence();
1297 EXPECT_CALL(task, Run);
1298 RunLoop().RunUntilIdle();
1299 }
1300
TEST_P(SequenceManagerTest,RemovingFenceForDisabledQueueDoesNotPostDoWork)1301 TEST_P(SequenceManagerTest, RemovingFenceForDisabledQueueDoesNotPostDoWork) {
1302 auto queue = CreateTaskQueue();
1303 StrictMock<MockTask> task;
1304
1305 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1306 queue->CreateQueueEnabledVoter();
1307 voter->SetVoteToEnable(false);
1308 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1309 queue->task_runner()->PostTask(FROM_HERE, task.Get());
1310
1311 queue->RemoveFence();
1312 EXPECT_CALL(task, Run).Times(0);
1313 RunLoop().RunUntilIdle();
1314 }
1315
TEST_P(SequenceManagerTest,EnablingFencedQueueDoesNotPostDoWork)1316 TEST_P(SequenceManagerTest, EnablingFencedQueueDoesNotPostDoWork) {
1317 auto queue = CreateTaskQueue();
1318 StrictMock<MockTask> task;
1319
1320 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1321 queue->CreateQueueEnabledVoter();
1322 voter->SetVoteToEnable(false);
1323 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1324 queue->task_runner()->PostTask(FROM_HERE, task.Get());
1325 voter->SetVoteToEnable(true);
1326
1327 EXPECT_CALL(task, Run).Times(0);
1328 RunLoop().RunUntilIdle();
1329 }
1330
TEST_P(SequenceManagerTest,DenyRunning_BeforePosting)1331 TEST_P(SequenceManagerTest, DenyRunning_BeforePosting) {
1332 auto queue = CreateTaskQueue();
1333 StrictMock<MockTask> task;
1334
1335 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1336 queue->CreateQueueEnabledVoter();
1337 voter->SetVoteToEnable(false);
1338 queue->task_runner()->PostTask(FROM_HERE, task.Get());
1339
1340 EXPECT_CALL(task, Run).Times(0);
1341 RunLoop().RunUntilIdle();
1342
1343 voter->SetVoteToEnable(true);
1344 EXPECT_CALL(task, Run);
1345 RunLoop().RunUntilIdle();
1346 }
1347
TEST_P(SequenceManagerTest,DenyRunning_AfterPosting)1348 TEST_P(SequenceManagerTest, DenyRunning_AfterPosting) {
1349 auto queue = CreateTaskQueue();
1350 StrictMock<MockTask> task;
1351
1352 queue->task_runner()->PostTask(FROM_HERE, task.Get());
1353 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1354 queue->CreateQueueEnabledVoter();
1355 voter->SetVoteToEnable(false);
1356
1357 EXPECT_CALL(task, Run).Times(0);
1358 RunLoop().RunUntilIdle();
1359
1360 voter->SetVoteToEnable(true);
1361 EXPECT_CALL(task, Run);
1362 RunLoop().RunUntilIdle();
1363 }
1364
TEST_P(SequenceManagerTest,DenyRunning_AfterRemovingFence)1365 TEST_P(SequenceManagerTest, DenyRunning_AfterRemovingFence) {
1366 auto queue = CreateTaskQueue();
1367
1368 std::vector<EnqueueOrder> run_order;
1369 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1370 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
1371 queue->CreateQueueEnabledVoter();
1372 voter->SetVoteToEnable(false);
1373 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1374
1375 RunLoop().RunUntilIdle();
1376 EXPECT_TRUE(run_order.empty());
1377
1378 queue->RemoveFence();
1379 voter->SetVoteToEnable(true);
1380 RunLoop().RunUntilIdle();
1381 EXPECT_THAT(run_order, ElementsAre(1u));
1382 }
1383
TEST_P(SequenceManagerTest,RemovingFenceWithDelayedTask)1384 TEST_P(SequenceManagerTest, RemovingFenceWithDelayedTask) {
1385 TimeDelta kDelay = Milliseconds(10);
1386 auto queue = CreateTaskQueue();
1387 StrictMock<MockTask> task;
1388
1389 // Posting a delayed task when fenced will apply the delay, but won't cause
1390 // work to executed afterwards.
1391 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1392
1393 queue->task_runner()->PostDelayedTask(FROM_HERE, task.Get(), kDelay);
1394
1395 // The task does not run even though it's delay is up.
1396 EXPECT_CALL(task, Run).Times(0);
1397 FastForwardBy(kDelay);
1398
1399 // Removing the fence causes the task to run.
1400 queue->RemoveFence();
1401 EXPECT_CALL(task, Run);
1402 RunLoop().RunUntilIdle();
1403 }
1404
TEST_P(SequenceManagerTest,RemovingFenceWithMultipleDelayedTasks)1405 TEST_P(SequenceManagerTest, RemovingFenceWithMultipleDelayedTasks) {
1406 auto queue = CreateTaskQueue();
1407 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1408
1409 std::vector<EnqueueOrder> run_order;
1410 // Posting a delayed task when fenced will apply the delay, but won't cause
1411 // work to executed afterwards.
1412 TimeDelta delay1(Milliseconds(1));
1413 TimeDelta delay2(Milliseconds(10));
1414 TimeDelta delay3(Milliseconds(20));
1415 queue->task_runner()->PostDelayedTask(
1416 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay1);
1417 queue->task_runner()->PostDelayedTask(
1418 FROM_HERE, BindOnce(&TestTask, 2, &run_order), delay2);
1419 queue->task_runner()->PostDelayedTask(
1420 FROM_HERE, BindOnce(&TestTask, 3, &run_order), delay3);
1421
1422 AdvanceMockTickClock(Milliseconds(15));
1423 RunLoop().RunUntilIdle();
1424 EXPECT_TRUE(run_order.empty());
1425
1426 // Removing the fence causes the ready tasks to run.
1427 queue->RemoveFence();
1428 RunLoop().RunUntilIdle();
1429 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1430 }
1431
TEST_P(SequenceManagerTest,InsertFencePreventsDelayedTasksFromRunning)1432 TEST_P(SequenceManagerTest, InsertFencePreventsDelayedTasksFromRunning) {
1433 auto queue = CreateTaskQueue();
1434 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1435
1436 std::vector<EnqueueOrder> run_order;
1437 TimeDelta delay(Milliseconds(10));
1438 queue->task_runner()->PostDelayedTask(
1439 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
1440
1441 FastForwardBy(Milliseconds(10));
1442 EXPECT_TRUE(run_order.empty());
1443 }
1444
TEST_P(SequenceManagerTest,MultipleFences)1445 TEST_P(SequenceManagerTest, MultipleFences) {
1446 auto queue = CreateTaskQueue();
1447
1448 std::vector<EnqueueOrder> run_order;
1449 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1450 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1451 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1452
1453 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
1454 RunLoop().RunUntilIdle();
1455 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1456
1457 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1458 // Subsequent tasks should be blocked.
1459 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order));
1460 RunLoop().RunUntilIdle();
1461 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
1462 }
1463
TEST_P(SequenceManagerTest,InsertFenceThenImmediatlyRemoveDoesNotBlock)1464 TEST_P(SequenceManagerTest, InsertFenceThenImmediatlyRemoveDoesNotBlock) {
1465 auto queue = CreateTaskQueue();
1466 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1467 queue->RemoveFence();
1468
1469 std::vector<EnqueueOrder> run_order;
1470 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1471 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1472
1473 RunLoop().RunUntilIdle();
1474 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1475 }
1476
TEST_P(SequenceManagerTest,InsertFencePostThenRemoveDoesNotBlock)1477 TEST_P(SequenceManagerTest, InsertFencePostThenRemoveDoesNotBlock) {
1478 auto queue = CreateTaskQueue();
1479 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1480
1481 std::vector<EnqueueOrder> run_order;
1482 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1483 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1484 queue->RemoveFence();
1485
1486 RunLoop().RunUntilIdle();
1487 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
1488 }
1489
TEST_P(SequenceManagerTest,MultipleFencesWithInitiallyEmptyQueue)1490 TEST_P(SequenceManagerTest, MultipleFencesWithInitiallyEmptyQueue) {
1491 auto queue = CreateTaskQueue();
1492 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1493
1494 std::vector<EnqueueOrder> run_order;
1495 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1496 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1497 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1498
1499 RunLoop().RunUntilIdle();
1500 EXPECT_THAT(run_order, ElementsAre(1u));
1501 }
1502
TEST_P(SequenceManagerTest,BlockedByFence)1503 TEST_P(SequenceManagerTest, BlockedByFence) {
1504 auto queue = CreateTaskQueue();
1505 EXPECT_FALSE(queue->BlockedByFence());
1506
1507 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1508 EXPECT_TRUE(queue->BlockedByFence());
1509
1510 queue->RemoveFence();
1511 EXPECT_FALSE(queue->BlockedByFence());
1512
1513 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
1514 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1515 EXPECT_FALSE(queue->BlockedByFence());
1516
1517 RunLoop().RunUntilIdle();
1518 EXPECT_TRUE(queue->BlockedByFence());
1519
1520 queue->RemoveFence();
1521 EXPECT_FALSE(queue->BlockedByFence());
1522 }
1523
TEST_P(SequenceManagerTest,BlockedByFence_BothTypesOfFence)1524 TEST_P(SequenceManagerTest, BlockedByFence_BothTypesOfFence) {
1525 auto queue = CreateTaskQueue();
1526
1527 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
1528
1529 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
1530 EXPECT_FALSE(queue->BlockedByFence());
1531
1532 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
1533 EXPECT_TRUE(queue->BlockedByFence());
1534 }
1535
1536 namespace {
1537
RecordTimeTask(std::vector<TimeTicks> * run_times,const TickClock * clock)1538 void RecordTimeTask(std::vector<TimeTicks>* run_times, const TickClock* clock) {
1539 run_times->push_back(clock->NowTicks());
1540 }
1541
RecordTimeAndQueueTask(std::vector<std::pair<TaskQueue *,TimeTicks>> * run_times,TaskQueue * task_queue,const TickClock * clock)1542 void RecordTimeAndQueueTask(
1543 std::vector<std::pair<TaskQueue*, TimeTicks>>* run_times,
1544 TaskQueue* task_queue,
1545 const TickClock* clock) {
1546 run_times->emplace_back(task_queue, clock->NowTicks());
1547 }
1548
1549 } // namespace
1550
TEST_P(SequenceManagerTest,DelayedFence_DelayedTasks)1551 TEST_P(SequenceManagerTest, DelayedFence_DelayedTasks) {
1552 TaskQueue::Handle queue = CreateTaskQueue(
1553 TaskQueue::Spec(QueueName::TEST_TQ).SetDelayedFencesAllowed(true));
1554
1555 std::vector<TimeTicks> run_times;
1556 queue->task_runner()->PostDelayedTask(
1557 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
1558 Milliseconds(100));
1559 queue->task_runner()->PostDelayedTask(
1560 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
1561 Milliseconds(200));
1562 queue->task_runner()->PostDelayedTask(
1563 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
1564 Milliseconds(300));
1565
1566 queue->InsertFenceAt(mock_tick_clock()->NowTicks() + Milliseconds(250));
1567 EXPECT_FALSE(queue->HasActiveFence());
1568
1569 FastForwardUntilNoTasksRemain();
1570
1571 EXPECT_TRUE(queue->HasActiveFence());
1572 EXPECT_THAT(run_times, ElementsAre(FromStartAligned(Milliseconds(100)),
1573 FromStartAligned(Milliseconds(200))));
1574 run_times.clear();
1575
1576 queue->RemoveFence();
1577
1578 FastForwardUntilNoTasksRemain();
1579
1580 EXPECT_FALSE(queue->HasActiveFence());
1581 EXPECT_THAT(run_times, ElementsAre(FromStartAligned(Milliseconds(300))));
1582 }
1583
TEST_P(SequenceManagerTest,DelayedFence_ImmediateTasks)1584 TEST_P(SequenceManagerTest, DelayedFence_ImmediateTasks) {
1585 const auto kStartTime = mock_tick_clock()->NowTicks();
1586 TaskQueue::Handle queue = CreateTaskQueue(
1587 TaskQueue::Spec(QueueName::TEST_TQ).SetDelayedFencesAllowed(true));
1588
1589 std::vector<TimeTicks> run_times;
1590 queue->InsertFenceAt(mock_tick_clock()->NowTicks() + Milliseconds(250));
1591
1592 for (int i = 0; i < 5; ++i) {
1593 queue->task_runner()->PostTask(
1594 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()));
1595 FastForwardBy(Milliseconds(100));
1596 if (i < 2) {
1597 EXPECT_FALSE(queue->HasActiveFence());
1598 } else {
1599 EXPECT_TRUE(queue->HasActiveFence());
1600 }
1601 }
1602
1603 EXPECT_THAT(run_times, ElementsAre(kStartTime, kStartTime + Milliseconds(100),
1604 kStartTime + Milliseconds(200)));
1605 run_times.clear();
1606
1607 queue->RemoveFence();
1608 FastForwardUntilNoTasksRemain();
1609
1610 EXPECT_THAT(run_times, ElementsAre(kStartTime + Milliseconds(500),
1611 kStartTime + Milliseconds(500)));
1612 }
1613
TEST_P(SequenceManagerTest,DelayedFence_RemovedFenceDoesNotActivate)1614 TEST_P(SequenceManagerTest, DelayedFence_RemovedFenceDoesNotActivate) {
1615 const auto kStartTime = mock_tick_clock()->NowTicks();
1616 TaskQueue::Handle queue = CreateTaskQueue(
1617 TaskQueue::Spec(QueueName::TEST_TQ).SetDelayedFencesAllowed(true));
1618
1619 std::vector<TimeTicks> run_times;
1620 queue->InsertFenceAt(mock_tick_clock()->NowTicks() + Milliseconds(250));
1621
1622 for (int i = 0; i < 3; ++i) {
1623 queue->task_runner()->PostTask(
1624 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()));
1625 EXPECT_FALSE(queue->HasActiveFence());
1626 FastForwardBy(Milliseconds(100));
1627 }
1628
1629 EXPECT_TRUE(queue->HasActiveFence());
1630 queue->RemoveFence();
1631
1632 for (int i = 0; i < 2; ++i) {
1633 queue->task_runner()->PostTask(
1634 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()));
1635 FastForwardBy(Milliseconds(100));
1636 EXPECT_FALSE(queue->HasActiveFence());
1637 }
1638
1639 EXPECT_THAT(run_times, ElementsAre(kStartTime, kStartTime + Milliseconds(100),
1640 kStartTime + Milliseconds(200),
1641 kStartTime + Milliseconds(300),
1642 kStartTime + Milliseconds(400)));
1643 }
1644
TEST_P(SequenceManagerTest,DelayedFence_TakeIncomingImmediateQueue)1645 TEST_P(SequenceManagerTest, DelayedFence_TakeIncomingImmediateQueue) {
1646 // This test checks that everything works correctly when a work queue
1647 // is swapped with an immediate incoming queue and a delayed fence
1648 // is activated, forcing a different queue to become active.
1649 const auto kStartTime = mock_tick_clock()->NowTicks();
1650 TaskQueue::Handle queue1 = CreateTaskQueue(
1651 TaskQueue::Spec(QueueName::TEST_TQ).SetDelayedFencesAllowed(true));
1652 TaskQueue::Handle queue2 = CreateTaskQueue(
1653 TaskQueue::Spec(QueueName::TEST2_TQ).SetDelayedFencesAllowed(true));
1654
1655 std::vector<std::pair<TaskQueue*, TimeTicks>> run_times;
1656
1657 // Fence ensures that the task posted after advancing time is blocked.
1658 queue1->InsertFenceAt(mock_tick_clock()->NowTicks() + Milliseconds(250));
1659
1660 // This task should not be blocked and should run immediately after
1661 // advancing time at 301ms.
1662 queue1->task_runner()->PostTask(
1663 FROM_HERE, BindOnce(&RecordTimeAndQueueTask, &run_times,
1664 Unretained(queue1.get()), mock_tick_clock()));
1665 // Force reload of immediate work queue. In real life the same effect can be
1666 // achieved with cross-thread posting.
1667 sequence_manager()->ReloadEmptyWorkQueues();
1668
1669 AdvanceMockTickClock(Milliseconds(300));
1670
1671 // This task should be blocked.
1672 queue1->task_runner()->PostTask(
1673 FROM_HERE, BindOnce(&RecordTimeAndQueueTask, &run_times,
1674 Unretained(queue1.get()), mock_tick_clock()));
1675 // This task on a different runner should run as expected.
1676 queue2->task_runner()->PostTask(
1677 FROM_HERE, BindOnce(&RecordTimeAndQueueTask, &run_times,
1678 Unretained(queue2.get()), mock_tick_clock()));
1679
1680 FastForwardUntilNoTasksRemain();
1681
1682 EXPECT_THAT(
1683 run_times,
1684 ElementsAre(
1685 std::make_pair(queue1.get(), kStartTime + Milliseconds(300)),
1686 std::make_pair(queue2.get(), kStartTime + Milliseconds(300))));
1687 }
1688
1689 namespace {
1690
ReentrantTestTask(TaskQueue * runner,int countdown,std::vector<EnqueueOrder> * out_result)1691 void ReentrantTestTask(TaskQueue* runner,
1692 int countdown,
1693 std::vector<EnqueueOrder>* out_result) {
1694 out_result->push_back(EnqueueOrder::FromIntForTesting(countdown));
1695 if (--countdown) {
1696 runner->task_runner()->PostTask(
1697 FROM_HERE, BindOnce(&ReentrantTestTask, Unretained(runner), countdown,
1698 out_result));
1699 }
1700 }
1701
1702 } // namespace
1703
TEST_P(SequenceManagerTest,ReentrantPosting)1704 TEST_P(SequenceManagerTest, ReentrantPosting) {
1705 auto queue = CreateTaskQueue();
1706
1707 std::vector<EnqueueOrder> run_order;
1708 queue->task_runner()->PostTask(
1709 FROM_HERE,
1710 BindOnce(&ReentrantTestTask, Unretained(queue.get()), 3, &run_order));
1711
1712 RunLoop().RunUntilIdle();
1713 EXPECT_THAT(run_order, ElementsAre(3u, 2u, 1u));
1714 }
1715
1716 namespace {
1717
1718 class RefCountedCallbackFactory {
1719 public:
WrapCallback(OnceCallback<void ()> cb)1720 OnceCallback<void()> WrapCallback(OnceCallback<void()> cb) {
1721 return BindOnce(
1722 [](OnceCallback<void()> cb, WeakPtr<bool>) { std::move(cb).Run(); },
1723 std::move(cb), task_references_.GetWeakPtr());
1724 }
1725
HasReferences() const1726 bool HasReferences() const { return task_references_.HasWeakPtrs(); }
1727
1728 private:
1729 bool dummy_;
1730 WeakPtrFactory<bool> task_references_{&dummy_};
1731 };
1732
1733 } // namespace
1734
TEST_P(SequenceManagerTest,NoTasksAfterShutdown)1735 TEST_P(SequenceManagerTest, NoTasksAfterShutdown) {
1736 auto queue = CreateTaskQueue();
1737 StrictMock<MockTask> task;
1738 RefCountedCallbackFactory counter;
1739
1740 EXPECT_CALL(task, Run).Times(0);
1741 queue->task_runner()->PostTask(FROM_HERE, counter.WrapCallback(task.Get()));
1742 DestroySequenceManager();
1743 queue->task_runner()->PostTask(FROM_HERE, counter.WrapCallback(task.Get()));
1744
1745 if (GetUnderlyingRunnerType() != RunnerType::kMessagePump) {
1746 RunLoop().RunUntilIdle();
1747 }
1748
1749 EXPECT_FALSE(counter.HasReferences());
1750 }
1751
PostTaskToRunner(TaskQueue * runner,std::vector<EnqueueOrder> * run_order)1752 void PostTaskToRunner(TaskQueue* runner, std::vector<EnqueueOrder>* run_order) {
1753 runner->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, run_order));
1754 }
1755
TEST_P(SequenceManagerTest,PostFromThread)1756 TEST_P(SequenceManagerTest, PostFromThread) {
1757 auto queue = CreateTaskQueue();
1758
1759 std::vector<EnqueueOrder> run_order;
1760 Thread thread("TestThread");
1761 thread.Start();
1762 thread.task_runner()->PostTask(
1763 FROM_HERE,
1764 BindOnce(&PostTaskToRunner, Unretained(queue.get()), &run_order));
1765 thread.Stop();
1766
1767 RunLoop().RunUntilIdle();
1768 EXPECT_THAT(run_order, ElementsAre(1u));
1769 }
1770
RePostingTestTask(TaskQueue * runner,int * run_count)1771 void RePostingTestTask(TaskQueue* runner, int* run_count) {
1772 (*run_count)++;
1773 runner->task_runner()->PostTask(
1774 FROM_HERE, BindOnce(&RePostingTestTask, Unretained(runner), run_count));
1775 }
1776
TEST_P(SequenceManagerTest,DoWorkCantPostItselfMultipleTimes)1777 TEST_P(SequenceManagerTest, DoWorkCantPostItselfMultipleTimes) {
1778 auto queue = CreateTaskQueue();
1779
1780 int run_count = 0;
1781 queue->task_runner()->PostTask(
1782 FROM_HERE,
1783 BindOnce(&RePostingTestTask, Unretained(queue.get()), &run_count));
1784
1785 RunDoWorkOnce();
1786 EXPECT_EQ(1u, sequence_manager()->GetPendingTaskCountForTesting());
1787 EXPECT_EQ(1, run_count);
1788 }
1789
TEST_P(SequenceManagerTest,PostFromNestedRunloop)1790 TEST_P(SequenceManagerTest, PostFromNestedRunloop) {
1791 auto queue = CreateTaskQueue();
1792
1793 std::vector<EnqueueOrder> run_order;
1794 std::vector<std::pair<OnceClosure, bool>> tasks_to_post_from_nested_loop;
1795 tasks_to_post_from_nested_loop.push_back(
1796 std::make_pair(BindOnce(&TestTask, 1, &run_order), true));
1797
1798 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 0, &run_order));
1799 queue->task_runner()->PostTask(
1800 FROM_HERE, BindOnce(&PostFromNestedRunloop, queue->task_runner(),
1801 Unretained(&tasks_to_post_from_nested_loop)));
1802 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1803
1804 RunLoop().RunUntilIdle();
1805
1806 EXPECT_THAT(run_order, ElementsAre(0u, 2u, 1u));
1807 }
1808
TEST_P(SequenceManagerTest,WorkBatching)1809 TEST_P(SequenceManagerTest, WorkBatching) {
1810 auto queue = CreateTaskQueue();
1811 sequence_manager()->SetWorkBatchSize(2);
1812
1813 std::vector<EnqueueOrder> run_order;
1814 for (int i = 0; i < 4; ++i) {
1815 queue->task_runner()->PostTask(FROM_HERE,
1816 BindOnce(&TestTask, i, &run_order));
1817 }
1818
1819 // Running one task in the host message loop should cause two posted tasks
1820 // to get executed.
1821 RunDoWorkOnce();
1822 EXPECT_THAT(run_order, ElementsAre(0u, 1u));
1823
1824 // The second task runs the remaining two posted tasks.
1825 RunDoWorkOnce();
1826 EXPECT_THAT(run_order, ElementsAre(0u, 1u, 2u, 3u));
1827 }
1828
1829 namespace {
1830
1831 class MockTaskObserver : public TaskObserver {
1832 public:
1833 MOCK_METHOD1(DidProcessTask, void(const PendingTask& task));
1834 MOCK_METHOD2(WillProcessTask,
1835 void(const PendingTask& task, bool was_blocked_or_low_priority));
1836 };
1837
1838 } // namespace
1839
TEST_P(SequenceManagerTest,TaskObserverAdding)1840 TEST_P(SequenceManagerTest, TaskObserverAdding) {
1841 auto queue = CreateTaskQueue();
1842 MockTaskObserver observer;
1843
1844 sequence_manager()->SetWorkBatchSize(2);
1845 sequence_manager()->AddTaskObserver(&observer);
1846
1847 std::vector<EnqueueOrder> run_order;
1848 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1849 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
1850
1851 EXPECT_CALL(observer,
1852 WillProcessTask(_, /*was_blocked_or_low_priority=*/false))
1853 .Times(2);
1854 EXPECT_CALL(observer, DidProcessTask(_)).Times(2);
1855 RunLoop().RunUntilIdle();
1856 }
1857
TEST_P(SequenceManagerTest,TaskObserverRemoving)1858 TEST_P(SequenceManagerTest, TaskObserverRemoving) {
1859 auto queue = CreateTaskQueue();
1860 MockTaskObserver observer;
1861 sequence_manager()->SetWorkBatchSize(2);
1862 sequence_manager()->AddTaskObserver(&observer);
1863 sequence_manager()->RemoveTaskObserver(&observer);
1864
1865 std::vector<EnqueueOrder> run_order;
1866 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1867
1868 EXPECT_CALL(observer, WillProcessTask(_, _)).Times(0);
1869 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1870 RunLoop().RunUntilIdle();
1871 }
1872
RemoveObserverTask(SequenceManagerImpl * manager,TaskObserver * observer)1873 void RemoveObserverTask(SequenceManagerImpl* manager, TaskObserver* observer) {
1874 manager->RemoveTaskObserver(observer);
1875 }
1876
TEST_P(SequenceManagerTest,TaskObserverRemovingInsideTask)1877 TEST_P(SequenceManagerTest, TaskObserverRemovingInsideTask) {
1878 auto queue = CreateTaskQueue();
1879 MockTaskObserver observer;
1880 sequence_manager()->SetWorkBatchSize(3);
1881 sequence_manager()->AddTaskObserver(&observer);
1882
1883 queue->task_runner()->PostTask(
1884 FROM_HERE, BindOnce(&RemoveObserverTask, sequence_manager(), &observer));
1885
1886 EXPECT_CALL(observer,
1887 WillProcessTask(_, /*was_blocked_or_low_priority=*/false))
1888 .Times(1);
1889 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1890 RunLoop().RunUntilIdle();
1891 }
1892
TEST_P(SequenceManagerTest,QueueTaskObserverAdding)1893 TEST_P(SequenceManagerTest, QueueTaskObserverAdding) {
1894 auto queues = CreateTaskQueues(2);
1895 MockTaskObserver observer;
1896
1897 sequence_manager()->SetWorkBatchSize(2);
1898 queues[0]->AddTaskObserver(&observer);
1899
1900 std::vector<EnqueueOrder> run_order;
1901 queues[0]->task_runner()->PostTask(FROM_HERE,
1902 BindOnce(&TestTask, 1, &run_order));
1903 queues[1]->task_runner()->PostTask(FROM_HERE,
1904 BindOnce(&TestTask, 2, &run_order));
1905
1906 EXPECT_CALL(observer,
1907 WillProcessTask(_, /*was_blocked_or_low_priority=*/false))
1908 .Times(1);
1909 EXPECT_CALL(observer, DidProcessTask(_)).Times(1);
1910 RunLoop().RunUntilIdle();
1911 }
1912
TEST_P(SequenceManagerTest,QueueTaskObserverRemoving)1913 TEST_P(SequenceManagerTest, QueueTaskObserverRemoving) {
1914 auto queue = CreateTaskQueue();
1915 MockTaskObserver observer;
1916 sequence_manager()->SetWorkBatchSize(2);
1917 queue->AddTaskObserver(&observer);
1918 queue->RemoveTaskObserver(&observer);
1919
1920 std::vector<EnqueueOrder> run_order;
1921 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
1922
1923 EXPECT_CALL(observer,
1924 WillProcessTask(_, /*was_blocked_or_low_priority=*/false))
1925 .Times(0);
1926 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1927
1928 RunLoop().RunUntilIdle();
1929 }
1930
RemoveQueueObserverTask(TaskQueue * queue,TaskObserver * observer)1931 void RemoveQueueObserverTask(TaskQueue* queue, TaskObserver* observer) {
1932 queue->RemoveTaskObserver(observer);
1933 }
1934
TEST_P(SequenceManagerTest,QueueTaskObserverRemovingInsideTask)1935 TEST_P(SequenceManagerTest, QueueTaskObserverRemovingInsideTask) {
1936 auto queue = CreateTaskQueue();
1937 MockTaskObserver observer;
1938 queue->AddTaskObserver(&observer);
1939
1940 queue->task_runner()->PostTask(
1941 FROM_HERE,
1942 BindOnce(&RemoveQueueObserverTask, Unretained(queue.get()), &observer));
1943
1944 EXPECT_CALL(observer,
1945 WillProcessTask(_, /*was_blocked_or_low_priority=*/false))
1946 .Times(1);
1947 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
1948 RunLoop().RunUntilIdle();
1949 }
1950
TEST_P(SequenceManagerTest,CancelHandleInsideTaskObserver)1951 TEST_P(SequenceManagerTest, CancelHandleInsideTaskObserver) {
1952 class CancelingTaskObserver : public TaskObserver {
1953 public:
1954 DelayedTaskHandle handle;
1955 bool will_run_task_called = false;
1956 bool did_process_task_called = false;
1957 explicit CancelingTaskObserver(DelayedTaskHandle handle_in)
1958 : handle(std::move(handle_in)) {
1959 EXPECT_TRUE(handle.IsValid());
1960 }
1961
1962 ~CancelingTaskObserver() override {
1963 EXPECT_FALSE(handle.IsValid());
1964 EXPECT_TRUE(will_run_task_called);
1965 EXPECT_TRUE(did_process_task_called);
1966 }
1967
1968 void DidProcessTask(const PendingTask& task) override {
1969 did_process_task_called = true;
1970 }
1971 void WillProcessTask(const PendingTask& task,
1972 bool was_blocked_or_low_priority) override {
1973 handle.CancelTask();
1974 will_run_task_called = true;
1975 }
1976 };
1977
1978 auto queue = CreateTaskQueue();
1979
1980 auto handle = queue->task_runner()->PostCancelableDelayedTask(
1981 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE,
1982 BindLambdaForTesting([]() { FAIL(); }), base::TimeDelta());
1983
1984 CancelingTaskObserver observer(std::move(handle));
1985 queue->AddTaskObserver(&observer);
1986
1987 RunLoop().RunUntilIdle();
1988 }
1989
TEST_P(SequenceManagerTest,ThreadCheckAfterTermination)1990 TEST_P(SequenceManagerTest, ThreadCheckAfterTermination) {
1991 auto queue = CreateTaskQueue();
1992 EXPECT_TRUE(queue->task_runner()->RunsTasksInCurrentSequence());
1993 DestroySequenceManager();
1994 EXPECT_TRUE(queue->task_runner()->RunsTasksInCurrentSequence());
1995 }
1996
TEST_P(SequenceManagerTest,GetNextDelayedWakeUp)1997 TEST_P(SequenceManagerTest, GetNextDelayedWakeUp) {
1998 auto queues = CreateTaskQueues(2u);
1999 AdvanceMockTickClock(Microseconds(10000));
2000 LazyNow lazy_now_1(mock_tick_clock());
2001
2002 // With no delayed tasks.
2003 EXPECT_FALSE(sequence_manager()->GetNextDelayedWakeUp());
2004
2005 // With a non-delayed task.
2006 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2007 EXPECT_FALSE(sequence_manager()->GetNextDelayedWakeUp());
2008
2009 // With a delayed task.
2010 TimeDelta expected_delay = Milliseconds(50);
2011 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2012 expected_delay);
2013 EXPECT_EQ(lazy_now_1.Now() + expected_delay,
2014 sequence_manager()->GetNextDelayedWakeUp()->time);
2015
2016 // With another delayed task in the same queue with a longer delay.
2017 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2018 Milliseconds(100));
2019 EXPECT_EQ(lazy_now_1.Now() + expected_delay,
2020 sequence_manager()->GetNextDelayedWakeUp()->time);
2021
2022 // With another delayed task in the same queue with a shorter delay.
2023 expected_delay = Milliseconds(20);
2024 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2025 expected_delay);
2026 EXPECT_EQ(lazy_now_1.Now() + expected_delay,
2027 sequence_manager()->GetNextDelayedWakeUp()->time);
2028
2029 // With another delayed task in a different queue with a shorter delay.
2030 expected_delay = Milliseconds(10);
2031 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2032 expected_delay);
2033 EXPECT_EQ(lazy_now_1.Now() + expected_delay,
2034 sequence_manager()->GetNextDelayedWakeUp()->time);
2035 }
2036
TEST_P(SequenceManagerTest,GetNextDelayedWakeUp_MultipleQueues)2037 TEST_P(SequenceManagerTest, GetNextDelayedWakeUp_MultipleQueues) {
2038 auto queues = CreateTaskQueues(3u);
2039
2040 TimeDelta delay1 = Milliseconds(50);
2041 TimeDelta delay2 = Milliseconds(5);
2042 TimeDelta delay3 = Milliseconds(10);
2043 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2044 delay1);
2045 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2046 delay2);
2047 queues[2]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2048 delay3);
2049 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2050
2051 LazyNow lazy_now(mock_tick_clock());
2052 EXPECT_EQ(lazy_now.Now() + delay2,
2053 sequence_manager()->GetNextDelayedWakeUp()->time);
2054 }
2055
TEST(SequenceManagerWithTaskRunnerTest,DeleteSequenceManagerInsideATask)2056 TEST(SequenceManagerWithTaskRunnerTest, DeleteSequenceManagerInsideATask) {
2057 FixtureWithMockTaskRunner fixture;
2058 auto queue = fixture.sequence_manager()->CreateTaskQueue(
2059 TaskQueue::Spec(QueueName::TEST_TQ));
2060
2061 queue->task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
2062 fixture.DestroySequenceManager();
2063 }));
2064
2065 // This should not crash, assuming DoWork detects the SequenceManager has
2066 // been deleted.
2067 RunLoop().RunUntilIdle();
2068 }
2069
TEST_P(SequenceManagerTest,GetAndClearSystemIsQuiescentBit)2070 TEST_P(SequenceManagerTest, GetAndClearSystemIsQuiescentBit) {
2071 auto queues = CreateTaskQueues(3u);
2072
2073 TaskQueue::Handle queue0 = CreateTaskQueue(
2074 TaskQueue::Spec(QueueName::TEST_TQ).SetShouldMonitorQuiescence(true));
2075 TaskQueue::Handle queue1 = CreateTaskQueue(
2076 TaskQueue::Spec(QueueName::TEST2_TQ).SetShouldMonitorQuiescence(true));
2077 TaskQueue::Handle queue2 = CreateTaskQueue();
2078
2079 EXPECT_TRUE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2080
2081 queue0->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2082 RunLoop().RunUntilIdle();
2083 EXPECT_FALSE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2084 EXPECT_TRUE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2085
2086 queue1->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2087 RunLoop().RunUntilIdle();
2088 EXPECT_FALSE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2089 EXPECT_TRUE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2090
2091 queue2->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2092 RunLoop().RunUntilIdle();
2093 EXPECT_TRUE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2094
2095 queue0->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2096 queue1->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2097 RunLoop().RunUntilIdle();
2098 EXPECT_FALSE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2099 EXPECT_TRUE(sequence_manager()->GetAndClearSystemIsQuiescentBit());
2100 }
2101
TEST_P(SequenceManagerTest,HasTaskToRunImmediatelyOrReadyDelayedTask)2102 TEST_P(SequenceManagerTest, HasTaskToRunImmediatelyOrReadyDelayedTask) {
2103 auto queue = CreateTaskQueue();
2104
2105 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2106 queue->task_runner()->PostTask(FROM_HERE, BindOnce(NullTask));
2107 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2108
2109 RunLoop().RunUntilIdle();
2110 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2111 }
2112
TEST_P(SequenceManagerTest,HasTaskToRunImmediatelyOrReadyDelayedTask_DelayedTasks)2113 TEST_P(SequenceManagerTest,
2114 HasTaskToRunImmediatelyOrReadyDelayedTask_DelayedTasks) {
2115 auto queue = CreateTaskQueue();
2116
2117 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2118 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(NullTask),
2119 Milliseconds(12));
2120 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2121
2122 // Move time forwards until just before the delayed task should run.
2123 AdvanceMockTickClock(Milliseconds(10));
2124 LazyNow lazy_now_1(mock_tick_clock());
2125 sequence_manager()->MoveReadyDelayedTasksToWorkQueues(&lazy_now_1);
2126 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2127
2128 // Force the delayed task onto the work queue.
2129 AdvanceMockTickClock(Milliseconds(2));
2130 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2131
2132 LazyNow lazy_now_2(mock_tick_clock());
2133 sequence_manager()->MoveReadyDelayedTasksToWorkQueues(&lazy_now_2);
2134 EXPECT_TRUE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2135
2136 sequence_manager()->ScheduleWork();
2137 RunLoop().RunUntilIdle();
2138 EXPECT_FALSE(queue->HasTaskToRunImmediatelyOrReadyDelayedTask());
2139 }
2140
TEST_P(SequenceManagerTest,ImmediateTasksAreNotStarvedByDelayedTasks)2141 TEST_P(SequenceManagerTest, ImmediateTasksAreNotStarvedByDelayedTasks) {
2142 auto queue = CreateTaskQueue();
2143 std::vector<EnqueueOrder> run_order;
2144 constexpr auto kDelay = Milliseconds(10);
2145
2146 // By posting the immediate tasks from a delayed one we make sure that the
2147 // delayed tasks we post afterwards have a lower enqueue_order than the
2148 // immediate ones. Thus all the delayed ones would run before the immediate
2149 // ones if it weren't for the anti-starvation feature we are testing here.
2150 queue->task_runner()->PostDelayedTask(
2151 FROM_HERE, BindLambdaForTesting([&]() {
2152 for (int i = 0; i < 9; i++) {
2153 queue->task_runner()->PostTask(FROM_HERE,
2154 BindOnce(&TestTask, i, &run_order));
2155 }
2156 }),
2157 kDelay);
2158
2159 for (int i = 10; i < 19; i++) {
2160 queue->task_runner()->PostDelayedTask(
2161 FROM_HERE, BindOnce(&TestTask, i, &run_order), kDelay);
2162 }
2163
2164 FastForwardBy(Milliseconds(10));
2165
2166 // Delayed tasks are not allowed to starve out immediate work which is why
2167 // some of the immediate tasks run out of order.
2168 uint64_t expected_run_order[] = {10, 11, 12, 0, 13, 14, 15, 1, 16,
2169 17, 18, 2, 3, 4, 5, 6, 7, 8};
2170 EXPECT_THAT(run_order, ElementsAreArray(expected_run_order));
2171 }
2172
TEST_P(SequenceManagerTest,DelayedTaskDoesNotSkipAHeadOfNonDelayedTask_SameQueue)2173 TEST_P(SequenceManagerTest,
2174 DelayedTaskDoesNotSkipAHeadOfNonDelayedTask_SameQueue) {
2175 auto queue = CreateTaskQueue();
2176
2177 std::vector<EnqueueOrder> run_order;
2178 TimeDelta delay = Milliseconds(10);
2179 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
2180 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
2181 queue->task_runner()->PostDelayedTask(
2182 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
2183
2184 AdvanceMockTickClock(delay * 2);
2185 RunLoop().RunUntilIdle();
2186
2187 EXPECT_THAT(run_order, ElementsAre(2u, 3u, 1u));
2188 }
2189
TEST_P(SequenceManagerTest,DelayedTaskDoesNotSkipAHeadOfNonDelayedTask_DifferentQueues)2190 TEST_P(SequenceManagerTest,
2191 DelayedTaskDoesNotSkipAHeadOfNonDelayedTask_DifferentQueues) {
2192 auto queues = CreateTaskQueues(2u);
2193
2194 std::vector<EnqueueOrder> run_order;
2195 TimeDelta delay = Milliseconds(10);
2196 queues[1]->task_runner()->PostTask(FROM_HERE,
2197 BindOnce(&TestTask, 2, &run_order));
2198 queues[1]->task_runner()->PostTask(FROM_HERE,
2199 BindOnce(&TestTask, 3, &run_order));
2200 queues[0]->task_runner()->PostDelayedTask(
2201 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay);
2202
2203 AdvanceMockTickClock(delay * 2);
2204 RunLoop().RunUntilIdle();
2205
2206 EXPECT_THAT(run_order, ElementsAre(2u, 3u, 1u));
2207 }
2208
TEST_P(SequenceManagerTest,DelayedTaskDoesNotSkipAHeadOfShorterDelayedTask)2209 TEST_P(SequenceManagerTest, DelayedTaskDoesNotSkipAHeadOfShorterDelayedTask) {
2210 auto queues = CreateTaskQueues(2u);
2211
2212 std::vector<EnqueueOrder> run_order;
2213 TimeDelta delay1 = Milliseconds(10);
2214 TimeDelta delay2 = Milliseconds(5);
2215 queues[0]->task_runner()->PostDelayedTask(
2216 FROM_HERE, BindOnce(&TestTask, 1, &run_order), delay1);
2217 queues[1]->task_runner()->PostDelayedTask(
2218 FROM_HERE, BindOnce(&TestTask, 2, &run_order), delay2);
2219
2220 AdvanceMockTickClock(delay1 * 2);
2221 RunLoop().RunUntilIdle();
2222
2223 EXPECT_THAT(run_order, ElementsAre(2u, 1u));
2224 }
2225
2226 namespace {
2227
CheckIsNested(bool * is_nested)2228 void CheckIsNested(bool* is_nested) {
2229 *is_nested = RunLoop::IsNestedOnCurrentThread();
2230 }
2231
PostAndQuitFromNestedRunloop(RunLoop * run_loop,TaskQueue * runner,bool * was_nested)2232 void PostAndQuitFromNestedRunloop(RunLoop* run_loop,
2233 TaskQueue* runner,
2234 bool* was_nested) {
2235 runner->task_runner()->PostTask(FROM_HERE, run_loop->QuitClosure());
2236 runner->task_runner()->PostTask(FROM_HERE,
2237 BindOnce(&CheckIsNested, was_nested));
2238 run_loop->Run();
2239 }
2240
2241 } // namespace
2242
TEST_P(SequenceManagerTest,QuitWhileNested)2243 TEST_P(SequenceManagerTest, QuitWhileNested) {
2244 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
2245 return;
2246 // This test makes sure we don't continue running a work batch after a nested
2247 // run loop has been exited in the middle of the batch.
2248 auto queue = CreateTaskQueue();
2249 sequence_manager()->SetWorkBatchSize(2);
2250
2251 bool was_nested = true;
2252 RunLoop run_loop(RunLoop::Type::kNestableTasksAllowed);
2253 queue->task_runner()->PostTask(
2254 FROM_HERE, BindOnce(&PostAndQuitFromNestedRunloop, Unretained(&run_loop),
2255 queue.get(), Unretained(&was_nested)));
2256
2257 RunLoop().RunUntilIdle();
2258 EXPECT_FALSE(was_nested);
2259 }
2260
2261 namespace {
2262
2263 class SequenceNumberCapturingTaskObserver : public TaskObserver {
2264 public:
2265 // TaskObserver overrides.
WillProcessTask(const PendingTask & pending_task,bool was_blocked_or_low_priority)2266 void WillProcessTask(const PendingTask& pending_task,
2267 bool was_blocked_or_low_priority) override {}
DidProcessTask(const PendingTask & pending_task)2268 void DidProcessTask(const PendingTask& pending_task) override {
2269 sequence_numbers_.push_back(pending_task.sequence_num);
2270 }
2271
sequence_numbers() const2272 const std::vector<int>& sequence_numbers() const { return sequence_numbers_; }
2273
2274 private:
2275 std::vector<int> sequence_numbers_;
2276 };
2277
2278 } // namespace
2279
TEST_P(SequenceManagerTest,SequenceNumSetWhenTaskIsPosted)2280 TEST_P(SequenceManagerTest, SequenceNumSetWhenTaskIsPosted) {
2281 auto queue = CreateTaskQueue();
2282
2283 SequenceNumberCapturingTaskObserver observer;
2284 sequence_manager()->AddTaskObserver(&observer);
2285
2286 // Register four tasks that will run in reverse order.
2287 std::vector<EnqueueOrder> run_order;
2288 queue->task_runner()->PostDelayedTask(
2289 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(30));
2290 queue->task_runner()->PostDelayedTask(
2291 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(20));
2292 queue->task_runner()->PostDelayedTask(
2293 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(10));
2294 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order));
2295
2296 FastForwardBy(Milliseconds(40));
2297 ASSERT_THAT(run_order, ElementsAre(4u, 3u, 2u, 1u));
2298
2299 // The sequence numbers are a one-based monotonically incrememting counter
2300 // which should be set when the task is posted rather than when it's enqueued
2301 // onto the Incoming queue. This counter starts with 2.
2302 EXPECT_THAT(observer.sequence_numbers(), ElementsAre(5, 4, 3, 2));
2303
2304 sequence_manager()->RemoveTaskObserver(&observer);
2305 }
2306
TEST_P(SequenceManagerTest,NewTaskQueues)2307 TEST_P(SequenceManagerTest, NewTaskQueues) {
2308 auto queue = CreateTaskQueue();
2309
2310 TaskQueue::Handle queue1 = CreateTaskQueue();
2311 TaskQueue::Handle queue2 = CreateTaskQueue();
2312 TaskQueue::Handle queue3 = CreateTaskQueue();
2313
2314 ASSERT_NE(queue1.get(), queue2.get());
2315 ASSERT_NE(queue1.get(), queue3.get());
2316 ASSERT_NE(queue2.get(), queue3.get());
2317
2318 std::vector<EnqueueOrder> run_order;
2319 queue1->task_runner()->PostTask(FROM_HERE,
2320 BindOnce(&TestTask, 1, &run_order));
2321 queue2->task_runner()->PostTask(FROM_HERE,
2322 BindOnce(&TestTask, 2, &run_order));
2323 queue3->task_runner()->PostTask(FROM_HERE,
2324 BindOnce(&TestTask, 3, &run_order));
2325 RunLoop().RunUntilIdle();
2326
2327 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
2328 }
2329
TEST_P(SequenceManagerTest,ShutdownTaskQueue_TaskRunnersDetaching)2330 TEST_P(SequenceManagerTest, ShutdownTaskQueue_TaskRunnersDetaching) {
2331 TaskQueue::Handle queue = CreateTaskQueue();
2332
2333 scoped_refptr<SingleThreadTaskRunner> runner1 = queue->task_runner();
2334 scoped_refptr<SingleThreadTaskRunner> runner2 = queue->CreateTaskRunner(1);
2335
2336 std::vector<EnqueueOrder> run_order;
2337 EXPECT_TRUE(runner1->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order)));
2338 EXPECT_TRUE(runner2->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order)));
2339 queue.reset();
2340 EXPECT_FALSE(
2341 runner1->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order)));
2342 EXPECT_FALSE(
2343 runner2->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order)));
2344
2345 RunLoop().RunUntilIdle();
2346 EXPECT_THAT(run_order, ElementsAre());
2347 }
2348
TEST_P(SequenceManagerTest,ShutdownTaskQueue)2349 TEST_P(SequenceManagerTest, ShutdownTaskQueue) {
2350 auto queue = CreateTaskQueue();
2351
2352 TaskQueue::Handle queue1 = CreateTaskQueue();
2353 TaskQueue::Handle queue2 = CreateTaskQueue();
2354 TaskQueue::Handle queue3 = CreateTaskQueue();
2355
2356 ASSERT_NE(queue1.get(), queue2.get());
2357 ASSERT_NE(queue1.get(), queue3.get());
2358 ASSERT_NE(queue2.get(), queue3.get());
2359
2360 std::vector<EnqueueOrder> run_order;
2361 queue1->task_runner()->PostTask(FROM_HERE,
2362 BindOnce(&TestTask, 1, &run_order));
2363 queue2->task_runner()->PostTask(FROM_HERE,
2364 BindOnce(&TestTask, 2, &run_order));
2365 queue3->task_runner()->PostTask(FROM_HERE,
2366 BindOnce(&TestTask, 3, &run_order));
2367 queue2.reset();
2368 RunLoop().RunUntilIdle();
2369
2370 EXPECT_THAT(run_order, ElementsAre(1u, 3u));
2371 }
2372
TEST_P(SequenceManagerTest,ShutdownTaskQueue_WithDelayedTasks)2373 TEST_P(SequenceManagerTest, ShutdownTaskQueue_WithDelayedTasks) {
2374 auto queues = CreateTaskQueues(2u);
2375
2376 // Register three delayed tasks
2377 std::vector<EnqueueOrder> run_order;
2378 queues[0]->task_runner()->PostDelayedTask(
2379 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(10));
2380 queues[1]->task_runner()->PostDelayedTask(
2381 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(20));
2382 queues[0]->task_runner()->PostDelayedTask(
2383 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(30));
2384
2385 queues[1].reset();
2386 RunLoop().RunUntilIdle();
2387
2388 FastForwardBy(Milliseconds(40));
2389 ASSERT_THAT(run_order, ElementsAre(1u, 3u));
2390 }
2391
2392 namespace {
ShutdownQueue(TaskQueue::Handle queue)2393 void ShutdownQueue(TaskQueue::Handle queue) {}
2394 } // namespace
2395
TEST_P(SequenceManagerTest,ShutdownTaskQueue_InTasks)2396 TEST_P(SequenceManagerTest, ShutdownTaskQueue_InTasks) {
2397 auto queues = CreateTaskQueues(3u);
2398 auto runner1 = queues[1]->task_runner();
2399 auto runner2 = queues[2]->task_runner();
2400
2401 std::vector<EnqueueOrder> run_order;
2402 queues[0]->task_runner()->PostTask(FROM_HERE,
2403 BindOnce(&TestTask, 1, &run_order));
2404 queues[0]->task_runner()->PostTask(
2405 FROM_HERE, BindOnce(&ShutdownQueue, std::move(queues[1])));
2406 queues[0]->task_runner()->PostTask(
2407 FROM_HERE, BindOnce(&ShutdownQueue, std::move(queues[2])));
2408 runner1->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
2409 runner2->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
2410
2411 RunLoop().RunUntilIdle();
2412 ASSERT_THAT(run_order, ElementsAre(1u));
2413 }
2414
2415 namespace {
2416
2417 class MockObserver : public SequenceManager::Observer {
2418 public:
2419 MOCK_METHOD0(OnTriedToExecuteBlockedTask, void());
2420 MOCK_METHOD0(OnBeginNestedRunLoop, void());
2421 MOCK_METHOD0(OnExitNestedRunLoop, void());
2422 };
2423
2424 } // namespace
2425
TEST_P(SequenceManagerTest,ShutdownTaskQueueInNestedLoop)2426 TEST_P(SequenceManagerTest, ShutdownTaskQueueInNestedLoop) {
2427 auto queue = CreateTaskQueue();
2428
2429 // We retain a reference to the task queue even when the manager has deleted
2430 // its reference.
2431 TaskQueue::Handle queue_to_delete = CreateTaskQueue();
2432
2433 std::vector<bool> log;
2434 std::vector<std::pair<OnceClosure, bool>> tasks_to_post_from_nested_loop;
2435
2436 // Inside a nested run loop, delete `queue_to_delete`, bookended by Nop tasks.
2437 tasks_to_post_from_nested_loop.push_back(
2438 std::make_pair(BindOnce(&NopTask), true));
2439 tasks_to_post_from_nested_loop.push_back(std::make_pair(
2440 BindLambdaForTesting([&] { queue_to_delete.reset(); }), true));
2441 tasks_to_post_from_nested_loop.push_back(
2442 std::make_pair(BindOnce(&NopTask), true));
2443 queue->task_runner()->PostTask(
2444 FROM_HERE, BindOnce(&PostFromNestedRunloop, queue->task_runner(),
2445 Unretained(&tasks_to_post_from_nested_loop)));
2446 RunLoop().RunUntilIdle();
2447
2448 // Just make sure that we don't crash.
2449 }
2450
TEST_P(SequenceManagerTest,TimeDomainMigrationWithIncomingImmediateTasks)2451 TEST_P(SequenceManagerTest, TimeDomainMigrationWithIncomingImmediateTasks) {
2452 auto queue = CreateTaskQueue();
2453
2454 TimeTicks start_time_ticks = sequence_manager()->NowTicks();
2455 std::unique_ptr<MockTimeDomain> domain_a =
2456 std::make_unique<MockTimeDomain>(start_time_ticks);
2457 std::unique_ptr<MockTimeDomain> domain_b =
2458 std::make_unique<MockTimeDomain>(start_time_ticks);
2459
2460 sequence_manager()->SetTimeDomain(domain_a.get());
2461 std::vector<EnqueueOrder> run_order;
2462 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
2463 sequence_manager()->ResetTimeDomain();
2464 sequence_manager()->SetTimeDomain(domain_b.get());
2465
2466 RunLoop().RunUntilIdle();
2467 EXPECT_THAT(run_order, ElementsAre(1u));
2468
2469 sequence_manager()->ResetTimeDomain();
2470 }
2471
2472 // Test that no wake up is scheduled for a delayed task in the future when a
2473 // time domain is present.
TEST_P(SequenceManagerTest,TimeDomainDoesNotCauseWakeUp)2474 TEST_P(SequenceManagerTest, TimeDomainDoesNotCauseWakeUp) {
2475 auto queue = CreateTaskQueue();
2476
2477 std::unique_ptr<MockTimeDomain> domain =
2478 std::make_unique<MockTimeDomain>(sequence_manager()->NowTicks());
2479 sequence_manager()->SetTimeDomain(domain.get());
2480
2481 std::vector<EnqueueOrder> run_order;
2482 queue->task_runner()->PostDelayedTask(
2483 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(10));
2484 LazyNow lazy_now1(domain.get());
2485 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now1));
2486 EXPECT_EQ(TimeTicks::Max(), NextPendingTaskTime());
2487
2488 domain->SetNowTicks(sequence_manager()->NowTicks() + Milliseconds(10));
2489 LazyNow lazy_now2(domain.get());
2490 EXPECT_EQ(WakeUp{}, sequence_manager()->GetPendingWakeUp(&lazy_now2));
2491
2492 sequence_manager()->ResetTimeDomain();
2493 }
2494
TEST_P(SequenceManagerTest,PostDelayedTasksReverseOrderAlternatingTimeDomains)2495 TEST_P(SequenceManagerTest,
2496 PostDelayedTasksReverseOrderAlternatingTimeDomains) {
2497 auto queue = CreateTaskQueue();
2498
2499 std::vector<EnqueueOrder> run_order;
2500
2501 std::unique_ptr<sequence_manager::MockTimeDomain> domain =
2502 std::make_unique<sequence_manager::MockTimeDomain>(
2503 mock_tick_clock()->NowTicks());
2504
2505 sequence_manager()->SetTimeDomain(domain.get());
2506 queue->task_runner()->PostDelayedTask(
2507 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(400));
2508
2509 sequence_manager()->ResetTimeDomain();
2510 queue->task_runner()->PostDelayedTask(
2511 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(300));
2512
2513 sequence_manager()->SetTimeDomain(domain.get());
2514 queue->task_runner()->PostDelayedTask(
2515 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(200));
2516
2517 sequence_manager()->ResetTimeDomain();
2518 queue->task_runner()->PostDelayedTask(
2519 FROM_HERE, BindOnce(&TestTask, 4, &run_order), Milliseconds(100));
2520
2521 FastForwardBy(Milliseconds(400));
2522 EXPECT_THAT(run_order, ElementsAre(4u, 3u, 2u, 1u));
2523
2524 sequence_manager()->ResetTimeDomain();
2525 }
2526
2527 namespace {
2528
2529 class MockTaskQueueThrottler : public TaskQueue::Throttler {
2530 public:
2531 MockTaskQueueThrottler() = default;
2532 ~MockTaskQueueThrottler() = default;
2533
2534 MOCK_METHOD1(OnWakeUp, void(LazyNow*));
2535 MOCK_METHOD0(OnHasImmediateTask, void());
2536 MOCK_METHOD1(GetNextAllowedWakeUp_DesiredWakeUpTime, void(TimeTicks));
2537
GetNextAllowedWakeUp(LazyNow * lazy_now,absl::optional<WakeUp> next_desired_wake_up,bool has_immediate_work)2538 absl::optional<WakeUp> GetNextAllowedWakeUp(
2539 LazyNow* lazy_now,
2540 absl::optional<WakeUp> next_desired_wake_up,
2541 bool has_immediate_work) override {
2542 if (next_desired_wake_up)
2543 GetNextAllowedWakeUp_DesiredWakeUpTime(next_desired_wake_up->time);
2544 if (next_allowed_wake_up_)
2545 return next_allowed_wake_up_;
2546 return next_desired_wake_up;
2547 }
2548
SetNextAllowedWakeUp(absl::optional<WakeUp> next_allowed_wake_up)2549 void SetNextAllowedWakeUp(absl::optional<WakeUp> next_allowed_wake_up) {
2550 next_allowed_wake_up_ = next_allowed_wake_up;
2551 }
2552
2553 private:
2554 absl::optional<WakeUp> next_allowed_wake_up_;
2555 };
2556
2557 } // namespace
2558
TEST_P(SequenceManagerTest,TaskQueueThrottler_ImmediateTask)2559 TEST_P(SequenceManagerTest, TaskQueueThrottler_ImmediateTask) {
2560 StrictMock<MockTaskQueueThrottler> throttler;
2561 auto queue = CreateTaskQueue();
2562 queue->SetThrottler(&throttler);
2563
2564 // OnHasImmediateTask should be called when a task is posted on an empty
2565 // queue.
2566 EXPECT_CALL(throttler, OnHasImmediateTask());
2567 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2568 sequence_manager()->ReloadEmptyWorkQueues();
2569 Mock::VerifyAndClearExpectations(&throttler);
2570
2571 // But not subsequently.
2572 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2573 sequence_manager()->ReloadEmptyWorkQueues();
2574 Mock::VerifyAndClearExpectations(&throttler);
2575
2576 // Unless the immediate work queue is emptied.
2577 LazyNow lazy_now(mock_tick_clock());
2578 sequence_manager()->SelectNextTask(lazy_now);
2579 sequence_manager()->DidRunTask(lazy_now);
2580 sequence_manager()->SelectNextTask(lazy_now);
2581 sequence_manager()->DidRunTask(lazy_now);
2582 EXPECT_CALL(throttler, OnHasImmediateTask());
2583 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
2584 sequence_manager()->ReloadEmptyWorkQueues();
2585 Mock::VerifyAndClearExpectations(&throttler);
2586 }
2587
TEST_P(SequenceManagerTest,TaskQueueThrottler_DelayedTask)2588 TEST_P(SequenceManagerTest, TaskQueueThrottler_DelayedTask) {
2589 StrictMock<MockTaskQueueThrottler> throttler;
2590 auto queue = CreateTaskQueue();
2591 queue->SetThrottler(&throttler);
2592
2593 TimeTicks start_time = sequence_manager()->NowTicks();
2594 TimeDelta delay10s(Seconds(10));
2595 TimeDelta delay100s(Seconds(100));
2596 TimeDelta delay1s(Seconds(1));
2597
2598 // GetNextAllowedWakeUp should be called when a delayed task is posted on an
2599 // empty queue.
2600 EXPECT_CALL(throttler,
2601 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay10s));
2602 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2603 delay10s);
2604 Mock::VerifyAndClearExpectations(&throttler);
2605
2606 // GetNextAllowedWakeUp should be given the same delay when a longer delay
2607 // task is posted.
2608 EXPECT_CALL(throttler,
2609 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay10s));
2610 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2611 delay100s);
2612 Mock::VerifyAndClearExpectations(&throttler);
2613
2614 // GetNextAllowedWakeUp should be given the new delay when a task is posted
2615 // with a shorter delay.
2616 EXPECT_CALL(throttler,
2617 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1s));
2618 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay1s);
2619 Mock::VerifyAndClearExpectations(&throttler);
2620
2621 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
2622 queue->CreateQueueEnabledVoter();
2623 voter->SetVoteToEnable(false);
2624 Mock::VerifyAndClearExpectations(&throttler);
2625
2626 // When a queue has been enabled, we may get a notification if the
2627 // TimeDomain's next scheduled wake-up has changed.
2628 EXPECT_CALL(throttler,
2629 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1s));
2630 voter->SetVoteToEnable(true);
2631 Mock::VerifyAndClearExpectations(&throttler);
2632 }
2633
TEST_P(SequenceManagerTest,TaskQueueThrottler_OnWakeUp)2634 TEST_P(SequenceManagerTest, TaskQueueThrottler_OnWakeUp) {
2635 StrictMock<MockTaskQueueThrottler> throttler;
2636 auto queue = CreateTaskQueue();
2637 queue->SetThrottler(&throttler);
2638
2639 TimeTicks start_time = sequence_manager()->NowTicks();
2640 TimeDelta delay(Seconds(1));
2641
2642 EXPECT_CALL(throttler,
2643 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay));
2644 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay);
2645 Mock::VerifyAndClearExpectations(&throttler);
2646
2647 AdvanceMockTickClock(delay);
2648
2649 // OnWakeUp should be called when the queue has a scheduler wake up.
2650 EXPECT_CALL(throttler, OnWakeUp(_));
2651 // Move the task into the |delayed_work_queue|.
2652 LazyNow lazy_now(mock_tick_clock());
2653 sequence_manager()->MoveReadyDelayedTasksToWorkQueues(&lazy_now);
2654 Mock::VerifyAndClearExpectations(&throttler);
2655 }
2656
TEST_P(SequenceManagerTest,TaskQueueThrottler_ResetThrottler)2657 TEST_P(SequenceManagerTest, TaskQueueThrottler_ResetThrottler) {
2658 StrictMock<MockTaskQueueThrottler> throttler;
2659 auto queue = CreateTaskQueue();
2660 queue->SetThrottler(&throttler);
2661
2662 TimeTicks start_time = sequence_manager()->NowTicks();
2663 TimeDelta delay10s(Seconds(10));
2664 TimeDelta delay1s(Seconds(1));
2665
2666 EXPECT_FALSE(queue->GetNextDesiredWakeUp());
2667
2668 // GetNextAllowedWakeUp should be called when a delayed task is posted on an
2669 // empty queue.
2670 throttler.SetNextAllowedWakeUp(
2671 base::sequence_manager::WakeUp{start_time + delay10s});
2672 EXPECT_CALL(throttler,
2673 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1s));
2674 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay1s);
2675 Mock::VerifyAndClearExpectations(&throttler);
2676 // Expect throttled wake up.
2677 LazyNow lazy_now(mock_tick_clock());
2678 WakeUp expected_wake_up{start_time + delay10s};
2679 EXPECT_EQ(expected_wake_up, sequence_manager()->GetPendingWakeUp(&lazy_now));
2680
2681 queue->ResetThrottler();
2682 // Next wake up should be back to normal.
2683 EXPECT_EQ((WakeUp{start_time + delay1s, kLeeway}),
2684 sequence_manager()->GetPendingWakeUp(&lazy_now));
2685 }
2686
TEST_P(SequenceManagerTest,TaskQueueThrottler_DelayedTaskMultipleQueues)2687 TEST_P(SequenceManagerTest, TaskQueueThrottler_DelayedTaskMultipleQueues) {
2688 StrictMock<MockTaskQueueThrottler> throttler0;
2689 StrictMock<MockTaskQueueThrottler> throttler1;
2690 auto queues = CreateTaskQueues(2u);
2691 queues[0]->SetThrottler(&throttler0);
2692 queues[1]->SetThrottler(&throttler1);
2693
2694 TimeTicks start_time = sequence_manager()->NowTicks();
2695 TimeDelta delay1s(Seconds(1));
2696 TimeDelta delay10s(Seconds(10));
2697
2698 EXPECT_CALL(throttler0,
2699 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1s))
2700 .Times(1);
2701 EXPECT_CALL(throttler1,
2702 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay10s))
2703 .Times(1);
2704 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2705 delay1s);
2706 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
2707 delay10s);
2708 testing::Mock::VerifyAndClearExpectations(&throttler0);
2709 testing::Mock::VerifyAndClearExpectations(&throttler1);
2710
2711 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter0 =
2712 queues[0]->CreateQueueEnabledVoter();
2713 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter1 =
2714 queues[1]->CreateQueueEnabledVoter();
2715
2716 // Disabling a queue should not trigger a notification.
2717 voter0->SetVoteToEnable(false);
2718 Mock::VerifyAndClearExpectations(&throttler0);
2719
2720 // But re-enabling it should should trigger an GetNextAllowedWakeUp
2721 // notification.
2722 EXPECT_CALL(throttler0,
2723 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1s));
2724 voter0->SetVoteToEnable(true);
2725 Mock::VerifyAndClearExpectations(&throttler0);
2726
2727 // Disabling a queue should not trigger a notification.
2728 voter1->SetVoteToEnable(false);
2729 Mock::VerifyAndClearExpectations(&throttler0);
2730
2731 // But re-enabling it should should trigger a notification.
2732 EXPECT_CALL(throttler1,
2733 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay10s));
2734 voter1->SetVoteToEnable(true);
2735 Mock::VerifyAndClearExpectations(&throttler1);
2736 }
2737
TEST_P(SequenceManagerTest,TaskQueueThrottler_DelayedWorkWhichCanRunNow)2738 TEST_P(SequenceManagerTest, TaskQueueThrottler_DelayedWorkWhichCanRunNow) {
2739 // This test checks that when delayed work becomes available the notification
2740 // still fires. This usually happens when time advances and task becomes
2741 // available in the middle of the scheduling code. For this test we force
2742 // notification dispatching by calling UpdateWakeUp() explicitly.
2743
2744 StrictMock<MockTaskQueueThrottler> throttler;
2745 auto queue = CreateTaskQueue();
2746 queue->SetThrottler(&throttler);
2747
2748 TimeDelta delay1s(Seconds(1));
2749
2750 // GetNextAllowedWakeUp should be called when a delayed task is posted on an
2751 // empty queue.
2752 EXPECT_CALL(throttler, GetNextAllowedWakeUp_DesiredWakeUpTime(_));
2753 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay1s);
2754 Mock::VerifyAndClearExpectations(&throttler);
2755
2756 AdvanceMockTickClock(Seconds(10));
2757
2758 EXPECT_CALL(throttler, GetNextAllowedWakeUp_DesiredWakeUpTime(_));
2759 LazyNow lazy_now(mock_tick_clock());
2760 queue->UpdateWakeUp(&lazy_now);
2761 Mock::VerifyAndClearExpectations(&throttler);
2762 }
2763
2764 namespace {
2765
2766 class CancelableTask {
2767 public:
CancelableTask(const TickClock * clock)2768 explicit CancelableTask(const TickClock* clock) : clock_(clock) {}
2769
RecordTimeTask(std::vector<TimeTicks> * run_times)2770 void RecordTimeTask(std::vector<TimeTicks>* run_times) {
2771 run_times->push_back(clock_->NowTicks());
2772 }
2773
2774 template <typename... Args>
FailTask(Args...)2775 void FailTask(Args...) {
2776 FAIL();
2777 }
2778
2779 raw_ptr<const TickClock> clock_;
2780 WeakPtrFactory<CancelableTask> weak_factory_{this};
2781 };
2782
2783 class DestructionCallback {
2784 public:
DestructionCallback(OnceCallback<void ()> on_destroy)2785 explicit DestructionCallback(OnceCallback<void()> on_destroy)
2786 : on_destroy_(std::move(on_destroy)) {}
~DestructionCallback()2787 ~DestructionCallback() {
2788 if (on_destroy_)
2789 std::move(on_destroy_).Run();
2790 }
2791 DestructionCallback(const DestructionCallback&) = delete;
2792 DestructionCallback& operator=(const DestructionCallback&) = delete;
2793 DestructionCallback(DestructionCallback&&) = default;
2794
2795 private:
2796 OnceCallback<void()> on_destroy_;
2797 };
2798
2799 } // namespace
2800
TEST_P(SequenceManagerTest,TaskQueueThrottler_SweepCanceledDelayedTasks)2801 TEST_P(SequenceManagerTest, TaskQueueThrottler_SweepCanceledDelayedTasks) {
2802 StrictMock<MockTaskQueueThrottler> throttler;
2803 auto queue = CreateTaskQueue();
2804 queue->SetThrottler(&throttler);
2805
2806 TimeTicks start_time = sequence_manager()->NowTicks();
2807 TimeDelta delay1(Seconds(5));
2808 TimeDelta delay2(Seconds(10));
2809
2810 EXPECT_CALL(throttler,
2811 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay1))
2812 .Times(2);
2813
2814 CancelableTask task1(mock_tick_clock());
2815 CancelableTask task2(mock_tick_clock());
2816 std::vector<TimeTicks> run_times;
2817 queue->task_runner()->PostDelayedTask(
2818 FROM_HERE,
2819 BindOnce(&CancelableTask::RecordTimeTask,
2820 task1.weak_factory_.GetWeakPtr(), &run_times),
2821 delay1);
2822 queue->task_runner()->PostDelayedTask(
2823 FROM_HERE,
2824 BindOnce(&CancelableTask::RecordTimeTask,
2825 task2.weak_factory_.GetWeakPtr(), &run_times),
2826 delay2);
2827
2828 task1.weak_factory_.InvalidateWeakPtrs();
2829
2830 // Sweeping away canceled delayed tasks should trigger a notification.
2831 EXPECT_CALL(throttler,
2832 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay2))
2833 .Times(1);
2834 sequence_manager()->ReclaimMemory();
2835 }
2836
TEST_P(SequenceManagerTest,SweepLastTaskInQueue)2837 TEST_P(SequenceManagerTest, SweepLastTaskInQueue) {
2838 auto queue = CreateTaskQueue();
2839 CancelableTask task(mock_tick_clock());
2840 queue->task_runner()->PostDelayedTask(
2841 FROM_HERE,
2842 BindOnce(&CancelableTask::FailTask<>, task.weak_factory_.GetWeakPtr()),
2843 base::Seconds(1));
2844
2845 // Make sure sweeping away the last task in the queue doesn't end up accessing
2846 // invalid iterators.
2847 task.weak_factory_.InvalidateWeakPtrs();
2848 sequence_manager()->ReclaimMemory();
2849 }
2850
TEST_P(SequenceManagerTest,CancelledTaskPostAnother_ReclaimMemory)2851 TEST_P(SequenceManagerTest, CancelledTaskPostAnother_ReclaimMemory) {
2852 // This check ensures that a task whose destruction causes another task to be
2853 // posted as a side-effect doesn't cause us to access invalid iterators while
2854 // sweeping away cancelled tasks.
2855 auto queue = CreateTaskQueue();
2856 bool did_destroy = false;
2857 auto on_destroy = BindLambdaForTesting([&] {
2858 queue->task_runner()->PostDelayedTask(
2859 FROM_HERE, BindLambdaForTesting([] {}), base::Seconds(1));
2860 did_destroy = true;
2861 });
2862
2863 DestructionCallback destruction_observer(std::move(on_destroy));
2864 CancelableTask task(mock_tick_clock());
2865 queue->task_runner()->PostDelayedTask(
2866 FROM_HERE,
2867 BindOnce(&CancelableTask::FailTask<DestructionCallback>,
2868 task.weak_factory_.GetWeakPtr(),
2869 std::move(destruction_observer)),
2870 base::Seconds(1));
2871
2872 task.weak_factory_.InvalidateWeakPtrs();
2873 EXPECT_FALSE(did_destroy);
2874 sequence_manager()->ReclaimMemory();
2875 EXPECT_TRUE(did_destroy);
2876 }
2877
2878 // Regression test to ensure that posting a new task from the destructor of a
2879 // canceled task doesn't crash.
TEST_P(SequenceManagerTest,CancelledTaskPostAnother_MoveReadyDelayedTasksToWorkQueues)2880 TEST_P(SequenceManagerTest,
2881 CancelledTaskPostAnother_MoveReadyDelayedTasksToWorkQueues) {
2882 // This check ensures that a task whose destruction causes another task to be
2883 // posted as a side-effect doesn't cause us to access invalid iterators while
2884 // sweeping away cancelled tasks.
2885 auto queue = CreateTaskQueue();
2886 bool did_destroy = false;
2887 auto on_destroy = BindLambdaForTesting([&] {
2888 queue->task_runner()->PostDelayedTask(
2889 FROM_HERE, BindLambdaForTesting([] {}), base::Seconds(1));
2890 did_destroy = true;
2891 });
2892
2893 DestructionCallback destruction_observer(std::move(on_destroy));
2894 CancelableTask task(mock_tick_clock());
2895 queue->task_runner()->PostDelayedTask(
2896 FROM_HERE,
2897 BindOnce(&CancelableTask::FailTask<DestructionCallback>,
2898 task.weak_factory_.GetWeakPtr(),
2899 std::move(destruction_observer)),
2900 base::Seconds(1));
2901
2902 AdvanceMockTickClock(base::Seconds(1));
2903
2904 task.weak_factory_.InvalidateWeakPtrs();
2905 EXPECT_FALSE(did_destroy);
2906 LazyNow lazy_now(mock_tick_clock());
2907 sequence_manager()->MoveReadyDelayedTasksToWorkQueues(&lazy_now);
2908 EXPECT_TRUE(did_destroy);
2909 }
2910
TEST_P(SequenceManagerTest,CancelledTaskPostAnother_RemoveAllCanceledDelayedTasksFromFront)2911 TEST_P(SequenceManagerTest,
2912 CancelledTaskPostAnother_RemoveAllCanceledDelayedTasksFromFront) {
2913 // This check ensures that a task whose destruction causes another task to be
2914 // posted as a side-effect doesn't cause us to access invalid iterators while
2915 // removing canceled tasks from the front of the queues.
2916 auto queue = CreateTaskQueue();
2917 bool did_destroy = false;
2918 auto on_destroy = BindLambdaForTesting([&] {
2919 queue->task_runner()->PostDelayedTask(
2920 FROM_HERE, BindLambdaForTesting([] {}), base::Seconds(1));
2921 did_destroy = true;
2922 });
2923
2924 DestructionCallback destruction_observer(std::move(on_destroy));
2925 CancelableTask task(mock_tick_clock());
2926 queue->task_runner()->PostDelayedTask(
2927 FROM_HERE,
2928 BindOnce(&CancelableTask::FailTask<DestructionCallback>,
2929 task.weak_factory_.GetWeakPtr(),
2930 std::move(destruction_observer)),
2931 base::Seconds(1));
2932
2933 task.weak_factory_.InvalidateWeakPtrs();
2934 EXPECT_FALSE(did_destroy);
2935 LazyNow lazy_now(mock_tick_clock());
2936 // This removes canceled delayed tasks from the front of the queue.
2937 sequence_manager()->GetPendingWakeUp(&lazy_now);
2938 EXPECT_TRUE(did_destroy);
2939 }
2940
TEST_P(SequenceManagerTest,CancelledImmediateTaskShutsDownQueue)2941 TEST_P(SequenceManagerTest, CancelledImmediateTaskShutsDownQueue) {
2942 // This check ensures that an immediate task whose destruction causes the
2943 // owning task queue to be shut down doesn't cause us to access freed memory.
2944 auto queue = CreateTaskQueue();
2945 bool did_shutdown = false;
2946 auto on_destroy = BindLambdaForTesting([&] {
2947 queue.reset();
2948 did_shutdown = true;
2949 });
2950
2951 DestructionCallback destruction_observer(std::move(on_destroy));
2952 CancelableTask task(mock_tick_clock());
2953 queue->task_runner()->PostTask(
2954 FROM_HERE, BindOnce(&CancelableTask::FailTask<DestructionCallback>,
2955 task.weak_factory_.GetWeakPtr(),
2956 std::move(destruction_observer)));
2957
2958 task.weak_factory_.InvalidateWeakPtrs();
2959 EXPECT_FALSE(did_shutdown);
2960 RunLoop().RunUntilIdle();
2961 EXPECT_TRUE(did_shutdown);
2962 }
2963
TEST_P(SequenceManagerTest,CancelledDelayedTaskShutsDownQueue)2964 TEST_P(SequenceManagerTest, CancelledDelayedTaskShutsDownQueue) {
2965 // This check ensures that a delayed task whose destruction causes the owning
2966 // task queue to be shut down doesn't cause us to access freed memory.
2967 auto queue = CreateTaskQueue();
2968 bool did_shutdown = false;
2969 auto on_destroy = BindLambdaForTesting([&] {
2970 queue.reset();
2971 did_shutdown = true;
2972 });
2973
2974 DestructionCallback destruction_observer(std::move(on_destroy));
2975 CancelableTask task(mock_tick_clock());
2976 queue->task_runner()->PostDelayedTask(
2977 FROM_HERE,
2978 BindOnce(&CancelableTask::FailTask<DestructionCallback>,
2979 task.weak_factory_.GetWeakPtr(),
2980 std::move(destruction_observer)),
2981 base::Seconds(1));
2982
2983 task.weak_factory_.InvalidateWeakPtrs();
2984 EXPECT_FALSE(did_shutdown);
2985 sequence_manager()->ReclaimMemory();
2986 EXPECT_TRUE(did_shutdown);
2987 }
2988
2989 namespace {
2990
ChromiumRunloopInspectionTask(scoped_refptr<TestMockTimeTaskRunner> test_task_runner)2991 void ChromiumRunloopInspectionTask(
2992 scoped_refptr<TestMockTimeTaskRunner> test_task_runner) {
2993 // We don't expect more than 1 pending task at any time.
2994 EXPECT_GE(1u, test_task_runner->GetPendingTaskCount());
2995 }
2996
2997 } // namespace
2998
TEST(SequenceManagerTestWithMockTaskRunner,NumberOfPendingTasksOnChromiumRunLoop)2999 TEST(SequenceManagerTestWithMockTaskRunner,
3000 NumberOfPendingTasksOnChromiumRunLoop) {
3001 FixtureWithMockTaskRunner fixture;
3002 auto queue = fixture.sequence_manager()->CreateTaskQueue(
3003 TaskQueue::Spec(QueueName::TEST_TQ));
3004
3005 // NOTE because tasks posted to the chromiumrun loop are not cancellable, we
3006 // will end up with a lot more tasks posted if the delayed tasks were posted
3007 // in the reverse order.
3008 // TODO(alexclarke): Consider talking to the message pump directly.
3009 for (int i = 1; i < 100; i++) {
3010 queue->task_runner()->PostDelayedTask(
3011 FROM_HERE,
3012 BindOnce(&ChromiumRunloopInspectionTask, fixture.test_task_runner()),
3013 Milliseconds(i));
3014 }
3015 fixture.FastForwardUntilNoTasksRemain();
3016 }
3017
3018 namespace {
3019
3020 class QuadraticTask {
3021 public:
QuadraticTask(scoped_refptr<TaskRunner> task_runner,TimeDelta delay,Fixture * fixture)3022 QuadraticTask(scoped_refptr<TaskRunner> task_runner,
3023 TimeDelta delay,
3024 Fixture* fixture)
3025 : count_(0),
3026 task_runner_(task_runner),
3027 delay_(delay),
3028 fixture_(fixture) {}
3029
SetShouldExit(RepeatingCallback<bool ()> should_exit)3030 void SetShouldExit(RepeatingCallback<bool()> should_exit) {
3031 should_exit_ = should_exit;
3032 }
3033
Run()3034 void Run() {
3035 if (should_exit_.Run())
3036 return;
3037 count_++;
3038 task_runner_->PostDelayedTask(
3039 FROM_HERE, BindOnce(&QuadraticTask::Run, Unretained(this)), delay_);
3040 task_runner_->PostDelayedTask(
3041 FROM_HERE, BindOnce(&QuadraticTask::Run, Unretained(this)), delay_);
3042 fixture_->AdvanceMockTickClock(Milliseconds(5));
3043 }
3044
Count() const3045 int Count() const { return count_; }
3046
3047 private:
3048 int count_;
3049 scoped_refptr<TaskRunner> task_runner_;
3050 TimeDelta delay_;
3051 raw_ptr<Fixture> fixture_;
3052 RepeatingCallback<bool()> should_exit_;
3053 };
3054
3055 class LinearTask {
3056 public:
LinearTask(scoped_refptr<TaskRunner> task_runner,TimeDelta delay,Fixture * fixture)3057 LinearTask(scoped_refptr<TaskRunner> task_runner,
3058 TimeDelta delay,
3059 Fixture* fixture)
3060 : count_(0),
3061 task_runner_(task_runner),
3062 delay_(delay),
3063 fixture_(fixture) {}
3064
SetShouldExit(RepeatingCallback<bool ()> should_exit)3065 void SetShouldExit(RepeatingCallback<bool()> should_exit) {
3066 should_exit_ = should_exit;
3067 }
3068
Run()3069 void Run() {
3070 if (should_exit_.Run())
3071 return;
3072 count_++;
3073 task_runner_->PostDelayedTask(
3074 FROM_HERE, BindOnce(&LinearTask::Run, Unretained(this)), delay_);
3075 fixture_->AdvanceMockTickClock(Milliseconds(5));
3076 }
3077
Count() const3078 int Count() const { return count_; }
3079
3080 private:
3081 int count_;
3082 scoped_refptr<TaskRunner> task_runner_;
3083 TimeDelta delay_;
3084 raw_ptr<Fixture> fixture_;
3085 RepeatingCallback<bool()> should_exit_;
3086 };
3087
ShouldExit(QuadraticTask * quadratic_task,LinearTask * linear_task)3088 bool ShouldExit(QuadraticTask* quadratic_task, LinearTask* linear_task) {
3089 return quadratic_task->Count() == 1000 || linear_task->Count() == 1000;
3090 }
3091
3092 } // namespace
3093
TEST_P(SequenceManagerTest,DelayedTasksDontBadlyStarveNonDelayedWork_SameQueue)3094 TEST_P(SequenceManagerTest,
3095 DelayedTasksDontBadlyStarveNonDelayedWork_SameQueue) {
3096 auto queue = CreateTaskQueue();
3097
3098 QuadraticTask quadratic_delayed_task(queue->task_runner(), Milliseconds(10),
3099 this);
3100 LinearTask linear_immediate_task(queue->task_runner(), TimeDelta(), this);
3101 RepeatingCallback<bool()> should_exit = BindRepeating(
3102 ShouldExit, &quadratic_delayed_task, &linear_immediate_task);
3103 quadratic_delayed_task.SetShouldExit(should_exit);
3104 linear_immediate_task.SetShouldExit(should_exit);
3105
3106 quadratic_delayed_task.Run();
3107 linear_immediate_task.Run();
3108
3109 FastForwardUntilNoTasksRemain();
3110
3111 double ratio = static_cast<double>(linear_immediate_task.Count()) /
3112 static_cast<double>(quadratic_delayed_task.Count());
3113
3114 EXPECT_GT(ratio, 0.333);
3115 EXPECT_LT(ratio, 1.1);
3116 }
3117
TEST_P(SequenceManagerTest,ImmediateWorkCanStarveDelayedTasks_SameQueue)3118 TEST_P(SequenceManagerTest, ImmediateWorkCanStarveDelayedTasks_SameQueue) {
3119 auto queue = CreateTaskQueue();
3120
3121 QuadraticTask quadratic_immediate_task(queue->task_runner(), TimeDelta(),
3122 this);
3123 LinearTask linear_delayed_task(queue->task_runner(), Milliseconds(10), this);
3124 RepeatingCallback<bool()> should_exit = BindRepeating(
3125 &ShouldExit, &quadratic_immediate_task, &linear_delayed_task);
3126
3127 quadratic_immediate_task.SetShouldExit(should_exit);
3128 linear_delayed_task.SetShouldExit(should_exit);
3129
3130 quadratic_immediate_task.Run();
3131 linear_delayed_task.Run();
3132
3133 FastForwardUntilNoTasksRemain();
3134
3135 double ratio = static_cast<double>(linear_delayed_task.Count()) /
3136 static_cast<double>(quadratic_immediate_task.Count());
3137
3138 // This is by design, we want to enforce a strict ordering in task execution
3139 // where by delayed tasks can not skip ahead of non-delayed work.
3140 EXPECT_GT(ratio, 0.0);
3141 EXPECT_LT(ratio, 0.1);
3142 }
3143
TEST_P(SequenceManagerTest,DelayedTasksDontBadlyStarveNonDelayedWork_DifferentQueue)3144 TEST_P(SequenceManagerTest,
3145 DelayedTasksDontBadlyStarveNonDelayedWork_DifferentQueue) {
3146 auto queues = CreateTaskQueues(2u);
3147
3148 QuadraticTask quadratic_delayed_task(queues[0]->task_runner(),
3149 Milliseconds(10), this);
3150 LinearTask linear_immediate_task(queues[1]->task_runner(), TimeDelta(), this);
3151 RepeatingCallback<bool()> should_exit = BindRepeating(
3152 ShouldExit, &quadratic_delayed_task, &linear_immediate_task);
3153 quadratic_delayed_task.SetShouldExit(should_exit);
3154 linear_immediate_task.SetShouldExit(should_exit);
3155
3156 quadratic_delayed_task.Run();
3157 linear_immediate_task.Run();
3158
3159 FastForwardUntilNoTasksRemain();
3160
3161 double ratio = static_cast<double>(linear_immediate_task.Count()) /
3162 static_cast<double>(quadratic_delayed_task.Count());
3163
3164 EXPECT_GT(ratio, 0.333);
3165 EXPECT_LT(ratio, 1.1);
3166 }
3167
TEST_P(SequenceManagerTest,ImmediateWorkCanStarveDelayedTasks_DifferentQueue)3168 TEST_P(SequenceManagerTest, ImmediateWorkCanStarveDelayedTasks_DifferentQueue) {
3169 auto queues = CreateTaskQueues(2u);
3170
3171 QuadraticTask quadratic_immediate_task(queues[0]->task_runner(), TimeDelta(),
3172 this);
3173 LinearTask linear_delayed_task(queues[1]->task_runner(), Milliseconds(10),
3174 this);
3175 RepeatingCallback<bool()> should_exit = BindRepeating(
3176 &ShouldExit, &quadratic_immediate_task, &linear_delayed_task);
3177
3178 quadratic_immediate_task.SetShouldExit(should_exit);
3179 linear_delayed_task.SetShouldExit(should_exit);
3180
3181 quadratic_immediate_task.Run();
3182 linear_delayed_task.Run();
3183
3184 FastForwardUntilNoTasksRemain();
3185
3186 double ratio = static_cast<double>(linear_delayed_task.Count()) /
3187 static_cast<double>(quadratic_immediate_task.Count());
3188
3189 // This is by design, we want to enforce a strict ordering in task execution
3190 // where by delayed tasks can not skip ahead of non-delayed work.
3191 EXPECT_GT(ratio, 0.0);
3192 EXPECT_LT(ratio, 0.1);
3193 }
3194
TEST_P(SequenceManagerTest,CurrentlyExecutingTaskQueue_NoTaskRunning)3195 TEST_P(SequenceManagerTest, CurrentlyExecutingTaskQueue_NoTaskRunning) {
3196 auto queue = CreateTaskQueue();
3197
3198 EXPECT_EQ(nullptr, sequence_manager()->currently_executing_task_queue());
3199 }
3200
3201 namespace {
CurrentlyExecutingTaskQueueTestTask(SequenceManagerImpl * sequence_manager,std::vector<internal::TaskQueueImpl * > * task_sources)3202 void CurrentlyExecutingTaskQueueTestTask(
3203 SequenceManagerImpl* sequence_manager,
3204 std::vector<internal::TaskQueueImpl*>* task_sources) {
3205 task_sources->push_back(sequence_manager->currently_executing_task_queue());
3206 }
3207 } // namespace
3208
TEST_P(SequenceManagerTest,CurrentlyExecutingTaskQueue_TaskRunning)3209 TEST_P(SequenceManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) {
3210 auto queues = CreateTaskQueues(2u);
3211
3212 TaskQueue* queue0 = queues[0].get();
3213 TaskQueue* queue1 = queues[1].get();
3214
3215 std::vector<internal::TaskQueueImpl*> task_sources;
3216 queue0->task_runner()->PostTask(FROM_HERE,
3217 BindOnce(&CurrentlyExecutingTaskQueueTestTask,
3218 sequence_manager(), &task_sources));
3219 queue1->task_runner()->PostTask(FROM_HERE,
3220 BindOnce(&CurrentlyExecutingTaskQueueTestTask,
3221 sequence_manager(), &task_sources));
3222 RunLoop().RunUntilIdle();
3223
3224 EXPECT_THAT(task_sources,
3225 ElementsAre(GetTaskQueueImpl(queue0), GetTaskQueueImpl(queue1)));
3226 EXPECT_EQ(nullptr, sequence_manager()->currently_executing_task_queue());
3227 }
3228
3229 namespace {
RunloopCurrentlyExecutingTaskQueueTestTask(SequenceManagerImpl * sequence_manager,std::vector<internal::TaskQueueImpl * > * task_sources,std::vector<std::pair<OnceClosure,TaskQueue * >> * tasks)3230 void RunloopCurrentlyExecutingTaskQueueTestTask(
3231 SequenceManagerImpl* sequence_manager,
3232 std::vector<internal::TaskQueueImpl*>* task_sources,
3233 std::vector<std::pair<OnceClosure, TaskQueue*>>* tasks) {
3234 task_sources->push_back(sequence_manager->currently_executing_task_queue());
3235
3236 for (std::pair<OnceClosure, TaskQueue*>& pair : *tasks) {
3237 pair.second->task_runner()->PostTask(FROM_HERE, std::move(pair.first));
3238 }
3239
3240 RunLoop(RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
3241 task_sources->push_back(sequence_manager->currently_executing_task_queue());
3242 }
3243 } // namespace
3244
TEST_P(SequenceManagerTest,CurrentlyExecutingTaskQueue_NestedLoop)3245 TEST_P(SequenceManagerTest, CurrentlyExecutingTaskQueue_NestedLoop) {
3246 auto queues = CreateTaskQueues(3u);
3247
3248 TaskQueue* queue0 = queues[0].get();
3249 TaskQueue* queue1 = queues[1].get();
3250 TaskQueue* queue2 = queues[2].get();
3251
3252 std::vector<internal::TaskQueueImpl*> task_sources;
3253 std::vector<std::pair<OnceClosure, TaskQueue*>>
3254 tasks_to_post_from_nested_loop;
3255 tasks_to_post_from_nested_loop.push_back(
3256 std::make_pair(BindOnce(&CurrentlyExecutingTaskQueueTestTask,
3257 sequence_manager(), &task_sources),
3258 queue1));
3259 tasks_to_post_from_nested_loop.push_back(
3260 std::make_pair(BindOnce(&CurrentlyExecutingTaskQueueTestTask,
3261 sequence_manager(), &task_sources),
3262 queue2));
3263
3264 queue0->task_runner()->PostTask(
3265 FROM_HERE,
3266 BindOnce(&RunloopCurrentlyExecutingTaskQueueTestTask, sequence_manager(),
3267 &task_sources, &tasks_to_post_from_nested_loop));
3268
3269 RunLoop().RunUntilIdle();
3270 EXPECT_THAT(
3271 task_sources,
3272 UnorderedElementsAre(GetTaskQueueImpl(queue0), GetTaskQueueImpl(queue1),
3273 GetTaskQueueImpl(queue2), GetTaskQueueImpl(queue0)));
3274 EXPECT_EQ(nullptr, sequence_manager()->currently_executing_task_queue());
3275 }
3276
TEST_P(SequenceManagerTest,NoWakeUpsForCanceledDelayedTasks)3277 TEST_P(SequenceManagerTest, NoWakeUpsForCanceledDelayedTasks) {
3278 auto queue = CreateTaskQueue();
3279
3280 TimeTicks start_time = sequence_manager()->NowTicks();
3281
3282 CancelableTask task1(mock_tick_clock());
3283 CancelableTask task2(mock_tick_clock());
3284 CancelableTask task3(mock_tick_clock());
3285 CancelableTask task4(mock_tick_clock());
3286 TimeDelta delay1(Seconds(5));
3287 TimeDelta delay2(Seconds(10));
3288 TimeDelta delay3(Seconds(15));
3289 TimeDelta delay4(Seconds(30));
3290 std::vector<TimeTicks> run_times;
3291 queue->task_runner()->PostDelayedTask(
3292 FROM_HERE,
3293 BindOnce(&CancelableTask::RecordTimeTask,
3294 task1.weak_factory_.GetWeakPtr(), &run_times),
3295 delay1);
3296 queue->task_runner()->PostDelayedTask(
3297 FROM_HERE,
3298 BindOnce(&CancelableTask::RecordTimeTask,
3299 task2.weak_factory_.GetWeakPtr(), &run_times),
3300 delay2);
3301 queue->task_runner()->PostDelayedTask(
3302 FROM_HERE,
3303 BindOnce(&CancelableTask::RecordTimeTask,
3304 task3.weak_factory_.GetWeakPtr(), &run_times),
3305 delay3);
3306 queue->task_runner()->PostDelayedTask(
3307 FROM_HERE,
3308 BindOnce(&CancelableTask::RecordTimeTask,
3309 task4.weak_factory_.GetWeakPtr(), &run_times),
3310 delay4);
3311
3312 task2.weak_factory_.InvalidateWeakPtrs();
3313 task3.weak_factory_.InvalidateWeakPtrs();
3314
3315 std::set<TimeTicks> wake_up_times;
3316
3317 RunUntilManagerIsIdle(BindRepeating(
3318 [](std::set<TimeTicks>* wake_up_times, const TickClock* clock) {
3319 wake_up_times->insert(clock->NowTicks());
3320 },
3321 &wake_up_times, mock_tick_clock()));
3322
3323 EXPECT_THAT(wake_up_times,
3324 ElementsAre(start_time + delay1, start_time + delay4));
3325 EXPECT_THAT(run_times, ElementsAre(start_time + delay1, start_time + delay4));
3326 }
3327
TEST_P(SequenceManagerTest,NoWakeUpsForCanceledDelayedTasksReversePostOrder)3328 TEST_P(SequenceManagerTest, NoWakeUpsForCanceledDelayedTasksReversePostOrder) {
3329 auto queue = CreateTaskQueue();
3330
3331 TimeTicks start_time = sequence_manager()->NowTicks();
3332
3333 CancelableTask task1(mock_tick_clock());
3334 CancelableTask task2(mock_tick_clock());
3335 CancelableTask task3(mock_tick_clock());
3336 CancelableTask task4(mock_tick_clock());
3337 TimeDelta delay1(Seconds(5));
3338 TimeDelta delay2(Seconds(10));
3339 TimeDelta delay3(Seconds(15));
3340 TimeDelta delay4(Seconds(30));
3341 std::vector<TimeTicks> run_times;
3342 queue->task_runner()->PostDelayedTask(
3343 FROM_HERE,
3344 BindOnce(&CancelableTask::RecordTimeTask,
3345 task4.weak_factory_.GetWeakPtr(), &run_times),
3346 delay4);
3347 queue->task_runner()->PostDelayedTask(
3348 FROM_HERE,
3349 BindOnce(&CancelableTask::RecordTimeTask,
3350 task3.weak_factory_.GetWeakPtr(), &run_times),
3351 delay3);
3352 queue->task_runner()->PostDelayedTask(
3353 FROM_HERE,
3354 BindOnce(&CancelableTask::RecordTimeTask,
3355 task2.weak_factory_.GetWeakPtr(), &run_times),
3356 delay2);
3357 queue->task_runner()->PostDelayedTask(
3358 FROM_HERE,
3359 BindOnce(&CancelableTask::RecordTimeTask,
3360 task1.weak_factory_.GetWeakPtr(), &run_times),
3361 delay1);
3362
3363 task2.weak_factory_.InvalidateWeakPtrs();
3364 task3.weak_factory_.InvalidateWeakPtrs();
3365
3366 std::set<TimeTicks> wake_up_times;
3367
3368 RunUntilManagerIsIdle(BindRepeating(
3369 [](std::set<TimeTicks>* wake_up_times, const TickClock* clock) {
3370 wake_up_times->insert(clock->NowTicks());
3371 },
3372 &wake_up_times, mock_tick_clock()));
3373
3374 EXPECT_THAT(wake_up_times,
3375 ElementsAre(start_time + delay1, start_time + delay4));
3376 EXPECT_THAT(run_times, ElementsAre(start_time + delay1, start_time + delay4));
3377 }
3378
TEST_P(SequenceManagerTest,TimeDomainWakeUpOnlyCancelledIfAllUsesCancelled)3379 TEST_P(SequenceManagerTest, TimeDomainWakeUpOnlyCancelledIfAllUsesCancelled) {
3380 auto queue = CreateTaskQueue();
3381
3382 TimeTicks start_time = sequence_manager()->NowTicks();
3383
3384 CancelableTask task1(mock_tick_clock());
3385 CancelableTask task2(mock_tick_clock());
3386 CancelableTask task3(mock_tick_clock());
3387 CancelableTask task4(mock_tick_clock());
3388 TimeDelta delay1(Seconds(5));
3389 TimeDelta delay2(Seconds(10));
3390 TimeDelta delay3(Seconds(15));
3391 TimeDelta delay4(Seconds(30));
3392 std::vector<TimeTicks> run_times;
3393 queue->task_runner()->PostDelayedTask(
3394 FROM_HERE,
3395 BindOnce(&CancelableTask::RecordTimeTask,
3396 task1.weak_factory_.GetWeakPtr(), &run_times),
3397 delay1);
3398 queue->task_runner()->PostDelayedTask(
3399 FROM_HERE,
3400 BindOnce(&CancelableTask::RecordTimeTask,
3401 task2.weak_factory_.GetWeakPtr(), &run_times),
3402 delay2);
3403 queue->task_runner()->PostDelayedTask(
3404 FROM_HERE,
3405 BindOnce(&CancelableTask::RecordTimeTask,
3406 task3.weak_factory_.GetWeakPtr(), &run_times),
3407 delay3);
3408 queue->task_runner()->PostDelayedTask(
3409 FROM_HERE,
3410 BindOnce(&CancelableTask::RecordTimeTask,
3411 task4.weak_factory_.GetWeakPtr(), &run_times),
3412 delay4);
3413
3414 // Post a non-canceled task with |delay3|. So we should still get a wake-up at
3415 // |delay3| even though we cancel |task3|.
3416 queue->task_runner()->PostDelayedTask(
3417 FROM_HERE,
3418 BindOnce(&CancelableTask::RecordTimeTask, Unretained(&task3), &run_times),
3419 delay3);
3420
3421 task2.weak_factory_.InvalidateWeakPtrs();
3422 task3.weak_factory_.InvalidateWeakPtrs();
3423 task1.weak_factory_.InvalidateWeakPtrs();
3424
3425 std::set<TimeTicks> wake_up_times;
3426
3427 RunUntilManagerIsIdle(BindRepeating(
3428 [](std::set<TimeTicks>* wake_up_times, const TickClock* clock) {
3429 wake_up_times->insert(clock->NowTicks());
3430 },
3431 &wake_up_times, mock_tick_clock()));
3432
3433 EXPECT_THAT(wake_up_times,
3434 ElementsAre(start_time + delay1, start_time + delay3,
3435 start_time + delay4));
3436
3437 EXPECT_THAT(run_times, ElementsAre(start_time + delay3, start_time + delay4));
3438 }
3439
TEST_P(SequenceManagerTest,SweepCanceledDelayedTasks)3440 TEST_P(SequenceManagerTest, SweepCanceledDelayedTasks) {
3441 auto queue = CreateTaskQueue();
3442
3443 CancelableTask task1(mock_tick_clock());
3444 CancelableTask task2(mock_tick_clock());
3445 CancelableTask task3(mock_tick_clock());
3446 CancelableTask task4(mock_tick_clock());
3447 TimeDelta delay1(Seconds(5));
3448 TimeDelta delay2(Seconds(10));
3449 TimeDelta delay3(Seconds(15));
3450 TimeDelta delay4(Seconds(30));
3451 std::vector<TimeTicks> run_times;
3452 queue->task_runner()->PostDelayedTask(
3453 FROM_HERE,
3454 BindOnce(&CancelableTask::RecordTimeTask,
3455 task1.weak_factory_.GetWeakPtr(), &run_times),
3456 delay1);
3457 queue->task_runner()->PostDelayedTask(
3458 FROM_HERE,
3459 BindOnce(&CancelableTask::RecordTimeTask,
3460 task2.weak_factory_.GetWeakPtr(), &run_times),
3461 delay2);
3462 queue->task_runner()->PostDelayedTask(
3463 FROM_HERE,
3464 BindOnce(&CancelableTask::RecordTimeTask,
3465 task3.weak_factory_.GetWeakPtr(), &run_times),
3466 delay3);
3467 queue->task_runner()->PostDelayedTask(
3468 FROM_HERE,
3469 BindOnce(&CancelableTask::RecordTimeTask,
3470 task4.weak_factory_.GetWeakPtr(), &run_times),
3471 delay4);
3472
3473 EXPECT_EQ(4u, queue->GetNumberOfPendingTasks());
3474 task2.weak_factory_.InvalidateWeakPtrs();
3475 task3.weak_factory_.InvalidateWeakPtrs();
3476 EXPECT_EQ(4u, queue->GetNumberOfPendingTasks());
3477
3478 sequence_manager()->ReclaimMemory();
3479 EXPECT_EQ(2u, queue->GetNumberOfPendingTasks());
3480
3481 task1.weak_factory_.InvalidateWeakPtrs();
3482 task4.weak_factory_.InvalidateWeakPtrs();
3483
3484 sequence_manager()->ReclaimMemory();
3485 EXPECT_EQ(0u, queue->GetNumberOfPendingTasks());
3486 }
3487
TEST_P(SequenceManagerTest,SweepCanceledDelayedTasks_ManyTasks)3488 TEST_P(SequenceManagerTest, SweepCanceledDelayedTasks_ManyTasks) {
3489 auto queue = CreateTaskQueue();
3490
3491 constexpr const int kNumTasks = 100;
3492
3493 std::vector<std::unique_ptr<CancelableTask>> tasks(100);
3494 std::vector<TimeTicks> run_times;
3495 for (int i = 0; i < kNumTasks; i++) {
3496 tasks[i] = std::make_unique<CancelableTask>(mock_tick_clock());
3497 queue->task_runner()->PostDelayedTask(
3498 FROM_HERE,
3499 BindOnce(&CancelableTask::RecordTimeTask,
3500 tasks[i]->weak_factory_.GetWeakPtr(), &run_times),
3501 Seconds(i + 1));
3502 }
3503
3504 // Invalidate ever other timer.
3505 for (int i = 0; i < kNumTasks; i++) {
3506 if (i % 2)
3507 tasks[i]->weak_factory_.InvalidateWeakPtrs();
3508 }
3509
3510 sequence_manager()->ReclaimMemory();
3511 EXPECT_EQ(50u, queue->GetNumberOfPendingTasks());
3512
3513 // Make sure the priority queue still operates as expected.
3514 FastForwardUntilNoTasksRemain();
3515 ASSERT_EQ(50u, run_times.size());
3516 for (int i = 0; i < 50; i++) {
3517 TimeTicks expected_run_time = FromStartAligned(Seconds(2 * i + 1));
3518 EXPECT_EQ(run_times[i], expected_run_time);
3519 }
3520 }
3521
TEST_P(SequenceManagerTest,DelayedTasksNotSelected)3522 TEST_P(SequenceManagerTest, DelayedTasksNotSelected) {
3523 auto queue = CreateTaskQueue();
3524 constexpr TimeDelta kDelay(Milliseconds(10));
3525 LazyNow lazy_now(mock_tick_clock());
3526 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3527 EXPECT_EQ(
3528 absl::nullopt,
3529 sequence_manager()->GetPendingWakeUp(
3530 &lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3531
3532 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), kDelay);
3533
3534 // No task should be ready to execute.
3535 EXPECT_FALSE(sequence_manager()->SelectNextTask(
3536 lazy_now, SequencedTaskSource::SelectTaskOption::kDefault));
3537 EXPECT_FALSE(sequence_manager()->SelectNextTask(
3538 lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3539
3540 EXPECT_EQ((WakeUp{lazy_now.Now() + kDelay, kLeeway}),
3541 sequence_manager()->GetPendingWakeUp(&lazy_now));
3542 EXPECT_EQ(
3543 absl::nullopt,
3544 sequence_manager()->GetPendingWakeUp(
3545 &lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3546
3547 AdvanceMockTickClock(kDelay);
3548 LazyNow lazy_now2(mock_tick_clock());
3549
3550 // Delayed task is ready to be executed. Consider it only if not in power
3551 // suspend state.
3552 EXPECT_FALSE(sequence_manager()->SelectNextTask(
3553 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3554 EXPECT_EQ(
3555 absl::nullopt,
3556 sequence_manager()->GetPendingWakeUp(
3557 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3558
3559 // Execute the delayed task.
3560 EXPECT_TRUE(sequence_manager()->SelectNextTask(
3561 lazy_now2, SequencedTaskSource::SelectTaskOption::kDefault));
3562 sequence_manager()->DidRunTask(lazy_now2);
3563 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now2));
3564 }
3565
TEST_P(SequenceManagerTest,DelayedTasksNotSelectedWithImmediateTask)3566 TEST_P(SequenceManagerTest, DelayedTasksNotSelectedWithImmediateTask) {
3567 auto queue = CreateTaskQueue();
3568 constexpr TimeDelta kDelay(Milliseconds(10));
3569 LazyNow lazy_now(mock_tick_clock());
3570
3571 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3572 EXPECT_EQ(
3573 absl::nullopt,
3574 sequence_manager()->GetPendingWakeUp(
3575 &lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3576
3577 // Post an immediate task.
3578 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3579 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), kDelay);
3580
3581 EXPECT_EQ(WakeUp{}, sequence_manager()->GetPendingWakeUp(&lazy_now));
3582 EXPECT_EQ(
3583 WakeUp{},
3584 sequence_manager()->GetPendingWakeUp(
3585 &lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3586
3587 AdvanceMockTickClock(kDelay);
3588 LazyNow lazy_now2(mock_tick_clock());
3589
3590 // An immediate task is present, even if we skip the delayed tasks.
3591 EXPECT_EQ(
3592 WakeUp{},
3593 sequence_manager()->GetPendingWakeUp(
3594 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3595
3596 // Immediate task should be ready to execute, execute it.
3597 EXPECT_TRUE(sequence_manager()->SelectNextTask(
3598 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3599 sequence_manager()->DidRunTask(lazy_now);
3600
3601 // Delayed task is ready to be executed. Consider it only if not in power
3602 // suspend state. This test differs from
3603 // SequenceManagerTest.DelayedTasksNotSelected as it confirms that delayed
3604 // tasks are ignored even if they're already in the ready queue (per having
3605 // performed task selection already before running the immediate task above).
3606 EXPECT_FALSE(sequence_manager()->SelectNextTask(
3607 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3608 EXPECT_EQ(
3609 absl::nullopt,
3610 sequence_manager()->GetPendingWakeUp(
3611 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3612
3613 // Execute the delayed task.
3614 EXPECT_TRUE(sequence_manager()->SelectNextTask(
3615 lazy_now2, SequencedTaskSource::SelectTaskOption::kDefault));
3616 EXPECT_EQ(
3617 absl::nullopt,
3618 sequence_manager()->GetPendingWakeUp(
3619 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3620 sequence_manager()->DidRunTask(lazy_now2);
3621 }
3622
TEST_P(SequenceManagerTest,DelayedTasksNotSelectedWithImmediateTaskWithPriority)3623 TEST_P(SequenceManagerTest,
3624 DelayedTasksNotSelectedWithImmediateTaskWithPriority) {
3625 auto queues = CreateTaskQueues(4u);
3626 queues[0]->SetQueuePriority(TestQueuePriority::kLowPriority);
3627 queues[1]->SetQueuePriority(TestQueuePriority::kNormalPriority);
3628 queues[2]->SetQueuePriority(TestQueuePriority::kHighPriority);
3629 queues[3]->SetQueuePriority(TestQueuePriority::kVeryHighPriority);
3630
3631 // Post immediate tasks.
3632 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3633 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3634
3635 // Post delayed tasks.
3636 constexpr TimeDelta kDelay(Milliseconds(10));
3637 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3638 kDelay);
3639 queues[3]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3640 kDelay);
3641
3642 LazyNow lazy_now(mock_tick_clock());
3643
3644 EXPECT_EQ(
3645 WakeUp{},
3646 sequence_manager()->GetPendingWakeUp(
3647 &lazy_now, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3648
3649 AdvanceMockTickClock(kDelay);
3650 LazyNow lazy_now2(mock_tick_clock());
3651
3652 EXPECT_EQ(
3653 WakeUp{},
3654 sequence_manager()->GetPendingWakeUp(
3655 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3656
3657 // Immediate tasks should be ready to execute, execute them.
3658 EXPECT_TRUE(sequence_manager()->SelectNextTask(
3659 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3660 sequence_manager()->DidRunTask(lazy_now2);
3661 EXPECT_TRUE(sequence_manager()->SelectNextTask(
3662 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3663 sequence_manager()->DidRunTask(lazy_now2);
3664
3665 // No immediate tasks can be executed anymore.
3666 EXPECT_FALSE(sequence_manager()->SelectNextTask(
3667 lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3668 EXPECT_EQ(
3669 absl::nullopt,
3670 sequence_manager()->GetPendingWakeUp(
3671 &lazy_now2, SequencedTaskSource::SelectTaskOption::kSkipDelayedTask));
3672
3673 // Execute delayed tasks.
3674 EXPECT_TRUE(sequence_manager()->SelectNextTask(lazy_now2));
3675 sequence_manager()->DidRunTask(lazy_now2);
3676 EXPECT_TRUE(sequence_manager()->SelectNextTask(lazy_now2));
3677 sequence_manager()->DidRunTask(lazy_now2);
3678
3679 // No delayed tasks can be executed anymore.
3680 EXPECT_FALSE(sequence_manager()->SelectNextTask(lazy_now2));
3681 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now2));
3682 }
3683
TEST_P(SequenceManagerTest,GetPendingWakeUp)3684 TEST_P(SequenceManagerTest, GetPendingWakeUp) {
3685 auto queues = CreateTaskQueues(2u);
3686
3687 LazyNow lazy_now(mock_tick_clock());
3688 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3689
3690 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3691 Seconds(10));
3692
3693 EXPECT_EQ((WakeUp{lazy_now.Now() + Seconds(10), kLeeway}),
3694 sequence_manager()->GetPendingWakeUp(&lazy_now));
3695
3696 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3697 Seconds(15));
3698
3699 EXPECT_EQ((WakeUp{lazy_now.Now() + Seconds(10), kLeeway}),
3700 sequence_manager()->GetPendingWakeUp(&lazy_now));
3701
3702 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3703 Seconds(5));
3704
3705 EXPECT_EQ((WakeUp{lazy_now.Now() + Seconds(5), kLeeway}),
3706 sequence_manager()->GetPendingWakeUp(&lazy_now));
3707
3708 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3709
3710 EXPECT_EQ(WakeUp{}, sequence_manager()->GetPendingWakeUp(&lazy_now));
3711 }
3712
TEST_P(SequenceManagerTest,GetPendingWakeUp_Disabled)3713 TEST_P(SequenceManagerTest, GetPendingWakeUp_Disabled) {
3714 auto queue = CreateTaskQueue();
3715
3716 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
3717 queue->CreateQueueEnabledVoter();
3718 voter->SetVoteToEnable(false);
3719 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3720
3721 LazyNow lazy_now(mock_tick_clock());
3722 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3723 }
3724
TEST_P(SequenceManagerTest,GetPendingWakeUp_Fence)3725 TEST_P(SequenceManagerTest, GetPendingWakeUp_Fence) {
3726 auto queue = CreateTaskQueue();
3727
3728 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3729 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3730
3731 LazyNow lazy_now(mock_tick_clock());
3732 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3733 }
3734
TEST_P(SequenceManagerTest,GetPendingWakeUp_FenceUnblocking)3735 TEST_P(SequenceManagerTest, GetPendingWakeUp_FenceUnblocking) {
3736 auto queue = CreateTaskQueue();
3737
3738 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3739 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3740 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3741
3742 LazyNow lazy_now(mock_tick_clock());
3743 EXPECT_EQ(WakeUp{}, sequence_manager()->GetPendingWakeUp(&lazy_now));
3744 }
3745
TEST_P(SequenceManagerTest,GetPendingWakeUp_DelayedTaskReady)3746 TEST_P(SequenceManagerTest, GetPendingWakeUp_DelayedTaskReady) {
3747 auto queue = CreateTaskQueue();
3748
3749 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3750 Seconds(1));
3751
3752 AdvanceMockTickClock(Seconds(10));
3753
3754 LazyNow lazy_now(mock_tick_clock());
3755 EXPECT_EQ(WakeUp{}, sequence_manager()->GetPendingWakeUp(&lazy_now));
3756 }
3757
TEST_P(SequenceManagerTest,RemoveAllCanceledDelayedTasksFromFront)3758 TEST_P(SequenceManagerTest, RemoveAllCanceledDelayedTasksFromFront) {
3759 auto queue = CreateTaskQueue();
3760
3761 // Posts a cancelable task.
3762 CancelableOnceClosure cancelable_closure(base::BindOnce(&NopTask));
3763 constexpr TimeDelta kDelay = Seconds(1);
3764 queue->task_runner()->PostDelayedTask(FROM_HERE,
3765 cancelable_closure.callback(), kDelay);
3766
3767 // Ensure it is picked to calculate the next task time.
3768 LazyNow lazy_now(mock_tick_clock());
3769 EXPECT_EQ((WakeUp{lazy_now.Now() + kDelay, kLeeway}),
3770 sequence_manager()->GetPendingWakeUp(&lazy_now));
3771
3772 // Canceling the task is not sufficient to ensure it is not considered for the
3773 // next task time.
3774 cancelable_closure.Cancel();
3775 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3776 }
3777
TEST_P(SequenceManagerTest,RemoveAllCanceledDelayedTasksFromFront_MultipleQueues)3778 TEST_P(SequenceManagerTest,
3779 RemoveAllCanceledDelayedTasksFromFront_MultipleQueues) {
3780 auto queues = CreateTaskQueues(2u);
3781
3782 // Post a task in each queue such that they would be executed in order
3783 // according to their delay.
3784 CancelableOnceClosure cancelable_closure_1(base::BindOnce(&NopTask));
3785 constexpr TimeDelta kDelay1 = Seconds(1);
3786 queues[0]->task_runner()->PostDelayedTask(
3787 FROM_HERE, cancelable_closure_1.callback(), kDelay1);
3788
3789 CancelableOnceClosure cancelable_closure_2(base::BindOnce(&NopTask));
3790 constexpr TimeDelta kDelay2 = Seconds(2);
3791 queues[1]->task_runner()->PostDelayedTask(
3792 FROM_HERE, cancelable_closure_2.callback(), kDelay2);
3793
3794 // The task from the first queue is picked to calculate the next task time.
3795 LazyNow lazy_now(mock_tick_clock());
3796 EXPECT_EQ((WakeUp{lazy_now.Now() + kDelay1, kLeeway}),
3797 sequence_manager()->GetPendingWakeUp(&lazy_now));
3798
3799 // Test that calling `GetPendingWakeUp()` works when no task is canceled.
3800 EXPECT_EQ((WakeUp{lazy_now.Now() + kDelay1, kLeeway}),
3801 sequence_manager()->GetPendingWakeUp(&lazy_now));
3802
3803 // Canceling the first task which comes from the first queue.
3804 cancelable_closure_1.Cancel();
3805
3806 // Now the only task remaining is the one from the second queue.
3807 EXPECT_EQ((WakeUp{lazy_now.Now() + kDelay2, kLeeway}),
3808 sequence_manager()->GetPendingWakeUp(&lazy_now));
3809
3810 // Cancel the remaining task.
3811 cancelable_closure_2.Cancel();
3812
3813 // No more valid tasks in any queues.
3814 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3815
3816 // Test that calling `GetPendingWakeUp()` works when no task is canceled.
3817 EXPECT_EQ(absl::nullopt, sequence_manager()->GetPendingWakeUp(&lazy_now));
3818 }
3819
3820 namespace {
MessageLoopTaskWithDelayedQuit(Fixture * fixture,TaskQueue * task_queue)3821 void MessageLoopTaskWithDelayedQuit(Fixture* fixture, TaskQueue* task_queue) {
3822 RunLoop run_loop(RunLoop::Type::kNestableTasksAllowed);
3823 task_queue->task_runner()->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(),
3824 Milliseconds(100));
3825 fixture->AdvanceMockTickClock(Milliseconds(200));
3826 run_loop.Run();
3827 }
3828 } // namespace
3829
TEST_P(SequenceManagerTest,DelayedTaskRunsInNestedMessageLoop)3830 TEST_P(SequenceManagerTest, DelayedTaskRunsInNestedMessageLoop) {
3831 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
3832 return;
3833 auto queue = CreateTaskQueue();
3834 RunLoop run_loop;
3835 queue->task_runner()->PostTask(
3836 FROM_HERE,
3837 BindOnce(&MessageLoopTaskWithDelayedQuit, this, Unretained(queue.get())));
3838 run_loop.RunUntilIdle();
3839 }
3840
3841 namespace {
MessageLoopTaskWithImmediateQuit(OnceClosure non_nested_quit_closure,TaskQueue * task_queue)3842 void MessageLoopTaskWithImmediateQuit(OnceClosure non_nested_quit_closure,
3843 TaskQueue* task_queue) {
3844 RunLoop run_loop(RunLoop::Type::kNestableTasksAllowed);
3845 // Needed because entering the nested run loop causes a DoWork to get
3846 // posted.
3847 task_queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3848 task_queue->task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
3849 run_loop.Run();
3850 std::move(non_nested_quit_closure).Run();
3851 }
3852 } // namespace
3853
TEST_P(SequenceManagerTest,DelayedNestedMessageLoopDoesntPreventTasksRunning)3854 TEST_P(SequenceManagerTest, DelayedNestedMessageLoopDoesntPreventTasksRunning) {
3855 if (GetUnderlyingRunnerType() == RunnerType::kMockTaskRunner)
3856 return;
3857 auto queue = CreateTaskQueue();
3858 RunLoop run_loop;
3859 queue->task_runner()->PostDelayedTask(
3860 FROM_HERE,
3861 BindOnce(&MessageLoopTaskWithImmediateQuit, run_loop.QuitClosure(),
3862 Unretained(queue.get())),
3863 Milliseconds(100));
3864
3865 AdvanceMockTickClock(Milliseconds(200));
3866 run_loop.Run();
3867 }
3868
TEST_P(SequenceManagerTest,CouldTaskRun_DisableAndReenable)3869 TEST_P(SequenceManagerTest, CouldTaskRun_DisableAndReenable) {
3870 auto queue = CreateTaskQueue();
3871
3872 EnqueueOrder enqueue_order = sequence_manager()->GetNextSequenceNumber();
3873 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3874
3875 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
3876 queue->CreateQueueEnabledVoter();
3877 voter->SetVoteToEnable(false);
3878 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3879
3880 voter->SetVoteToEnable(true);
3881 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3882 }
3883
TEST_P(SequenceManagerTest,CouldTaskRun_Fence)3884 TEST_P(SequenceManagerTest, CouldTaskRun_Fence) {
3885 auto queue = CreateTaskQueue();
3886
3887 EnqueueOrder enqueue_order = sequence_manager()->GetNextSequenceNumber();
3888 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3889
3890 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3891 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3892
3893 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
3894 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3895
3896 queue->RemoveFence();
3897 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3898 }
3899
TEST_P(SequenceManagerTest,CouldTaskRun_FenceBeforeThenAfter)3900 TEST_P(SequenceManagerTest, CouldTaskRun_FenceBeforeThenAfter) {
3901 auto queue = CreateTaskQueue();
3902
3903 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3904
3905 EnqueueOrder enqueue_order = sequence_manager()->GetNextSequenceNumber();
3906 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3907
3908 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
3909 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->CouldTaskRun(enqueue_order));
3910 }
3911
TEST_P(SequenceManagerTest,DelayedDoWorkNotPostedForDisabledQueue)3912 TEST_P(SequenceManagerTest, DelayedDoWorkNotPostedForDisabledQueue) {
3913 auto queue = CreateTaskQueue();
3914
3915 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3916 Milliseconds(1));
3917 EXPECT_EQ(FromStartAligned(Milliseconds(1)), NextPendingTaskTime());
3918
3919 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
3920 queue->CreateQueueEnabledVoter();
3921 voter->SetVoteToEnable(false);
3922
3923 EXPECT_EQ(TimeTicks::Max(), NextPendingTaskTime());
3924
3925 voter->SetVoteToEnable(true);
3926 EXPECT_EQ(FromStartAligned(Milliseconds(1)), NextPendingTaskTime());
3927 }
3928
TEST_P(SequenceManagerTest,DisablingQueuesChangesDelayTillNextDoWork)3929 TEST_P(SequenceManagerTest, DisablingQueuesChangesDelayTillNextDoWork) {
3930 auto queues = CreateTaskQueues(3u);
3931 queues[0]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3932 Milliseconds(1));
3933 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3934 Milliseconds(10));
3935 queues[2]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
3936 Milliseconds(100));
3937
3938 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter0 =
3939 queues[0]->CreateQueueEnabledVoter();
3940 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter1 =
3941 queues[1]->CreateQueueEnabledVoter();
3942 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 =
3943 queues[2]->CreateQueueEnabledVoter();
3944
3945 EXPECT_EQ(FromStartAligned(Milliseconds(1)), NextPendingTaskTime());
3946
3947 voter0->SetVoteToEnable(false);
3948 EXPECT_EQ(FromStartAligned(Milliseconds(10)), NextPendingTaskTime());
3949
3950 voter1->SetVoteToEnable(false);
3951 EXPECT_EQ(FromStartAligned(Milliseconds(100)), NextPendingTaskTime());
3952
3953 voter2->SetVoteToEnable(false);
3954 EXPECT_EQ(TimeTicks::Max(), NextPendingTaskTime());
3955 }
3956
TEST_P(SequenceManagerTest,GetNextDesiredWakeUp)3957 TEST_P(SequenceManagerTest, GetNextDesiredWakeUp) {
3958 auto queue = CreateTaskQueue();
3959
3960 EXPECT_EQ(absl::nullopt, queue->GetNextDesiredWakeUp());
3961
3962 TimeTicks start_time = sequence_manager()->NowTicks();
3963 TimeDelta delay1 = Milliseconds(10);
3964 TimeDelta delay2 = Milliseconds(2);
3965
3966 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay1);
3967 EXPECT_EQ(start_time + delay1, queue->GetNextDesiredWakeUp()->time);
3968
3969 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay2);
3970 EXPECT_EQ(start_time + delay2, queue->GetNextDesiredWakeUp()->time);
3971
3972 // We don't have wake-ups scheduled for disabled queues.
3973 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
3974 queue->CreateQueueEnabledVoter();
3975 voter->SetVoteToEnable(false);
3976 EXPECT_EQ(absl::nullopt, queue->GetNextDesiredWakeUp());
3977
3978 voter->SetVoteToEnable(true);
3979 EXPECT_EQ(start_time + delay2, queue->GetNextDesiredWakeUp()->time);
3980
3981 // Immediate tasks shouldn't make any difference.
3982 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
3983 EXPECT_EQ(start_time + delay2, queue->GetNextDesiredWakeUp()->time);
3984
3985 // Neither should fences.
3986 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
3987 EXPECT_EQ(start_time + delay2, queue->GetNextDesiredWakeUp()->time);
3988 }
3989
TEST_P(SequenceManagerTest,SetTimeDomainForDisabledQueue)3990 TEST_P(SequenceManagerTest, SetTimeDomainForDisabledQueue) {
3991 StrictMock<MockTaskQueueThrottler> throttler;
3992 auto queue = CreateTaskQueue();
3993 queue->SetThrottler(&throttler);
3994
3995 TimeTicks start_time = sequence_manager()->NowTicks();
3996 TimeDelta delay(Milliseconds(1));
3997
3998 EXPECT_CALL(throttler,
3999 GetNextAllowedWakeUp_DesiredWakeUpTime(start_time + delay));
4000 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask), delay);
4001 Mock::VerifyAndClearExpectations(&throttler);
4002
4003 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
4004 queue->CreateQueueEnabledVoter();
4005 voter->SetVoteToEnable(false);
4006
4007 // We should not get a notification for a disabled queue.
4008 std::unique_ptr<MockTimeDomain> domain =
4009 std::make_unique<MockTimeDomain>(sequence_manager()->NowTicks());
4010 sequence_manager()->SetTimeDomain(domain.get());
4011
4012 // Tidy up.
4013 queue.reset();
4014 sequence_manager()->ResetTimeDomain();
4015 }
4016
4017 namespace {
SetOnTaskHandlers(TaskQueue * task_queue,int * start_counter,int * complete_counter)4018 void SetOnTaskHandlers(TaskQueue* task_queue,
4019 int* start_counter,
4020 int* complete_counter) {
4021 GetTaskQueueImpl(task_queue)
4022 ->SetOnTaskStartedHandler(BindRepeating(
4023 [](int* counter, const Task& task,
4024 const TaskQueue::TaskTiming& task_timing) { ++(*counter); },
4025 start_counter));
4026 GetTaskQueueImpl(task_queue)
4027 ->SetOnTaskCompletedHandler(BindRepeating(
4028 [](int* counter, const Task& task, TaskQueue::TaskTiming* task_timing,
4029 LazyNow* lazy_now) { ++(*counter); },
4030 complete_counter));
4031 }
4032
UnsetOnTaskHandlers(TaskQueue * task_queue)4033 void UnsetOnTaskHandlers(TaskQueue* task_queue) {
4034 GetTaskQueueImpl(task_queue)
4035 ->SetOnTaskStartedHandler(
4036 internal::TaskQueueImpl::OnTaskStartedHandler());
4037 GetTaskQueueImpl(task_queue)
4038 ->SetOnTaskCompletedHandler(
4039 internal::TaskQueueImpl::OnTaskCompletedHandler());
4040 }
4041 } // namespace
4042
TEST_P(SequenceManagerTest,ProcessTasksWithoutTaskTimeObservers)4043 TEST_P(SequenceManagerTest, ProcessTasksWithoutTaskTimeObservers) {
4044 auto queue = CreateTaskQueue();
4045 int start_counter = 0;
4046 int complete_counter = 0;
4047 std::vector<EnqueueOrder> run_order;
4048 SetOnTaskHandlers(queue.get(), &start_counter, &complete_counter);
4049 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4050 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
4051 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
4052 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
4053
4054 RunLoop().RunUntilIdle();
4055 EXPECT_EQ(start_counter, 3);
4056 EXPECT_EQ(complete_counter, 3);
4057 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u));
4058
4059 UnsetOnTaskHandlers(queue.get());
4060 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4061 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order));
4062 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 5, &run_order));
4063 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 6, &run_order));
4064
4065 RunLoop().RunUntilIdle();
4066 EXPECT_EQ(start_counter, 3);
4067 EXPECT_EQ(complete_counter, 3);
4068 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u, 6u));
4069 }
4070
TEST_P(SequenceManagerTest,ProcessTasksWithTaskTimeObservers)4071 TEST_P(SequenceManagerTest, ProcessTasksWithTaskTimeObservers) {
4072 TestTaskTimeObserver test_task_time_observer;
4073 auto queue = CreateTaskQueue();
4074 int start_counter = 0;
4075 int complete_counter = 0;
4076
4077 sequence_manager()->AddTaskTimeObserver(&test_task_time_observer);
4078 SetOnTaskHandlers(queue.get(), &start_counter, &complete_counter);
4079 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4080 std::vector<EnqueueOrder> run_order;
4081 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 1, &run_order));
4082 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 2, &run_order));
4083
4084 RunLoop().RunUntilIdle();
4085 EXPECT_EQ(start_counter, 2);
4086 EXPECT_EQ(complete_counter, 2);
4087 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
4088
4089 UnsetOnTaskHandlers(queue.get());
4090 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4091 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 3, &run_order));
4092 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 4, &run_order));
4093
4094 RunLoop().RunUntilIdle();
4095 EXPECT_EQ(start_counter, 2);
4096 EXPECT_EQ(complete_counter, 2);
4097 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u));
4098
4099 sequence_manager()->RemoveTaskTimeObserver(&test_task_time_observer);
4100 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 5, &run_order));
4101 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 6, &run_order));
4102
4103 RunLoop().RunUntilIdle();
4104 EXPECT_EQ(start_counter, 2);
4105 EXPECT_EQ(complete_counter, 2);
4106 EXPECT_FALSE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4107 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u, 6u));
4108
4109 SetOnTaskHandlers(queue.get(), &start_counter, &complete_counter);
4110 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 7, &run_order));
4111 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&TestTask, 8, &run_order));
4112
4113 RunLoop().RunUntilIdle();
4114 EXPECT_EQ(start_counter, 4);
4115 EXPECT_EQ(complete_counter, 4);
4116 EXPECT_TRUE(GetTaskQueueImpl(queue.get())->RequiresTaskTiming());
4117 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u));
4118 UnsetOnTaskHandlers(queue.get());
4119 }
4120
TEST_P(SequenceManagerTest,ObserverNotFiredAfterTaskQueueDestructed)4121 TEST_P(SequenceManagerTest, ObserverNotFiredAfterTaskQueueDestructed) {
4122 StrictMock<MockTaskQueueThrottler> throttler;
4123 auto queue = CreateTaskQueue();
4124 queue->SetThrottler(&throttler);
4125
4126 // We don't expect the throttler to be notified if the TaskQueue gets
4127 // destructed.
4128 auto task_runner = queue->task_runner();
4129 queue.reset();
4130 task_runner->PostTask(FROM_HERE, BindOnce(&NopTask));
4131
4132 FastForwardUntilNoTasksRemain();
4133 }
4134
TEST_P(SequenceManagerTest,OnQueueNextWakeUpChangedNotFiredForDisabledQueuePostTask)4135 TEST_P(SequenceManagerTest,
4136 OnQueueNextWakeUpChangedNotFiredForDisabledQueuePostTask) {
4137 StrictMock<MockTaskQueueThrottler> throttler;
4138 auto queue = CreateTaskQueue();
4139 queue->SetThrottler(&throttler);
4140
4141 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
4142 queue->CreateQueueEnabledVoter();
4143 voter->SetVoteToEnable(false);
4144
4145 // We don't expect the OnHasImmediateTask to be called if the TaskQueue gets
4146 // disabled.
4147 auto task_runner = queue->task_runner();
4148 task_runner->PostTask(FROM_HERE, BindOnce(&NopTask));
4149
4150 FastForwardUntilNoTasksRemain();
4151 // When |voter| goes out of scope the queue will become enabled and the
4152 // observer will fire. We're not interested in testing that however.
4153 Mock::VerifyAndClearExpectations(&throttler);
4154 }
4155
TEST_P(SequenceManagerTest,OnQueueNextWakeUpChangedNotFiredForCrossThreadDisabledQueuePostTask)4156 TEST_P(SequenceManagerTest,
4157 OnQueueNextWakeUpChangedNotFiredForCrossThreadDisabledQueuePostTask) {
4158 StrictMock<MockTaskQueueThrottler> throttler;
4159 auto queue = CreateTaskQueue();
4160 queue->SetThrottler(&throttler);
4161
4162 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
4163 queue->CreateQueueEnabledVoter();
4164 voter->SetVoteToEnable(false);
4165
4166 // We don't expect OnHasImmediateTask to be called if the TaskQueue gets
4167 // blocked.
4168 auto task_runner = queue->task_runner();
4169 WaitableEvent done_event;
4170 Thread thread("TestThread");
4171 thread.Start();
4172 thread.task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
4173 // Should not fire the observer.
4174 task_runner->PostTask(FROM_HERE,
4175 BindOnce(&NopTask));
4176 done_event.Signal();
4177 }));
4178 done_event.Wait();
4179 thread.Stop();
4180
4181 FastForwardUntilNoTasksRemain();
4182 // When |voter| goes out of scope the queue will become enabled and the
4183 // observer will fire. We're not interested in testing that however.
4184 Mock::VerifyAndClearExpectations(&throttler);
4185 }
4186
TEST_P(SequenceManagerTest,GracefulShutdown_ManagerDeletedInFlight)4187 TEST_P(SequenceManagerTest, GracefulShutdown_ManagerDeletedInFlight) {
4188 std::vector<TimeTicks> run_times;
4189 TaskQueue::Handle control_tq = CreateTaskQueue();
4190 std::vector<TaskQueue::Handle> main_tqs;
4191
4192 // There might be a race condition - async task queues should be unregistered
4193 // first. Increase the number of task queues to surely detect that.
4194 // The problem is that pointers are compared in a set and generally for
4195 // a small number of allocations value of the pointers increases
4196 // monotonically. 100 is large enough to force allocations from different
4197 // pages.
4198 const int N = 100;
4199 for (int i = 0; i < N; ++i) {
4200 main_tqs.push_back(CreateTaskQueue());
4201 }
4202
4203 for (int i = 1; i <= 5; ++i) {
4204 main_tqs[0]->task_runner()->PostDelayedTask(
4205 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
4206 Milliseconds(i * 100));
4207 }
4208 FastForwardBy(Milliseconds(250));
4209
4210 main_tqs.clear();
4211
4212 // No leaks should occur when TQM was destroyed before processing
4213 // shutdown task and TaskQueueImpl should be safely deleted on a correct
4214 // thread.
4215 DestroySequenceManager();
4216
4217 if (GetUnderlyingRunnerType() != RunnerType::kMessagePump) {
4218 FastForwardUntilNoTasksRemain();
4219 }
4220
4221 EXPECT_THAT(run_times, ElementsAre(FromStartAligned(Milliseconds(100)),
4222 FromStartAligned(Milliseconds(200))));
4223 }
4224
TEST_P(SequenceManagerTest,SequenceManagerDeletedWithQueuesToDelete)4225 TEST_P(SequenceManagerTest, SequenceManagerDeletedWithQueuesToDelete) {
4226 std::vector<TimeTicks> run_times;
4227 TaskQueue::Handle main_tq = CreateTaskQueue();
4228 RefCountedCallbackFactory counter;
4229
4230 EXPECT_EQ(1u, sequence_manager()->ActiveQueuesCount());
4231 EXPECT_EQ(0u, sequence_manager()->QueuesToDeleteCount());
4232
4233 for (int i = 1; i <= 5; ++i) {
4234 main_tq->task_runner()->PostDelayedTask(
4235 FROM_HERE,
4236 counter.WrapCallback(
4237 BindOnce(&RecordTimeTask, &run_times, mock_tick_clock())),
4238 Milliseconds(i * 100));
4239 }
4240 FastForwardBy(Milliseconds(250));
4241
4242 main_tq.reset();
4243
4244 EXPECT_EQ(0u, sequence_manager()->ActiveQueuesCount());
4245 EXPECT_EQ(1u, sequence_manager()->QueuesToDeleteCount());
4246
4247 // Ensure that all queues-to-gracefully-shutdown are properly unregistered.
4248 DestroySequenceManager();
4249
4250 if (GetUnderlyingRunnerType() != RunnerType::kMessagePump) {
4251 FastForwardUntilNoTasksRemain();
4252 }
4253
4254 EXPECT_THAT(run_times, ElementsAre(FromStartAligned(Milliseconds(100)),
4255 FromStartAligned(Milliseconds(200))));
4256 EXPECT_FALSE(counter.HasReferences());
4257 }
4258
TEST(SequenceManagerBasicTest,DefaultTaskRunnerSupport)4259 TEST(SequenceManagerBasicTest, DefaultTaskRunnerSupport) {
4260 auto base_sequence_manager =
4261 sequence_manager::CreateSequenceManagerOnCurrentThreadWithPump(
4262 MessagePump::Create(MessagePumpType::DEFAULT));
4263 auto queue = base_sequence_manager->CreateTaskQueue(
4264 sequence_manager::TaskQueue::Spec(QueueName::DEFAULT_TQ));
4265 base_sequence_manager->SetDefaultTaskRunner(queue->task_runner());
4266
4267 scoped_refptr<SingleThreadTaskRunner> original_task_runner =
4268 SingleThreadTaskRunner::GetCurrentDefault();
4269 scoped_refptr<SingleThreadTaskRunner> custom_task_runner =
4270 MakeRefCounted<TestSimpleTaskRunner>();
4271 {
4272 std::unique_ptr<SequenceManager> manager =
4273 CreateSequenceManagerOnCurrentThread(SequenceManager::Settings());
4274
4275 manager->SetDefaultTaskRunner(custom_task_runner);
4276 DCHECK_EQ(custom_task_runner, SingleThreadTaskRunner::GetCurrentDefault());
4277 }
4278 DCHECK_EQ(original_task_runner, SingleThreadTaskRunner::GetCurrentDefault());
4279 }
4280
TEST_P(SequenceManagerTest,CanceledTasksInQueueCantMakeOtherTasksSkipAhead)4281 TEST_P(SequenceManagerTest, CanceledTasksInQueueCantMakeOtherTasksSkipAhead) {
4282 auto queues = CreateTaskQueues(2u);
4283
4284 CancelableTask task1(mock_tick_clock());
4285 CancelableTask task2(mock_tick_clock());
4286 std::vector<TimeTicks> run_times;
4287
4288 queues[0]->task_runner()->PostTask(
4289 FROM_HERE, BindOnce(&CancelableTask::RecordTimeTask,
4290 task1.weak_factory_.GetWeakPtr(), &run_times));
4291 queues[0]->task_runner()->PostTask(
4292 FROM_HERE, BindOnce(&CancelableTask::RecordTimeTask,
4293 task2.weak_factory_.GetWeakPtr(), &run_times));
4294
4295 std::vector<EnqueueOrder> run_order;
4296 queues[1]->task_runner()->PostTask(FROM_HERE,
4297 BindOnce(&TestTask, 1, &run_order));
4298
4299 queues[0]->task_runner()->PostTask(FROM_HERE,
4300 BindOnce(&TestTask, 2, &run_order));
4301
4302 task1.weak_factory_.InvalidateWeakPtrs();
4303 task2.weak_factory_.InvalidateWeakPtrs();
4304 RunLoop().RunUntilIdle();
4305
4306 EXPECT_THAT(run_order, ElementsAre(1u, 2u));
4307 }
4308
TEST_P(SequenceManagerTest,TaskQueueDeleted)4309 TEST_P(SequenceManagerTest, TaskQueueDeleted) {
4310 std::vector<TimeTicks> run_times;
4311 TaskQueue::Handle main_tq = CreateTaskQueue();
4312 scoped_refptr<TaskRunner> main_task_runner =
4313 main_tq->CreateTaskRunner(kTaskTypeNone);
4314
4315 TaskQueue::Handle other_tq = CreateTaskQueue();
4316 scoped_refptr<TaskRunner> other_task_runner =
4317 other_tq->CreateTaskRunner(kTaskTypeNone);
4318
4319 int start_counter = 0;
4320 int complete_counter = 0;
4321 SetOnTaskHandlers(main_tq.get(), &start_counter, &complete_counter);
4322
4323 EXPECT_EQ(2u, sequence_manager()->ActiveQueuesCount());
4324 EXPECT_EQ(0u, sequence_manager()->QueuesToDeleteCount());
4325
4326 for (int i = 1; i <= 5; ++i) {
4327 main_task_runner->PostDelayedTask(
4328 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
4329 Milliseconds(i * 100));
4330 }
4331
4332 other_task_runner->PostDelayedTask(
4333 FROM_HERE, BindOnce(&RecordTimeTask, &run_times, mock_tick_clock()),
4334 Milliseconds(600));
4335
4336 // TODO(altimin): do not do this after switching to weak pointer-based
4337 // task handlers.
4338 UnsetOnTaskHandlers(main_tq.get());
4339
4340 main_tq.reset();
4341
4342 EXPECT_EQ(1u, sequence_manager()->ActiveQueuesCount());
4343 EXPECT_EQ(1u, sequence_manager()->QueuesToDeleteCount());
4344
4345 FastForwardUntilNoTasksRemain();
4346
4347 // Only tasks on `other_tq` will run, which will also trigger deleting the
4348 // `main_tq`'s impl.
4349 EXPECT_THAT(run_times, ElementsAre(FromStartAligned(Milliseconds(600))));
4350
4351 EXPECT_EQ(1u, sequence_manager()->ActiveQueuesCount());
4352 EXPECT_EQ(0u, sequence_manager()->QueuesToDeleteCount());
4353 }
4354
4355 namespace {
4356
4357 class RunOnDestructionHelper {
4358 public:
RunOnDestructionHelper(base::OnceClosure task)4359 explicit RunOnDestructionHelper(base::OnceClosure task)
4360 : task_(std::move(task)) {}
4361
~RunOnDestructionHelper()4362 ~RunOnDestructionHelper() { std::move(task_).Run(); }
4363
4364 private:
4365 base::OnceClosure task_;
4366 };
4367
RunOnDestruction(base::OnceClosure task)4368 base::OnceClosure RunOnDestruction(base::OnceClosure task) {
4369 return base::BindOnce(
4370 [](std::unique_ptr<RunOnDestructionHelper>) {},
4371 std::make_unique<RunOnDestructionHelper>(std::move(task)));
4372 }
4373
PostOnDestruction(TaskQueue * task_queue,base::OnceClosure task)4374 base::OnceClosure PostOnDestruction(TaskQueue* task_queue,
4375 base::OnceClosure task) {
4376 return RunOnDestruction(base::BindOnce(
4377 [](base::OnceClosure task, TaskQueue* task_queue) {
4378 task_queue->task_runner()->PostTask(FROM_HERE, std::move(task));
4379 },
4380 std::move(task), Unretained(task_queue)));
4381 }
4382
4383 } // namespace
4384
TEST_P(SequenceManagerTest,TaskQueueUsedInTaskDestructorAfterShutdown)4385 TEST_P(SequenceManagerTest, TaskQueueUsedInTaskDestructorAfterShutdown) {
4386 // This test checks that when a task is posted to a shutdown queue and
4387 // destroyed, it can try to post a task to the same queue without deadlocks.
4388 TaskQueue::Handle main_tq = CreateTaskQueue();
4389
4390 WaitableEvent test_executed(WaitableEvent::ResetPolicy::MANUAL,
4391 WaitableEvent::InitialState::NOT_SIGNALED);
4392 std::unique_ptr<Thread> thread = std::make_unique<Thread>("test thread");
4393 thread->StartAndWaitForTesting();
4394
4395 DestroySequenceManager();
4396
4397 thread->task_runner()->PostTask(
4398 FROM_HERE, BindOnce(
4399 [](TaskQueue* task_queue, WaitableEvent* test_executed) {
4400 task_queue->task_runner()->PostTask(
4401 FROM_HERE, PostOnDestruction(
4402 task_queue, base::BindOnce([]() {})));
4403 test_executed->Signal();
4404 },
4405 Unretained(main_tq.get()), &test_executed));
4406 test_executed.Wait();
4407 }
4408
TEST_P(SequenceManagerTest,TaskQueueTaskRunnerDetach)4409 TEST_P(SequenceManagerTest, TaskQueueTaskRunnerDetach) {
4410 scoped_refptr<SingleThreadTaskRunner> task_runner;
4411 {
4412 TaskQueue::Handle queue1 = CreateTaskQueue();
4413 task_runner = queue1->task_runner();
4414 EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindOnce(&NopTask)));
4415 }
4416 EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&NopTask)));
4417
4418 // Create without a sequence manager.
4419 std::unique_ptr<TaskQueueImpl> queue2 = std::make_unique<TaskQueueImpl>(
4420 nullptr, nullptr, TaskQueue::Spec(QueueName::TEST_TQ));
4421 scoped_refptr<SingleThreadTaskRunner> task_runner2 =
4422 queue2->CreateTaskRunner(0);
4423 EXPECT_FALSE(task_runner2->PostTask(FROM_HERE, BindOnce(&NopTask)));
4424
4425 // Tidy up.
4426 queue2->UnregisterTaskQueue();
4427 }
4428
TEST_P(SequenceManagerTest,DestructorPostChainDuringShutdown)4429 TEST_P(SequenceManagerTest, DestructorPostChainDuringShutdown) {
4430 // Checks that a chain of closures which post other closures on destruction do
4431 // thing on shutdown.
4432 TaskQueue::Handle task_queue = CreateTaskQueue();
4433 bool run = false;
4434 task_queue->task_runner()->PostTask(
4435 FROM_HERE,
4436 PostOnDestruction(
4437 task_queue.get(),
4438 PostOnDestruction(task_queue.get(),
4439 RunOnDestruction(base::BindOnce(
4440 [](bool* run) { *run = true; }, &run)))));
4441
4442 DestroySequenceManager();
4443
4444 EXPECT_TRUE(run);
4445 }
4446
TEST_P(SequenceManagerTest,DestructorPostsViaTaskRunnerHandleDuringShutdown)4447 TEST_P(SequenceManagerTest, DestructorPostsViaTaskRunnerHandleDuringShutdown) {
4448 TaskQueue::Handle task_queue = CreateTaskQueue();
4449 bool run = false;
4450 task_queue->task_runner()->PostTask(
4451 FROM_HERE, RunOnDestruction(BindLambdaForTesting([&]() {
4452 SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
4453 FROM_HERE, base::BindOnce(&NopTask));
4454 run = true;
4455 })));
4456
4457 // Should not DCHECK when SingleThreadTaskRunner::GetCurrentDefault() is
4458 // invoked.
4459 DestroySequenceManager();
4460 EXPECT_TRUE(run);
4461 }
4462
TEST_P(SequenceManagerTest,CreateUnboundSequenceManagerWhichIsNeverBound)4463 TEST_P(SequenceManagerTest, CreateUnboundSequenceManagerWhichIsNeverBound) {
4464 // This should not crash.
4465 CreateUnboundSequenceManager();
4466 }
4467
TEST_P(SequenceManagerTest,HasPendingHighResolutionTasks)4468 TEST_P(SequenceManagerTest, HasPendingHighResolutionTasks) {
4469 auto queue = CreateTaskQueue();
4470 bool supports_high_res = false;
4471 #if BUILDFLAG(IS_WIN)
4472 supports_high_res = true;
4473 #endif
4474
4475 // Only the third task needs high resolution timing.
4476 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4477 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4478 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4479 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4480 Milliseconds(100));
4481 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4482 queue->task_runner()->PostDelayedTaskAt(
4483 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE, BindOnce(&NopTask),
4484 sequence_manager()->NowTicks() + Milliseconds(10),
4485 subtle::DelayPolicy::kPrecise);
4486 EXPECT_EQ(sequence_manager()->HasPendingHighResolutionTasks(),
4487 supports_high_res);
4488
4489 // Running immediate tasks doesn't affect pending high resolution tasks.
4490 RunLoop().RunUntilIdle();
4491 EXPECT_EQ(sequence_manager()->HasPendingHighResolutionTasks(),
4492 supports_high_res);
4493
4494 // Advancing to just before a pending low resolution task doesn't mean that we
4495 // have pending high resolution work.
4496 AdvanceMockTickClock(Milliseconds(99));
4497 RunLoop().RunUntilIdle();
4498 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4499
4500 AdvanceMockTickClock(Milliseconds(100));
4501 RunLoop().RunUntilIdle();
4502 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4503 }
4504
TEST_P(SequenceManagerTest,HasPendingHighResolutionTasksLowPriority)4505 TEST_P(SequenceManagerTest, HasPendingHighResolutionTasksLowPriority) {
4506 auto queue = CreateTaskQueue();
4507 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
4508 bool supports_high_res = false;
4509 #if BUILDFLAG(IS_WIN)
4510 supports_high_res = true;
4511 #endif
4512
4513 // No task should be considered high resolution in a low priority queue.
4514 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4515 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4516 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4517 queue->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4518 Milliseconds(100));
4519 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4520 queue->task_runner()->PostDelayedTaskAt(
4521 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE, BindOnce(&NopTask),
4522 sequence_manager()->NowTicks() + Milliseconds(10),
4523 subtle::DelayPolicy::kPrecise);
4524 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4525
4526 // Increasing queue priority should enable high resolution timer.
4527 queue->SetQueuePriority(TestQueuePriority::kNormalPriority);
4528 EXPECT_EQ(sequence_manager()->HasPendingHighResolutionTasks(),
4529 supports_high_res);
4530 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
4531 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4532
4533 // Running immediate tasks doesn't affect pending high resolution tasks.
4534 RunLoop().RunUntilIdle();
4535 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4536
4537 // Advancing to just before a pending low resolution task doesn't mean that we
4538 // have pending high resolution work.
4539 AdvanceMockTickClock(Milliseconds(99));
4540 RunLoop().RunUntilIdle();
4541 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4542
4543 AdvanceMockTickClock(Milliseconds(100));
4544 RunLoop().RunUntilIdle();
4545 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4546 }
4547
TEST_P(SequenceManagerTest,HasPendingHighResolutionTasksLowAndNormalPriorityQueues)4548 TEST_P(SequenceManagerTest,
4549 HasPendingHighResolutionTasksLowAndNormalPriorityQueues) {
4550 auto queueLow = CreateTaskQueue();
4551 queueLow->SetQueuePriority(TestQueuePriority::kLowPriority);
4552 auto queueNormal = CreateTaskQueue();
4553 queueNormal->SetQueuePriority(TestQueuePriority::kNormalPriority);
4554 bool supports_high_res = false;
4555 #if BUILDFLAG(IS_WIN)
4556 supports_high_res = true;
4557 #endif
4558
4559 // No task should be considered high resolution in a low priority queue.
4560 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4561 queueLow->task_runner()->PostDelayedTaskAt(
4562 subtle::PostDelayedTaskPassKeyForTesting(), FROM_HERE, BindOnce(&NopTask),
4563 sequence_manager()->NowTicks() + Milliseconds(10),
4564 subtle::DelayPolicy::kPrecise);
4565 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4566 queueNormal->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4567 Milliseconds(100));
4568 EXPECT_FALSE(sequence_manager()->HasPendingHighResolutionTasks());
4569
4570 // Increasing queue priority should enable high resolution timer.
4571 queueLow->SetQueuePriority(TestQueuePriority::kNormalPriority);
4572 EXPECT_EQ(sequence_manager()->HasPendingHighResolutionTasks(),
4573 supports_high_res);
4574 }
4575
4576 namespace {
4577
4578 class PostTaskWhenDeleted;
4579 void CallbackWithDestructor(std::unique_ptr<PostTaskWhenDeleted>);
4580
4581 class PostTaskWhenDeleted {
4582 public:
PostTaskWhenDeleted(std::string name,scoped_refptr<SingleThreadTaskRunner> task_runner,size_t depth,std::set<std::string> * tasks_alive,std::vector<std::string> * tasks_deleted)4583 PostTaskWhenDeleted(std::string name,
4584 scoped_refptr<SingleThreadTaskRunner> task_runner,
4585 size_t depth,
4586 std::set<std::string>* tasks_alive,
4587 std::vector<std::string>* tasks_deleted)
4588 : name_(name),
4589 task_runner_(std::move(task_runner)),
4590 depth_(depth),
4591 tasks_alive_(tasks_alive),
4592 tasks_deleted_(tasks_deleted) {
4593 tasks_alive_->insert(full_name());
4594 }
4595
~PostTaskWhenDeleted()4596 ~PostTaskWhenDeleted() {
4597 DCHECK(tasks_alive_->find(full_name()) != tasks_alive_->end());
4598 tasks_alive_->erase(full_name());
4599 tasks_deleted_->push_back(full_name());
4600
4601 if (depth_ > 0) {
4602 task_runner_->PostTask(
4603 FROM_HERE, base::BindOnce(&CallbackWithDestructor,
4604 std::make_unique<PostTaskWhenDeleted>(
4605 name_, task_runner_, depth_ - 1,
4606 tasks_alive_, tasks_deleted_)));
4607 }
4608 }
4609
4610 private:
full_name()4611 std::string full_name() { return name_ + " " + NumberToString(depth_); }
4612
4613 std::string name_;
4614 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
4615 int depth_;
4616 raw_ptr<std::set<std::string>> tasks_alive_;
4617 raw_ptr<std::vector<std::string>> tasks_deleted_;
4618 };
4619
CallbackWithDestructor(std::unique_ptr<PostTaskWhenDeleted> object)4620 void CallbackWithDestructor(std::unique_ptr<PostTaskWhenDeleted> object) {}
4621
4622 } // namespace
4623
TEST_P(SequenceManagerTest,DoesNotRecordQueueTimeIfSettingFalse)4624 TEST_P(SequenceManagerTest, DoesNotRecordQueueTimeIfSettingFalse) {
4625 auto queue = CreateTaskQueue();
4626
4627 QueueTimeTaskObserver observer;
4628 sequence_manager()->AddTaskObserver(&observer);
4629
4630 // We do not record task queue time when the setting is false.
4631 sequence_manager()->SetAddQueueTimeToTasks(false);
4632 AdvanceMockTickClock(Milliseconds(99));
4633 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4634 RunLoop().RunUntilIdle();
4635 EXPECT_THAT(observer.queue_times(), ElementsAre(TimeTicks()));
4636
4637 sequence_manager()->RemoveTaskObserver(&observer);
4638 }
4639
TEST_P(SequenceManagerTest,RecordsQueueTimeIfSettingTrue)4640 TEST_P(SequenceManagerTest, RecordsQueueTimeIfSettingTrue) {
4641 const auto kStartTime = mock_tick_clock()->NowTicks();
4642 auto queue = CreateTaskQueue();
4643
4644 QueueTimeTaskObserver observer;
4645 sequence_manager()->AddTaskObserver(&observer);
4646
4647 // We correctly record task queue time when the setting is true.
4648 sequence_manager()->SetAddQueueTimeToTasks(true);
4649 AdvanceMockTickClock(Milliseconds(99));
4650 queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4651 RunLoop().RunUntilIdle();
4652 EXPECT_THAT(observer.queue_times(),
4653 ElementsAre(kStartTime + Milliseconds(99)));
4654
4655 sequence_manager()->RemoveTaskObserver(&observer);
4656 }
4657
4658 namespace {
4659
4660 // Inject a test point for recording the destructor calls for OnceClosure
4661 // objects sent to PostTask(). It is awkward usage since we are trying to hook
4662 // the actual destruction, which is not a common operation.
4663 class DestructionObserverProbe : public RefCounted<DestructionObserverProbe> {
4664 public:
DestructionObserverProbe(bool * task_destroyed,bool * destruction_observer_called)4665 DestructionObserverProbe(bool* task_destroyed,
4666 bool* destruction_observer_called)
4667 : task_destroyed_(task_destroyed),
4668 destruction_observer_called_(destruction_observer_called) {}
Run()4669 virtual void Run() {
4670 // This task should never run.
4671 ADD_FAILURE();
4672 }
4673
4674 private:
4675 friend class RefCounted<DestructionObserverProbe>;
4676
~DestructionObserverProbe()4677 virtual ~DestructionObserverProbe() {
4678 EXPECT_FALSE(*destruction_observer_called_);
4679 *task_destroyed_ = true;
4680 }
4681
4682 raw_ptr<bool> task_destroyed_;
4683 raw_ptr<bool> destruction_observer_called_;
4684 };
4685
4686 class SMDestructionObserver : public CurrentThread::DestructionObserver {
4687 public:
SMDestructionObserver(bool * task_destroyed,bool * destruction_observer_called)4688 SMDestructionObserver(bool* task_destroyed, bool* destruction_observer_called)
4689 : task_destroyed_(task_destroyed),
4690 destruction_observer_called_(destruction_observer_called),
4691 task_destroyed_before_message_loop_(false) {}
WillDestroyCurrentMessageLoop()4692 void WillDestroyCurrentMessageLoop() override {
4693 task_destroyed_before_message_loop_ = *task_destroyed_;
4694 *destruction_observer_called_ = true;
4695 }
task_destroyed_before_message_loop() const4696 bool task_destroyed_before_message_loop() const {
4697 return task_destroyed_before_message_loop_;
4698 }
4699
4700 private:
4701 raw_ptr<bool> task_destroyed_;
4702 raw_ptr<bool> destruction_observer_called_;
4703 bool task_destroyed_before_message_loop_;
4704 };
4705
4706 } // namespace
4707
TEST_P(SequenceManagerTest,DestructionObserverTest)4708 TEST_P(SequenceManagerTest, DestructionObserverTest) {
4709 auto queue = CreateTaskQueue();
4710
4711 // Verify that the destruction observer gets called at the very end (after
4712 // all the pending tasks have been destroyed).
4713 const TimeDelta kDelay = Milliseconds(100);
4714
4715 bool task_destroyed = false;
4716 bool destruction_observer_called = false;
4717
4718 SMDestructionObserver observer(&task_destroyed, &destruction_observer_called);
4719 sequence_manager()->AddDestructionObserver(&observer);
4720 queue->task_runner()->PostDelayedTask(
4721 FROM_HERE,
4722 BindOnce(&DestructionObserverProbe::Run,
4723 base::MakeRefCounted<DestructionObserverProbe>(
4724 &task_destroyed, &destruction_observer_called)),
4725 kDelay);
4726
4727 DestroySequenceManager();
4728
4729 EXPECT_TRUE(observer.task_destroyed_before_message_loop());
4730 // The task should have been destroyed when we deleted the loop.
4731 EXPECT_TRUE(task_destroyed);
4732 EXPECT_TRUE(destruction_observer_called);
4733 }
4734
TEST_P(SequenceManagerTest,GetMessagePump)4735 TEST_P(SequenceManagerTest, GetMessagePump) {
4736 switch (GetUnderlyingRunnerType()) {
4737 default:
4738 EXPECT_THAT(sequence_manager()->GetMessagePump(), testing::IsNull());
4739 break;
4740 case RunnerType::kMessagePump:
4741 EXPECT_THAT(sequence_manager()->GetMessagePump(), testing::NotNull());
4742 break;
4743 }
4744 }
4745
4746 namespace {
4747
4748 class MockTimeDomain : public TimeDomain {
4749 public:
4750 MockTimeDomain() = default;
4751 MockTimeDomain(const MockTimeDomain&) = delete;
4752 MockTimeDomain& operator=(const MockTimeDomain&) = delete;
4753 ~MockTimeDomain() override = default;
4754
4755 // TickClock:
NowTicks() const4756 TimeTicks NowTicks() const override { return now_; }
4757
4758 // TimeDomain:
MaybeFastForwardToWakeUp(absl::optional<WakeUp> wakeup,bool quit_when_idle_requested)4759 bool MaybeFastForwardToWakeUp(absl::optional<WakeUp> wakeup,
4760 bool quit_when_idle_requested) override {
4761 return MaybeFastForwardToWakeUp(quit_when_idle_requested);
4762 }
4763
4764 MOCK_METHOD1(MaybeFastForwardToWakeUp, bool(bool quit_when_idle_requested));
4765
GetName() const4766 const char* GetName() const override { return "Test"; }
4767
4768 private:
4769 TimeTicks now_;
4770 };
4771
4772 } // namespace
4773
TEST_P(SequenceManagerTest,OnSystemIdleTimeDomainNotification)4774 TEST_P(SequenceManagerTest, OnSystemIdleTimeDomainNotification) {
4775 if (GetUnderlyingRunnerType() != RunnerType::kMessagePump)
4776 return;
4777
4778 auto queue = CreateTaskQueue();
4779
4780 // If we call OnSystemIdle, we expect registered TimeDomains to receive a call
4781 // to MaybeFastForwardToWakeUp. If no run loop has requested quit on idle,
4782 // the parameter passed in should be false.
4783 StrictMock<MockTimeDomain> mock_time_domain;
4784 sequence_manager()->SetTimeDomain(&mock_time_domain);
4785 EXPECT_CALL(mock_time_domain, MaybeFastForwardToWakeUp(false))
4786 .WillOnce(Return(false));
4787 sequence_manager()->OnSystemIdle();
4788 sequence_manager()->ResetTimeDomain();
4789 Mock::VerifyAndClearExpectations(&mock_time_domain);
4790
4791 // However if RunUntilIdle is called it should be true.
4792 queue->task_runner()->PostTask(
4793 FROM_HERE, BindLambdaForTesting([&]() {
4794 StrictMock<MockTimeDomain> mock_time_domain;
4795 EXPECT_CALL(mock_time_domain, MaybeFastForwardToWakeUp(true))
4796 .WillOnce(Return(false));
4797 sequence_manager()->SetTimeDomain(&mock_time_domain);
4798 sequence_manager()->OnSystemIdle();
4799 sequence_manager()->ResetTimeDomain();
4800 }));
4801
4802 RunLoop().RunUntilIdle();
4803 }
4804
TEST_P(SequenceManagerTest,CreateTaskQueue)4805 TEST_P(SequenceManagerTest, CreateTaskQueue) {
4806 TaskQueue::Handle task_queue =
4807 sequence_manager()->CreateTaskQueue(TaskQueue::Spec(QueueName::TEST_TQ));
4808 EXPECT_THAT(task_queue.get(), testing::NotNull());
4809
4810 task_queue->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4811 EXPECT_EQ(1u, sequence_manager()->GetPendingTaskCountForTesting());
4812 }
4813
TEST_P(SequenceManagerTest,GetPendingTaskCountForTesting)4814 TEST_P(SequenceManagerTest, GetPendingTaskCountForTesting) {
4815 auto queues = CreateTaskQueues(3u);
4816
4817 EXPECT_EQ(0u, sequence_manager()->GetPendingTaskCountForTesting());
4818
4819 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4820 EXPECT_EQ(1u, sequence_manager()->GetPendingTaskCountForTesting());
4821
4822 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4823 EXPECT_EQ(2u, sequence_manager()->GetPendingTaskCountForTesting());
4824
4825 queues[0]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4826 EXPECT_EQ(3u, sequence_manager()->GetPendingTaskCountForTesting());
4827
4828 queues[1]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4829 EXPECT_EQ(4u, sequence_manager()->GetPendingTaskCountForTesting());
4830
4831 queues[2]->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask));
4832 EXPECT_EQ(5u, sequence_manager()->GetPendingTaskCountForTesting());
4833
4834 queues[1]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4835 Milliseconds(10));
4836 EXPECT_EQ(6u, sequence_manager()->GetPendingTaskCountForTesting());
4837
4838 queues[2]->task_runner()->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4839 Milliseconds(20));
4840 EXPECT_EQ(7u, sequence_manager()->GetPendingTaskCountForTesting());
4841
4842 RunLoop().RunUntilIdle();
4843 EXPECT_EQ(2u, sequence_manager()->GetPendingTaskCountForTesting());
4844
4845 AdvanceMockTickClock(Milliseconds(10));
4846 RunLoop().RunUntilIdle();
4847 EXPECT_EQ(1u, sequence_manager()->GetPendingTaskCountForTesting());
4848
4849 AdvanceMockTickClock(Milliseconds(10));
4850 RunLoop().RunUntilIdle();
4851 EXPECT_EQ(0u, sequence_manager()->GetPendingTaskCountForTesting());
4852 }
4853
TEST_P(SequenceManagerTest,PostDelayedTaskFromOtherThread)4854 TEST_P(SequenceManagerTest, PostDelayedTaskFromOtherThread) {
4855 TaskQueue::Handle main_tq = CreateTaskQueue();
4856 scoped_refptr<TaskRunner> task_runner =
4857 main_tq->CreateTaskRunner(kTaskTypeNone);
4858 sequence_manager()->SetAddQueueTimeToTasks(true);
4859
4860 Thread thread("test thread");
4861 thread.StartAndWaitForTesting();
4862
4863 WaitableEvent task_posted(WaitableEvent::ResetPolicy::MANUAL,
4864 WaitableEvent::InitialState::NOT_SIGNALED);
4865 thread.task_runner()->PostTask(
4866 FROM_HERE, BindOnce(
4867 [](scoped_refptr<TaskRunner> task_runner,
4868 WaitableEvent* task_posted) {
4869 task_runner->PostDelayedTask(FROM_HERE,
4870 BindOnce(&NopTask),
4871 base::Milliseconds(10));
4872 task_posted->Signal();
4873 },
4874 std::move(task_runner), &task_posted));
4875 task_posted.Wait();
4876 FastForwardUntilNoTasksRemain();
4877 RunLoop().RunUntilIdle();
4878 thread.Stop();
4879 }
4880
4881 namespace {
4882
PostTaskA(scoped_refptr<TaskRunner> task_runner)4883 void PostTaskA(scoped_refptr<TaskRunner> task_runner) {
4884 task_runner->PostTask(FROM_HERE, BindOnce(&NopTask));
4885 task_runner->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4886 base::Milliseconds(10));
4887 }
4888
PostTaskB(scoped_refptr<TaskRunner> task_runner)4889 void PostTaskB(scoped_refptr<TaskRunner> task_runner) {
4890 task_runner->PostTask(FROM_HERE, BindOnce(&NopTask));
4891 task_runner->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4892 base::Milliseconds(20));
4893 }
4894
PostTaskC(scoped_refptr<TaskRunner> task_runner)4895 void PostTaskC(scoped_refptr<TaskRunner> task_runner) {
4896 task_runner->PostTask(FROM_HERE, BindOnce(&NopTask));
4897 task_runner->PostDelayedTask(FROM_HERE, BindOnce(&NopTask),
4898 base::Milliseconds(30));
4899 }
4900
4901 } // namespace
4902
TEST_P(SequenceManagerTest,DescribeAllPendingTasks)4903 TEST_P(SequenceManagerTest, DescribeAllPendingTasks) {
4904 auto queues = CreateTaskQueues(3u);
4905
4906 PostTaskA(queues[0]->task_runner());
4907 PostTaskB(queues[1]->task_runner());
4908 PostTaskC(queues[2]->task_runner());
4909
4910 std::string description = sequence_manager()->DescribeAllPendingTasks();
4911 EXPECT_THAT(description, HasSubstr("PostTaskA@"));
4912 EXPECT_THAT(description, HasSubstr("PostTaskB@"));
4913 EXPECT_THAT(description, HasSubstr("PostTaskC@"));
4914 }
4915
TEST_P(SequenceManagerTest,TaskPriortyInterleaving)4916 TEST_P(SequenceManagerTest, TaskPriortyInterleaving) {
4917 auto queues = CreateTaskQueues(
4918 static_cast<size_t>(TestQueuePriority::kQueuePriorityCount));
4919
4920 for (uint8_t priority = 0;
4921 priority < static_cast<uint8_t>(TestQueuePriority::kQueuePriorityCount);
4922 priority++) {
4923 if (priority != static_cast<uint8_t>(TestQueuePriority::kNormalPriority)) {
4924 queues[priority]->SetQueuePriority(
4925 static_cast<TaskQueue::QueuePriority>(priority));
4926 }
4927 }
4928
4929 std::string order;
4930 for (int i = 0; i < 60; i++) {
4931 for (uint8_t priority = 0;
4932 priority <
4933 static_cast<uint8_t>(TestQueuePriority::kQueuePriorityCount);
4934 priority++) {
4935 queues[priority]->task_runner()->PostTask(
4936 FROM_HERE,
4937 base::BindOnce([](std::string* str, char c) { str->push_back(c); },
4938 &order, '0' + priority));
4939 }
4940 }
4941
4942 RunLoop().RunUntilIdle();
4943
4944 EXPECT_EQ(order,
4945 "000000000000000000000000000000000000000000000000000000000000"
4946 "111111111111111111111111111111111111111111111111111111111111"
4947 "222222222222222222222222222222222222222222222222222222222222"
4948 "333333333333333333333333333333333333333333333333333333333333"
4949 "444444444444444444444444444444444444444444444444444444444444"
4950 "555555555555555555555555555555555555555555555555555555555555"
4951 "666666666666666666666666666666666666666666666666666666666666");
4952 }
4953
4954 namespace {
4955
4956 class CancelableTaskWithDestructionObserver {
4957 public:
CancelableTaskWithDestructionObserver()4958 CancelableTaskWithDestructionObserver() {}
4959
Task(std::unique_ptr<ScopedClosureRunner> destruction_observer)4960 void Task(std::unique_ptr<ScopedClosureRunner> destruction_observer) {
4961 destruction_observer_ = std::move(destruction_observer);
4962 }
4963
4964 std::unique_ptr<ScopedClosureRunner> destruction_observer_;
4965 WeakPtrFactory<CancelableTaskWithDestructionObserver> weak_factory_{this};
4966 };
4967
4968 } // namespace
4969
TEST_P(SequenceManagerTest,PeriodicHousekeeping)4970 TEST_P(SequenceManagerTest, PeriodicHousekeeping) {
4971 auto queue = CreateTaskQueue();
4972
4973 // Post a task that will trigger housekeeping.
4974 queue->task_runner()->PostDelayedTask(
4975 FROM_HERE, BindOnce(&NopTask),
4976 SequenceManagerImpl::kReclaimMemoryInterval);
4977
4978 // Posts some tasks set to run long in the future and then cancel some of
4979 // them.
4980 bool task1_deleted = false;
4981 bool task2_deleted = false;
4982 bool task3_deleted = false;
4983 CancelableTaskWithDestructionObserver task1;
4984 CancelableTaskWithDestructionObserver task2;
4985 CancelableTaskWithDestructionObserver task3;
4986
4987 queue->task_runner()->PostDelayedTask(
4988 FROM_HERE,
4989 BindOnce(&CancelableTaskWithDestructionObserver::Task,
4990 task1.weak_factory_.GetWeakPtr(),
4991 std::make_unique<ScopedClosureRunner>(
4992 BindLambdaForTesting([&]() { task1_deleted = true; }))),
4993 Hours(1));
4994
4995 queue->task_runner()->PostDelayedTask(
4996 FROM_HERE,
4997 BindOnce(&CancelableTaskWithDestructionObserver::Task,
4998 task2.weak_factory_.GetWeakPtr(),
4999 std::make_unique<ScopedClosureRunner>(
5000 BindLambdaForTesting([&]() { task2_deleted = true; }))),
5001 Hours(2));
5002
5003 queue->task_runner()->PostDelayedTask(
5004 FROM_HERE,
5005 BindOnce(&CancelableTaskWithDestructionObserver::Task,
5006 task3.weak_factory_.GetWeakPtr(),
5007 std::make_unique<ScopedClosureRunner>(
5008 BindLambdaForTesting([&]() { task3_deleted = true; }))),
5009 Hours(3));
5010
5011 task2.weak_factory_.InvalidateWeakPtrs();
5012 task3.weak_factory_.InvalidateWeakPtrs();
5013
5014 EXPECT_FALSE(task1_deleted);
5015 EXPECT_FALSE(task2_deleted);
5016 EXPECT_FALSE(task3_deleted);
5017
5018 // This should trigger housekeeping which will sweep away the canceled tasks.
5019 FastForwardBy(SequenceManagerImpl::kReclaimMemoryInterval);
5020
5021 EXPECT_FALSE(task1_deleted);
5022 EXPECT_TRUE(task2_deleted);
5023 EXPECT_TRUE(task3_deleted);
5024
5025 // Tidy up.
5026 FastForwardUntilNoTasksRemain();
5027 }
5028
5029 namespace {
5030
5031 class MockCrashKeyImplementation : public debug::CrashKeyImplementation {
5032 public:
5033 MOCK_METHOD2(Allocate,
5034 debug::CrashKeyString*(const char name[], debug::CrashKeySize));
5035 MOCK_METHOD2(Set, void(debug::CrashKeyString*, StringPiece));
5036 MOCK_METHOD1(Clear, void(debug::CrashKeyString*));
5037 MOCK_METHOD1(OutputCrashKeysToStream, void(std::ostream&));
5038 };
5039
5040 } // namespace
5041
TEST_P(SequenceManagerTest,CrossQueueTaskPostingWhenQueueDeleted)5042 TEST_P(SequenceManagerTest, CrossQueueTaskPostingWhenQueueDeleted) {
5043 MockTask task;
5044 auto queue_1 = CreateTaskQueue();
5045 auto queue_2 = CreateTaskQueue();
5046
5047 EXPECT_CALL(task, Run).Times(1);
5048
5049 queue_1->task_runner()->PostDelayedTask(
5050 FROM_HERE, PostOnDestruction(queue_2.get(), task.Get()), Minutes(1));
5051
5052 queue_1.reset();
5053
5054 FastForwardUntilNoTasksRemain();
5055 }
5056
TEST_P(SequenceManagerTest,UnregisterTaskQueueTriggersScheduleWork)5057 TEST_P(SequenceManagerTest, UnregisterTaskQueueTriggersScheduleWork) {
5058 constexpr auto kDelay = Minutes(1);
5059 auto queue_1 = CreateTaskQueue();
5060 auto queue_2 = CreateTaskQueue();
5061
5062 MockTask task;
5063 EXPECT_CALL(task, Run).Times(1);
5064
5065 queue_1->task_runner()->PostDelayedTask(FROM_HERE, task.Get(), kDelay);
5066 queue_2->task_runner()->PostDelayedTask(FROM_HERE, task.Get(), kDelay * 2);
5067
5068 AdvanceMockTickClock(kDelay * 2);
5069
5070 // Wakeup time needs to be adjusted to kDelay * 2 when the queue is
5071 // unregistered from the TimeDomain
5072 queue_1.reset();
5073
5074 RunLoop().RunUntilIdle();
5075 }
5076
TEST_P(SequenceManagerTest,ReclaimMemoryRemovesCorrectQueueFromSet)5077 TEST_P(SequenceManagerTest, ReclaimMemoryRemovesCorrectQueueFromSet) {
5078 auto queue1 = CreateTaskQueue();
5079 auto queue2 = CreateTaskQueue();
5080 auto queue3 = CreateTaskQueue();
5081 auto queue4 = CreateTaskQueue();
5082
5083 std::vector<int> order;
5084
5085 CancelableRepeatingClosure cancelable_closure1(
5086 BindLambdaForTesting([&]() { order.push_back(10); }));
5087 CancelableRepeatingClosure cancelable_closure2(
5088 BindLambdaForTesting([&]() { order.push_back(11); }));
5089 queue1->task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
5090 order.push_back(1);
5091 cancelable_closure1.Cancel();
5092 cancelable_closure2.Cancel();
5093 // This should remove |queue4| from the work
5094 // queue set,
5095 sequence_manager()->ReclaimMemory();
5096 }));
5097 queue2->task_runner()->PostTask(
5098 FROM_HERE, BindLambdaForTesting([&]() { order.push_back(2); }));
5099 queue3->task_runner()->PostTask(
5100 FROM_HERE, BindLambdaForTesting([&]() { order.push_back(3); }));
5101 queue4->task_runner()->PostTask(FROM_HERE, cancelable_closure1.callback());
5102 queue4->task_runner()->PostTask(FROM_HERE, cancelable_closure2.callback());
5103
5104 RunLoop().RunUntilIdle();
5105
5106 // Make sure ReclaimMemory didn't prevent the task from |queue2| from running.
5107 EXPECT_THAT(order, ElementsAre(1, 2, 3));
5108 }
5109
5110 namespace {
5111
5112 class TaskObserverExpectingNoDelayedRunTime : public TaskObserver {
5113 public:
5114 TaskObserverExpectingNoDelayedRunTime() = default;
5115 ~TaskObserverExpectingNoDelayedRunTime() override = default;
5116
num_will_process_task() const5117 int num_will_process_task() const { return num_will_process_task_; }
num_did_process_task() const5118 int num_did_process_task() const { return num_did_process_task_; }
5119
5120 private:
WillProcessTask(const base::PendingTask & pending_task,bool was_blocked_or_low_priority)5121 void WillProcessTask(const base::PendingTask& pending_task,
5122 bool was_blocked_or_low_priority) override {
5123 EXPECT_TRUE(pending_task.delayed_run_time.is_null());
5124 ++num_will_process_task_;
5125 }
DidProcessTask(const base::PendingTask & pending_task)5126 void DidProcessTask(const base::PendingTask& pending_task) override {
5127 EXPECT_TRUE(pending_task.delayed_run_time.is_null());
5128 ++num_did_process_task_;
5129 }
5130
5131 int num_will_process_task_ = 0;
5132 int num_did_process_task_ = 0;
5133 };
5134
5135 } // namespace
5136
5137 // The |delayed_run_time| must not be set for immediate tasks as that prevents
5138 // external observers from correctly identifying delayed tasks.
5139 // https://crbug.com/1029137
TEST_P(SequenceManagerTest,NoDelayedRunTimeForImmediateTask)5140 TEST_P(SequenceManagerTest, NoDelayedRunTimeForImmediateTask) {
5141 TaskObserverExpectingNoDelayedRunTime task_observer;
5142 sequence_manager()->SetAddQueueTimeToTasks(true);
5143 sequence_manager()->AddTaskObserver(&task_observer);
5144 auto queue = CreateTaskQueue();
5145
5146 base::RunLoop run_loop;
5147 queue->task_runner()->PostTask(
5148 FROM_HERE, BindLambdaForTesting([&]() { run_loop.Quit(); }));
5149 run_loop.Run();
5150
5151 EXPECT_EQ(1, task_observer.num_will_process_task());
5152 EXPECT_EQ(1, task_observer.num_did_process_task());
5153
5154 sequence_manager()->RemoveTaskObserver(&task_observer);
5155 }
5156
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_QueueDisabled)5157 TEST_P(SequenceManagerTest, TaskObserverBlockedOrLowPriority_QueueDisabled) {
5158 auto queue = CreateTaskQueue();
5159 testing::StrictMock<MockTaskObserver> observer;
5160 sequence_manager()->AddTaskObserver(&observer);
5161
5162 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5163 GetTaskQueueImpl(queue.get())->SetQueueEnabled(false);
5164 GetTaskQueueImpl(queue.get())->SetQueueEnabled(true);
5165
5166 EXPECT_CALL(observer,
5167 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5168 EXPECT_CALL(observer, DidProcessTask(_));
5169 RunLoop().RunUntilIdle();
5170
5171 sequence_manager()->RemoveTaskObserver(&observer);
5172 }
5173
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_FenceBeginningOfTime)5174 TEST_P(SequenceManagerTest,
5175 TaskObserverBlockedOrLowPriority_FenceBeginningOfTime) {
5176 auto queue = CreateTaskQueue();
5177 testing::StrictMock<MockTaskObserver> observer;
5178 sequence_manager()->AddTaskObserver(&observer);
5179
5180 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5181 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
5182 queue->RemoveFence();
5183
5184 EXPECT_CALL(observer,
5185 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5186 EXPECT_CALL(observer, DidProcessTask(_));
5187 RunLoop().RunUntilIdle();
5188
5189 sequence_manager()->RemoveTaskObserver(&observer);
5190 }
5191
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_PostedBeforeFenceNow)5192 TEST_P(SequenceManagerTest,
5193 TaskObserverBlockedOrLowPriority_PostedBeforeFenceNow) {
5194 auto queue = CreateTaskQueue();
5195 testing::StrictMock<MockTaskObserver> observer;
5196 sequence_manager()->AddTaskObserver(&observer);
5197
5198 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5199 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
5200 queue->RemoveFence();
5201
5202 EXPECT_CALL(observer,
5203 WillProcessTask(_, /*was_blocked_or_low_priority=*/false));
5204 EXPECT_CALL(observer, DidProcessTask(_));
5205 RunLoop().RunUntilIdle();
5206
5207 sequence_manager()->RemoveTaskObserver(&observer);
5208 }
5209
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_PostedAfterFenceNow)5210 TEST_P(SequenceManagerTest,
5211 TaskObserverBlockedOrLowPriority_PostedAfterFenceNow) {
5212 auto queue = CreateTaskQueue();
5213 testing::StrictMock<MockTaskObserver> observer;
5214 sequence_manager()->AddTaskObserver(&observer);
5215
5216 queue->InsertFence(TaskQueue::InsertFencePosition::kNow);
5217 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5218 queue->RemoveFence();
5219
5220 EXPECT_CALL(observer,
5221 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5222 EXPECT_CALL(observer, DidProcessTask(_));
5223 RunLoop().RunUntilIdle();
5224
5225 sequence_manager()->RemoveTaskObserver(&observer);
5226 }
5227
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_LowerPriorityWhileQueued)5228 TEST_P(SequenceManagerTest,
5229 TaskObserverBlockedOrLowPriority_LowerPriorityWhileQueued) {
5230 auto queue = CreateTaskQueue();
5231 testing::StrictMock<MockTaskObserver> observer;
5232 sequence_manager()->AddTaskObserver(&observer);
5233
5234 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5235 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
5236 queue->SetQueuePriority(TestQueuePriority::kNormalPriority);
5237
5238 EXPECT_CALL(observer,
5239 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5240 EXPECT_CALL(observer, DidProcessTask(_));
5241 RunLoop().RunUntilIdle();
5242
5243 sequence_manager()->RemoveTaskObserver(&observer);
5244 }
5245
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_LowPriorityWhenQueueing)5246 TEST_P(SequenceManagerTest,
5247 TaskObserverBlockedOrLowPriority_LowPriorityWhenQueueing) {
5248 auto queue = CreateTaskQueue();
5249 testing::StrictMock<MockTaskObserver> observer;
5250 sequence_manager()->AddTaskObserver(&observer);
5251
5252 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
5253 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5254 queue->SetQueuePriority(TestQueuePriority::kNormalPriority);
5255
5256 EXPECT_CALL(observer,
5257 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5258 EXPECT_CALL(observer, DidProcessTask(_));
5259 RunLoop().RunUntilIdle();
5260
5261 sequence_manager()->RemoveTaskObserver(&observer);
5262 }
5263
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_LowPriorityWhenRunning)5264 TEST_P(SequenceManagerTest,
5265 TaskObserverBlockedOrLowPriority_LowPriorityWhenRunning) {
5266 auto queue = CreateTaskQueue();
5267 testing::StrictMock<MockTaskObserver> observer;
5268 sequence_manager()->AddTaskObserver(&observer);
5269
5270 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5271 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
5272
5273 EXPECT_CALL(observer,
5274 WillProcessTask(_, /*was_blocked_or_low_priority=*/true));
5275 EXPECT_CALL(observer, DidProcessTask(_));
5276 RunLoop().RunUntilIdle();
5277
5278 sequence_manager()->RemoveTaskObserver(&observer);
5279 }
5280
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_TaskObserverUnblockedWithBacklog)5281 TEST_P(SequenceManagerTest,
5282 TaskObserverBlockedOrLowPriority_TaskObserverUnblockedWithBacklog) {
5283 auto queue = CreateTaskQueue();
5284 testing::StrictMock<MockTaskObserver> observer;
5285 sequence_manager()->AddTaskObserver(&observer);
5286
5287 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
5288 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5289 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
5290 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5291 queue->RemoveFence();
5292 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5293 queue->SetQueuePriority(TestQueuePriority::kNormalPriority);
5294 // Post a task while the queue is kNormalPriority and unblocked, but has a
5295 // backlog of tasks that were blocked.
5296 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5297
5298 EXPECT_CALL(observer,
5299 WillProcessTask(_, /*was_blocked_or_low_priority=*/true))
5300 .Times(3);
5301 EXPECT_CALL(observer, DidProcessTask(_)).Times(4);
5302 EXPECT_CALL(observer,
5303 WillProcessTask(_, /*was_blocked_or_low_priority=*/false));
5304 RunLoop().RunUntilIdle();
5305 testing::Mock::VerifyAndClear(&observer);
5306
5307 sequence_manager()->RemoveTaskObserver(&observer);
5308 }
5309
TEST_P(SequenceManagerTest,TaskObserverBlockedOrLowPriority_Mix)5310 TEST_P(SequenceManagerTest, TaskObserverBlockedOrLowPriority_Mix) {
5311 auto queue = CreateTaskQueue();
5312 testing::StrictMock<MockTaskObserver> observer;
5313 sequence_manager()->AddTaskObserver(&observer);
5314
5315 queue->SetQueuePriority(TestQueuePriority::kLowPriority);
5316 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5317 queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime);
5318 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5319 queue->RemoveFence();
5320 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5321
5322 EXPECT_CALL(observer,
5323 WillProcessTask(_, /*was_blocked_or_low_priority=*/true))
5324 .Times(3);
5325 EXPECT_CALL(observer, DidProcessTask(_)).Times(3);
5326 RunLoop().RunUntilIdle();
5327 testing::Mock::VerifyAndClear(&observer);
5328
5329 queue->SetQueuePriority(TestQueuePriority::kNormalPriority);
5330 queue->task_runner()->PostTask(FROM_HERE, DoNothing());
5331 EXPECT_CALL(observer,
5332 WillProcessTask(_, /*was_blocked_or_low_priority=*/false));
5333 EXPECT_CALL(observer, DidProcessTask(_));
5334 RunLoop().RunUntilIdle();
5335
5336 sequence_manager()->RemoveTaskObserver(&observer);
5337 }
5338
TEST_P(SequenceManagerTest,DelayedTaskOrderFromMultipleQueues)5339 TEST_P(SequenceManagerTest, DelayedTaskOrderFromMultipleQueues) {
5340 // Regression test for crbug.com/1249857. The 4th task posted below should run
5341 // 4th despite being in queues[0].
5342 std::vector<EnqueueOrder> run_order;
5343 auto queues = CreateTaskQueues(3u);
5344
5345 queues[0]->task_runner()->PostDelayedTask(
5346 FROM_HERE, BindOnce(&TestTask, 1, &run_order), Milliseconds(9));
5347 queues[1]->task_runner()->PostDelayedTask(
5348 FROM_HERE, BindOnce(&TestTask, 2, &run_order), Milliseconds(10));
5349 queues[2]->task_runner()->PostDelayedTask(
5350 FROM_HERE, BindOnce(&TestTask, 3, &run_order), Milliseconds(10));
5351 queues[0]->task_runner()->PostDelayedTask(
5352 FROM_HERE, BindOnce(&TestTask, 4, &run_order), Milliseconds(100));
5353
5354 // All delayed tasks are now ready, but none have run.
5355 AdvanceMockTickClock(Milliseconds(100));
5356 RunLoop().RunUntilIdle();
5357
5358 EXPECT_THAT(run_order, ElementsAre(1u, 2u, 3u, 4u));
5359 }
5360
TEST_P(SequenceManagerTest,OnTaskPostedCallbacks)5361 TEST_P(SequenceManagerTest, OnTaskPostedCallbacks) {
5362 int counter1 = 0;
5363 int counter2 = 0;
5364
5365 auto queue = CreateTaskQueue();
5366
5367 std::unique_ptr<TaskQueue::OnTaskPostedCallbackHandle> handle1 =
5368 queue->AddOnTaskPostedHandler(BindRepeating(
5369 [](int* counter, const Task& task) { ++(*counter); }, &counter1));
5370
5371 queue->task_runner()->PostTask(FROM_HERE, BindOnce(NullTask));
5372 EXPECT_EQ(1, counter1);
5373 EXPECT_EQ(0, counter2);
5374
5375 std::unique_ptr<TaskQueue::OnTaskPostedCallbackHandle> handle2 =
5376 queue->AddOnTaskPostedHandler(BindRepeating(
5377 [](int* counter, const Task& task) { ++(*counter); }, &counter2));
5378
5379 queue->task_runner()->PostTask(FROM_HERE, BindOnce(NullTask));
5380 EXPECT_EQ(2, counter1);
5381 EXPECT_EQ(1, counter2);
5382
5383 handle1.reset();
5384
5385 queue->task_runner()->PostTask(FROM_HERE, BindOnce(NullTask));
5386 EXPECT_EQ(2, counter1);
5387 EXPECT_EQ(2, counter2);
5388
5389 handle2.reset();
5390
5391 queue->task_runner()->PostTask(FROM_HERE, BindOnce(NullTask));
5392 EXPECT_EQ(2, counter1);
5393 EXPECT_EQ(2, counter2);
5394 }
5395
TEST(SequenceManagerTest,CanAccessSingleThreadTaskRunnerCurrentDefaultHandleHandleDuringSequenceLocalStorageSlotDestruction)5396 TEST(
5397 SequenceManagerTest,
5398 CanAccessSingleThreadTaskRunnerCurrentDefaultHandleHandleDuringSequenceLocalStorageSlotDestruction) {
5399 auto sequence_manager =
5400 sequence_manager::CreateSequenceManagerOnCurrentThreadWithPump(
5401 MessagePump::Create(MessagePumpType::DEFAULT));
5402 auto queue = sequence_manager->CreateTaskQueue(
5403 sequence_manager::TaskQueue::Spec(QueueName::DEFAULT_TQ));
5404 sequence_manager->SetDefaultTaskRunner(queue->task_runner());
5405
5406 scoped_refptr<SingleThreadTaskRunner> expected_task_runner =
5407 SingleThreadTaskRunner::GetCurrentDefault();
5408
5409 StrictMock<MockCallback<base::OnceCallback<void()>>> cb;
5410 EXPECT_CALL(cb, Run).WillOnce(testing::Invoke([expected_task_runner]() {
5411 EXPECT_EQ(SingleThreadTaskRunner::GetCurrentDefault(),
5412 expected_task_runner);
5413 }));
5414
5415 static base::SequenceLocalStorageSlot<std::unique_ptr<DestructionCallback>>
5416 storage_slot;
5417 storage_slot.GetOrCreateValue() =
5418 std::make_unique<DestructionCallback>(cb.Get());
5419
5420 queue.reset();
5421 sequence_manager.reset();
5422 }
5423
TEST(SequenceManagerTest,BindOnDifferentThreadWithActiveVoters)5424 TEST(SequenceManagerTest, BindOnDifferentThreadWithActiveVoters) {
5425 auto sequence_manager = CreateUnboundSequenceManager();
5426 auto queue =
5427 sequence_manager->CreateTaskQueue(TaskQueue::Spec(QueueName::TEST_TQ));
5428 auto voter = queue->CreateQueueEnabledVoter();
5429 {
5430 // Create a second voter that gets destroyed while unbound.
5431 auto voter2 = queue->CreateQueueEnabledVoter();
5432 }
5433
5434 voter->SetVoteToEnable(false);
5435 EXPECT_FALSE(queue->IsQueueEnabled());
5436
5437 std::vector<bool> results;
5438 WaitableEvent done_event;
5439 Thread thread("TestThread");
5440 thread.Start();
5441 auto task = BindLambdaForTesting([&]() {
5442 // Move `voter` so it gets destroyed on the bound thread.
5443 auto scoped_voter = std::move(voter);
5444 // Bind `sequence_manager` to this thread.
5445 auto scoped_mgr = std::move(sequence_manager);
5446 scoped_mgr->BindToCurrentThread();
5447
5448 results.push_back(queue->IsQueueEnabled());
5449 scoped_voter->SetVoteToEnable(true);
5450 results.push_back(queue->IsQueueEnabled());
5451 done_event.Signal();
5452 });
5453 thread.task_runner()->PostTask(FROM_HERE, std::move(task));
5454 done_event.Wait();
5455 thread.Stop();
5456 EXPECT_THAT(results, ElementsAre(false, true));
5457 }
5458
5459 } // namespace internal
5460 } // namespace sequence_manager
5461 } // namespace base
5462