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

Unified Diff: cc/scheduler/begin_frame_source_unittest.cc

Issue 2061273002: cc: Make BackToBackBeginFrameSource a SyntheticBeginFrameSource. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: syntheticbeginframesource: delete-DEBUG_FRAMES Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/delay_based_time_source.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/scheduler/begin_frame_source_unittest.cc
diff --git a/cc/scheduler/begin_frame_source_unittest.cc b/cc/scheduler/begin_frame_source_unittest.cc
index fbeba81732aba029bdc6abf1db1a55d7c56080e3..b50c4b91ce510a5444ba5912f090adca3dec176c 100644
--- a/cc/scheduler/begin_frame_source_unittest.cc
+++ b/cc/scheduler/begin_frame_source_unittest.cc
@@ -14,201 +14,33 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-using testing::Mock;
using testing::StrictMock;
namespace cc {
namespace {
-// BeginFrameObserverBase testing ---------------------------------------
-class MockMinimalBeginFrameObserverBase : public BeginFrameObserverBase {
- public:
- MOCK_METHOD1(OnBeginFrameDerivedImpl, bool(const BeginFrameArgs&));
- MOCK_METHOD1(OnBeginFrameSourcePausedChanged, void(bool));
- int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; }
-};
-
-TEST(BeginFrameObserverBaseTest, OnBeginFrameImplementation) {
- using ::testing::Return;
- MockMinimalBeginFrameObserverBase obs;
- ::testing::InSequence ordered; // These calls should be ordered
-
- // Initial conditions
- EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs());
- EXPECT_EQ(0, obs.dropped_begin_frame_args());
-
-#ifndef NDEBUG
- EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, "");
-#endif
-
- BeginFrameArgs args1 =
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300);
- EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args1)).WillOnce(Return(true));
- obs.OnBeginFrame(args1);
- EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
- EXPECT_EQ(0, obs.dropped_begin_frame_args());
-
-#ifndef NDEBUG
- EXPECT_DEATH({
- obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
- BEGINFRAME_FROM_HERE, 50, 200, 300));
- },
- "");
-#endif
-
- // Returning false shouldn't update the LastUsedBeginFrameArgs value.
- BeginFrameArgs args2 =
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400);
- EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args2)).WillOnce(Return(false));
- obs.OnBeginFrame(args2);
- EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
- EXPECT_EQ(1, obs.dropped_begin_frame_args());
-
- BeginFrameArgs args3 =
- CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400);
- EXPECT_CALL(obs, OnBeginFrameDerivedImpl(args3)).WillOnce(Return(true));
- obs.OnBeginFrame(args3);
- EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs());
- EXPECT_EQ(1, obs.dropped_begin_frame_args());
-}
-
-// BeginFrameSource testing ----------------------------------------------
-TEST(BeginFrameSourceBaseTest, ObserverManipulation) {
- MockBeginFrameObserver obs;
- MockBeginFrameObserver otherObs;
- FakeBeginFrameSource source;
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
- source.AddObserver(&obs);
- EXPECT_TRUE(source.has_observers());
-
-#ifndef NDEBUG
- // Adding an observer when it already exists should DCHECK fail.
- EXPECT_DEATH({ source.AddObserver(&obs); }, "");
-
- // Removing wrong observer should DCHECK fail.
- EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, "");
-
- // Removing an observer when there is no observer should DCHECK fail.
- EXPECT_DEATH(
- {
- source.RemoveObserver(&obs);
- source.RemoveObserver(&obs);
- },
- "");
-#endif
-
- source.RemoveObserver(&obs);
- EXPECT_FALSE(source.has_observers());
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(otherObs, false);
- source.AddObserver(&otherObs);
- EXPECT_TRUE(source.has_observers());
- source.RemoveObserver(&otherObs);
- EXPECT_FALSE(source.has_observers());
-}
-
-TEST(BeginFrameSourceBaseTest, Observer) {
- FakeBeginFrameSource source;
- MockBeginFrameObserver obs;
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
- source.AddObserver(&obs);
- EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
- EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300);
- EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300);
- EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
-
- SEND_BEGIN_FRAME_USED(source, 100, 200, 300);
- SEND_BEGIN_FRAME_DROP(source, 400, 600, 300);
- SEND_BEGIN_FRAME_DROP(source, 450, 650, 300);
- SEND_BEGIN_FRAME_USED(source, 700, 900, 300);
-}
-
-TEST(BeginFrameSourceBaseTest, NoObserver) {
- FakeBeginFrameSource source;
- SEND_BEGIN_FRAME_DROP(source, 100, 200, 300);
-}
-
-TEST(BeginFrameSourceBaseTest, SetBeginFrameSourcePaused) {
- FakeBeginFrameSource source;
- MockBeginFrameObserver obs;
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
- source.AddObserver(&obs);
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, true);
- source.SetBeginFrameSourcePaused(true);
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
- source.SetBeginFrameSourcePaused(false);
-}
-
-TEST(BeginFrameSourceBaseTest, MultipleObservers) {
- FakeBeginFrameSource source;
- StrictMock<MockBeginFrameObserver> obs1, obs2;
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
- source.AddObserver(&obs1);
-
- EXPECT_BEGIN_FRAME_USED(obs1, 100, 200, 100);
- SEND_BEGIN_FRAME_USED(source, 100, 200, 100);
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
- source.AddObserver(&obs2);
-
- EXPECT_BEGIN_FRAME_USED(obs1, 200, 300, 100);
- EXPECT_BEGIN_FRAME_USED(obs2, 200, 300, 100);
- SEND_BEGIN_FRAME_USED(source, 200, 300, 100);
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, true);
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, true);
- source.SetBeginFrameSourcePaused(true);
-
- source.RemoveObserver(&obs1);
-
- EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
- source.SetBeginFrameSourcePaused(false);
-
- EXPECT_BEGIN_FRAME_USED(obs2, 300, 400, 100);
- SEND_BEGIN_FRAME_USED(source, 300, 400, 100);
-
- source.RemoveObserver(&obs2);
-}
-
-// BackToBackBeginFrameSource testing -----------------------------------------
-class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource {
- public:
- TestBackToBackBeginFrameSource(base::SimpleTestTickClock* now_src,
- base::SingleThreadTaskRunner* task_runner)
- : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {}
-
- protected:
- base::TimeTicks Now() override { return now_src_->NowTicks(); }
-
- // Not owned.
- base::SimpleTestTickClock* now_src_;
-};
-
class BackToBackBeginFrameSourceTest : public ::testing::Test {
- public:
+ protected:
static const int64_t kDeadline;
static const int64_t kInterval;
- std::unique_ptr<base::SimpleTestTickClock> now_src_;
- scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
- std::unique_ptr<TestBackToBackBeginFrameSource> source_;
- std::unique_ptr<MockBeginFrameObserver> obs_;
-
void SetUp() override {
now_src_.reset(new base::SimpleTestTickClock());
now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
task_runner_ =
make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false));
- source_.reset(
- new TestBackToBackBeginFrameSource(now_src_.get(), task_runner_.get()));
- obs_ =
- base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>());
+ std::unique_ptr<TestDelayBasedTimeSource> time_source(
+ new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get()));
+ source_.reset(new BackToBackBeginFrameSource(std::move(time_source)));
+ obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>);
}
void TearDown() override { obs_.reset(); }
+
+ std::unique_ptr<base::SimpleTestTickClock> now_src_;
+ scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
+ std::unique_ptr<BackToBackBeginFrameSource> source_;
+ std::unique_ptr<MockBeginFrameObserver> obs_;
};
const int64_t BackToBackBeginFrameSourceTest::kDeadline =
@@ -240,6 +72,10 @@ TEST_F(BackToBackBeginFrameSourceTest,
source_->RemoveObserver(obs_.get());
source_->DidFinishFrame(obs_.get(), 0);
+ // Verify no BeginFrame is sent to |obs_|. There is a pending task in the
+ // task_runner_ as a BeginFrame was posted, but it gets aborted since |obs_|
+ // is removed.
+ task_runner_->RunPendingTasks();
EXPECT_FALSE(task_runner_->HasPendingTasks());
}
@@ -276,7 +112,9 @@ TEST_F(BackToBackBeginFrameSourceTest,
source_->DidFinishFrame(obs_.get(), 0);
now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
- EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
+ // The begin frame is posted at the time when the observer was added,
+ // so it ignores changes to "now" afterward.
+ EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval);
EXPECT_TRUE(task_runner_->HasPendingTasks());
task_runner_->RunPendingTasks();
}
@@ -299,7 +137,9 @@ TEST_F(BackToBackBeginFrameSourceTest,
source_->AddObserver(obs_.get());
now_src_->Advance(base::TimeDelta::FromMicroseconds(10));
- EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
+ // Ticks at the time at which the observer was added, ignoring the
+ // last change to "now".
+ EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval);
EXPECT_TRUE(task_runner_->HasPendingTasks());
task_runner_->RunPendingTasks();
}
@@ -316,7 +156,12 @@ TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
source_->AddObserver(obs_.get());
EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
+ // Runs the pending begin frame.
task_runner_->RunPendingTasks();
+ // While running the begin frame, the next frame was cancelled, this
+ // runs the next frame, sees it was cancelled, and goes to sleep.
+ task_runner_->RunPendingTasks();
+ EXPECT_FALSE(task_runner_->HasPendingTasks());
now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
@@ -363,7 +208,9 @@ TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
source_->DidFinishFrame(obs_.get(), 0);
now_src_->Advance(base::TimeDelta::FromMicroseconds(50));
- EXPECT_BEGIN_FRAME_USED(*obs_, 1150, 1150 + kDeadline, kInterval);
+ // Ticks at the time the last frame finished, so ignores the last change to
+ // "now".
+ EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
EXPECT_TRUE(task_runner_->HasPendingTasks());
task_runner_->RunPendingTasks();
@@ -418,6 +265,9 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) {
source_->DidFinishFrame(&obs1, 0);
source_->RemoveObserver(&obs1);
+ // Finishing the frame for |obs1| posts a begin frame task, which will be
+ // aborted since |obs1| is removed. Clear that from the task runner.
+ task_runner_->RunPendingTasks();
now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
source_->DidFinishFrame(&obs2, 0);
@@ -428,12 +278,43 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) {
source_->RemoveObserver(&obs2);
}
-// SyntheticBeginFrameSource testing ------------------------------------------
-class SyntheticBeginFrameSourceTest : public ::testing::Test {
+TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) {
+ StrictMock<MockBeginFrameObserver> obs1, obs2;
+
+ EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false);
+ EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false);
+ source_->AddObserver(&obs1);
+ source_->AddObserver(&obs2);
+ EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval);
+ EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval);
+ task_runner_->RunPendingTasks();
+
+ // |obs1| finishes first.
+ now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
+ source_->DidFinishFrame(&obs1, 0);
+
+ // |obs2| finishes also, before getting to the newly posted begin frame.
+ now_src_->Advance(base::TimeDelta::FromMicroseconds(100));
+ source_->DidFinishFrame(&obs2, 0);
+
+ // Because the begin frame source already ticked when |obs1| finished,
+ // we see it as the frame time for both observers.
+ EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval);
+ EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval);
+ task_runner_->RunPendingTasks();
+
+ source_->DidFinishFrame(&obs1, 0);
+ source_->RemoveObserver(&obs1);
+ source_->DidFinishFrame(&obs2, 0);
+ source_->RemoveObserver(&obs2);
+}
+
+// DelayBasedBeginFrameSource testing ------------------------------------------
+class DelayBasedBeginFrameSourceTest : public ::testing::Test {
public:
std::unique_ptr<base::SimpleTestTickClock> now_src_;
scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
- std::unique_ptr<TestSyntheticBeginFrameSource> source_;
+ std::unique_ptr<DelayBasedBeginFrameSource> source_;
std::unique_ptr<MockBeginFrameObserver> obs_;
void SetUp() override {
@@ -441,16 +322,18 @@ class SyntheticBeginFrameSourceTest : public ::testing::Test {
now_src_->Advance(base::TimeDelta::FromMicroseconds(1000));
task_runner_ =
make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false));
- source_.reset(new TestSyntheticBeginFrameSource(
- now_src_.get(), task_runner_.get(),
- base::TimeDelta::FromMicroseconds(10000)));
- obs_ = base::WrapUnique(new MockBeginFrameObserver());
+ std::unique_ptr<DelayBasedTimeSource> time_source(
+ new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get()));
+ time_source->SetTimebaseAndInterval(
+ base::TimeTicks(), base::TimeDelta::FromMicroseconds(10000));
+ source_.reset(new DelayBasedBeginFrameSource(std::move(time_source)));
+ obs_.reset(new MockBeginFrameObserver);
}
void TearDown() override { obs_.reset(); }
};
-TEST_F(SyntheticBeginFrameSourceTest,
+TEST_F(DelayBasedBeginFrameSourceTest,
AddObserverCallsOnBeginFrameWithMissedTick) {
now_src_->Advance(base::TimeDelta::FromMicroseconds(9010));
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
@@ -459,7 +342,7 @@ TEST_F(SyntheticBeginFrameSourceTest,
// No tasks should need to be run for this to occur.
}
-TEST_F(SyntheticBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) {
+TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) {
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000);
source_->AddObserver(obs_.get());
@@ -470,7 +353,7 @@ TEST_F(SyntheticBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) {
task_runner_->RunPendingTasks();
}
-TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
+TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) {
task_runner_->SetAutoAdvanceNowToPendingTasks(true);
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
@@ -486,7 +369,7 @@ TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
}
-TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
+TEST_F(DelayBasedBeginFrameSourceTest, VSyncChanges) {
task_runner_->SetAutoAdvanceNowToPendingTasks(true);
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false);
EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000);
@@ -507,7 +390,7 @@ TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
}
-TEST_F(SyntheticBeginFrameSourceTest, AuthoritativeVSyncChanges) {
+TEST_F(DelayBasedBeginFrameSourceTest, AuthoritativeVSyncChanges) {
task_runner_->SetAutoAdvanceNowToPendingTasks(true);
source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500),
base::TimeDelta::FromMicroseconds(10000));
@@ -534,7 +417,7 @@ TEST_F(SyntheticBeginFrameSourceTest, AuthoritativeVSyncChanges) {
task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395));
}
-TEST_F(SyntheticBeginFrameSourceTest, MultipleObservers) {
+TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) {
StrictMock<MockBeginFrameObserver> obs1, obs2;
// now_src_ starts off at 1000.
@@ -566,7 +449,7 @@ TEST_F(SyntheticBeginFrameSourceTest, MultipleObservers) {
EXPECT_FALSE(task_runner_->HasPendingTasks());
}
-TEST_F(SyntheticBeginFrameSourceTest, DoubleTick) {
+TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) {
StrictMock<MockBeginFrameObserver> obs;
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
@@ -588,7 +471,7 @@ TEST_F(SyntheticBeginFrameSourceTest, DoubleTick) {
task_runner_->RunPendingTasks();
}
-TEST_F(SyntheticBeginFrameSourceTest, DoubleTickMissedFrame) {
+TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) {
StrictMock<MockBeginFrameObserver> obs;
EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false);
« no previous file with comments | « cc/scheduler/begin_frame_source.cc ('k') | cc/scheduler/delay_based_time_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698