OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/scheduler/base/time_domain.h" | 5 #include "platform/scheduler/base/time_domain.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "cc/test/ordered_simple_task_runner.h" | 10 #include "cc/test/ordered_simple_task_runner.h" |
11 #include "platform/scheduler/base/task_queue_impl.h" | 11 #include "platform/scheduler/base/task_queue_impl.h" |
12 #include "platform/scheduler/base/task_queue_manager.h" | 12 #include "platform/scheduler/base/task_queue_manager.h" |
13 #include "platform/scheduler/base/task_queue_manager_delegate_for_test.h" | 13 #include "platform/scheduler/base/task_queue_manager_delegate_for_test.h" |
14 #include "platform/scheduler/base/test_time_source.h" | 14 #include "platform/scheduler/base/test_time_source.h" |
15 #include "platform/scheduler/base/work_queue.h" | 15 #include "platform/scheduler/base/work_queue.h" |
16 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
17 | 17 |
18 using testing::_; | 18 using testing::_; |
19 using testing::AnyNumber; | 19 using testing::AnyNumber; |
20 using testing::Mock; | 20 using testing::Mock; |
21 | 21 |
22 namespace blink { | 22 namespace blink { |
23 namespace scheduler { | 23 namespace scheduler { |
24 | 24 |
25 class MockTimeDomain : public TimeDomain { | 25 class MockTimeDomain : public TimeDomain { |
26 public: | 26 public: |
27 explicit MockTimeDomain(TimeDomain::Observer* observer) | 27 MockTimeDomain() |
28 : TimeDomain(observer), | 28 : now_(base::TimeTicks() + base::TimeDelta::FromSeconds(1)) {} |
29 now_(base::TimeTicks() + base::TimeDelta::FromSeconds(1)) {} | |
30 | 29 |
31 ~MockTimeDomain() override {} | 30 ~MockTimeDomain() override {} |
32 | 31 |
33 using TimeDomain::CancelDelayedWork; | 32 using TimeDomain::CancelDelayedWork; |
34 using TimeDomain::NextScheduledRunTime; | 33 using TimeDomain::NextScheduledRunTime; |
35 using TimeDomain::NextScheduledTaskQueue; | 34 using TimeDomain::NextScheduledTaskQueue; |
36 using TimeDomain::OnQueueHasImmediateWork; | |
37 using TimeDomain::ScheduleDelayedWork; | 35 using TimeDomain::ScheduleDelayedWork; |
38 using TimeDomain::UnregisterQueue; | 36 using TimeDomain::UnregisterQueue; |
39 using TimeDomain::WakeupReadyDelayedQueues; | 37 using TimeDomain::WakeUpReadyDelayedQueues; |
40 | 38 |
41 // TimeSource implementation: | 39 // TimeSource implementation: |
42 LazyNow CreateLazyNow() const override { return LazyNow(now_); } | 40 LazyNow CreateLazyNow() const override { return LazyNow(now_); } |
43 base::TimeTicks Now() const override { return now_; } | 41 base::TimeTicks Now() const override { return now_; } |
44 | 42 |
45 void AsValueIntoInternal( | 43 void AsValueIntoInternal( |
46 base::trace_event::TracedValue* state) const override {} | 44 base::trace_event::TracedValue* state) const override {} |
47 | 45 |
48 base::Optional<base::TimeDelta> DelayTillNextTask( | 46 base::Optional<base::TimeDelta> DelayTillNextTask( |
49 LazyNow* lazy_now) override { | 47 LazyNow* lazy_now) override { |
50 return base::Optional<base::TimeDelta>(); | 48 return base::Optional<base::TimeDelta>(); |
51 } | 49 } |
52 const char* GetName() const override { return "Test"; } | 50 const char* GetName() const override { return "Test"; } |
53 void OnRegisterWithTaskQueueManager( | 51 void OnRegisterWithTaskQueueManager( |
54 TaskQueueManager* task_queue_manager) override {} | 52 TaskQueueManager* task_queue_manager) override {} |
55 | 53 |
56 MOCK_METHOD2(RequestWakeupAt, | 54 MOCK_METHOD2(RequestWakeUpAt, |
57 void(base::TimeTicks now, base::TimeTicks run_time)); | 55 void(base::TimeTicks now, base::TimeTicks run_time)); |
58 | 56 |
59 MOCK_METHOD1(CancelWakeupAt, void(base::TimeTicks run_time)); | 57 MOCK_METHOD1(CancelWakeUpAt, void(base::TimeTicks run_time)); |
60 | 58 |
61 void SetNow(base::TimeTicks now) { now_ = now; } | 59 void SetNow(base::TimeTicks now) { now_ = now; } |
62 | 60 |
63 private: | 61 private: |
64 base::TimeTicks now_; | 62 base::TimeTicks now_; |
65 | 63 |
66 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain); | 64 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain); |
67 }; | 65 }; |
68 | 66 |
69 class TimeDomainTest : public testing::Test { | 67 class TimeDomainTest : public testing::Test { |
70 public: | 68 public: |
71 void SetUp() final { | 69 void SetUp() final { |
72 time_domain_ = base::WrapUnique(CreateMockTimeDomain()); | 70 time_domain_ = base::WrapUnique(CreateMockTimeDomain()); |
73 task_queue_ = make_scoped_refptr( | 71 task_queue_ = make_scoped_refptr( |
74 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 72 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
75 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 73 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
76 "test.category", "test.category")); | 74 "test.category", "test.category")); |
77 } | 75 } |
78 | 76 |
79 void TearDown() final { | 77 void TearDown() final { |
80 if (task_queue_) | 78 if (task_queue_) |
81 task_queue_->UnregisterTaskQueue(); | 79 task_queue_->UnregisterTaskQueue(); |
82 } | 80 } |
83 | 81 |
84 virtual MockTimeDomain* CreateMockTimeDomain() { | 82 virtual MockTimeDomain* CreateMockTimeDomain() { |
85 return new MockTimeDomain(nullptr); | 83 return new MockTimeDomain(); |
86 } | 84 } |
87 | 85 |
88 std::unique_ptr<MockTimeDomain> time_domain_; | 86 std::unique_ptr<MockTimeDomain> time_domain_; |
89 scoped_refptr<internal::TaskQueueImpl> task_queue_; | 87 scoped_refptr<internal::TaskQueueImpl> task_queue_; |
90 }; | 88 }; |
91 | 89 |
92 TEST_F(TimeDomainTest, ScheduleDelayedWork) { | 90 TEST_F(TimeDomainTest, ScheduleDelayedWork) { |
93 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); | 91 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
94 base::TimeTicks delayed_runtime = time_domain_->Now() + delay; | 92 base::TimeTicks delayed_runtime = time_domain_->Now() + delay; |
95 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime)); | 93 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); |
96 base::TimeTicks now = time_domain_->Now(); | 94 base::TimeTicks now = time_domain_->Now(); |
97 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay, 0}, now); | 95 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay, 0}, now); |
98 | 96 |
99 base::TimeTicks next_scheduled_runtime; | 97 base::TimeTicks next_scheduled_runtime; |
100 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 98 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
101 EXPECT_EQ(delayed_runtime, next_scheduled_runtime); | 99 EXPECT_EQ(delayed_runtime, next_scheduled_runtime); |
102 | 100 |
103 TaskQueue* next_task_queue; | 101 TaskQueue* next_task_queue; |
104 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 102 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
105 EXPECT_EQ(task_queue_.get(), next_task_queue); | 103 EXPECT_EQ(task_queue_.get(), next_task_queue); |
106 Mock::VerifyAndClearExpectations(time_domain_.get()); | 104 Mock::VerifyAndClearExpectations(time_domain_.get()); |
107 | 105 |
108 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber()); | 106 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); |
109 } | 107 } |
110 | 108 |
111 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) { | 109 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeUp) { |
112 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); | 110 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); |
113 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100); | 111 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100); |
114 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1; | 112 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1; |
115 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2; | 113 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2; |
116 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime1)); | 114 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime1)); |
117 base::TimeTicks now = time_domain_->Now(); | 115 base::TimeTicks now = time_domain_->Now(); |
118 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime1, 0}, | 116 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime1, 0}, |
119 now); | 117 now); |
120 | 118 |
121 base::TimeTicks next_scheduled_runtime; | 119 base::TimeTicks next_scheduled_runtime; |
122 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 120 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
123 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime); | 121 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime); |
124 | 122 |
125 Mock::VerifyAndClearExpectations(time_domain_.get()); | 123 Mock::VerifyAndClearExpectations(time_domain_.get()); |
126 | 124 |
127 // Now scheduler a later wakeup, which should replace the previously requested | 125 // Now scheduler a later wake_up, which should replace the previously |
128 // one. | 126 // requested one. |
129 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime2)); | 127 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime2)); |
130 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime2, 0}, | 128 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime2, 0}, |
131 now); | 129 now); |
132 | 130 |
133 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 131 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
134 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime); | 132 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime); |
135 Mock::VerifyAndClearExpectations(time_domain_.get()); | 133 Mock::VerifyAndClearExpectations(time_domain_.get()); |
136 | 134 |
137 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber()); | 135 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); |
138 } | 136 } |
139 | 137 |
140 TEST_F(TimeDomainTest, RequestWakeupAt_OnlyCalledForEarlierTasks) { | 138 TEST_F(TimeDomainTest, RequestWakeUpAt_OnlyCalledForEarlierTasks) { |
141 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( | 139 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( |
142 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 140 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
143 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 141 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
144 "test.category", "test.category")); | 142 "test.category", "test.category")); |
145 | 143 |
146 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( | 144 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( |
147 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 145 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
148 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 146 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
149 "test.category", "test.category")); | 147 "test.category", "test.category")); |
150 | 148 |
151 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( | 149 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( |
152 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 150 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
153 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 151 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
154 "test.category", "test.category")); | 152 "test.category", "test.category")); |
155 | 153 |
156 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); | 154 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); |
157 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); | 155 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); |
158 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30); | 156 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30); |
159 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1); | 157 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1); |
160 | 158 |
161 // RequestWakeupAt should always be called if there are no other wakeups. | 159 // RequestWakeUpAt should always be called if there are no other wake_ups. |
162 base::TimeTicks now = time_domain_->Now(); | 160 base::TimeTicks now = time_domain_->Now(); |
163 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay1)); | 161 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, now + delay1)); |
164 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay1, 0}, now); | 162 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay1, 0}, now); |
165 | 163 |
166 Mock::VerifyAndClearExpectations(time_domain_.get()); | 164 Mock::VerifyAndClearExpectations(time_domain_.get()); |
167 | 165 |
168 // RequestWakeupAt should not be called when scheduling later tasks. | 166 // RequestWakeUpAt should not be called when scheduling later tasks. |
169 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0); | 167 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(0); |
170 time_domain_->ScheduleDelayedWork(task_queue2.get(), {now + delay2, 0}, now); | 168 time_domain_->ScheduleDelayedWork(task_queue2.get(), {now + delay2, 0}, now); |
171 time_domain_->ScheduleDelayedWork(task_queue3.get(), {now + delay3, 0}, now); | 169 time_domain_->ScheduleDelayedWork(task_queue3.get(), {now + delay3, 0}, now); |
172 | 170 |
173 // RequestWakeupAt should be called when scheduling earlier tasks. | 171 // RequestWakeUpAt should be called when scheduling earlier tasks. |
174 Mock::VerifyAndClearExpectations(time_domain_.get()); | 172 Mock::VerifyAndClearExpectations(time_domain_.get()); |
175 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay4)); | 173 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, now + delay4)); |
176 time_domain_->ScheduleDelayedWork(task_queue4.get(), {now + delay4, 0}, now); | 174 time_domain_->ScheduleDelayedWork(task_queue4.get(), {now + delay4, 0}, now); |
177 | 175 |
178 Mock::VerifyAndClearExpectations(time_domain_.get()); | 176 Mock::VerifyAndClearExpectations(time_domain_.get()); |
179 | 177 |
180 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)); | 178 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)); |
181 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(2); | 179 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(2); |
182 task_queue2->UnregisterTaskQueue(); | 180 task_queue2->UnregisterTaskQueue(); |
183 task_queue3->UnregisterTaskQueue(); | 181 task_queue3->UnregisterTaskQueue(); |
184 task_queue4->UnregisterTaskQueue(); | 182 task_queue4->UnregisterTaskQueue(); |
185 } | 183 } |
186 | 184 |
187 TEST_F(TimeDomainTest, UnregisterQueue) { | 185 TEST_F(TimeDomainTest, UnregisterQueue) { |
188 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( | 186 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( |
189 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 187 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
190 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 188 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
191 "test.category", "test.category")); | 189 "test.category", "test.category")); |
192 | 190 |
193 base::TimeTicks now = time_domain_->Now(); | 191 base::TimeTicks now = time_domain_->Now(); |
194 base::TimeTicks wakeup1 = now + base::TimeDelta::FromMilliseconds(10); | 192 base::TimeTicks wake_up1 = now + base::TimeDelta::FromMilliseconds(10); |
195 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, wakeup1)).Times(1); | 193 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up1)).Times(1); |
196 time_domain_->ScheduleDelayedWork(task_queue_.get(), {wakeup1, 0}, now); | 194 time_domain_->ScheduleDelayedWork(task_queue_.get(), {wake_up1, 0}, now); |
197 base::TimeTicks wakeup2 = now + base::TimeDelta::FromMilliseconds(100); | 195 base::TimeTicks wake_up2 = now + base::TimeDelta::FromMilliseconds(100); |
198 time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wakeup2, 0}, now); | 196 time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wake_up2, 0}, now); |
199 | 197 |
200 TaskQueue* next_task_queue; | 198 TaskQueue* next_task_queue; |
201 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 199 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
202 EXPECT_EQ(task_queue_.get(), next_task_queue); | 200 EXPECT_EQ(task_queue_.get(), next_task_queue); |
203 | 201 |
204 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); | 202 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); |
205 | 203 |
206 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(wakeup1)).Times(1); | 204 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(wake_up1)).Times(1); |
207 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, wakeup2)).Times(1); | 205 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up2)).Times(1); |
208 | 206 |
209 time_domain_->UnregisterQueue(task_queue_.get()); | 207 time_domain_->UnregisterQueue(task_queue_.get()); |
210 task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); | 208 task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); |
211 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 209 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
212 EXPECT_EQ(task_queue2_.get(), next_task_queue); | 210 EXPECT_EQ(task_queue2_.get(), next_task_queue); |
213 | 211 |
214 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); | 212 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); |
215 | 213 |
216 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(wakeup2)).Times(1); | 214 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(wake_up2)).Times(1); |
217 | 215 |
218 time_domain_->UnregisterQueue(task_queue2_.get()); | 216 time_domain_->UnregisterQueue(task_queue2_.get()); |
219 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 217 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
220 } | 218 } |
221 | 219 |
222 TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) { | 220 TEST_F(TimeDomainTest, WakeUpReadyDelayedQueues) { |
223 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); | 221 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); |
224 base::TimeTicks now = time_domain_->Now(); | 222 base::TimeTicks now = time_domain_->Now(); |
225 base::TimeTicks delayed_runtime = now + delay; | 223 base::TimeTicks delayed_runtime = now + delay; |
226 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime)); | 224 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); |
227 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime, 0}, | 225 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime, 0}, |
228 now); | 226 now); |
229 | 227 |
230 base::TimeTicks next_run_time; | 228 base::TimeTicks next_run_time; |
231 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 229 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
232 EXPECT_EQ(delayed_runtime, next_run_time); | 230 EXPECT_EQ(delayed_runtime, next_run_time); |
233 | 231 |
234 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 232 LazyNow lazy_now = time_domain_->CreateLazyNow(); |
235 time_domain_->WakeupReadyDelayedQueues(&lazy_now); | 233 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); |
236 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 234 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
237 EXPECT_EQ(delayed_runtime, next_run_time); | 235 EXPECT_EQ(delayed_runtime, next_run_time); |
238 | 236 |
239 time_domain_->SetNow(delayed_runtime); | 237 time_domain_->SetNow(delayed_runtime); |
240 lazy_now = time_domain_->CreateLazyNow(); | 238 lazy_now = time_domain_->CreateLazyNow(); |
241 time_domain_->WakeupReadyDelayedQueues(&lazy_now); | 239 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); |
242 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time)); | 240 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time)); |
243 } | 241 } |
244 | 242 |
245 TEST_F(TimeDomainTest, WakeupReadyDelayedQueuesWithIdenticalRuntimes) { | 243 TEST_F(TimeDomainTest, WakeUpReadyDelayedQueuesWithIdenticalRuntimes) { |
246 int sequence_num = 0; | 244 int sequence_num = 0; |
247 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); | 245 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); |
248 base::TimeTicks now = time_domain_->Now(); | 246 base::TimeTicks now = time_domain_->Now(); |
249 base::TimeTicks delayed_runtime = now + delay; | 247 base::TimeTicks delayed_runtime = now + delay; |
250 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime)); | 248 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); |
251 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(delayed_runtime)); | 249 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(delayed_runtime)); |
252 | 250 |
253 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( | 251 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( |
254 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 252 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
255 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 253 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
256 "test.category", "test.category")); | 254 "test.category", "test.category")); |
257 | 255 |
258 time_domain_->ScheduleDelayedWork(task_queue2.get(), | 256 time_domain_->ScheduleDelayedWork(task_queue2.get(), |
259 {delayed_runtime, ++sequence_num}, now); | 257 {delayed_runtime, ++sequence_num}, now); |
260 time_domain_->ScheduleDelayedWork(task_queue_.get(), | 258 time_domain_->ScheduleDelayedWork(task_queue_.get(), |
261 {delayed_runtime, ++sequence_num}, now); | 259 {delayed_runtime, ++sequence_num}, now); |
262 | 260 |
263 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 261 LazyNow lazy_now = time_domain_->CreateLazyNow(); |
264 time_domain_->WakeupReadyDelayedQueues(&lazy_now); | 262 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); |
265 | 263 |
266 // The second task queue should wake up first since it has a lower sequence | 264 // The second task queue should wake up first since it has a lower sequence |
267 // number. | 265 // number. |
268 TaskQueue* next_task_queue; | 266 TaskQueue* next_task_queue; |
269 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 267 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
270 EXPECT_EQ(task_queue2.get(), next_task_queue); | 268 EXPECT_EQ(task_queue2.get(), next_task_queue); |
271 | 269 |
272 task_queue2->UnregisterTaskQueue(); | 270 task_queue2->UnregisterTaskQueue(); |
273 } | 271 } |
274 | 272 |
275 TEST_F(TimeDomainTest, CancelDelayedWork) { | 273 TEST_F(TimeDomainTest, CancelDelayedWork) { |
276 base::TimeTicks now = time_domain_->Now(); | 274 base::TimeTicks now = time_domain_->Now(); |
277 base::TimeTicks run_time = now + base::TimeDelta::FromMilliseconds(20); | 275 base::TimeTicks run_time = now + base::TimeDelta::FromMilliseconds(20); |
278 | 276 |
279 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time)); | 277 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time)); |
280 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now); | 278 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now); |
281 | 279 |
282 TaskQueue* next_task_queue; | 280 TaskQueue* next_task_queue; |
283 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 281 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
284 EXPECT_EQ(task_queue_.get(), next_task_queue); | 282 EXPECT_EQ(task_queue_.get(), next_task_queue); |
285 | 283 |
286 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(run_time)); | 284 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(run_time)); |
287 time_domain_->CancelDelayedWork(task_queue_.get()); | 285 time_domain_->CancelDelayedWork(task_queue_.get()); |
288 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 286 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
289 } | 287 } |
290 | 288 |
291 TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) { | 289 TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) { |
292 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( | 290 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( |
293 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 291 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
294 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 292 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
295 "test.category", "test.category")); | 293 "test.category", "test.category")); |
296 | 294 |
297 base::TimeTicks now = time_domain_->Now(); | 295 base::TimeTicks now = time_domain_->Now(); |
298 base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20); | 296 base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20); |
299 base::TimeTicks run_time2 = now + base::TimeDelta::FromMilliseconds(40); | 297 base::TimeTicks run_time2 = now + base::TimeDelta::FromMilliseconds(40); |
300 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time1)); | 298 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time1)); |
301 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time1, 0}, now); | 299 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time1, 0}, now); |
302 Mock::VerifyAndClearExpectations(time_domain_.get()); | 300 Mock::VerifyAndClearExpectations(time_domain_.get()); |
303 | 301 |
304 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0); | 302 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(0); |
305 time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now); | 303 time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now); |
306 Mock::VerifyAndClearExpectations(time_domain_.get()); | 304 Mock::VerifyAndClearExpectations(time_domain_.get()); |
307 | 305 |
308 TaskQueue* next_task_queue; | 306 TaskQueue* next_task_queue; |
309 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 307 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
310 EXPECT_EQ(task_queue_.get(), next_task_queue); | 308 EXPECT_EQ(task_queue_.get(), next_task_queue); |
311 | 309 |
312 base::TimeTicks next_run_time; | 310 base::TimeTicks next_run_time; |
313 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 311 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
314 EXPECT_EQ(run_time1, next_run_time); | 312 EXPECT_EQ(run_time1, next_run_time); |
315 | 313 |
316 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(run_time1)); | 314 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(run_time1)); |
317 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time2)); | 315 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time2)); |
318 time_domain_->CancelDelayedWork(task_queue_.get()); | 316 time_domain_->CancelDelayedWork(task_queue_.get()); |
319 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 317 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
320 EXPECT_EQ(task_queue2.get(), next_task_queue); | 318 EXPECT_EQ(task_queue2.get(), next_task_queue); |
321 | 319 |
322 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 320 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
323 EXPECT_EQ(run_time2, next_run_time); | 321 EXPECT_EQ(run_time2, next_run_time); |
324 | 322 |
325 Mock::VerifyAndClearExpectations(time_domain_.get()); | 323 Mock::VerifyAndClearExpectations(time_domain_.get()); |
326 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(AnyNumber()); | 324 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(AnyNumber()); |
327 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber()); | 325 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); |
328 | 326 |
329 // Tidy up. | 327 // Tidy up. |
330 task_queue2->UnregisterTaskQueue(); | 328 task_queue2->UnregisterTaskQueue(); |
331 } | 329 } |
332 | 330 |
333 namespace { | |
334 class MockObserver : public TimeDomain::Observer { | |
335 public: | |
336 ~MockObserver() override {} | |
337 | |
338 MOCK_METHOD1(OnTimeDomainHasImmediateWork, void(TaskQueue*)); | |
339 MOCK_METHOD1(OnTimeDomainHasDelayedWork, void(TaskQueue*)); | |
340 }; | |
341 } // namespace | |
342 | |
343 class TimeDomainWithObserverTest : public TimeDomainTest { | |
344 public: | |
345 MockTimeDomain* CreateMockTimeDomain() override { | |
346 observer_.reset(new MockObserver()); | |
347 return new MockTimeDomain(observer_.get()); | |
348 } | |
349 | |
350 std::unique_ptr<MockObserver> observer_; | |
351 }; | |
352 | |
353 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasImmediateWork) { | |
354 EXPECT_CALL(*observer_, OnTimeDomainHasImmediateWork(task_queue_.get())); | |
355 time_domain_->OnQueueHasImmediateWork(task_queue_.get()); | |
356 } | |
357 | |
358 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasDelayedWork) { | |
359 EXPECT_CALL(*observer_, OnTimeDomainHasDelayedWork(task_queue_.get())); | |
360 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)); | |
361 base::TimeTicks now = time_domain_->Now(); | |
362 time_domain_->ScheduleDelayedWork( | |
363 task_queue_.get(), {now + base::TimeDelta::FromMilliseconds(10), 0}, now); | |
364 } | |
365 | |
366 } // namespace scheduler | 331 } // namespace scheduler |
367 } // namespace blink | 332 } // namespace blink |
OLD | NEW |