1 // Copyright 2018 The Chromium Authors. All rights reserved.
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/test/sequence_manager_for_test.h"
6 
7 #include "base/task/sequence_manager/thread_controller_impl.h"
8 
9 namespace base {
10 namespace sequence_manager {
11 
12 namespace {
13 
14 class ThreadControllerForTest : public internal::ThreadControllerImpl {
15  public:
ThreadControllerForTest(internal::SequenceManagerImpl * funneled_sequence_manager,scoped_refptr<SingleThreadTaskRunner> task_runner,const TickClock * time_source)16   ThreadControllerForTest(
17       internal::SequenceManagerImpl* funneled_sequence_manager,
18       scoped_refptr<SingleThreadTaskRunner> task_runner,
19       const TickClock* time_source)
20       : ThreadControllerImpl(funneled_sequence_manager,
21                              std::move(task_runner),
22                              time_source) {}
23 
AddNestingObserver(RunLoop::NestingObserver * observer)24   void AddNestingObserver(RunLoop::NestingObserver* observer) override {
25     if (!funneled_sequence_manager_)
26       return;
27     ThreadControllerImpl::AddNestingObserver(observer);
28   }
29 
RemoveNestingObserver(RunLoop::NestingObserver * observer)30   void RemoveNestingObserver(RunLoop::NestingObserver* observer) override {
31     if (!funneled_sequence_manager_)
32       return;
33     ThreadControllerImpl::RemoveNestingObserver(observer);
34   }
35 
36   ~ThreadControllerForTest() override = default;
37 };
38 
39 }  // namespace
40 
SequenceManagerForTest(std::unique_ptr<internal::ThreadController> thread_controller,SequenceManager::Settings settings)41 SequenceManagerForTest::SequenceManagerForTest(
42     std::unique_ptr<internal::ThreadController> thread_controller,
43     SequenceManager::Settings settings)
44     : SequenceManagerImpl(std::move(thread_controller), std::move(settings)) {}
45 
46 // static
Create(SequenceManagerImpl * funneled_sequence_manager,scoped_refptr<SingleThreadTaskRunner> task_runner,const TickClock * clock,SequenceManager::Settings settings)47 std::unique_ptr<SequenceManagerForTest> SequenceManagerForTest::Create(
48     SequenceManagerImpl* funneled_sequence_manager,
49     scoped_refptr<SingleThreadTaskRunner> task_runner,
50     const TickClock* clock,
51     SequenceManager::Settings settings) {
52   std::unique_ptr<SequenceManagerForTest> manager(new SequenceManagerForTest(
53       std::make_unique<ThreadControllerForTest>(funneled_sequence_manager,
54                                                 std::move(task_runner), clock),
55       std::move(settings)));
56   manager->BindToCurrentThread();
57   return manager;
58 }
59 
60 // static
Create(std::unique_ptr<internal::ThreadController> thread_controller,SequenceManager::Settings settings)61 std::unique_ptr<SequenceManagerForTest> SequenceManagerForTest::Create(
62     std::unique_ptr<internal::ThreadController> thread_controller,
63     SequenceManager::Settings settings) {
64   std::unique_ptr<SequenceManagerForTest> manager(new SequenceManagerForTest(
65       std::move(thread_controller), std::move(settings)));
66   manager->BindToCurrentThread();
67   return manager;
68 }
69 
70 // static
71 std::unique_ptr<SequenceManagerForTest>
CreateOnCurrentThread(SequenceManager::Settings settings)72 SequenceManagerForTest::CreateOnCurrentThread(
73     SequenceManager::Settings settings) {
74   const auto* clock = settings.clock;
75   return Create(CreateThreadControllerImplForCurrentThread(clock),
76                 std::move(settings));
77 }
78 
ActiveQueuesCount() const79 size_t SequenceManagerForTest::ActiveQueuesCount() const {
80   return main_thread_only().active_queues.size();
81 }
82 
HasImmediateWork() const83 bool SequenceManagerForTest::HasImmediateWork() const {
84   return main_thread_only().selector.GetHighestPendingPriority().has_value();
85 }
86 
PendingTasksCount() const87 size_t SequenceManagerForTest::PendingTasksCount() const {
88   size_t task_count = 0;
89   for (auto* const queue : main_thread_only().active_queues)
90     task_count += queue->GetNumberOfPendingTasks();
91   return task_count;
92 }
93 
QueuesToDeleteCount() const94 size_t SequenceManagerForTest::QueuesToDeleteCount() const {
95   return main_thread_only().queues_to_delete.size();
96 }
97 
QueuesToShutdownCount()98 size_t SequenceManagerForTest::QueuesToShutdownCount() {
99   return main_thread_only().queues_to_gracefully_shutdown.size();
100 }
101 
102 }  // namespace sequence_manager
103 }  // namespace base
104