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