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

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

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

Powered by Google App Engine
This is Rietveld 408576698