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