Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/time_domain_unittest.cc

Issue 2798563003: [scheduler] Add TaskQueue::Observer (Closed)
Patch Set: add todo for test timings & wake_up -> wake-up in comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698