• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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