OLD | NEW |
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::NiceMock; |
18 | 18 |
19 namespace cc { | 19 namespace cc { |
20 namespace { | 20 namespace { |
21 | 21 |
22 // BeginFrameSource testing ---------------------------------------------------- | 22 // BeginFrameSource testing ---------------------------------------------------- |
23 TEST(BeginFrameSourceTest, SourceIdsAreUnique) { | 23 TEST(BeginFrameSourceTest, SourceIdsAreUnique) { |
24 StubBeginFrameSource source1; | 24 StubBeginFrameSource source1; |
25 StubBeginFrameSource source2; | 25 StubBeginFrameSource source2; |
26 StubBeginFrameSource source3; | 26 StubBeginFrameSource source3; |
27 EXPECT_NE(source1.source_id(), source2.source_id()); | 27 EXPECT_NE(source1.source_id(), source2.source_id()); |
28 EXPECT_NE(source1.source_id(), source3.source_id()); | 28 EXPECT_NE(source1.source_id(), source3.source_id()); |
29 EXPECT_NE(source2.source_id(), source3.source_id()); | 29 EXPECT_NE(source2.source_id(), source3.source_id()); |
30 } | 30 } |
31 | 31 |
32 // BackToBackBeginFrameSource testing ------------------------------------------ | 32 // BackToBackBeginFrameSource testing ------------------------------------------ |
33 class BackToBackBeginFrameSourceTest : public ::testing::Test { | 33 class BackToBackBeginFrameSourceTest : public ::testing::Test { |
34 protected: | 34 protected: |
35 static const int64_t kDeadline; | 35 static const int64_t kDeadline; |
36 static const int64_t kInterval; | 36 static const int64_t kInterval; |
37 | 37 |
38 void SetUp() override { | 38 void SetUp() override { |
39 now_src_.reset(new base::SimpleTestTickClock()); | 39 now_src_.reset(new base::SimpleTestTickClock()); |
40 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 40 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
41 task_runner_ = | 41 task_runner_ = |
42 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 42 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
43 std::unique_ptr<TestDelayBasedTimeSource> time_source( | 43 std::unique_ptr<TestDelayBasedTimeSource> time_source( |
44 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); | 44 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); |
45 delay_based_time_source_ = time_source.get(); | 45 delay_based_time_source_ = time_source.get(); |
46 source_.reset(new BackToBackBeginFrameSource(std::move(time_source))); | 46 source_.reset(new BackToBackBeginFrameSource(std::move(time_source))); |
47 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>); | 47 obs_ = base::WrapUnique(new ::testing::NiceMock<MockBeginFrameObserver>); |
48 } | 48 } |
49 | 49 |
50 void TearDown() override { obs_.reset(); } | 50 void TearDown() override { obs_.reset(); } |
51 | 51 |
52 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 52 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
53 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 53 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
54 std::unique_ptr<BackToBackBeginFrameSource> source_; | 54 std::unique_ptr<BackToBackBeginFrameSource> source_; |
55 std::unique_ptr<MockBeginFrameObserver> obs_; | 55 std::unique_ptr<MockBeginFrameObserver> obs_; |
56 TestDelayBasedTimeSource* delay_based_time_source_; // Owned by |now_src_|. | 56 TestDelayBasedTimeSource* delay_based_time_source_; // Owned by |now_src_|. |
57 }; | 57 }; |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 // Ticks at the time the last frame finished, so ignores the last change to | 223 // Ticks at the time the last frame finished, so ignores the last change to |
224 // "now". | 224 // "now". |
225 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, | 225 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, |
226 1100 + kDeadline, kInterval); | 226 1100 + kDeadline, kInterval); |
227 | 227 |
228 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 228 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
229 task_runner_->RunPendingTasks(); | 229 task_runner_->RunPendingTasks(); |
230 } | 230 } |
231 | 231 |
232 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { | 232 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { |
233 StrictMock<MockBeginFrameObserver> obs1, obs2; | 233 NiceMock<MockBeginFrameObserver> obs1, obs2; |
234 | 234 |
235 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 235 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
236 source_->AddObserver(&obs1); | 236 source_->AddObserver(&obs1); |
237 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 237 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
238 source_->AddObserver(&obs2); | 238 source_->AddObserver(&obs2); |
239 | 239 |
240 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 240 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
241 kInterval); | 241 kInterval); |
242 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, | 242 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, |
243 kInterval); | 243 kInterval); |
(...skipping 15 matching lines...) Expand all Loading... |
259 BeginFrameAck(source_->source_id(), 2, 2, true)); | 259 BeginFrameAck(source_->source_id(), 2, 2, true)); |
260 source_->DidFinishFrame(&obs2, | 260 source_->DidFinishFrame(&obs2, |
261 BeginFrameAck(source_->source_id(), 2, 2, true)); | 261 BeginFrameAck(source_->source_id(), 2, 2, true)); |
262 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 262 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
263 source_->RemoveObserver(&obs1); | 263 source_->RemoveObserver(&obs1); |
264 source_->RemoveObserver(&obs2); | 264 source_->RemoveObserver(&obs2); |
265 task_runner_->RunPendingTasks(); | 265 task_runner_->RunPendingTasks(); |
266 } | 266 } |
267 | 267 |
268 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { | 268 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { |
269 StrictMock<MockBeginFrameObserver> obs1, obs2; | 269 NiceMock<MockBeginFrameObserver> obs1, obs2; |
270 | 270 |
271 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 271 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
272 source_->AddObserver(&obs1); | 272 source_->AddObserver(&obs1); |
273 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 273 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
274 kInterval); | 274 kInterval); |
275 task_runner_->RunPendingTasks(); | 275 task_runner_->RunPendingTasks(); |
276 | 276 |
277 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 277 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
278 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 278 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
279 source_->AddObserver(&obs2); | 279 source_->AddObserver(&obs2); |
(...skipping 23 matching lines...) Expand all Loading... |
303 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline, | 303 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline, |
304 kInterval); | 304 kInterval); |
305 task_runner_->RunPendingTasks(); | 305 task_runner_->RunPendingTasks(); |
306 | 306 |
307 source_->DidFinishFrame(&obs2, | 307 source_->DidFinishFrame(&obs2, |
308 BeginFrameAck(source_->source_id(), 4, 4, true)); | 308 BeginFrameAck(source_->source_id(), 4, 4, true)); |
309 source_->RemoveObserver(&obs2); | 309 source_->RemoveObserver(&obs2); |
310 } | 310 } |
311 | 311 |
312 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { | 312 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { |
313 StrictMock<MockBeginFrameObserver> obs1, obs2; | 313 NiceMock<MockBeginFrameObserver> obs1, obs2; |
314 | 314 |
315 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 315 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
316 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 316 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
317 source_->AddObserver(&obs1); | 317 source_->AddObserver(&obs1); |
318 source_->AddObserver(&obs2); | 318 source_->AddObserver(&obs2); |
319 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 319 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, |
320 kInterval); | 320 kInterval); |
321 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, | 321 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, |
322 kInterval); | 322 kInterval); |
323 task_runner_->RunPendingTasks(); | 323 task_runner_->RunPendingTasks(); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 | 455 |
456 // Change the vsync params, but the new interval will be ignored. | 456 // Change the vsync params, but the new interval will be ignored. |
457 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), | 457 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), |
458 base::TimeDelta::FromMicroseconds(1)); | 458 base::TimeDelta::FromMicroseconds(1)); |
459 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 50495, 60394, 9999); | 459 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 50495, 60394, 9999); |
460 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 60394, 70393, 9999); | 460 EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 60394, 70393, 9999); |
461 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); | 461 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); |
462 } | 462 } |
463 | 463 |
464 TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { | 464 TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { |
465 StrictMock<MockBeginFrameObserver> obs1, obs2; | 465 NiceMock<MockBeginFrameObserver> obs1, obs2; |
466 | 466 |
467 // now_src_ starts off at 1000. | 467 // now_src_ starts off at 1000. |
468 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); | 468 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); |
469 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 469 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
470 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, source_->source_id(), 1, 10000, 20000, | 470 EXPECT_BEGIN_FRAME_USED_MISSED(obs1, source_->source_id(), 1, 10000, 20000, |
471 10000); | 471 10000); |
472 source_->AddObserver(&obs1); // Should cause the last tick to be sent | 472 source_->AddObserver(&obs1); // Should cause the last tick to be sent |
473 // No tasks should need to be run for this to occur. | 473 // No tasks should need to be run for this to occur. |
474 | 474 |
475 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 20000, 30000, 10000); | 475 EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 20000, 30000, 10000); |
(...skipping 14 matching lines...) Expand all Loading... |
490 | 490 |
491 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 40000, 50000, 10000); | 491 EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 40000, 50000, 10000); |
492 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 492 task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); |
493 | 493 |
494 source_->RemoveObserver(&obs2); | 494 source_->RemoveObserver(&obs2); |
495 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); | 495 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(50000)); |
496 EXPECT_FALSE(task_runner_->HasPendingTasks()); | 496 EXPECT_FALSE(task_runner_->HasPendingTasks()); |
497 } | 497 } |
498 | 498 |
499 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { | 499 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { |
500 StrictMock<MockBeginFrameObserver> obs; | 500 NiceMock<MockBeginFrameObserver> obs; |
501 | 501 |
502 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 502 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
503 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); | 503 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); |
504 source_->AddObserver(&obs); | 504 source_->AddObserver(&obs); |
505 | 505 |
506 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 506 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
507 base::TimeDelta::FromInternalValue(10000)); | 507 base::TimeDelta::FromInternalValue(10000)); |
508 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 508 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
509 | 509 |
510 // No begin frame received. | 510 // No begin frame received. |
511 task_runner_->RunPendingTasks(); | 511 task_runner_->RunPendingTasks(); |
512 | 512 |
513 // Begin frame received. | 513 // Begin frame received. |
514 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 514 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
515 base::TimeDelta::FromInternalValue(10000)); | 515 base::TimeDelta::FromInternalValue(10000)); |
516 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 516 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
517 EXPECT_BEGIN_FRAME_USED(obs, source_->source_id(), 2, 10000, 20000, 10000); | 517 EXPECT_BEGIN_FRAME_USED(obs, source_->source_id(), 2, 10000, 20000, 10000); |
518 task_runner_->RunPendingTasks(); | 518 task_runner_->RunPendingTasks(); |
519 } | 519 } |
520 | 520 |
521 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 521 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { |
522 StrictMock<MockBeginFrameObserver> obs; | 522 NiceMock<MockBeginFrameObserver> obs; |
523 | 523 |
524 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 524 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
525 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); | 525 EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); |
526 source_->AddObserver(&obs); | 526 source_->AddObserver(&obs); |
527 source_->RemoveObserver(&obs); | 527 source_->RemoveObserver(&obs); |
528 | 528 |
529 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 529 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
530 base::TimeDelta::FromInternalValue(10000)); | 530 base::TimeDelta::FromInternalValue(10000)); |
531 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 531 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
532 | 532 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 // not notify observer. | 593 // not notify observer. |
594 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 594 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
595 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); | 595 EXPECT_CALL((*client_), OnNeedsBeginFrames(true)).Times(1); |
596 ExternalBeginFrameSource source2(client_.get()); | 596 ExternalBeginFrameSource source2(client_.get()); |
597 source2.AddObserver(obs_.get()); | 597 source2.AddObserver(obs_.get()); |
598 source2.OnBeginFrame(args); | 598 source2.OnBeginFrame(args); |
599 } | 599 } |
600 | 600 |
601 } // namespace | 601 } // namespace |
602 } // namespace cc | 602 } // namespace cc |
OLD | NEW |