Chromium Code Reviews| Index: cc/scheduler/scheduler_unittest.cc |
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
| index 29e4c496f151304c2d58cf6a170edec8c2342358..6d9dfc574dd6e2d63b7c29ffeded00dd093a8563 100644 |
| --- a/cc/scheduler/scheduler_unittest.cc |
| +++ b/cc/scheduler/scheduler_unittest.cc |
| @@ -22,16 +22,8 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \ |
| - do { \ |
| - EXPECT_EQ(expected_num_actions, client.num_actions_()); \ |
| - if (action_index >= 0) { \ |
| - ASSERT_LT(action_index, client.num_actions_()) << scheduler; \ |
| - EXPECT_STREQ(action, client.Action(action_index)); \ |
| - } \ |
| - for (int i = expected_num_actions; i < client.num_actions_(); ++i) \ |
| - ADD_FAILURE() << "Unexpected action: " << client.Action(i) \ |
| - << " with state:\n" << client.StateForAction(i); \ |
| - } while (false) |
| + client->ExpectAction(action, action_index, expected_num_actions, \ |
|
brianderson
2015/01/27 01:08:25
Please keep the implementation in the macro. I kno
Jimmy Jo
2015/01/28 00:53:47
Done.
|
| + scheduler_.get()); |
| #define EXPECT_NO_ACTION(client) EXPECT_ACTION("", client, -1, 0) |
| @@ -44,64 +36,16 @@ |
| statements; \ |
| } |
| -#define CREATE_SCHEDULER_AND_INIT_SURFACE(settings) \ |
| - TestScheduler* scheduler = client.CreateScheduler(settings); \ |
| - EXPECT_SCOPED(client.InitializeOutputSurfaceAndFirstCommit(scheduler)); |
| - |
| namespace cc { |
| namespace { |
| -class FakeSchedulerClient; |
| - |
| class FakeSchedulerClient : public SchedulerClient { |
| public: |
| - class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn { |
| - public: |
| - explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
| - : client_(client) {} |
| - ~FakeExternalBeginFrameSource() override {} |
| - |
| - void OnNeedsBeginFramesChange(bool needs_begin_frames) override { |
| - if (needs_begin_frames) { |
| - client_->PushAction("SetNeedsBeginFrames(true)"); |
| - } else { |
| - client_->PushAction("SetNeedsBeginFrames(false)"); |
| - } |
| - client_->states_.push_back(client_->scheduler_->AsValue()); |
| - } |
| - |
| - void TestOnBeginFrame(const BeginFrameArgs& args) { |
| - return CallOnBeginFrame(args); |
| - } |
| - |
| - private: |
| - FakeSchedulerClient* client_; |
| - }; |
| - |
| - class FakePowerMonitorSource : public base::PowerMonitorSource { |
| - public: |
| - FakePowerMonitorSource() {} |
| - ~FakePowerMonitorSource() override {} |
| - void GeneratePowerStateEvent(bool on_battery_power) { |
| - on_battery_power_impl_ = on_battery_power; |
| - ProcessPowerEvent(POWER_STATE_EVENT); |
| - base::MessageLoop::current()->RunUntilIdle(); |
| - } |
| - bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } |
| - |
| - private: |
| - bool on_battery_power_impl_; |
| - }; |
| - |
| FakeSchedulerClient() |
| : automatic_swap_ack_(true), |
| begin_frame_is_sent_to_children_(false), |
| now_src_(TestNowSource::Create()), |
|
brianderson
2015/01/27 01:08:25
Should now_src_ and task_runner_ also move to the
Jimmy Jo
2015/01/28 00:53:48
Done.
|
| task_runner_(new OrderedSimpleTaskRunner(now_src_, true)), |
| - fake_external_begin_frame_source_(nullptr), |
| - fake_power_monitor_source_(new FakePowerMonitorSource), |
| - power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( |
| - fake_power_monitor_source_)), |
| scheduler_(nullptr) { |
| // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() |
| now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
| @@ -120,24 +64,7 @@ class FakeSchedulerClient : public SchedulerClient { |
| begin_frame_is_sent_to_children_ = false; |
| } |
| - TestScheduler* CreateScheduler(const SchedulerSettings& settings) { |
| - scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
| - if (settings.use_external_begin_frame_source) { |
| - fake_external_begin_frame_source.reset( |
| - new FakeExternalBeginFrameSource(this)); |
| - fake_external_begin_frame_source_ = |
| - fake_external_begin_frame_source.get(); |
| - } |
| - scheduler_ = TestScheduler::Create(now_src_, |
| - this, |
| - settings, |
| - 0, |
| - task_runner_, |
| - &power_monitor_, |
| - fake_external_begin_frame_source.Pass()); |
| - DCHECK(scheduler_); |
| - return scheduler_.get(); |
| - } |
| + void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } |
| // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
| // for tests that do. |
| @@ -155,110 +82,6 @@ class FakeSchedulerClient : public SchedulerClient { |
| return posted_begin_impl_frame_deadline_; |
| } |
| - FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { |
| - return fake_external_begin_frame_source_; |
| - } |
| - |
| - base::PowerMonitor* PowerMonitor() { return &power_monitor_; } |
| - |
| - FakePowerMonitorSource* PowerMonitorSource() { |
| - return fake_power_monitor_source_; |
| - } |
| - |
| - // As this function contains EXPECT macros, to allow debugging it should be |
| - // called inside EXPECT_SCOPED like so; |
| - // EXPECT_SCOPED(client.InitializeOutputSurfaceAndFirstCommit(scheduler)); |
| - void InitializeOutputSurfaceAndFirstCommit(TestScheduler* scheduler) { |
| - TRACE_EVENT0("cc", |
| - "SchedulerUnitTest::InitializeOutputSurfaceAndFirstCommit"); |
| - DCHECK(scheduler); |
| - |
| - // Check the client doesn't have any actions queued when calling this |
| - // function. |
| - EXPECT_NO_ACTION((*this)); |
| - EXPECT_FALSE(needs_begin_frames()); |
| - |
| - // Start the initial output surface creation. |
| - EXPECT_FALSE(scheduler->CanStart()); |
| - scheduler->SetCanStart(); |
| - scheduler->SetVisible(true); |
| - scheduler->SetCanDraw(true); |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", (*this)); |
| - Reset(); |
| - |
| - // We don't see anything happening until the first impl frame. |
| - scheduler->DidCreateAndInitializeOutputSurface(); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_TRUE(needs_begin_frames()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - Reset(); |
| - |
| - { |
| - SCOPED_TRACE("Do first frame to commit after initialize."); |
| - AdvanceFrame(); |
| - |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommitThenActivateIfNeeded(); |
| - |
| - // Run the posted deadline task. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - task_runner().RunTasksWhile(ImplFrameDeadlinePending(true)); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - EXPECT_FALSE(scheduler->CommitPending()); |
| - } |
| - |
| - Reset(); |
| - |
| - { |
| - SCOPED_TRACE( |
| - "Run second frame so Scheduler calls SetNeedsBeginFrame(false)."); |
| - AdvanceFrame(); |
| - |
| - // Run the posted deadline task. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - task_runner().RunTasksWhile(ImplFrameDeadlinePending(true)); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - } |
| - |
| - EXPECT_FALSE(needs_begin_frames()); |
| - Reset(); |
| - } |
| - |
| - // As this function contains EXPECT macros, to allow debugging it should be |
| - // called inside EXPECT_SCOPED like so; |
| - // EXPECT_SCOPED(client.AdvanceFrame()); |
| - void AdvanceFrame() { |
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), |
| - "FakeSchedulerClient::AdvanceFrame"); |
| - // Consume any previous deadline first, if no deadline is currently |
| - // pending, ImplFrameDeadlinePending will return false straight away and we |
| - // will run no tasks. |
| - task_runner().RunTasksWhile(ImplFrameDeadlinePending(true)); |
| - EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| - |
| - // Send the next BeginFrame message if using an external source, otherwise |
| - // it will be already in the task queue. |
| - if (scheduler_->settings().use_external_begin_frame_source && |
| - scheduler_->FrameProductionThrottled()) { |
| - SendNextBeginFrame(); |
| - EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - } |
| - |
| - // Then run tasks until new deadline is scheduled. |
| - EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false))); |
| - EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - } |
| - |
| - void SendNextBeginFrame() { |
| - DCHECK(scheduler_->settings().use_external_begin_frame_source); |
| - // Creep the time forward so that any BeginFrameArgs is not equal to the |
| - // last one otherwise we violate the BeginFrameSource contract. |
| - now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
| - fake_external_begin_frame_source_->TestOnBeginFrame( |
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src_)); |
| - } |
| - |
| OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
| TestNowSource* now_src() { return now_src_.get(); } |
| @@ -349,9 +172,18 @@ class FakeSchedulerClient : public SchedulerClient { |
| return begin_frame_is_sent_to_children_; |
| } |
| - protected: |
| - bool ImplFrameDeadlinePendingCallback(bool state) { |
| - return scheduler_->BeginImplFrameDeadlinePending() == state; |
| + void ExpectAction(const char* action, |
| + int action_index, |
| + int expected_num_actions, |
| + const TestScheduler* scheduler) { |
| + EXPECT_EQ(expected_num_actions, num_actions_()); |
| + if (action_index >= 0) { |
| + ASSERT_LT(action_index, num_actions_()) << scheduler; |
| + EXPECT_STREQ(action, Action(action_index)); |
| + } |
| + for (int i = expected_num_actions; i < num_actions_(); ++i) |
| + ADD_FAILURE() << "Unexpected action: " << Action(i) << " with state:\n" |
| + << StateForAction(i); |
| } |
| void PushAction(const char* description) { |
|
brianderson
2015/01/27 01:08:25
Does PushAction need to be public now?
Jimmy Jo
2015/01/28 00:53:47
This is placed in FakeSchedulerClient Class but th
|
| @@ -359,6 +191,11 @@ class FakeSchedulerClient : public SchedulerClient { |
| states_.push_back(scheduler_->AsValue()); |
| } |
| + protected: |
| + bool ImplFrameDeadlinePendingCallback(bool state) { |
| + return scheduler_->BeginImplFrameDeadlinePending() == state; |
| + } |
| + |
| bool draw_will_happen_; |
| bool swap_will_happen_if_draw_happens_; |
| bool automatic_swap_ack_; |
| @@ -370,197 +207,393 @@ class FakeSchedulerClient : public SchedulerClient { |
| std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; |
| scoped_refptr<TestNowSource> now_src_; |
| scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| - FakeExternalBeginFrameSource* fake_external_begin_frame_source_; |
| - FakePowerMonitorSource* fake_power_monitor_source_; |
| - base::PowerMonitor power_monitor_; |
| - scoped_ptr<TestScheduler> scheduler_; |
| + TestScheduler* scheduler_; |
| }; |
| -TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| - scheduler->SetCanStart(); |
| - scheduler->SetVisible(true); |
| - scheduler->SetCanDraw(true); |
| - |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| - client.Reset(); |
| - scheduler->DidCreateAndInitializeOutputSurface(); |
| - EXPECT_NO_ACTION(client); |
| -} |
| +class FakePowerMonitorSource : public base::PowerMonitorSource { |
| + public: |
| + FakePowerMonitorSource() {} |
| + ~FakePowerMonitorSource() override {} |
| + void GeneratePowerStateEvent(bool on_battery_power) { |
| + on_battery_power_impl_ = on_battery_power; |
| + ProcessPowerEvent(POWER_STATE_EVENT); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + } |
| + bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; } |
| -TEST(SchedulerTest, SendBeginFramesToChildren) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - scheduler_settings.forward_begin_frames_to_children = true; |
| + private: |
| + bool on_battery_power_impl_; |
| +}; |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn { |
| + public: |
| + explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client) |
| + : client_(client) {} |
| + ~FakeExternalBeginFrameSource() override {} |
| + |
| + void OnNeedsBeginFramesChange(bool needs_begin_frames) override { |
| + if (needs_begin_frames) { |
| + client_->PushAction("SetNeedsBeginFrames(true)"); |
| + } else { |
| + client_->PushAction("SetNeedsBeginFrames(false)"); |
| + } |
| + } |
| - EXPECT_FALSE(client.begin_frame_is_sent_to_children()); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + void TestOnBeginFrame(const BeginFrameArgs& args) { |
| + return CallOnBeginFrame(args); |
| + } |
| - scheduler->SetChildrenNeedBeginFrames(true); |
| + private: |
| + FakeSchedulerClient* client_; |
| +}; |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_TRUE(client.begin_frame_is_sent_to_children()); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| -} |
| +class SchedulerTest : public testing::Test { |
| + public: |
| + SchedulerTest() |
| + : fake_power_monitor_source_(new FakePowerMonitorSource), |
| + fake_external_begin_frame_source_(nullptr), |
| + power_monitor_(make_scoped_ptr<base::PowerMonitorSource>( |
| + fake_power_monitor_source_)) {} |
| + |
| + ~SchedulerTest() override {} |
| + |
| + protected: |
| + TestScheduler* CreateScheduler() { |
| + scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
| + if (scheduler_settings_.use_external_begin_frame_source) { |
| + fake_external_begin_frame_source.reset( |
| + new FakeExternalBeginFrameSource(client_.get())); |
| + fake_external_begin_frame_source_ = |
| + fake_external_begin_frame_source.get(); |
| + } |
| + scheduler_ = TestScheduler::Create( |
| + client_->now_src(), client_.get(), scheduler_settings_, 0, |
| + make_scoped_refptr(&client_->task_runner()), &power_monitor_, |
| + fake_external_begin_frame_source.Pass()); |
| + DCHECK(scheduler_); |
| + client_->set_scheduler(scheduler_.get()); |
| + return scheduler_.get(); |
| + } |
| + |
| + void CreateSchedulerAndInitSurface() { |
| + CreateScheduler(); |
| + EXPECT_SCOPED(InitializeOutputSurfaceAndFirstCommit()); |
| + } |
| + |
| + void SetUpScheduler(bool initSurface) { |
| + SetUpScheduler((new FakeSchedulerClient), initSurface); |
| + } |
| + |
| + void SetUpScheduler(FakeSchedulerClient* client, bool initSurface) { |
|
brianderson
2015/01/27 01:08:25
Please make the client argument a scoped_ptr so it
|
| + client_.reset(client); |
| + if (initSurface) |
| + CreateSchedulerAndInitSurface(); |
| + else |
| + CreateScheduler(); |
| + } |
| + |
| + // As this function contains EXPECT macros, to allow debugging it should be |
| + // called inside EXPECT_SCOPED like so; |
| + // EXPECT_SCOPED(client.InitializeOutputSurfaceAndFirstCommit(scheduler)); |
| + void InitializeOutputSurfaceAndFirstCommit() { |
| + TRACE_EVENT0("cc", |
| + "SchedulerUnitTest::InitializeOutputSurfaceAndFirstCommit"); |
| + DCHECK(scheduler_); |
| + |
| + // Check the client doesn't have any actions queued when calling this |
| + // function. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(client_->needs_begin_frames()); |
| + |
| + // Start the initial output surface creation. |
| + EXPECT_FALSE(scheduler_->CanStart()); |
| + scheduler_->SetCanStart(); |
| + scheduler_->SetVisible(true); |
| + scheduler_->SetCanDraw(true); |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| + |
| + client_->Reset(); |
| + |
| + // We don't see anything happening until the first impl frame. |
| + scheduler_->DidCreateAndInitializeOutputSurface(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + |
| + { |
| + SCOPED_TRACE("Do first frame to commit after initialize."); |
| + AdvanceFrame(); |
| + |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommitThenActivateIfNeeded(); |
| + |
| + // Run the posted deadline task. |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + EXPECT_FALSE(scheduler_->CommitPending()); |
| + } |
| + |
| + client_->Reset(); |
| + |
| + { |
| + SCOPED_TRACE( |
| + "Run second frame so Scheduler calls SetNeedsBeginFrame(false)."); |
| + AdvanceFrame(); |
| + |
| + // Run the posted deadline task. |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + } |
| + |
| + EXPECT_FALSE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| + } |
| + |
| + // As this function contains EXPECT macros, to allow debugging it should be |
| + // called inside EXPECT_SCOPED like so; |
| + // EXPECT_SCOPED(client.AdvanceFrame()); |
| + void AdvanceFrame() { |
| + TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), |
| + "FakeSchedulerClient::AdvanceFrame"); |
| + // Consume any previous deadline first, if no deadline is currently |
| + // pending, ImplFrameDeadlinePending will return false straight away and we |
| + // will run no tasks. |
| + client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + // Send the next BeginFrame message if using an external source, otherwise |
| + // it will be already in the task queue. |
| + if (scheduler_->settings().use_external_begin_frame_source && |
| + scheduler_->FrameProductionThrottled()) { |
| + SendNextBeginFrame(); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + } |
| + |
| + // Then run tasks until new deadline is scheduled. |
| + EXPECT_TRUE(client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(false))); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + } |
| + |
| + void SendNextBeginFrame() { |
| + DCHECK(scheduler_->settings().use_external_begin_frame_source); |
| + // Creep the time forward so that any BeginFrameArgs is not equal to the |
| + // last one otherwise we violate the BeginFrameSource contract. |
| + client_->now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
| + fake_external_begin_frame_source_->TestOnBeginFrame( |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, |
| + client_->now_src())); |
| + } |
| -TEST(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - scheduler_settings.forward_begin_frames_to_children = true; |
| + base::PowerMonitor* PowerMonitor() { return &power_monitor_; } |
| + FakePowerMonitorSource* PowerMonitorSource() { |
| + return fake_power_monitor_source_; |
| + } |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { |
| + return fake_external_begin_frame_source_; |
| + } |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| - scheduler->SetChildrenNeedBeginFrames(true); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + void MainFrameInHighLatencyMode( |
| + int64 begin_main_frame_to_commit_estimate_in_ms, |
| + int64 commit_to_activate_estimate_in_ms, |
| + bool impl_latency_takes_priority, |
| + bool should_send_begin_main_frame); |
| + void BeginFramesNotFromClient(bool use_external_begin_frame_source, |
| + bool throttle_frame_production); |
| + void BeginFramesNotFromClient_SwapThrottled( |
| + bool use_external_begin_frame_source, |
| + bool throttle_frame_production); |
| + void DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( |
| + bool impl_side_painting); |
| + void DidLoseOutputSurfaceAfterReadyToCommit(bool impl_side_painting); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_TRUE(client.begin_frame_is_sent_to_children()); |
| + FakePowerMonitorSource* fake_power_monitor_source_; |
| + FakeExternalBeginFrameSource* fake_external_begin_frame_source_; |
| + base::PowerMonitor power_monitor_; |
| + SchedulerSettings scheduler_settings_; |
| + scoped_ptr<FakeSchedulerClient> client_; |
| + scoped_ptr<TestScheduler> scheduler_; |
| +}; |
| + |
| +TEST_F(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(false); |
| + scheduler_->SetCanStart(); |
| + scheduler_->SetVisible(true); |
| + scheduler_->SetCanDraw(true); |
| + |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| + client_->Reset(); |
| + scheduler_->DidCreateAndInitializeOutputSurface(); |
| + EXPECT_NO_ACTION(client_); |
| } |
| -TEST(SchedulerTest, RequestCommit) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, SendBeginFramesToChildren) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + scheduler_settings_.forward_begin_frames_to_children = true; |
| + SetUpScheduler(true); |
| + |
| + EXPECT_FALSE(client_->begin_frame_is_sent_to_children()); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + |
| + scheduler_->SetChildrenNeedBeginFrames(true); |
| + |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| +} |
| + |
| +TEST_F(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + scheduler_settings_.forward_begin_frames_to_children = true; |
| + SetUpScheduler(true); |
| + |
| + EXPECT_FALSE(client_->needs_begin_frames()); |
| + scheduler_->SetChildrenNeedBeginFrames(true); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); |
| +} |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, RequestCommit) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + client_->Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // If we don't swap on the deadline, we wait for the next BeginFrame. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // NotifyReadyToCommit should trigger the commit. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // BeginImplFrame should prepare the draw. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // BeginImplFrame deadline should draw. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
| // to avoid excessive toggles. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| + client_->Reset(); |
| } |
| -TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Now SetNeedsCommit again. Calling here means we need a second commit. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_EQ(client.num_actions_(), 0); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_EQ(client_->num_actions_(), 0); |
| + client_->Reset(); |
| // Finish the first commit. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Because we just swapped, the Scheduler should also request the next |
| // BeginImplFrame from the OutputSurface. |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Since another commit is needed, the next BeginImplFrame should initiate |
| // the second commit. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // Finishing the commit before the deadline should post a new deadline task |
| // to trigger the deadline early. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // On the next BeginImplFrame, verify we go back to a quiescent state and |
| // no longer request BeginImplFrames. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_FALSE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| } |
| class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
| @@ -596,86 +629,85 @@ class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
| // 1. the scheduler dropping SetNeedsRedraw requests that happen inside |
| // a ScheduledActionDrawAndSwap |
| // 2. the scheduler drawing twice inside a single tick |
| -TEST(SchedulerTest, RequestRedrawInsideDraw) { |
| - SchedulerClientThatsetNeedsDrawInsideDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - client.SetRequestRedrawsInsideDraw(true); |
| - |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - |
| - client.SetRequestRedrawsInsideDraw(false); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| +TEST_F(SchedulerTest, RequestRedrawInsideDraw) { |
| + SchedulerClientThatsetNeedsDrawInsideDraw* client = |
| + new SchedulerClientThatsetNeedsDrawInsideDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
|
Jimmy Jo
2015/01/28 00:53:47
when I make SetUpScheduler 1st arugment a scoped_p
brianderson
2015/01/28 01:09:14
Does casting the argument inline work?
If not, you
|
| + client->SetRequestRedrawsInsideDraw(true); |
| + |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + |
| + client->SetRequestRedrawsInsideDraw(false); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client_->num_draws()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
| // swap. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(client->needs_begin_frames()); |
| } |
| // Test that requesting redraw inside a failed draw doesn't lose the request. |
| -TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
| - SchedulerClientThatsetNeedsDrawInsideDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, RequestRedrawInsideFailedDraw) { |
| + SchedulerClientThatsetNeedsDrawInsideDraw* client = |
| + new SchedulerClientThatsetNeedsDrawInsideDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - client.SetRequestRedrawsInsideDraw(true); |
| - client.SetDrawWillHappen(false); |
| + client->SetRequestRedrawsInsideDraw(true); |
| + client->SetDrawWillHappen(false); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| // Fail the draw. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| // We have a commit pending and the draw failed, and we didn't lose the redraw |
| // request. |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| - client.SetRequestRedrawsInsideDraw(false); |
| + client->SetRequestRedrawsInsideDraw(false); |
| // Fail the draw again. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // Draw successfully. |
| - client.SetDrawWillHappen(true); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(3, client.num_draws()); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client->SetDrawWillHappen(true); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(3, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| } |
| class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
| @@ -709,120 +741,118 @@ class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
| // Tests for the scheduler infinite-looping on SetNeedsCommit requests that |
| // happen inside a ScheduledActionDrawAndSwap |
| -TEST(SchedulerTest, RequestCommitInsideDraw) { |
| - SchedulerClientThatSetNeedsCommitInsideDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_EQ(0, client.num_draws()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - |
| - client.SetNeedsCommitOnNextDraw(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.SetNeedsCommitOnNextDraw(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->CommitPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| +TEST_F(SchedulerTest, RequestCommitInsideDraw) { |
| + SchedulerClientThatSetNeedsCommitInsideDraw* client = |
| + new SchedulerClientThatSetNeedsCommitInsideDraw; |
| + |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| + |
| + EXPECT_FALSE(client->needs_begin_frames()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_EQ(0, client->num_draws()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + |
| + client->SetNeedsCommitOnNextDraw(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->SetNeedsCommitOnNextDraw(); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| + |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
| // swap. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->CommitPending()); |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->CommitPending()); |
| + EXPECT_FALSE(client->needs_begin_frames()); |
| } |
| // Tests that when a draw fails then the pending commit should not be dropped. |
| -TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
| - SchedulerClientThatsetNeedsDrawInsideDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, RequestCommitInsideFailedDraw) { |
| + SchedulerClientThatsetNeedsDrawInsideDraw* client = |
| + new SchedulerClientThatsetNeedsDrawInsideDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + client->SetDrawWillHappen(false); |
| - client.SetDrawWillHappen(false); |
| - |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| // Fail the draw. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| // We have a commit pending and the draw failed, and we didn't lose the commit |
| // request. |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // Fail the draw again. |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // Draw successfully. |
| - client.SetDrawWillHappen(true); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(3, client.num_draws()); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client->SetDrawWillHappen(true); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(3, client->num_draws()); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| } |
| -TEST(SchedulerTest, NoSwapWhenDrawFails) { |
| - SchedulerClientThatSetNeedsCommitInsideDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, NoSwapWhenDrawFails) { |
| + SchedulerClientThatSetNeedsCommitInsideDraw* client = |
| + new SchedulerClientThatSetNeedsCommitInsideDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| // Draw successfully, this starts a new frame. |
| - client.SetNeedsCommitOnNextDraw(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| + client->SetNeedsCommitOnNextDraw(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| // Fail to draw, this should not start a frame. |
| - client.SetDrawWillHappen(false); |
| - client.SetNeedsCommitOnNextDraw(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(2, client.num_draws()); |
| + client->SetDrawWillHappen(false); |
| + client->SetNeedsCommitOnNextDraw(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(2, client->num_draws()); |
| } |
| class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient { |
| @@ -834,241 +864,236 @@ class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient { |
| }; |
| // Test prepare tiles is independant of draws. |
| -TEST(SchedulerTest, PrepareTiles) { |
| - SchedulerClientNeedsPrepareTilesInDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, PrepareTiles) { |
| + SchedulerClientNeedsPrepareTilesInDraw* client = |
| + new SchedulerClientNeedsPrepareTilesInDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| // Request both draw and prepare tiles. PrepareTiles shouldn't |
| // be trigged until BeginImplFrame. |
| - client.Reset(); |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + client->Reset(); |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| + EXPECT_FALSE(client->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| // We have no immediate actions to perform, so the BeginImplFrame should post |
| // the deadline task. |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + client->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // On the deadline, he actions should have occured in the right order. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| - client.ActionIndex("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + client->Reset(); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_LT(client->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| + client->ActionIndex("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Request a draw. We don't need a PrepareTiles yet. |
| - client.Reset(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_TRUE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_EQ(0, client.num_draws()); |
| + client->Reset(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_TRUE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_EQ(0, client->num_draws()); |
| // We have no immediate actions to perform, so the BeginImplFrame should post |
| // the deadline task. |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + client->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Draw. The draw will trigger SetNeedsPrepareTiles, and |
| // then the PrepareTiles action will be triggered after the Draw. |
| // Afterwards, neither a draw nor PrepareTiles are pending. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| - client.ActionIndex("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + client->Reset(); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client->num_draws()); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_LT(client->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| + client->ActionIndex("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // We need a BeginImplFrame where we don't swap to go idle. |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + client->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client->Reset(); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_EQ(0, client.num_draws()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_EQ(0, client->num_draws()); |
| // Now trigger a PrepareTiles outside of a draw. We will then need |
| // a begin-frame for the PrepareTiles, but we don't need a draw. |
| - client.Reset(); |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| - scheduler->SetNeedsPrepareTiles(); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| + client->Reset(); |
| + EXPECT_FALSE(client->needs_begin_frames()); |
| + scheduler_->SetNeedsPrepareTiles(); |
| + EXPECT_TRUE(client->needs_begin_frames()); |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| // BeginImplFrame. There will be no draw, only PrepareTiles. |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + client->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(0, client.num_draws()); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client->Reset(); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(0, client->num_draws()); |
| + EXPECT_FALSE(client->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| } |
| // Test that PrepareTiles only happens once per frame. If an external caller |
| // initiates it, then the state machine should not PrepareTiles on that frame. |
| -TEST(SchedulerTest, PrepareTilesOncePerFrame) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, PrepareTilesOncePerFrame) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // If DidPrepareTiles during a frame, then PrepareTiles should not occur |
| // again. |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - scheduler->DidPrepareTiles(); // An explicit PrepareTiles. |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client_->num_draws()); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Next frame without DidPrepareTiles should PrepareTiles with draw. |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| - client.ActionIndex("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - scheduler->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client_->num_draws()); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| + client_->ActionIndex("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + scheduler_->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles |
| // If we get another DidPrepareTiles within the same frame, we should |
| // not PrepareTiles on the next frame. |
| - scheduler->DidPrepareTiles(); // An explicit PrepareTiles. |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client_->num_draws()); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // If we get another DidPrepareTiles, we should not PrepareTiles on the next |
| // frame. This verifies we don't alternate calling PrepareTiles once and |
| // twice. |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - scheduler->DidPrepareTiles(); // An explicit PrepareTiles. |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - EXPECT_TRUE(scheduler->PrepareTilesPending()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + scheduler_->DidPrepareTiles(); // An explicit PrepareTiles. |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + EXPECT_TRUE(scheduler_->PrepareTilesPending()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client_->num_draws()); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_FALSE(client_->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Next frame without DidPrepareTiles should PrepareTiles with draw. |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(1, client.num_draws()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles")); |
| - EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| - client.ActionIndex("ScheduledActionPrepareTiles")); |
| - EXPECT_FALSE(scheduler->RedrawPending()); |
| - EXPECT_FALSE(scheduler->PrepareTilesPending()); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - scheduler->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(1, client_->num_draws()); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| + EXPECT_TRUE(client_->HasAction("ScheduledActionPrepareTiles")); |
| + EXPECT_LT(client_->ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| + client_->ActionIndex("ScheduledActionPrepareTiles")); |
| + EXPECT_FALSE(scheduler_->RedrawPending()); |
| + EXPECT_FALSE(scheduler_->PrepareTilesPending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + scheduler_->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles |
| } |
| -TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
| - SchedulerClientNeedsPrepareTilesInDraw client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
| + SchedulerClientNeedsPrepareTilesInDraw* client = |
| + new SchedulerClientNeedsPrepareTilesInDraw; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| // The deadline should be zero since there is no work other than drawing |
| // pending. |
| - EXPECT_EQ(base::TimeTicks(), client.posted_begin_impl_frame_deadline()); |
| + EXPECT_EQ(base::TimeTicks(), client->posted_begin_impl_frame_deadline()); |
| } |
| class SchedulerClientWithFixedEstimates : public FakeSchedulerClient { |
| @@ -1096,1226 +1121,1172 @@ class SchedulerClientWithFixedEstimates : public FakeSchedulerClient { |
| base::TimeDelta commit_to_activate_duration_; |
| }; |
| -void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms, |
| - int64 commit_to_activate_estimate_in_ms, |
| - bool impl_latency_takes_priority, |
| - bool should_send_begin_main_frame) { |
| +void SchedulerTest::MainFrameInHighLatencyMode( |
| + int64 begin_main_frame_to_commit_estimate_in_ms, |
| + int64 commit_to_activate_estimate_in_ms, |
| + bool impl_latency_takes_priority, |
| + bool should_send_begin_main_frame) { |
| // Set up client with specified estimates (draw duration is set to 1). |
| - SchedulerClientWithFixedEstimates client( |
| - base::TimeDelta::FromMilliseconds(1), |
| - base::TimeDelta::FromMilliseconds( |
| - begin_main_frame_to_commit_estimate_in_ms), |
| - base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms)); |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| + SchedulerClientWithFixedEstimates* client = |
| + new SchedulerClientWithFixedEstimates( |
| + base::TimeDelta::FromMilliseconds(1), |
| + base::TimeDelta::FromMilliseconds( |
| + begin_main_frame_to_commit_estimate_in_ms), |
| + base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms)); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - scheduler->SetImplLatencyTakesPriority(impl_latency_takes_priority); |
| + scheduler_->SetImplLatencyTakesPriority(impl_latency_takes_priority); |
| // Impl thread hits deadline before commit finishes. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| - EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
| - |
| - client.Reset(); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_FALSE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + EXPECT_TRUE(client->HasAction("ScheduledActionSendBeginMainFrame")); |
| + |
| + client->Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_TRUE(scheduler_->MainThreadIsInHighLatencyMode()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_EQ(scheduler_->MainThreadIsInHighLatencyMode(), |
| should_send_begin_main_frame); |
| - EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"), |
| + EXPECT_EQ(client->HasAction("ScheduledActionSendBeginMainFrame"), |
| should_send_begin_main_frame); |
| } |
| -TEST(SchedulerTest, |
| - SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { |
| +TEST_F(SchedulerTest, |
| + SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { |
| // Set up client so that estimates indicate that we can commit and activate |
| // before the deadline (~8ms by default). |
| MainFrameInHighLatencyMode(1, 1, false, false); |
| } |
| -TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanCommitTooLong) { |
| +TEST_F(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanCommitTooLong) { |
| // Set up client so that estimates indicate that the commit cannot finish |
| // before the deadline (~8ms by default). |
| MainFrameInHighLatencyMode(10, 1, false, true); |
| } |
| -TEST(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanActivateTooLong) { |
| +TEST_F(SchedulerTest, NotSkipMainFrameIfHighLatencyAndCanActivateTooLong) { |
| // Set up client so that estimates indicate that the activate cannot finish |
| // before the deadline (~8ms by default). |
| MainFrameInHighLatencyMode(1, 10, false, true); |
| } |
| -TEST(SchedulerTest, NotSkipMainFrameInPreferImplLatencyMode) { |
| +TEST_F(SchedulerTest, NotSkipMainFrameInPreferImplLatencyMode) { |
| // Set up client so that estimates indicate that we can commit and activate |
| // before the deadline (~8ms by default), but also enable impl latency takes |
| // priority mode. |
| MainFrameInHighLatencyMode(1, 1, true, true); |
| } |
| -TEST(SchedulerTest, PollForCommitCompletion) { |
| +TEST_F(SchedulerTest, PollForCommitCompletion) { |
| // Since we are simulating a long commit, set up a client with draw duration |
| // estimates that prevent skipping main frames to get to low latency mode. |
| - SchedulerClientWithFixedEstimates client( |
| - base::TimeDelta::FromMilliseconds(1), |
| - base::TimeDelta::FromMilliseconds(32), |
| - base::TimeDelta::FromMilliseconds(32)); |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| + SchedulerClientWithFixedEstimates* client = |
| + new SchedulerClientWithFixedEstimates( |
| + base::TimeDelta::FromMilliseconds(1), |
| + base::TimeDelta::FromMilliseconds(32), |
| + base::TimeDelta::FromMilliseconds(32)); |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(client, true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - |
| - client.set_log_anticipated_draw_time_change(true); |
| + client->set_log_anticipated_draw_time_change(true); |
| BeginFrameArgs frame_args = |
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src()); |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client->now_src()); |
| frame_args.interval = base::TimeDelta::FromMilliseconds(1000); |
| // At this point, we've drawn a frame. Start another commit, but hold off on |
| // the NotifyReadyToCommit for now. |
| - EXPECT_FALSE(scheduler->CommitPending()); |
| - scheduler->SetNeedsCommit(); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); |
| - EXPECT_TRUE(scheduler->CommitPending()); |
| + EXPECT_FALSE(scheduler_->CommitPending()); |
| + scheduler_->SetNeedsCommit(); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(frame_args); |
| + EXPECT_TRUE(scheduler_->CommitPending()); |
| // Draw and swap the frame, but don't ack the swap to simulate the Browser |
| // blocking on the renderer. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - scheduler->DidSwapBuffers(); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + scheduler_->DidSwapBuffers(); |
| // Spin the event loop a few times and make sure we get more |
| // DidAnticipateDrawTimeChange calls every time. |
| - int actions_so_far = client.num_actions_(); |
| + int actions_so_far = client->num_actions_(); |
| // Does three iterations to make sure that the timer is properly repeating. |
| for (int i = 0; i < 3; ++i) { |
| EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), |
| - client.task_runner().DelayToNextTaskTime().InMicroseconds()) |
| - << scheduler->AsValue()->ToString(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_GT(client.num_actions_(), actions_so_far); |
| - EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
| + client->task_runner().DelayToNextTaskTime().InMicroseconds()) |
| + << scheduler_->AsValue()->ToString(); |
| + client->task_runner().RunPendingTasks(); |
| + EXPECT_GT(client->num_actions_(), actions_so_far); |
| + EXPECT_STREQ(client->Action(client->num_actions_() - 1), |
| "DidAnticipatedDrawTimeChange"); |
| - actions_so_far = client.num_actions_(); |
| + actions_so_far = client->num_actions_(); |
| } |
| // Do the same thing after BeginMainFrame starts but still before activation. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| for (int i = 0; i < 3; ++i) { |
| EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), |
| - client.task_runner().DelayToNextTaskTime().InMicroseconds()) |
| - << scheduler->AsValue()->ToString(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_GT(client.num_actions_(), actions_so_far); |
| - EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
| + client->task_runner().DelayToNextTaskTime().InMicroseconds()) |
| + << scheduler_->AsValue()->ToString(); |
| + client->task_runner().RunPendingTasks(); |
| + EXPECT_GT(client->num_actions_(), actions_so_far); |
| + EXPECT_STREQ(client->Action(client->num_actions_() - 1), |
| "DidAnticipatedDrawTimeChange"); |
| - actions_so_far = client.num_actions_(); |
| + actions_so_far = client->num_actions_(); |
| } |
| } |
| -TEST(SchedulerTest, BeginRetroFrame) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, BeginRetroFrame) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + client_->Reset(); |
| // Create a BeginFrame with a long deadline to avoid race conditions. |
| // This is the first BeginFrame, which will be handled immediately. |
| BeginFrameArgs args = |
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src()); |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client_->now_src()); |
| args.deadline += base::TimeDelta::FromHours(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Queue BeginFrames while we are still handling the previous BeginFrame. |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // NotifyReadyToCommit should trigger the commit. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // BeginImplFrame should prepare the draw. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // BeginImplFrame deadline should draw. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
| // to avoid excessive toggles. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| - EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| + client_->Reset(); |
| } |
| -TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - scheduler->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1)); |
| + scheduler_->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1)); |
| // To test swap ack throttling, this test disables automatic swap acks. |
| - scheduler->SetMaxSwapsPending(1); |
| - client.SetAutomaticSwapAck(false); |
| + scheduler_->SetMaxSwapsPending(1); |
| + client_->SetAutomaticSwapAck(false); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - client.Reset(); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - client.Reset(); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + client_->Reset(); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Queue BeginFrame while we are still handling the previous BeginFrame. |
| - client.SendNextBeginFrame(); |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + SendNextBeginFrame(); |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // NotifyReadyToCommit should trigger the pending commit and draw. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Swapping will put us into a swap throttled state. |
| // Run posted deadline. |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // While swap throttled, BeginRetroFrames should trigger BeginImplFrames |
| // but not a BeginMainFrame or draw. |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| // Run posted BeginRetroFrame. |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(false)); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(false)); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Let time pass sufficiently beyond the regular deadline but not beyond the |
| // late deadline. |
| - client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
| - base::TimeDelta::FromMicroseconds(1)); |
| - client.task_runner().RunUntilTime(client.now_src()->Now()); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
| + base::TimeDelta::FromMicroseconds(1)); |
| + client_->task_runner().RunUntilTime(client_->now_src()->Now()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Take us out of a swap throttled state. |
| - scheduler->DidSwapBuffersComplete(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + scheduler_->DidSwapBuffersComplete(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| // Verify that the deadline was rescheduled. |
| - client.task_runner().RunUntilTime(client.now_src()->Now()); |
| - EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + client_->task_runner().RunUntilTime(client_->now_src()->Now()); |
| + EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| } |
| -TEST(SchedulerTest, RetroFrameDoesNotExpireTooEarly) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| - client.Reset(); |
| - client.SendNextBeginFrame(); |
| + client_->Reset(); |
| + SendNextBeginFrame(); |
| // This BeginFrame is queued up as a retro frame. |
| - EXPECT_NO_ACTION(client); |
| + EXPECT_NO_ACTION(client_); |
| // The previous deadline is still pending. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->Reset(); |
| // This commit should schedule the (previous) deadline to trigger immediately. |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| - client.Reset(); |
| + client_->Reset(); |
| // The deadline task should trigger causing a draw. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| // Keep animating. |
| - client.Reset(); |
| - scheduler->SetNeedsAnimate(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_NO_ACTION(client); |
| + client_->Reset(); |
| + scheduler_->SetNeedsAnimate(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_NO_ACTION(client_); |
| // Let's advance sufficiently past the next frame's deadline. |
| - client.now_src()->AdvanceNow( |
| + client_->now_src()->AdvanceNow( |
| BeginFrameArgs::DefaultInterval() - |
| BeginFrameArgs::DefaultEstimatedParentDrawTime() + |
| base::TimeDelta::FromMicroseconds(1)); |
| // The retro frame hasn't expired yet. |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(false)); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(false)); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // This is an immediate deadline case. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); |
| } |
| -TEST(SchedulerTest, RetroFrameDoesNotExpireTooLate) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooLate) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - |
| - client.Reset(); |
| - client.SendNextBeginFrame(); |
| + client_->Reset(); |
| + SendNextBeginFrame(); |
| // This BeginFrame is queued up as a retro frame. |
| - EXPECT_NO_ACTION(client); |
| + EXPECT_NO_ACTION(client_); |
| // The previous deadline is still pending. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->Reset(); |
| // This commit should schedule the (previous) deadline to trigger immediately. |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| - client.Reset(); |
| + client_->Reset(); |
| // The deadline task should trigger causing a draw. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| // Keep animating. |
| - client.Reset(); |
| - scheduler->SetNeedsAnimate(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_NO_ACTION(client); |
| + client_->Reset(); |
| + scheduler_->SetNeedsAnimate(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_NO_ACTION(client_); |
| // Let's advance sufficiently past the next frame's deadline. |
| - client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() + |
| - base::TimeDelta::FromMicroseconds(1)); |
| + client_->now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() + |
| + base::TimeDelta::FromMicroseconds(1)); |
| // The retro frame should've expired. |
| - EXPECT_NO_ACTION(client); |
| + EXPECT_NO_ACTION(client_); |
| } |
| -void BeginFramesNotFromClient(bool use_external_begin_frame_source, |
| - bool throttle_frame_production) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = |
| +void SchedulerTest::BeginFramesNotFromClient( |
| + bool use_external_begin_frame_source, |
| + bool throttle_frame_production) { |
| + scheduler_settings_.use_external_begin_frame_source = |
| use_external_begin_frame_source; |
| - scheduler_settings.throttle_frame_production = throttle_frame_production; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + scheduler_settings_.throttle_frame_production = throttle_frame_production; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame |
| // without calling SetNeedsBeginFrame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_NO_ACTION(client); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_NO_ACTION(client_); |
| + client_->Reset(); |
| // When the client-driven BeginFrame are disabled, the scheduler posts it's |
| // own BeginFrame tasks. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // If we don't swap on the deadline, we wait for the next BeginFrame. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // NotifyReadyToCommit should trigger the commit. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + client_->Reset(); |
| // BeginImplFrame should prepare the draw. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // BeginImplFrame deadline should draw. |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
| // to avoid excessive toggles. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| - EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // Make sure SetNeedsBeginFrame isn't called on the client |
| // when the BeginFrame is no longer needed. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + client_->Reset(); |
| } |
| -TEST(SchedulerTest, SyntheticBeginFrames) { |
| +TEST_F(SchedulerTest, SyntheticBeginFrames) { |
| bool use_external_begin_frame_source = false; |
| bool throttle_frame_production = true; |
| BeginFramesNotFromClient(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -TEST(SchedulerTest, VSyncThrottlingDisabled) { |
| +TEST_F(SchedulerTest, VSyncThrottlingDisabled) { |
| bool use_external_begin_frame_source = true; |
| bool throttle_frame_production = false; |
| BeginFramesNotFromClient(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { |
| +TEST_F(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { |
| bool use_external_begin_frame_source = false; |
| bool throttle_frame_production = false; |
| BeginFramesNotFromClient(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -void BeginFramesNotFromClient_SwapThrottled( |
| +void SchedulerTest::BeginFramesNotFromClient_SwapThrottled( |
| bool use_external_begin_frame_source, |
| bool throttle_frame_production) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = |
| + scheduler_settings_.use_external_begin_frame_source = |
| use_external_begin_frame_source; |
| - scheduler_settings.throttle_frame_production = throttle_frame_production; |
| + scheduler_settings_.throttle_frame_production = throttle_frame_production; |
| + SetUpScheduler(true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - scheduler->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1)); |
| + scheduler_->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1)); |
| // To test swap ack throttling, this test disables automatic swap acks. |
| - scheduler->SetMaxSwapsPending(1); |
| - client.SetAutomaticSwapAck(false); |
| + scheduler_->SetMaxSwapsPending(1); |
| + client_->SetAutomaticSwapAck(false); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - client.Reset(); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_NO_ACTION(client); |
| - client.Reset(); |
| + client_->Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_NO_ACTION(client_); |
| + client_->Reset(); |
| // Trigger the first BeginImplFrame and BeginMainFrame |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // NotifyReadyToCommit should trigger the pending commit and draw. |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - client.Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + client_->Reset(); |
| // Swapping will put us into a swap throttled state. |
| // Run posted deadline. |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // While swap throttled, BeginFrames should trigger BeginImplFrames, |
| // but not a BeginMainFrame or draw. |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); // Run posted BeginFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_SCOPED(AdvanceFrame()); // Run posted BeginFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // Let time pass sufficiently beyond the regular deadline but not beyond the |
| // late deadline. |
| - client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
| - base::TimeDelta::FromMicroseconds(1)); |
| - client.task_runner().RunUntilTime(client.now_src()->Now()); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
| + base::TimeDelta::FromMicroseconds(1)); |
| + client_->task_runner().RunUntilTime(client_->now_src()->Now()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Take us out of a swap throttled state. |
| - scheduler->DidSwapBuffersComplete(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + scheduler_->DidSwapBuffersComplete(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client_); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // Verify that the deadline was rescheduled. |
| // We can't use RunUntilTime(now) here because the next frame is also |
| // scheduled if throttle_frame_production = false. |
| - base::TimeTicks before_deadline = client.now_src()->Now(); |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| - base::TimeTicks after_deadline = client.now_src()->Now(); |
| + base::TimeTicks before_deadline = client_->now_src()->Now(); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| + base::TimeTicks after_deadline = client_->now_src()->Now(); |
| EXPECT_EQ(after_deadline, before_deadline); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| } |
| -TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| +TEST_F(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| bool use_external_begin_frame_source = false; |
| bool throttle_frame_production = true; |
| BeginFramesNotFromClient_SwapThrottled(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
| +TEST_F(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
| bool use_external_begin_frame_source = true; |
| bool throttle_frame_production = false; |
| BeginFramesNotFromClient_SwapThrottled(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -TEST(SchedulerTest, |
| - SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| +TEST_F(SchedulerTest, |
| + SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| bool use_external_begin_frame_source = false; |
| bool throttle_frame_production = false; |
| BeginFramesNotFromClient_SwapThrottled(use_external_begin_frame_source, |
| throttle_frame_production); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterOutputSurfaceIsInitialized) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - TestScheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| - scheduler->SetCanStart(); |
| - scheduler->SetVisible(true); |
| - scheduler->SetCanDraw(true); |
| - |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| - client.Reset(); |
| - scheduler->DidCreateAndInitializeOutputSurface(); |
| - EXPECT_NO_ACTION(client); |
| - |
| - scheduler->DidLoseOutputSurface(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| -} |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterOutputSurfaceIsInitialized) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(false); |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStarted) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| + scheduler_->SetCanStart(); |
| + scheduler_->SetVisible(true); |
| + scheduler_->SetCanDraw(true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| + client_->Reset(); |
| + scheduler_->DidCreateAndInitializeOutputSurface(); |
| + EXPECT_NO_ACTION(client_); |
| + |
| + scheduler_->DidLoseOutputSurface(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| +} |
| + |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStarted) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - scheduler->DidLoseOutputSurface(); |
| + client_->Reset(); |
| + scheduler_->DidLoseOutputSurface(); |
| // Do nothing when impl frame is in deadine pending state. |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_ACTION("ScheduledActionCommit", client, 0, 1); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_ACTION("ScheduledActionCommit", client_, 0, 1); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| } |
| -void DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( |
| +void SchedulerTest::DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( |
| bool impl_side_painting) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.impl_side_painting = impl_side_painting; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + scheduler_settings_.impl_side_painting = impl_side_painting; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - scheduler->DidLoseOutputSurface(); |
| + client_->Reset(); |
| + scheduler_->DidLoseOutputSurface(); |
| // Do nothing when impl frame is in deadine pending state. |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| - client.Reset(); |
| + client_->Reset(); |
| // Run posted deadline. |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
| // OnBeginImplFrameDeadline didn't schedule any actions because main frame is |
| // not yet completed. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| // BeginImplFrame is not started. |
| - client.task_runner().RunUntilTime(client.now_src()->Now() + |
| - base::TimeDelta::FromMilliseconds(10)); |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| + client_->task_runner().RunUntilTime(client_->now_src()->Now() + |
| + base::TimeDelta::FromMilliseconds(10)); |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| if (impl_side_painting) { |
| - EXPECT_ACTION("ScheduledActionCommit", client, 0, 3); |
| - EXPECT_ACTION("ScheduledActionActivateSyncTree", client, 1, 3); |
| - EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client, 2, 3); |
| + EXPECT_ACTION("ScheduledActionCommit", client_, 0, 3); |
| + EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 3); |
| + EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 2, 3); |
| } else { |
| - EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client, 1, 2); |
| + EXPECT_ACTION("ScheduledActionCommit", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 1, 2); |
| } |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency) { |
| +TEST_F(SchedulerTest, |
| + DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency) { |
| bool impl_side_painting = false; |
| DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency(impl_side_painting); |
| } |
| -TEST(SchedulerTest, |
| - DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatencyWithImplPaint) { |
| +TEST_F(SchedulerTest, |
| + DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatencyWithImplPaint) { |
| bool impl_side_painting = true; |
| DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency(impl_side_painting); |
| } |
| -void DidLoseOutputSurfaceAfterReadyToCommit(bool impl_side_painting) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.impl_side_painting = impl_side_painting; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +void SchedulerTest::DidLoseOutputSurfaceAfterReadyToCommit( |
| + bool impl_side_painting) { |
| + scheduler_settings_.impl_side_painting = impl_side_painting; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - |
| - client.Reset(); |
| - scheduler->DidLoseOutputSurface(); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + |
| + client_->Reset(); |
| + scheduler_->DidLoseOutputSurface(); |
| if (impl_side_painting) { |
| // Sync tree should be forced to activate. |
| - EXPECT_ACTION("ScheduledActionActivateSyncTree", client, 0, 2); |
| - EXPECT_ACTION("SetNeedsBeginFrames(false)", client, 1, 2); |
| + EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); |
| + EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 2); |
| } else { |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| } |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterReadyToCommit) { |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterReadyToCommit) { |
| DidLoseOutputSurfaceAfterReadyToCommit(false); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterReadyToCommitWithImplPainting) { |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterReadyToCommitWithImplPainting) { |
| DidLoseOutputSurfaceAfterReadyToCommit(true); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsPrepareTiles) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsPrepareTiles) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| + scheduler_->SetNeedsPrepareTiles(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| - scheduler->SetNeedsPrepareTiles(); |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + scheduler_->DidLoseOutputSurface(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| - client.Reset(); |
| - scheduler->DidLoseOutputSurface(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionPrepareTiles", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client, 1, 2); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 1, 2); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginRetroFramePosted) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterBeginRetroFramePosted) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| // Create a BeginFrame with a long deadline to avoid race conditions. |
| // This is the first BeginFrame, which will be handled immediately. |
| - client.Reset(); |
| + client_->Reset(); |
| BeginFrameArgs args = |
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src()); |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client_->now_src()); |
| args.deadline += base::TimeDelta::FromHours(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| // Queue BeginFrames while we are still handling the previous BeginFrame. |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| // NotifyReadyToCommit should trigger the commit. |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - |
| - client.Reset(); |
| - EXPECT_FALSE(scheduler->IsBeginRetroFrameArgsEmpty()); |
| - scheduler->DidLoseOutputSurface(); |
| - EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client, 0, 2); |
| - EXPECT_ACTION("SetNeedsBeginFrames(false)", client, 1, 2); |
| - EXPECT_TRUE(scheduler->IsBeginRetroFrameArgsEmpty()); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + |
| + client_->Reset(); |
| + EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
| + scheduler_->DidLoseOutputSurface(); |
| + EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 2); |
| + EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
| // Posted BeginRetroFrame is aborted. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_NO_ACTION(client); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); |
| + EXPECT_NO_ACTION(client_); |
| } |
| -TEST(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| // Create a BeginFrame with a long deadline to avoid race conditions. |
| // This is the first BeginFrame, which will be handled immediately. |
| - client.Reset(); |
| + client_->Reset(); |
| BeginFrameArgs args = |
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src()); |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client_->now_src()); |
| args.deadline += base::TimeDelta::FromHours(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| // Queue BeginFrames while we are still handling the previous BeginFrame. |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| args.frame_time += base::TimeDelta::FromSeconds(1); |
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| + fake_external_begin_frame_source()->TestOnBeginFrame(args); |
| // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| // NotifyReadyToCommit should trigger the commit. |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| // BeginImplFrame should prepare the draw. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - |
| - client.Reset(); |
| - EXPECT_FALSE(scheduler->IsBeginRetroFrameArgsEmpty()); |
| - scheduler->DidLoseOutputSurface(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
| - EXPECT_TRUE(scheduler->IsBeginRetroFrameArgsEmpty()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + |
| + client_->Reset(); |
| + EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
| + scheduler_->DidLoseOutputSurface(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
| + EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
| // BeginImplFrame deadline should abort drawing. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_FALSE(client.needs_begin_frames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_FALSE(client_->needs_begin_frames()); |
| // No more BeginRetroFrame because BeginRetroFrame queue is cleared. |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_NO_ACTION(client); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); |
| + EXPECT_NO_ACTION(client_); |
| } |
| -TEST(SchedulerTest, |
| - StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, |
| + StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| - EXPECT_FALSE(scheduler->frame_source().NeedsBeginFrames()); |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_TRUE(scheduler->frame_source().NeedsBeginFrames()); |
| + EXPECT_FALSE(scheduler_->frame_source().NeedsBeginFrames()); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_TRUE(scheduler_->frame_source().NeedsBeginFrames()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted Tick. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(scheduler->frame_source().NeedsBeginFrames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted Tick. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->frame_source().NeedsBeginFrames()); |
| // NotifyReadyToCommit should trigger the commit. |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - EXPECT_TRUE(scheduler->frame_source().NeedsBeginFrames()); |
| - |
| - client.Reset(); |
| - scheduler->DidLoseOutputSurface(); |
| - EXPECT_NO_ACTION(client); |
| - EXPECT_FALSE(scheduler->frame_source().NeedsBeginFrames()); |
| - |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| - EXPECT_FALSE(scheduler->frame_source().NeedsBeginFrames()); |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + EXPECT_TRUE(scheduler_->frame_source().NeedsBeginFrames()); |
| + |
| + client_->Reset(); |
| + scheduler_->DidLoseOutputSurface(); |
| + EXPECT_NO_ACTION(client_); |
| + EXPECT_FALSE(scheduler_->frame_source().NeedsBeginFrames()); |
| + |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
| + EXPECT_FALSE(scheduler_->frame_source().NeedsBeginFrames()); |
| } |
| -TEST(SchedulerTest, ScheduledActionActivateAfterBecomingInvisible) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.impl_side_painting = true; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, ScheduledActionActivateAfterBecomingInvisible) { |
| + scheduler_settings_.impl_side_painting = true; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsCommit should begin the frame. |
| - scheduler->SetNeedsCommit(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - |
| - client.Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - |
| - client.Reset(); |
| - scheduler->NotifyBeginMainFrameStarted(); |
| - scheduler->NotifyReadyToCommit(); |
| - EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| - |
| - client.Reset(); |
| - scheduler->SetVisible(false); |
| + scheduler_->SetNeedsCommit(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + |
| + client_->Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + |
| + client_->Reset(); |
| + scheduler_->NotifyBeginMainFrameStarted(); |
| + scheduler_->NotifyReadyToCommit(); |
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
| + |
| + client_->Reset(); |
| + scheduler_->SetVisible(false); |
| // Sync tree should be forced to activate. |
| - EXPECT_ACTION("SetNeedsBeginFrames(false)", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionActivateSyncTree", client, 1, 2); |
| + EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2); |
| } |
| -TEST(SchedulerTest, SchedulerPowerMonitoring) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings settings; |
| - settings.disable_hi_res_timer_tasks_on_battery = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(settings); |
| +TEST_F(SchedulerTest, SchedulerPowerMonitoring) { |
| + scheduler_settings_.disable_hi_res_timer_tasks_on_battery = true; |
| + SetUpScheduler(true); |
| base::TimeTicks before_deadline, after_deadline; |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // On non-battery power |
| - EXPECT_FALSE(client.PowerMonitor()->IsOnBatteryPower()); |
| + EXPECT_FALSE(PowerMonitor()->IsOnBatteryPower()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + client_->Reset(); |
| - before_deadline = client.now_src()->Now(); |
| - EXPECT_TRUE(client.task_runner().RunTasksWhile( |
| - client.ImplFrameDeadlinePending(true))); |
| - after_deadline = client.now_src()->Now(); |
| + before_deadline = client_->now_src()->Now(); |
| + EXPECT_TRUE(client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true))); |
| + after_deadline = client_->now_src()->Now(); |
| // We post a non-zero deadline task when not on battery |
| EXPECT_LT(before_deadline, after_deadline); |
| // Switch to battery power |
| - client.PowerMonitorSource()->GeneratePowerStateEvent(true); |
| - EXPECT_TRUE(client.PowerMonitor()->IsOnBatteryPower()); |
| + PowerMonitorSource()->GeneratePowerStateEvent(true); |
| + EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| - before_deadline = client.now_src()->Now(); |
| - EXPECT_TRUE(client.task_runner().RunTasksWhile( |
| - client.ImplFrameDeadlinePending(true))); |
| - after_deadline = client.now_src()->Now(); |
| + before_deadline = client_->now_src()->Now(); |
| + EXPECT_TRUE(client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true))); |
| + after_deadline = client_->now_src()->Now(); |
| // We post a zero deadline task when on battery |
| EXPECT_EQ(before_deadline, after_deadline); |
| // Switch to non-battery power |
| - client.PowerMonitorSource()->GeneratePowerStateEvent(false); |
| - EXPECT_FALSE(client.PowerMonitor()->IsOnBatteryPower()); |
| + PowerMonitorSource()->GeneratePowerStateEvent(false); |
| + EXPECT_FALSE(PowerMonitor()->IsOnBatteryPower()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // Same as before |
| - before_deadline = client.now_src()->Now(); |
| - EXPECT_TRUE(client.task_runner().RunTasksWhile( |
| - client.ImplFrameDeadlinePending(true))); |
| - after_deadline = client.now_src()->Now(); |
| + before_deadline = client_->now_src()->Now(); |
| + EXPECT_TRUE(client_->task_runner().RunTasksWhile( |
| + client_->ImplFrameDeadlinePending(true))); |
| + after_deadline = client_->now_src()->Now(); |
| } |
| -TEST(SchedulerTest, |
| - SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOff) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings settings; |
| - settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(settings); |
| +TEST_F(SchedulerTest, |
| + SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOff) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // Set needs commit so that the scheduler tries to wait for the main thread |
| - scheduler->SetNeedsCommit(); |
| + scheduler_->SetNeedsCommit(); |
| // Set needs redraw so that the scheduler doesn't wait too long |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // Switch to battery power |
| - client.PowerMonitorSource()->GeneratePowerStateEvent(true); |
| - EXPECT_TRUE(client.PowerMonitor()->IsOnBatteryPower()); |
| + PowerMonitorSource()->GeneratePowerStateEvent(true); |
| + EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // Disable auto-advancing of now_src |
| - client.task_runner().SetAutoAdvanceNowToPendingTasks(false); |
| + client_->task_runner().SetAutoAdvanceNowToPendingTasks(false); |
| // Deadline task is pending |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunPendingTasks(); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunPendingTasks(); |
| // Deadline task is still pending |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| // Advance now by 15 ms - same as windows low res timer |
| - client.now_src()->AdvanceNowMicroseconds(15000); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunPendingTasks(); |
| + client_->now_src()->AdvanceNowMicroseconds(15000); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunPendingTasks(); |
| // Deadline task finally completes |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| } |
| -TEST(SchedulerTest, |
| - SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOn) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings settings; |
| - settings.disable_hi_res_timer_tasks_on_battery = true; |
| - settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(settings); |
| +TEST_F(SchedulerTest, |
| + SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOn) { |
| + scheduler_settings_.disable_hi_res_timer_tasks_on_battery = true; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // Set needs commit so that the scheduler tries to wait for the main thread |
| - scheduler->SetNeedsCommit(); |
| + scheduler_->SetNeedsCommit(); |
| // Set needs redraw so that the scheduler doesn't wait too long |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // Switch to battery power |
| - client.PowerMonitorSource()->GeneratePowerStateEvent(true); |
| - EXPECT_TRUE(client.PowerMonitor()->IsOnBatteryPower()); |
| + PowerMonitorSource()->GeneratePowerStateEvent(true); |
| + EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower()); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - scheduler->SetNeedsCommit(); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + scheduler_->SetNeedsCommit(); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| // Disable auto-advancing of now_src |
| - client.task_runner().SetAutoAdvanceNowToPendingTasks(false); |
| + client_->task_runner().SetAutoAdvanceNowToPendingTasks(false); |
| // Deadline task is pending |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.task_runner().RunPendingTasks(); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->task_runner().RunPendingTasks(); |
| // Deadline task runs immediately |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| } |
| // Tests to ensure frame sources can be successfully changed while drawing. |
| -TEST(SchedulerTest, SwitchFrameSourceToUnthrottled) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, SwitchFrameSourceToUnthrottled) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - client.Reset(); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - scheduler->SetNeedsRedraw(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + client_->Reset(); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + scheduler_->SetNeedsRedraw(); |
| // Switch to an unthrottled frame source. |
| - scheduler->SetThrottleFrameProduction(false); |
| - client.Reset(); |
| + scheduler_->SetThrottleFrameProduction(false); |
| + client_->Reset(); |
| // Unthrottled frame source will immediately begin a new frame. |
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // If we don't swap on the deadline, we wait for the next BeginFrame. |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| } |
| // Tests to ensure frame sources can be successfully changed while a frame |
| // deadline is pending. |
| -TEST(SchedulerTest, SwitchFrameSourceToUnthrottledBeforeDeadline) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| +TEST_F(SchedulerTest, SwitchFrameSourceToUnthrottledBeforeDeadline) { |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
| - client.Reset(); |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
| + client_->Reset(); |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| // Switch to an unthrottled frame source before the frame deadline is hit. |
| - scheduler->SetThrottleFrameProduction(false); |
| - client.Reset(); |
| + scheduler_->SetThrottleFrameProduction(false); |
| + client_->Reset(); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| - client.task_runner() |
| + client_->task_runner() |
| .RunPendingTasks(); // Run posted deadline and BeginFrame. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 2); |
| // Unthrottled frame source will immediately begin a new frame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 1, 2); |
| - scheduler->SetNeedsRedraw(); |
| - client.Reset(); |
| - |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 1, 2); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->Reset(); |
| + |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 1, 2); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| } |
| // Tests to ensure that the active frame source can successfully be changed from |
| // unthrottled to throttled. |
| -TEST(SchedulerTest, SwitchFrameSourceToThrottled) { |
| - FakeSchedulerClient client; |
| - SchedulerSettings scheduler_settings; |
| - scheduler_settings.throttle_frame_production = false; |
| - scheduler_settings.use_external_begin_frame_source = true; |
| - |
| - CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
| - |
| - scheduler->SetNeedsRedraw(); |
| - EXPECT_NO_ACTION(client); |
| - client.Reset(); |
| - |
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| - |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| - EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| - client.Reset(); |
| +TEST_F(SchedulerTest, SwitchFrameSourceToThrottled) { |
| + scheduler_settings_.throttle_frame_production = false; |
| + scheduler_settings_.use_external_begin_frame_source = true; |
| + SetUpScheduler(true); |
| + |
| + scheduler_->SetNeedsRedraw(); |
| + EXPECT_NO_ACTION(client_); |
| + client_->Reset(); |
| + |
| + client_->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| + |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
| + client_->Reset(); |
| // Switch to a throttled frame source. |
| - scheduler->SetThrottleFrameProduction(true); |
| - client.Reset(); |
| + scheduler_->SetThrottleFrameProduction(true); |
| + client_->Reset(); |
| // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
| - scheduler->SetNeedsRedraw(); |
| - client.task_runner().RunPendingTasks(); |
| - EXPECT_NO_ACTION(client); |
| - client.Reset(); |
| - |
| - EXPECT_SCOPED(client.AdvanceFrame()); |
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| - EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| - EXPECT_TRUE(client.needs_begin_frames()); |
| - client.Reset(); |
| - client.task_runner().RunPendingTasks(); // Run posted deadline. |
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| + scheduler_->SetNeedsRedraw(); |
| + client_->task_runner().RunPendingTasks(); |
| + EXPECT_NO_ACTION(client_); |
| + client_->Reset(); |
| + |
| + EXPECT_SCOPED(AdvanceFrame()); |
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| + EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client_->needs_begin_frames()); |
| + client_->Reset(); |
| + client_->task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
| } |
| } // namespace |