| 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 |