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