Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(729)

Side by Side Diff: components/scheduler/base/time_domain_unittest.cc

Issue 1432263002: (reland) Adds TimeDomains to the TaskQueueManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing some more feedback. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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 "components/scheduler/base/time_domain.h"
6
7 #include "base/test/simple_test_tick_clock.h"
8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "components/scheduler/base/task_queue_impl.h"
10 #include "components/scheduler/base/task_queue_manager.h"
11 #include "components/scheduler/base/task_queue_manager_delegate.h"
12 #include "components/scheduler/base/task_queue_manager_delegate_for_test.h"
13 #include "components/scheduler/base/test_time_source.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15
16 using testing::_;
17
18 namespace scheduler {
19
20 class FakeTaskQueueManagerDelegate : public TaskQueueManagerDelegate {
21 public:
22 FakeTaskQueueManagerDelegate() : belongs_to_current_thread_(true) {}
23
24 MOCK_METHOD3(PostDelayedTask,
25 bool(const tracked_objects::Location& from_here,
26 const base::Closure& task,
27 base::TimeDelta dela));
28 MOCK_METHOD3(PostNonNestableDelayedTask,
29 bool(const tracked_objects::Location& from_here,
30 const base::Closure& task,
31 base::TimeDelta dela));
32
33 base::TimeTicks NowTicks() override {
34 NOTREACHED();
35 return base::TimeTicks();
36 }
37
38 bool IsNested() const override {
39 NOTREACHED();
40 return false;
41 }
42
43 void OnNoMoreImmediateWork() override { NOTREACHED(); }
44
45 double CurrentTimeSeconds() const override {
46 NOTREACHED();
47 return 0.0;
48 }
49
50 void SetBelongsToCurrentThread(bool belongs_to_current_thread) {
51 belongs_to_current_thread_ = belongs_to_current_thread;
52 }
53
54 bool RunsTasksOnCurrentThread() const override {
55 return belongs_to_current_thread_;
56 }
57
58 private:
59 ~FakeTaskQueueManagerDelegate() override {}
60
61 bool belongs_to_current_thread_;
62 };
63
64 class MockTimeDomain : public TimeDomain {
65 public:
66 MockTimeDomain(TaskQueueManagerDelegate* delegate)
67 : TimeDomain(delegate),
68 now_(base::TimeTicks() + base::TimeDelta::FromSeconds(1)) {}
69
70 using TimeDomain::NextScheduledRunTime;
71 using TimeDomain::NextScheduledTaskQueue;
72 using TimeDomain::ScheduleDelayedWork;
73 using TimeDomain::UnregisterQueue;
74 using TimeDomain::UpdateWorkQueues;
75
76 // TimeSource implementation:
77 LazyNow GetLazyNow() override { return LazyNow(now_); }
78
79 void AsValueIntoInternal(
80 base::trace_event::TracedValue* state) const override {}
81
82 bool MaybeAdvanceTime() override { return false; }
83
84 MOCK_METHOD1(ScheduleDoWork, void(base::TimeDelta delay));
85
86 void SetNow(base::TimeTicks now) { now_ = now; }
87
88 base::TimeTicks Now() const { return now_; }
89
90 private:
91 base::TimeTicks now_;
92
93 ~MockTimeDomain() override {}
94
95 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain);
96 };
97
98 class TimeDomainTest : public testing::Test {
99 public:
100 void SetUp() final {
101 delegate_ = make_scoped_refptr(new FakeTaskQueueManagerDelegate);
102 time_domain_ = make_scoped_refptr(new MockTimeDomain(delegate_.get()));
103 task_queue_ = make_scoped_refptr(new internal::TaskQueueImpl(
104 nullptr, time_domain_, TaskQueue::Spec("test_queue"), "test.category",
105 "test.category"));
106 }
107
108 scoped_refptr<FakeTaskQueueManagerDelegate> delegate_;
109 scoped_refptr<MockTimeDomain> time_domain_;
110 scoped_refptr<internal::TaskQueueImpl> task_queue_;
111 };
112
113 TEST_F(TimeDomainTest, ScheduleDelayedWork_SameThread) {
114 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
115 base::TimeTicks delayed_runtime = time_domain_->Now() + delay;
116 EXPECT_CALL(*time_domain_.get(), ScheduleDoWork(delay));
117 LazyNow lazy_now = time_domain_->GetLazyNow();
118 time_domain_->ScheduleDelayedWork(task_queue_.get(),
119 time_domain_->Now() + delay, &lazy_now);
120
121 base::TimeTicks next_scheduled_runtime;
122 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
123 EXPECT_EQ(delayed_runtime, next_scheduled_runtime);
124
125 TaskQueue* next_task_queue;
126 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
127 EXPECT_EQ(task_queue_.get(), next_task_queue);
128 }
129
130 TEST_F(TimeDomainTest, ScheduleDelayedWork_DifferentThread) {
131 delegate_->SetBelongsToCurrentThread(false);
132
133 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
134 base::TimeTicks delayed_runtime = time_domain_->Now() + delay;
135
136 EXPECT_CALL(*delegate_.get(), PostDelayedTask(_, _, base::TimeDelta()));
137 LazyNow lazy_now = time_domain_->GetLazyNow();
138 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime,
139 &lazy_now);
140
141 base::TimeTicks next_scheduled_runtime;
142 EXPECT_FALSE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
143 }
144
145 TEST_F(TimeDomainTest, UnregisterQueue) {
146 scoped_refptr<internal::TaskQueueImpl> task_queue2_ =
147 make_scoped_refptr(new internal::TaskQueueImpl(
148 nullptr, time_domain_, TaskQueue::Spec("test_queue2"),
149 "test.category", "test.category"));
150
151 EXPECT_CALL(*time_domain_.get(), ScheduleDoWork(_)).Times(2);
152 LazyNow lazy_now = time_domain_->GetLazyNow();
153 time_domain_->ScheduleDelayedWork(
154 task_queue_.get(),
155 time_domain_->Now() + base::TimeDelta::FromMilliseconds(10), &lazy_now);
156 time_domain_->ScheduleDelayedWork(
157 task_queue2_.get(),
158 time_domain_->Now() + base::TimeDelta::FromMilliseconds(100), &lazy_now);
159
160 TaskQueue* next_task_queue;
161 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
162 EXPECT_EQ(task_queue_.get(), next_task_queue);
163
164 time_domain_->UnregisterQueue(task_queue_.get());
165 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
166 EXPECT_EQ(task_queue2_.get(), next_task_queue);
167
168 time_domain_->UnregisterQueue(task_queue2_.get());
169 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
170 }
171
172 TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) {
173 scoped_refptr<MockTimeDomain> dummy_delegate(
174 new MockTimeDomain(delegate_.get()));
175 base::SimpleTestTickClock dummy_time_source;
176 scoped_refptr<cc::OrderedSimpleTaskRunner> dummy_task_runner(
177 new cc::OrderedSimpleTaskRunner(&dummy_time_source, false));
178 TaskQueueManager task_queue_manager(
179 TaskQueueManagerDelegateForTest::Create(
180 dummy_task_runner,
181 make_scoped_ptr(new TestTimeSource(&dummy_time_source))),
182 "test.scheduler", "test.scheduler", "scheduler.debug");
183 scoped_refptr<internal::TaskQueueImpl> dummy_queue =
184 task_queue_manager.NewTaskQueue(TaskQueue::Spec("test_queue"));
185
186 // Post a delayed task on |dummy_queue| and advance the queue's clock so that
187 // next time MoveReadyDelayedTasksToIncomingQueue is called, the task will
188 // get moved onto the incomming queue.
189 base::TimeDelta dummy_delay = base::TimeDelta::FromMilliseconds(10);
190 dummy_queue->PostDelayedTask(FROM_HERE, base::Closure(), dummy_delay);
191 dummy_time_source.Advance(dummy_delay);
192
193 // Now we can test that WakeupReadyDelayedQueues triggers calls to
194 // MoveReadyDelayedTasksToIncomingQueue as expected.
195 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
196 base::TimeTicks delayed_runtime = time_domain_->Now() + delay;
197 EXPECT_CALL(*time_domain_.get(), ScheduleDoWork(delay));
198 LazyNow lazy_now = time_domain_->GetLazyNow();
199 time_domain_->ScheduleDelayedWork(dummy_queue.get(), delayed_runtime,
200 &lazy_now);
201
202 time_domain_->UpdateWorkQueues(false, nullptr);
203 EXPECT_EQ(0UL, dummy_queue->IncomingQueueSizeForTest());
204
205 time_domain_->SetNow(delayed_runtime);
206 time_domain_->UpdateWorkQueues(false, nullptr);
207 EXPECT_EQ(1UL, dummy_queue->IncomingQueueSizeForTest());
208 }
209
210 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698