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