| 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 |