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" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 base::trace_event::TracedValue* state) const override {} | 45 base::trace_event::TracedValue* state) const override {} |
46 | 46 |
47 base::Optional<base::TimeDelta> DelayTillNextTask( | 47 base::Optional<base::TimeDelta> DelayTillNextTask( |
48 LazyNow* lazy_now) override { | 48 LazyNow* lazy_now) override { |
49 return base::Optional<base::TimeDelta>(); | 49 return base::Optional<base::TimeDelta>(); |
50 } | 50 } |
51 const char* GetName() const override { return "Test"; } | 51 const char* GetName() const override { return "Test"; } |
52 void OnRegisterWithTaskQueueManager( | 52 void OnRegisterWithTaskQueueManager( |
53 TaskQueueManager* task_queue_manager) override {} | 53 TaskQueueManager* task_queue_manager) override {} |
54 | 54 |
55 MOCK_METHOD2(RequestWakeupAt, | 55 MOCK_METHOD2(RequestWakeup, void(base::TimeTicks now, base::TimeDelta delay)); |
56 void(LazyNow* lazy_now, base::TimeTicks run_time)); | |
57 | |
58 MOCK_METHOD1(CancelWakeupAt, void(base::TimeTicks run_time)); | |
59 | 56 |
60 void SetNow(base::TimeTicks now) { now_ = now; } | 57 void SetNow(base::TimeTicks now) { now_ = now; } |
61 | 58 |
62 private: | 59 private: |
63 base::TimeTicks now_; | 60 base::TimeTicks now_; |
64 | 61 |
65 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain); | 62 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain); |
66 }; | 63 }; |
67 | 64 |
68 class TimeDomainTest : public testing::Test { | 65 class TimeDomainTest : public testing::Test { |
(...skipping 15 matching lines...) Expand all Loading... |
84 return new MockTimeDomain(nullptr); | 81 return new MockTimeDomain(nullptr); |
85 } | 82 } |
86 | 83 |
87 std::unique_ptr<MockTimeDomain> time_domain_; | 84 std::unique_ptr<MockTimeDomain> time_domain_; |
88 scoped_refptr<internal::TaskQueueImpl> task_queue_; | 85 scoped_refptr<internal::TaskQueueImpl> task_queue_; |
89 }; | 86 }; |
90 | 87 |
91 TEST_F(TimeDomainTest, ScheduleDelayedWork) { | 88 TEST_F(TimeDomainTest, ScheduleDelayedWork) { |
92 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); | 89 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
93 base::TimeTicks delayed_runtime = time_domain_->Now() + delay; | 90 base::TimeTicks delayed_runtime = time_domain_->Now() + delay; |
94 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime)); | 91 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay)); |
95 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 92 base::TimeTicks now = time_domain_->Now(); |
96 time_domain_->ScheduleDelayedWork(task_queue_.get(), lazy_now.Now() + delay, | 93 time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay, now); |
97 &lazy_now); | |
98 | 94 |
99 base::TimeTicks next_scheduled_runtime; | 95 base::TimeTicks next_scheduled_runtime; |
100 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 96 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
101 EXPECT_EQ(delayed_runtime, next_scheduled_runtime); | 97 EXPECT_EQ(delayed_runtime, next_scheduled_runtime); |
102 | 98 |
103 TaskQueue* next_task_queue; | 99 TaskQueue* next_task_queue; |
104 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 100 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
105 EXPECT_EQ(task_queue_.get(), next_task_queue); | 101 EXPECT_EQ(task_queue_.get(), next_task_queue); |
106 } | 102 } |
107 | 103 |
108 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) { | 104 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) { |
109 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); | 105 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); |
110 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100); | 106 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100); |
111 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1; | 107 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1; |
112 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2; | 108 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2; |
113 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime1)); | 109 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay1)); |
114 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 110 base::TimeTicks now = time_domain_->Now(); |
115 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, | 111 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime1, now); |
116 &lazy_now); | |
117 | 112 |
118 base::TimeTicks next_scheduled_runtime; | 113 base::TimeTicks next_scheduled_runtime; |
119 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 114 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
120 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime); | 115 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime); |
121 | 116 |
122 Mock::VerifyAndClearExpectations(time_domain_.get()); | 117 Mock::VerifyAndClearExpectations(time_domain_.get()); |
123 | 118 |
124 // Now scheduler a later wakeup, which should replace the previously requested | 119 // Now scheduler a later wakeup, which should replace the previously requested |
125 // one. | 120 // one. |
126 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime2)); | 121 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay2)); |
127 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, | 122 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime2, now); |
128 &lazy_now); | |
129 | 123 |
130 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); | 124 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); |
131 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime); | 125 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime); |
132 } | 126 } |
133 | 127 |
134 TEST_F(TimeDomainTest, RequestWakeupAt_OnlyCalledForEarlierTasks) { | 128 TEST_F(TimeDomainTest, RequestWakeup_OnlyCalledForEarlierTasks) { |
135 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( | 129 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( |
136 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 130 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
137 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 131 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
138 "test.category", "test.category")); | 132 "test.category", "test.category")); |
139 | 133 |
140 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( | 134 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( |
141 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 135 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
142 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 136 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
143 "test.category", "test.category")); | 137 "test.category", "test.category")); |
144 | 138 |
145 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( | 139 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( |
146 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 140 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
147 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 141 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
148 "test.category", "test.category")); | 142 "test.category", "test.category")); |
149 | 143 |
150 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); | 144 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); |
151 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); | 145 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); |
152 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30); | 146 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30); |
153 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1); | 147 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1); |
154 | 148 |
155 // RequestWakeupAt should always be called if there are no other wakeups. | 149 // RequestWakeup should always be called if there are no other wakeups. |
156 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 150 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay1)); |
157 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, lazy_now.Now() + delay1)); | 151 base::TimeTicks now = time_domain_->Now(); |
158 time_domain_->ScheduleDelayedWork(task_queue_.get(), lazy_now.Now() + delay1, | 152 time_domain_->ScheduleDelayedWork(task_queue_.get(), now + delay1, now); |
159 &lazy_now); | |
160 | 153 |
161 Mock::VerifyAndClearExpectations(time_domain_.get()); | 154 Mock::VerifyAndClearExpectations(time_domain_.get()); |
162 | 155 |
163 // RequestWakeupAt should not be called when scheduling later tasks. | 156 // RequestWakeup should not be called when scheduling later tasks. |
164 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0); | 157 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, _)).Times(0); |
165 time_domain_->ScheduleDelayedWork(task_queue2.get(), lazy_now.Now() + delay2, | 158 time_domain_->ScheduleDelayedWork(task_queue2.get(), now + delay2, now); |
166 &lazy_now); | 159 time_domain_->ScheduleDelayedWork(task_queue3.get(), now + delay3, now); |
167 time_domain_->ScheduleDelayedWork(task_queue3.get(), lazy_now.Now() + delay3, | |
168 &lazy_now); | |
169 | 160 |
170 // RequestWakeupAt should be called when scheduling earlier tasks. | 161 // RequestWakeup should be called when scheduling earlier tasks. |
171 Mock::VerifyAndClearExpectations(time_domain_.get()); | 162 Mock::VerifyAndClearExpectations(time_domain_.get()); |
172 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, lazy_now.Now() + delay4)); | 163 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay4)); |
173 time_domain_->ScheduleDelayedWork(task_queue4.get(), lazy_now.Now() + delay4, | 164 time_domain_->ScheduleDelayedWork(task_queue4.get(), now + delay4, now); |
174 &lazy_now); | |
175 | 165 |
176 task_queue2->UnregisterTaskQueue(); | 166 task_queue2->UnregisterTaskQueue(); |
177 task_queue3->UnregisterTaskQueue(); | 167 task_queue3->UnregisterTaskQueue(); |
178 task_queue4->UnregisterTaskQueue(); | 168 task_queue4->UnregisterTaskQueue(); |
179 } | 169 } |
180 | 170 |
181 TEST_F(TimeDomainTest, UnregisterQueue) { | 171 TEST_F(TimeDomainTest, UnregisterQueue) { |
182 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( | 172 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( |
183 new internal::TaskQueueImpl(nullptr, time_domain_.get(), | 173 new internal::TaskQueueImpl(nullptr, time_domain_.get(), |
184 TaskQueue::Spec(TaskQueue::QueueType::TEST), | 174 TaskQueue::Spec(TaskQueue::QueueType::TEST), |
185 "test.category", "test.category")); | 175 "test.category", "test.category")); |
186 | 176 |
187 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(1); | 177 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, _)).Times(1); |
188 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 178 base::TimeTicks now = time_domain_->Now(); |
189 time_domain_->ScheduleDelayedWork( | 179 time_domain_->ScheduleDelayedWork( |
190 task_queue_.get(), lazy_now.Now() + base::TimeDelta::FromMilliseconds(10), | 180 task_queue_.get(), now + base::TimeDelta::FromMilliseconds(10), now); |
191 &lazy_now); | |
192 time_domain_->ScheduleDelayedWork( | 181 time_domain_->ScheduleDelayedWork( |
193 task_queue2_.get(), | 182 task_queue2_.get(), now + base::TimeDelta::FromMilliseconds(100), now); |
194 lazy_now.Now() + base::TimeDelta::FromMilliseconds(100), &lazy_now); | |
195 | 183 |
196 TaskQueue* next_task_queue; | 184 TaskQueue* next_task_queue; |
197 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 185 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
198 EXPECT_EQ(task_queue_.get(), next_task_queue); | 186 EXPECT_EQ(task_queue_.get(), next_task_queue); |
199 | 187 |
200 time_domain_->UnregisterQueue(task_queue_.get()); | 188 time_domain_->UnregisterQueue(task_queue_.get()); |
201 task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); | 189 task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); |
202 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 190 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
203 EXPECT_EQ(task_queue2_.get(), next_task_queue); | 191 EXPECT_EQ(task_queue2_.get(), next_task_queue); |
204 | 192 |
205 time_domain_->UnregisterQueue(task_queue2_.get()); | 193 time_domain_->UnregisterQueue(task_queue2_.get()); |
206 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); | 194 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); |
207 } | 195 } |
208 | 196 |
209 TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) { | 197 TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) { |
210 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); | 198 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); |
211 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 199 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, delay)); |
212 base::TimeTicks delayed_runtime = lazy_now.Now() + delay; | 200 base::TimeTicks now = time_domain_->Now(); |
213 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime)); | 201 base::TimeTicks delayed_runtime = now + delay; |
214 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime, | 202 time_domain_->ScheduleDelayedWork(task_queue_.get(), delayed_runtime, now); |
215 &lazy_now); | |
216 | 203 |
217 base::TimeTicks next_run_time; | 204 base::TimeTicks next_run_time; |
218 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 205 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
219 EXPECT_EQ(delayed_runtime, next_run_time); | 206 EXPECT_EQ(delayed_runtime, next_run_time); |
220 | 207 |
| 208 LazyNow lazy_now = time_domain_->CreateLazyNow(); |
221 time_domain_->WakeupReadyDelayedQueues(&lazy_now); | 209 time_domain_->WakeupReadyDelayedQueues(&lazy_now); |
222 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); | 210 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); |
223 EXPECT_EQ(delayed_runtime, next_run_time); | 211 EXPECT_EQ(delayed_runtime, next_run_time); |
224 | 212 |
225 time_domain_->SetNow(delayed_runtime); | 213 time_domain_->SetNow(delayed_runtime); |
226 lazy_now = time_domain_->CreateLazyNow(); | 214 lazy_now = time_domain_->CreateLazyNow(); |
227 time_domain_->WakeupReadyDelayedQueues(&lazy_now); | 215 time_domain_->WakeupReadyDelayedQueues(&lazy_now); |
228 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time)); | 216 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time)); |
229 } | 217 } |
230 | 218 |
(...skipping 17 matching lines...) Expand all Loading... |
248 std::unique_ptr<MockObserver> observer_; | 236 std::unique_ptr<MockObserver> observer_; |
249 }; | 237 }; |
250 | 238 |
251 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasImmediateWork) { | 239 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasImmediateWork) { |
252 EXPECT_CALL(*observer_, OnTimeDomainHasImmediateWork(task_queue_.get())); | 240 EXPECT_CALL(*observer_, OnTimeDomainHasImmediateWork(task_queue_.get())); |
253 time_domain_->OnQueueHasImmediateWork(task_queue_.get()); | 241 time_domain_->OnQueueHasImmediateWork(task_queue_.get()); |
254 } | 242 } |
255 | 243 |
256 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasDelayedWork) { | 244 TEST_F(TimeDomainWithObserverTest, OnTimeDomainHasDelayedWork) { |
257 EXPECT_CALL(*observer_, OnTimeDomainHasDelayedWork(task_queue_.get())); | 245 EXPECT_CALL(*observer_, OnTimeDomainHasDelayedWork(task_queue_.get())); |
258 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)); | 246 EXPECT_CALL(*time_domain_.get(), RequestWakeup(_, _)); |
259 LazyNow lazy_now = time_domain_->CreateLazyNow(); | 247 base::TimeTicks now = time_domain_->Now(); |
260 time_domain_->ScheduleDelayedWork( | 248 time_domain_->ScheduleDelayedWork( |
261 task_queue_.get(), lazy_now.Now() + base::TimeDelta::FromMilliseconds(10), | 249 task_queue_.get(), now + base::TimeDelta::FromMilliseconds(10), now); |
262 &lazy_now); | |
263 } | 250 } |
264 | 251 |
265 } // namespace scheduler | 252 } // namespace scheduler |
266 } // namespace blink | 253 } // namespace blink |
OLD | NEW |