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