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

Side by Side Diff: cc/scheduler/begin_frame_source_unittest.cc

Issue 2150533004: cc: Send all begin frames using a PostTask. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@scheduler_unittest_no_deadline
Patch Set: Created 4 years, 5 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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/scheduler/begin_frame_source.h" 5 #include "cc/scheduler/begin_frame_source.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
11 #include "cc/test/begin_frame_args_test.h" 11 #include "cc/test/begin_frame_args_test.h"
12 #include "cc/test/begin_frame_source_test.h" 12 #include "cc/test/begin_frame_source_test.h"
13 #include "cc/test/scheduler_test_common.h" 13 #include "cc/test/scheduler_test_common.h"
14 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 using testing::StrictMock; 17 using testing::StrictMock;
18 18
19 namespace cc { 19 namespace cc {
20 namespace { 20 namespace {
21 21
22 class BackToBackBeginFrameSourceTest : public ::testing::Test { 22 class BackToBackBeginFrameSourceTest : public ::testing::Test {
23 protected: 23 protected:
24 static const int64_t kDeadline; 24 static const int64_t kDeadline;
25 static const int64_t kInterval; 25 static const int64_t kInterval;
26 26
27 void SetUp() override { 27 void SetUp() override {
28 now_src_.reset(new base::SimpleTestTickClock()); 28 now_src_ = base::MakeUnique<base::SimpleTestTickClock>();
29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); 29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
30 task_runner_ = 30 task_runner_ =
31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); 31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false));
32 std::unique_ptr<TestDelayBasedTimeSource> time_source( 32 source_.reset(
33 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); 33 new BackToBackBeginFrameSource(task_runner_.get(), now_src_.get()));
34 source_.reset(new BackToBackBeginFrameSource(std::move(time_source)));
35 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>); 34 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>);
36 } 35 }
37 36
38 void TearDown() override { obs_.reset(); } 37 void TearDown() override { obs_.reset(); }
39 38
40 std::unique_ptr<base::SimpleTestTickClock> now_src_; 39 std::unique_ptr<base::SimpleTestTickClock> now_src_;
41 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 40 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
42 std::unique_ptr<BackToBackBeginFrameSource> source_; 41 std::unique_ptr<BackToBackBeginFrameSource> source_;
43 std::unique_ptr<MockBeginFrameObserver> obs_; 42 std::unique_ptr<MockBeginFrameObserver> obs_;
44 }; 43 };
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 source_->RemoveObserver(obs_.get()); 104 source_->RemoveObserver(obs_.get());
106 105
107 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 106 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
108 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 107 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
109 source_->AddObserver(obs_.get()); 108 source_->AddObserver(obs_.get());
110 109
111 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 110 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
112 source_->DidFinishFrame(obs_.get(), 0); 111 source_->DidFinishFrame(obs_.get(), 0);
113 112
114 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 113 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
115 // The begin frame is posted at the time when the observer was added, 114 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
116 // so it ignores changes to "now" afterward.
117 EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval);
118 EXPECT_TRUE(task_runner_->HasPendingTasks()); 115 EXPECT_TRUE(task_runner_->HasPendingTasks());
119 task_runner_->RunPendingTasks(); 116 task_runner_->RunPendingTasks();
120 } 117 }
121 118
122 TEST_F(BackToBackBeginFrameSourceTest, 119 TEST_F(BackToBackBeginFrameSourceTest,
123 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { 120 DidFinishFrameThenTogglingObserverProducesCorrectFrame) {
124 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 121 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
125 source_->AddObserver(obs_.get()); 122 source_->AddObserver(obs_.get());
126 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); 123 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
127 task_runner_->RunPendingTasks(); 124 task_runner_->RunPendingTasks();
128 125
129 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 126 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
130 source_->DidFinishFrame(obs_.get(), 0); 127 source_->DidFinishFrame(obs_.get(), 0);
131 128
132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 129 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
133 source_->RemoveObserver(obs_.get()); 130 source_->RemoveObserver(obs_.get());
134 131
135 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
136 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 133 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
137 source_->AddObserver(obs_.get()); 134 source_->AddObserver(obs_.get());
138 135
139 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); 136 now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
140 // Ticks at the time at which the observer was added, ignoring the 137 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
141 // last change to "now".
142 EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval);
143 EXPECT_TRUE(task_runner_->HasPendingTasks()); 138 EXPECT_TRUE(task_runner_->HasPendingTasks());
144 task_runner_->RunPendingTasks(); 139 task_runner_->RunPendingTasks();
145 } 140 }
146 141
147 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { 142 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) {
148 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 143 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
149 source_->AddObserver(obs_.get()); 144 source_->AddObserver(obs_.get());
150 source_->RemoveObserver(obs_.get()); 145 source_->RemoveObserver(obs_.get());
151 source_->DidFinishFrame(obs_.get(), 0); 146 source_->DidFinishFrame(obs_.get(), 0);
152 EXPECT_FALSE(task_runner_->RunPendingTasks()); 147 EXPECT_FALSE(task_runner_->RunPendingTasks());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 task_runner_->RunPendingTasks(); 187 task_runner_->RunPendingTasks();
193 188
194 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 189 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
195 source_->DidFinishFrame(obs_.get(), 0); 190 source_->DidFinishFrame(obs_.get(), 0);
196 source_->DidFinishFrame(obs_.get(), 0); 191 source_->DidFinishFrame(obs_.get(), 0);
197 source_->DidFinishFrame(obs_.get(), 0); 192 source_->DidFinishFrame(obs_.get(), 0);
198 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); 193 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval);
199 task_runner_->RunPendingTasks(); 194 task_runner_->RunPendingTasks();
200 } 195 }
201 196
202 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
203 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
204 source_->AddObserver(obs_.get());
205 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
206 task_runner_->RunPendingTasks();
207
208 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
209 source_->DidFinishFrame(obs_.get(), 0);
210 now_src_->Advance(base::TimeDelta::FromMicroseconds(50));
211 // Ticks at the time the last frame finished, so ignores the last change to
212 // "now".
213 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
214
215 EXPECT_TRUE(task_runner_->HasPendingTasks());
216 task_runner_->RunPendingTasks();
217 }
218
219 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { 197 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) {
220 StrictMock<MockBeginFrameObserver> obs1, obs2; 198 StrictMock<MockBeginFrameObserver> obs1, obs2;
221 199
222 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); 200 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
223 source_->AddObserver(&obs1); 201 source_->AddObserver(&obs1);
224 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); 202 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
225 source_->AddObserver(&obs2); 203 source_->AddObserver(&obs2);
226 204
227 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); 205 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval);
228 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); 206 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 task_runner_->RunPendingTasks(); 268 task_runner_->RunPendingTasks();
291 269
292 // |obs1| finishes first. 270 // |obs1| finishes first.
293 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 271 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
294 source_->DidFinishFrame(&obs1, 0); 272 source_->DidFinishFrame(&obs1, 0);
295 273
296 // |obs2| finishes also, before getting to the newly posted begin frame. 274 // |obs2| finishes also, before getting to the newly posted begin frame.
297 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); 275 now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
298 source_->DidFinishFrame(&obs2, 0); 276 source_->DidFinishFrame(&obs2, 0);
299 277
300 // Because the begin frame source already ticked when |obs1| finished, 278 EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval);
301 // we see it as the frame time for both observers. 279 EXPECT_BEGIN_FRAME_USED(obs2, 1200, 1200 + kDeadline, kInterval);
302 EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval);
303 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval);
304 task_runner_->RunPendingTasks(); 280 task_runner_->RunPendingTasks();
305 281
306 source_->DidFinishFrame(&obs1, 0); 282 source_->DidFinishFrame(&obs1, 0);
307 source_->RemoveObserver(&obs1); 283 source_->RemoveObserver(&obs1);
308 source_->DidFinishFrame(&obs2, 0); 284 source_->DidFinishFrame(&obs2, 0);
309 source_->RemoveObserver(&obs2); 285 source_->RemoveObserver(&obs2);
310 } 286 }
311 287
312 // DelayBasedBeginFrameSource testing ------------------------------------------ 288 // DelayBasedBeginFrameSource testing ------------------------------------------
313 class DelayBasedBeginFrameSourceTest : public ::testing::Test { 289 class DelayBasedBeginFrameSourceTest : public ::testing::Test {
314 public: 290 public:
315 std::unique_ptr<base::SimpleTestTickClock> now_src_; 291 std::unique_ptr<base::SimpleTestTickClock> now_src_;
316 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 292 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
317 std::unique_ptr<DelayBasedBeginFrameSource> source_; 293 std::unique_ptr<DelayBasedBeginFrameSource> source_;
318 std::unique_ptr<MockBeginFrameObserver> obs_; 294 std::unique_ptr<MockBeginFrameObserver> obs_;
319 295
320 void SetUp() override { 296 void SetUp() override {
321 now_src_.reset(new base::SimpleTestTickClock()); 297 now_src_ = base::MakeUnique<base::SimpleTestTickClock>();
322 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); 298 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
323 task_runner_ = 299 task_runner_ =
324 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); 300 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false));
325 std::unique_ptr<DelayBasedTimeSource> time_source( 301 source_.reset(
326 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); 302 new DelayBasedBeginFrameSource(task_runner_.get(), now_src_.get()));
327 time_source->SetTimebaseAndInterval( 303 source_->OnUpdateVSyncParameters(base::TimeTicks(),
328 base::TimeTicks(), base::TimeDelta::FromMicroseconds(10000)); 304 base::TimeDelta::FromMicroseconds(10000));
329 source_.reset(new DelayBasedBeginFrameSource(std::move(time_source)));
330 obs_.reset(new MockBeginFrameObserver); 305 obs_.reset(new MockBeginFrameObserver);
331 } 306 }
332 307
333 void TearDown() override { obs_.reset(); } 308 void TearDown() override { obs_.reset(); }
334 }; 309 };
335 310
336 TEST_F(DelayBasedBeginFrameSourceTest, 311 TEST_F(DelayBasedBeginFrameSourceTest,
337 AddObserverCallsOnBeginFrameWithMissedTick) { 312 AddObserverCallsOnBeginFrameWithMissedTick) {
338 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); 313 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010));
339 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 314 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
315 source_->AddObserver(obs_.get());
316
340 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); 317 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000);
341 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent 318 task_runner_->RunPendingTasks(); // Should cause the last tick to be sent.
342 // No tasks should need to be run for this to occur.
343 } 319 }
344 320
345 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { 321 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) {
346 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); 322 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
323 source_->AddObserver(obs_.get());
347 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); 324 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000);
348 source_->AddObserver(obs_.get()); 325 task_runner_->RunPendingTasks();
349 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); 326 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
350 327
351 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); 328 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
352 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); 329 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010));
353 task_runner_->RunPendingTasks(); 330 task_runner_->RunPendingTasks();
354 } 331 }
355 332
356 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { 333 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) {
357 task_runner_->SetAutoAdvanceNowToPendingTasks(true); 334 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
358 335
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 base::TimeDelta::FromInternalValue(10000)); 445 base::TimeDelta::FromInternalValue(10000));
469 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); 446 now_src_->Advance(base::TimeDelta::FromInternalValue(5000));
470 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); 447 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000);
471 task_runner_->RunPendingTasks(); 448 task_runner_->RunPendingTasks();
472 } 449 }
473 450
474 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { 451 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) {
475 StrictMock<MockBeginFrameObserver> obs; 452 StrictMock<MockBeginFrameObserver> obs;
476 453
477 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); 454 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
455 source_->AddObserver(&obs);
478 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); 456 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000);
479 source_->AddObserver(&obs); 457 task_runner_->RunPendingTasks();
480 source_->RemoveObserver(&obs); 458 source_->RemoveObserver(&obs);
481 459
482 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), 460 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000),
483 base::TimeDelta::FromInternalValue(10000)); 461 base::TimeDelta::FromInternalValue(10000));
484 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); 462 now_src_->Advance(base::TimeDelta::FromInternalValue(4000));
485 463
486 // No missed frame received. 464 // No missed frame received.
487 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); 465 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
488 source_->AddObserver(&obs); 466 source_->AddObserver(&obs);
489 source_->RemoveObserver(&obs); 467 source_->RemoveObserver(&obs);
490 468
491 // Missed frame received. 469 // Missed frame received.
492 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), 470 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000),
493 base::TimeDelta::FromInternalValue(10000)); 471 base::TimeDelta::FromInternalValue(10000));
494 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); 472 now_src_->Advance(base::TimeDelta::FromInternalValue(5000));
495 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); 473 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
474 source_->AddObserver(&obs);
496 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); 475 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000);
497 source_->AddObserver(&obs); 476 task_runner_->RunPendingTasks();
498 source_->RemoveObserver(&obs); 477 source_->RemoveObserver(&obs);
499 } 478 }
500 479
501 } // namespace 480 } // namespace
502 } // namespace cc 481 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698