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

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

Issue 2812703002: Revert of [scheduler] Add TaskQueue::Observer (Closed)
Patch Set: Manual Revert 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 MockTimeDomain() 27 explicit MockTimeDomain(TimeDomain::Observer* observer)
28 : now_(base::TimeTicks() + base::TimeDelta::FromSeconds(1)) {} 28 : TimeDomain(observer),
29 now_(base::TimeTicks() + base::TimeDelta::FromSeconds(1)) {}
29 30
30 ~MockTimeDomain() override {} 31 ~MockTimeDomain() override {}
31 32
32 using TimeDomain::CancelDelayedWork; 33 using TimeDomain::CancelDelayedWork;
33 using TimeDomain::NextScheduledRunTime; 34 using TimeDomain::NextScheduledRunTime;
34 using TimeDomain::NextScheduledTaskQueue; 35 using TimeDomain::NextScheduledTaskQueue;
36 using TimeDomain::OnQueueHasImmediateWork;
35 using TimeDomain::ScheduleDelayedWork; 37 using TimeDomain::ScheduleDelayedWork;
36 using TimeDomain::UnregisterQueue; 38 using TimeDomain::UnregisterQueue;
37 using TimeDomain::WakeUpReadyDelayedQueues; 39 using TimeDomain::WakeupReadyDelayedQueues;
38 40
39 // TimeSource implementation: 41 // TimeSource implementation:
40 LazyNow CreateLazyNow() const override { return LazyNow(now_); } 42 LazyNow CreateLazyNow() const override { return LazyNow(now_); }
41 base::TimeTicks Now() const override { return now_; } 43 base::TimeTicks Now() const override { return now_; }
42 44
43 void AsValueIntoInternal( 45 void AsValueIntoInternal(
44 base::trace_event::TracedValue* state) const override {} 46 base::trace_event::TracedValue* state) const override {}
45 47
46 base::Optional<base::TimeDelta> DelayTillNextTask( 48 base::Optional<base::TimeDelta> DelayTillNextTask(
47 LazyNow* lazy_now) override { 49 LazyNow* lazy_now) override {
48 return base::Optional<base::TimeDelta>(); 50 return base::Optional<base::TimeDelta>();
49 } 51 }
50 const char* GetName() const override { return "Test"; } 52 const char* GetName() const override { return "Test"; }
51 void OnRegisterWithTaskQueueManager( 53 void OnRegisterWithTaskQueueManager(
52 TaskQueueManager* task_queue_manager) override {} 54 TaskQueueManager* task_queue_manager) override {}
53 55
54 MOCK_METHOD2(RequestWakeUpAt, 56 MOCK_METHOD2(RequestWakeupAt,
55 void(base::TimeTicks now, base::TimeTicks run_time)); 57 void(base::TimeTicks now, base::TimeTicks run_time));
56 58
57 MOCK_METHOD1(CancelWakeUpAt, void(base::TimeTicks run_time)); 59 MOCK_METHOD1(CancelWakeupAt, void(base::TimeTicks run_time));
58 60
59 void SetNow(base::TimeTicks now) { now_ = now; } 61 void SetNow(base::TimeTicks now) { now_ = now; }
60 62
61 private: 63 private:
62 base::TimeTicks now_; 64 base::TimeTicks now_;
63 65
64 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain); 66 DISALLOW_COPY_AND_ASSIGN(MockTimeDomain);
65 }; 67 };
66 68
67 class TimeDomainTest : public testing::Test { 69 class TimeDomainTest : public testing::Test {
68 public: 70 public:
69 void SetUp() final { 71 void SetUp() final {
70 time_domain_ = base::WrapUnique(CreateMockTimeDomain()); 72 time_domain_ = base::WrapUnique(CreateMockTimeDomain());
71 task_queue_ = make_scoped_refptr( 73 task_queue_ = make_scoped_refptr(
72 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 74 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
73 TaskQueue::Spec(TaskQueue::QueueType::TEST), 75 TaskQueue::Spec(TaskQueue::QueueType::TEST),
74 "test.category", "test.category")); 76 "test.category", "test.category"));
75 } 77 }
76 78
77 void TearDown() final { 79 void TearDown() final {
78 if (task_queue_) 80 if (task_queue_)
79 task_queue_->UnregisterTaskQueue(); 81 task_queue_->UnregisterTaskQueue();
80 } 82 }
81 83
82 virtual MockTimeDomain* CreateMockTimeDomain() { 84 virtual MockTimeDomain* CreateMockTimeDomain() {
83 return new MockTimeDomain(); 85 return new MockTimeDomain(nullptr);
84 } 86 }
85 87
86 std::unique_ptr<MockTimeDomain> time_domain_; 88 std::unique_ptr<MockTimeDomain> time_domain_;
87 scoped_refptr<internal::TaskQueueImpl> task_queue_; 89 scoped_refptr<internal::TaskQueueImpl> task_queue_;
88 }; 90 };
89 91
90 TEST_F(TimeDomainTest, ScheduleDelayedWork) { 92 TEST_F(TimeDomainTest, ScheduleDelayedWork) {
91 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); 93 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10);
92 base::TimeTicks delayed_runtime = time_domain_->Now() + delay; 94 base::TimeTicks delayed_runtime = time_domain_->Now() + delay;
93 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); 95 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
94 base::TimeTicks now = time_domain_->Now(); 96 base::TimeTicks now = time_domain_->Now();
95 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay, 0}, now); 97 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay, 0}, now);
96 98
97 base::TimeTicks next_scheduled_runtime; 99 base::TimeTicks next_scheduled_runtime;
98 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); 100 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
99 EXPECT_EQ(delayed_runtime, next_scheduled_runtime); 101 EXPECT_EQ(delayed_runtime, next_scheduled_runtime);
100 102
101 TaskQueue* next_task_queue; 103 TaskQueue* next_task_queue;
102 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 104 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
103 EXPECT_EQ(task_queue_.get(), next_task_queue); 105 EXPECT_EQ(task_queue_.get(), next_task_queue);
104 Mock::VerifyAndClearExpectations(time_domain_.get()); 106 Mock::VerifyAndClearExpectations(time_domain_.get());
105 107
106 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); 108 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber());
107 } 109 }
108 110
109 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeUp) { 111 TEST_F(TimeDomainTest, ScheduleDelayedWorkSupersedesPreviousWakeup) {
110 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); 112 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
111 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100); 113 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(100);
112 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1; 114 base::TimeTicks delayed_runtime1 = time_domain_->Now() + delay1;
113 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2; 115 base::TimeTicks delayed_runtime2 = time_domain_->Now() + delay2;
114 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime1)); 116 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime1));
115 base::TimeTicks now = time_domain_->Now(); 117 base::TimeTicks now = time_domain_->Now();
116 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime1, 0}, 118 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime1, 0},
117 now); 119 now);
118 120
119 base::TimeTicks next_scheduled_runtime; 121 base::TimeTicks next_scheduled_runtime;
120 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); 122 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
121 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime); 123 EXPECT_EQ(delayed_runtime1, next_scheduled_runtime);
122 124
123 Mock::VerifyAndClearExpectations(time_domain_.get()); 125 Mock::VerifyAndClearExpectations(time_domain_.get());
124 126
125 // Now scheduler a later wake_up, which should replace the previously 127 // Now scheduler a later wakeup, which should replace the previously requested
126 // requested one. 128 // one.
127 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime2)); 129 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime2));
128 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime2, 0}, 130 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime2, 0},
129 now); 131 now);
130 132
131 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime)); 133 EXPECT_TRUE(time_domain_->NextScheduledRunTime(&next_scheduled_runtime));
132 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime); 134 EXPECT_EQ(delayed_runtime2, next_scheduled_runtime);
133 Mock::VerifyAndClearExpectations(time_domain_.get()); 135 Mock::VerifyAndClearExpectations(time_domain_.get());
134 136
135 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); 137 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber());
136 } 138 }
137 139
138 TEST_F(TimeDomainTest, RequestWakeUpAt_OnlyCalledForEarlierTasks) { 140 TEST_F(TimeDomainTest, RequestWakeupAt_OnlyCalledForEarlierTasks) {
139 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( 141 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
140 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 142 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
141 TaskQueue::Spec(TaskQueue::QueueType::TEST), 143 TaskQueue::Spec(TaskQueue::QueueType::TEST),
142 "test.category", "test.category")); 144 "test.category", "test.category"));
143 145
144 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr( 146 scoped_refptr<internal::TaskQueueImpl> task_queue3 = make_scoped_refptr(
145 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 147 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
146 TaskQueue::Spec(TaskQueue::QueueType::TEST), 148 TaskQueue::Spec(TaskQueue::QueueType::TEST),
147 "test.category", "test.category")); 149 "test.category", "test.category"));
148 150
149 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr( 151 scoped_refptr<internal::TaskQueueImpl> task_queue4 = make_scoped_refptr(
150 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 152 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
151 TaskQueue::Spec(TaskQueue::QueueType::TEST), 153 TaskQueue::Spec(TaskQueue::QueueType::TEST),
152 "test.category", "test.category")); 154 "test.category", "test.category"));
153 155
154 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10); 156 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(10);
155 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20); 157 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(20);
156 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30); 158 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(30);
157 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1); 159 base::TimeDelta delay4 = base::TimeDelta::FromMilliseconds(1);
158 160
159 // RequestWakeUpAt should always be called if there are no other wake_ups. 161 // RequestWakeupAt should always be called if there are no other wakeups.
160 base::TimeTicks now = time_domain_->Now(); 162 base::TimeTicks now = time_domain_->Now();
161 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, now + delay1)); 163 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay1));
162 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay1, 0}, now); 164 time_domain_->ScheduleDelayedWork(task_queue_.get(), {now + delay1, 0}, now);
163 165
164 Mock::VerifyAndClearExpectations(time_domain_.get()); 166 Mock::VerifyAndClearExpectations(time_domain_.get());
165 167
166 // RequestWakeUpAt should not be called when scheduling later tasks. 168 // RequestWakeupAt should not be called when scheduling later tasks.
167 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(0); 169 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0);
168 time_domain_->ScheduleDelayedWork(task_queue2.get(), {now + delay2, 0}, now); 170 time_domain_->ScheduleDelayedWork(task_queue2.get(), {now + delay2, 0}, now);
169 time_domain_->ScheduleDelayedWork(task_queue3.get(), {now + delay3, 0}, now); 171 time_domain_->ScheduleDelayedWork(task_queue3.get(), {now + delay3, 0}, now);
170 172
171 // RequestWakeUpAt should be called when scheduling earlier tasks. 173 // RequestWakeupAt should be called when scheduling earlier tasks.
172 Mock::VerifyAndClearExpectations(time_domain_.get()); 174 Mock::VerifyAndClearExpectations(time_domain_.get());
173 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, now + delay4)); 175 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, now + delay4));
174 time_domain_->ScheduleDelayedWork(task_queue4.get(), {now + delay4, 0}, now); 176 time_domain_->ScheduleDelayedWork(task_queue4.get(), {now + delay4, 0}, now);
175 177
176 Mock::VerifyAndClearExpectations(time_domain_.get()); 178 Mock::VerifyAndClearExpectations(time_domain_.get());
177 179
178 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)); 180 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _));
179 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(2); 181 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(2);
180 task_queue2->UnregisterTaskQueue(); 182 task_queue2->UnregisterTaskQueue();
181 task_queue3->UnregisterTaskQueue(); 183 task_queue3->UnregisterTaskQueue();
182 task_queue4->UnregisterTaskQueue(); 184 task_queue4->UnregisterTaskQueue();
183 } 185 }
184 186
185 TEST_F(TimeDomainTest, UnregisterQueue) { 187 TEST_F(TimeDomainTest, UnregisterQueue) {
186 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr( 188 scoped_refptr<internal::TaskQueueImpl> task_queue2_ = make_scoped_refptr(
187 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 189 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
188 TaskQueue::Spec(TaskQueue::QueueType::TEST), 190 TaskQueue::Spec(TaskQueue::QueueType::TEST),
189 "test.category", "test.category")); 191 "test.category", "test.category"));
190 192
191 base::TimeTicks now = time_domain_->Now(); 193 base::TimeTicks now = time_domain_->Now();
192 base::TimeTicks wake_up1 = now + base::TimeDelta::FromMilliseconds(10); 194 base::TimeTicks wakeup1 = now + base::TimeDelta::FromMilliseconds(10);
193 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up1)).Times(1); 195 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, wakeup1)).Times(1);
194 time_domain_->ScheduleDelayedWork(task_queue_.get(), {wake_up1, 0}, now); 196 time_domain_->ScheduleDelayedWork(task_queue_.get(), {wakeup1, 0}, now);
195 base::TimeTicks wake_up2 = now + base::TimeDelta::FromMilliseconds(100); 197 base::TimeTicks wakeup2 = now + base::TimeDelta::FromMilliseconds(100);
196 time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wake_up2, 0}, now); 198 time_domain_->ScheduleDelayedWork(task_queue2_.get(), {wakeup2, 0}, now);
197 199
198 TaskQueue* next_task_queue; 200 TaskQueue* next_task_queue;
199 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 201 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
200 EXPECT_EQ(task_queue_.get(), next_task_queue); 202 EXPECT_EQ(task_queue_.get(), next_task_queue);
201 203
202 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); 204 testing::Mock::VerifyAndClearExpectations(time_domain_.get());
203 205
204 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(wake_up1)).Times(1); 206 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(wakeup1)).Times(1);
205 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, wake_up2)).Times(1); 207 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, wakeup2)).Times(1);
206 208
207 time_domain_->UnregisterQueue(task_queue_.get()); 209 time_domain_->UnregisterQueue(task_queue_.get());
208 task_queue_ = scoped_refptr<internal::TaskQueueImpl>(); 210 task_queue_ = scoped_refptr<internal::TaskQueueImpl>();
209 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 211 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
210 EXPECT_EQ(task_queue2_.get(), next_task_queue); 212 EXPECT_EQ(task_queue2_.get(), next_task_queue);
211 213
212 testing::Mock::VerifyAndClearExpectations(time_domain_.get()); 214 testing::Mock::VerifyAndClearExpectations(time_domain_.get());
213 215
214 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(wake_up2)).Times(1); 216 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(wakeup2)).Times(1);
215 217
216 time_domain_->UnregisterQueue(task_queue2_.get()); 218 time_domain_->UnregisterQueue(task_queue2_.get());
217 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 219 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
218 } 220 }
219 221
220 TEST_F(TimeDomainTest, WakeUpReadyDelayedQueues) { 222 TEST_F(TimeDomainTest, WakeupReadyDelayedQueues) {
221 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); 223 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
222 base::TimeTicks now = time_domain_->Now(); 224 base::TimeTicks now = time_domain_->Now();
223 base::TimeTicks delayed_runtime = now + delay; 225 base::TimeTicks delayed_runtime = now + delay;
224 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); 226 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
225 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime, 0}, 227 time_domain_->ScheduleDelayedWork(task_queue_.get(), {delayed_runtime, 0},
226 now); 228 now);
227 229
228 base::TimeTicks next_run_time; 230 base::TimeTicks next_run_time;
229 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); 231 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
230 EXPECT_EQ(delayed_runtime, next_run_time); 232 EXPECT_EQ(delayed_runtime, next_run_time);
231 233
232 LazyNow lazy_now = time_domain_->CreateLazyNow(); 234 LazyNow lazy_now = time_domain_->CreateLazyNow();
233 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); 235 time_domain_->WakeupReadyDelayedQueues(&lazy_now);
234 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); 236 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
235 EXPECT_EQ(delayed_runtime, next_run_time); 237 EXPECT_EQ(delayed_runtime, next_run_time);
236 238
237 time_domain_->SetNow(delayed_runtime); 239 time_domain_->SetNow(delayed_runtime);
238 lazy_now = time_domain_->CreateLazyNow(); 240 lazy_now = time_domain_->CreateLazyNow();
239 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); 241 time_domain_->WakeupReadyDelayedQueues(&lazy_now);
240 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time)); 242 ASSERT_FALSE(time_domain_->NextScheduledRunTime(&next_run_time));
241 } 243 }
242 244
243 TEST_F(TimeDomainTest, WakeUpReadyDelayedQueuesWithIdenticalRuntimes) { 245 TEST_F(TimeDomainTest, WakeupReadyDelayedQueuesWithIdenticalRuntimes) {
244 int sequence_num = 0; 246 int sequence_num = 0;
245 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50); 247 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(50);
246 base::TimeTicks now = time_domain_->Now(); 248 base::TimeTicks now = time_domain_->Now();
247 base::TimeTicks delayed_runtime = now + delay; 249 base::TimeTicks delayed_runtime = now + delay;
248 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, delayed_runtime)); 250 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, delayed_runtime));
249 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(delayed_runtime)); 251 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(delayed_runtime));
250 252
251 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( 253 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
252 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 254 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
253 TaskQueue::Spec(TaskQueue::QueueType::TEST), 255 TaskQueue::Spec(TaskQueue::QueueType::TEST),
254 "test.category", "test.category")); 256 "test.category", "test.category"));
255 257
256 time_domain_->ScheduleDelayedWork(task_queue2.get(), 258 time_domain_->ScheduleDelayedWork(task_queue2.get(),
257 {delayed_runtime, ++sequence_num}, now); 259 {delayed_runtime, ++sequence_num}, now);
258 time_domain_->ScheduleDelayedWork(task_queue_.get(), 260 time_domain_->ScheduleDelayedWork(task_queue_.get(),
259 {delayed_runtime, ++sequence_num}, now); 261 {delayed_runtime, ++sequence_num}, now);
260 262
261 LazyNow lazy_now = time_domain_->CreateLazyNow(); 263 LazyNow lazy_now = time_domain_->CreateLazyNow();
262 time_domain_->WakeUpReadyDelayedQueues(&lazy_now); 264 time_domain_->WakeupReadyDelayedQueues(&lazy_now);
263 265
264 // The second task queue should wake up first since it has a lower sequence 266 // The second task queue should wake up first since it has a lower sequence
265 // number. 267 // number.
266 TaskQueue* next_task_queue; 268 TaskQueue* next_task_queue;
267 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 269 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
268 EXPECT_EQ(task_queue2.get(), next_task_queue); 270 EXPECT_EQ(task_queue2.get(), next_task_queue);
269 271
270 task_queue2->UnregisterTaskQueue(); 272 task_queue2->UnregisterTaskQueue();
271 } 273 }
272 274
273 TEST_F(TimeDomainTest, CancelDelayedWork) { 275 TEST_F(TimeDomainTest, CancelDelayedWork) {
274 base::TimeTicks now = time_domain_->Now(); 276 base::TimeTicks now = time_domain_->Now();
275 base::TimeTicks run_time = now + base::TimeDelta::FromMilliseconds(20); 277 base::TimeTicks run_time = now + base::TimeDelta::FromMilliseconds(20);
276 278
277 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time)); 279 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time));
278 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now); 280 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time, 0}, now);
279 281
280 TaskQueue* next_task_queue; 282 TaskQueue* next_task_queue;
281 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 283 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
282 EXPECT_EQ(task_queue_.get(), next_task_queue); 284 EXPECT_EQ(task_queue_.get(), next_task_queue);
283 285
284 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(run_time)); 286 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(run_time));
285 time_domain_->CancelDelayedWork(task_queue_.get()); 287 time_domain_->CancelDelayedWork(task_queue_.get());
286 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 288 EXPECT_FALSE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
287 } 289 }
288 290
289 TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) { 291 TEST_F(TimeDomainTest, CancelDelayedWork_TwoQueues) {
290 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr( 292 scoped_refptr<internal::TaskQueueImpl> task_queue2 = make_scoped_refptr(
291 new internal::TaskQueueImpl(nullptr, time_domain_.get(), 293 new internal::TaskQueueImpl(nullptr, time_domain_.get(),
292 TaskQueue::Spec(TaskQueue::QueueType::TEST), 294 TaskQueue::Spec(TaskQueue::QueueType::TEST),
293 "test.category", "test.category")); 295 "test.category", "test.category"));
294 296
295 base::TimeTicks now = time_domain_->Now(); 297 base::TimeTicks now = time_domain_->Now();
296 base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20); 298 base::TimeTicks run_time1 = now + base::TimeDelta::FromMilliseconds(20);
297 base::TimeTicks run_time2 = now + base::TimeDelta::FromMilliseconds(40); 299 base::TimeTicks run_time2 = now + base::TimeDelta::FromMilliseconds(40);
298 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time1)); 300 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time1));
299 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time1, 0}, now); 301 time_domain_->ScheduleDelayedWork(task_queue_.get(), {run_time1, 0}, now);
300 Mock::VerifyAndClearExpectations(time_domain_.get()); 302 Mock::VerifyAndClearExpectations(time_domain_.get());
301 303
302 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(0); 304 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(0);
303 time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now); 305 time_domain_->ScheduleDelayedWork(task_queue2.get(), {run_time2, 0}, now);
304 Mock::VerifyAndClearExpectations(time_domain_.get()); 306 Mock::VerifyAndClearExpectations(time_domain_.get());
305 307
306 TaskQueue* next_task_queue; 308 TaskQueue* next_task_queue;
307 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 309 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
308 EXPECT_EQ(task_queue_.get(), next_task_queue); 310 EXPECT_EQ(task_queue_.get(), next_task_queue);
309 311
310 base::TimeTicks next_run_time; 312 base::TimeTicks next_run_time;
311 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); 313 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
312 EXPECT_EQ(run_time1, next_run_time); 314 EXPECT_EQ(run_time1, next_run_time);
313 315
314 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(run_time1)); 316 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(run_time1));
315 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, run_time2)); 317 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, run_time2));
316 time_domain_->CancelDelayedWork(task_queue_.get()); 318 time_domain_->CancelDelayedWork(task_queue_.get());
317 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue)); 319 EXPECT_TRUE(time_domain_->NextScheduledTaskQueue(&next_task_queue));
318 EXPECT_EQ(task_queue2.get(), next_task_queue); 320 EXPECT_EQ(task_queue2.get(), next_task_queue);
319 321
320 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time)); 322 ASSERT_TRUE(time_domain_->NextScheduledRunTime(&next_run_time));
321 EXPECT_EQ(run_time2, next_run_time); 323 EXPECT_EQ(run_time2, next_run_time);
322 324
323 Mock::VerifyAndClearExpectations(time_domain_.get()); 325 Mock::VerifyAndClearExpectations(time_domain_.get());
324 EXPECT_CALL(*time_domain_.get(), RequestWakeUpAt(_, _)).Times(AnyNumber()); 326 EXPECT_CALL(*time_domain_.get(), RequestWakeupAt(_, _)).Times(AnyNumber());
325 EXPECT_CALL(*time_domain_.get(), CancelWakeUpAt(_)).Times(AnyNumber()); 327 EXPECT_CALL(*time_domain_.get(), CancelWakeupAt(_)).Times(AnyNumber());
326 328
327 // Tidy up. 329 // Tidy up.
328 task_queue2->UnregisterTaskQueue(); 330 task_queue2->UnregisterTaskQueue();
329 } 331 }
330 332
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
331 } // namespace scheduler 366 } // namespace scheduler
332 } // namespace blink 367 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698