Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 29e4c496f151304c2d58cf6a170edec8c2342358..e4ce6b3614d838a8924bd0672e689cb46d2bfd86 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -7,7 +7,6 @@ |
#include <string> |
#include <vector> |
-#include "base/debug/trace_event.h" |
#include "base/logging.h" |
#include "base/memory/scoped_vector.h" |
#include "base/message_loop/message_loop.h" |
@@ -15,22 +14,23 @@ |
#include "base/power_monitor/power_monitor_source.h" |
#include "base/run_loop.h" |
#include "base/time/time.h" |
+#include "base/trace_event/trace_event.h" |
#include "cc/test/begin_frame_args_test.h" |
#include "cc/test/ordered_simple_task_runner.h" |
#include "cc/test/scheduler_test_common.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#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); \ |
+#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_.get(); \ |
+ 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) |
#define EXPECT_NO_ACTION(client) EXPECT_ACTION("", client, -1, 0) |
@@ -44,69 +44,15 @@ |
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()), |
- 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)); |
- // Fail if we need to run 100 tasks in a row. |
- task_runner_->SetRunTaskLimit(100); |
Reset(); |
} |
@@ -120,24 +66,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,113 +84,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(); } |
- |
int ActionIndex(const char* action) const { |
for (size_t i = 0; i < actions_.size(); i++) |
if (!strcmp(actions_[i], action)) |
@@ -349,16 +171,16 @@ class FakeSchedulerClient : public SchedulerClient { |
return begin_frame_is_sent_to_children_; |
} |
- protected: |
- bool ImplFrameDeadlinePendingCallback(bool state) { |
- return scheduler_->BeginImplFrameDeadlinePending() == state; |
- } |
- |
void PushAction(const char* description) { |
actions_.push_back(description); |
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_; |
@@ -368,199 +190,471 @@ class FakeSchedulerClient : public SchedulerClient { |
base::TimeTicks posted_begin_impl_frame_deadline_; |
std::vector<const char*> actions_; |
std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat>> states_; |
+ TestScheduler* scheduler_; |
+}; |
+ |
+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_; |
+}; |
+ |
+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)"); |
+ } |
+ } |
+ |
+ void TestOnBeginFrame(const BeginFrameArgs& args) { |
+ return CallOnBeginFrame(args); |
+ } |
+ |
+ private: |
+ FakeSchedulerClient* client_; |
+}; |
+ |
+class SchedulerTest : public testing::Test { |
+ public: |
+ SchedulerTest() |
+ : now_src_(TestNowSource::Create()), |
+ 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_)) { |
+ // A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval() |
+ now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
+ // Fail if we need to run 100 tasks in a row. |
+ task_runner_->SetRunTaskLimit(100); |
+ } |
+ |
+ ~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( |
+ now_src_, client_.get(), scheduler_settings_, 0, 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(make_scoped_ptr(new FakeSchedulerClient), initSurface); |
+ } |
+ |
+ void SetUpScheduler(scoped_ptr<FakeSchedulerClient> client, |
+ bool initSurface) { |
+ client_ = client.Pass(); |
+ if (initSurface) |
+ CreateSchedulerAndInitSurface(); |
+ else |
+ CreateScheduler(); |
+ } |
+ |
+ OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
+ TestNowSource* now_src() { return now_src_.get(); } |
+ |
+ // 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()); |
+ 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()); |
+ 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. |
+ 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( |
+ 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. |
+ now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
+ fake_external_begin_frame_source_->TestOnBeginFrame( |
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src())); |
+ } |
+ |
+ base::PowerMonitor* PowerMonitor() { return &power_monitor_; } |
+ FakePowerMonitorSource* PowerMonitorSource() { |
+ return fake_power_monitor_source_; |
+ } |
+ |
+ FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { |
+ return fake_external_begin_frame_source_; |
+ } |
+ |
+ 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); |
+ |
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_; |
+ SchedulerSettings scheduler_settings_; |
+ scoped_ptr<FakeSchedulerClient> client_; |
scoped_ptr<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); |
+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, SendBeginFramesToChildren) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- scheduler_settings.use_external_begin_frame_source = true; |
- scheduler_settings.forward_begin_frames_to_children = true; |
- |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
- |
- 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(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()); |
+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(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- scheduler_settings.use_external_begin_frame_source = true; |
- scheduler_settings.forward_begin_frames_to_children = true; |
+TEST_F(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) { |
+ scheduler_settings_.use_external_begin_frame_source = true; |
+ scheduler_settings_.forward_begin_frames_to_children = true; |
+ SetUpScheduler(true); |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ EXPECT_FALSE(client_->needs_begin_frames()); |
+ scheduler_->SetChildrenNeedBeginFrames(true); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
+ EXPECT_TRUE(client_->needs_begin_frames()); |
- 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(client.AdvanceFrame()); |
- EXPECT_TRUE(client.begin_frame_is_sent_to_children()); |
+ client_->Reset(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_TRUE(client_->begin_frame_is_sent_to_children()); |
} |
-TEST(SchedulerTest, RequestCommit) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- scheduler_settings.use_external_begin_frame_source = true; |
- |
- 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(); |
+ 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(); |
+ 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(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ client_->Reset(); |
+ |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ client_->Reset(); |
+} |
- client.task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
- client.Reset(); |
+TEST_F(SchedulerTest, RequestCommitAfterSetDeferCommit) { |
+ scheduler_settings_.use_external_begin_frame_source = true; |
+ SetUpScheduler(true); |
+ |
+ scheduler_->SetCanStart(); |
+ scheduler_->SetVisible(true); |
+ scheduler_->SetCanDraw(true); |
+ |
+ scheduler_->SetDeferCommits(true); |
+ |
+ scheduler_->SetNeedsCommit(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
+ |
+ client_->Reset(); |
+ AdvanceFrame(); |
+ // BeginMainFrame is not sent during the defer commit is on. |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+ |
+ client_->Reset(); |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ // There is no posted deadline. |
+ EXPECT_NO_ACTION(client_); |
+ EXPECT_TRUE(client_->needs_begin_frames()); |
+ |
+ client_->Reset(); |
+ scheduler_->SetDeferCommits(false); |
+ EXPECT_NO_ACTION(client_); |
+ |
+ // Start new BeginMainFrame after defer commit is off. |
+ client_->Reset(); |
+ AdvanceFrame(); |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
} |
-TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- scheduler_settings.use_external_begin_frame_source = true; |
+TEST_F(SchedulerTest, DeferCommitWithRedraw) { |
+ scheduler_settings_.use_external_begin_frame_source = true; |
+ SetUpScheduler(true); |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ scheduler_->SetCanStart(); |
+ scheduler_->SetVisible(true); |
+ scheduler_->SetCanDraw(true); |
+ |
+ scheduler_->SetDeferCommits(true); |
+ |
+ scheduler_->SetNeedsCommit(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
+ |
+ client_->Reset(); |
+ scheduler_->SetNeedsRedraw(); |
+ EXPECT_NO_ACTION(client_); |
+ |
+ client_->Reset(); |
+ AdvanceFrame(); |
+ // BeginMainFrame is not sent during the defer commit is on. |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
+ |
+ client_->Reset(); |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_); |
+ EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
+ EXPECT_TRUE(client_->needs_begin_frames()); |
+ |
+ client_->Reset(); |
+ AdvanceFrame(); |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+} |
+ |
+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(); |
+ 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(); |
+ 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()); |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_FALSE(client_->needs_begin_frames()); |
+ client_->Reset(); |
} |
class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
@@ -596,86 +690,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(make_scoped_ptr(client).Pass(), true); |
+ client->SetRequestRedrawsInsideDraw(true); |
+ |
+ scheduler_->SetNeedsRedraw(); |
+ EXPECT_TRUE(scheduler_->RedrawPending()); |
+ EXPECT_TRUE(client->needs_begin_frames()); |
+ EXPECT_EQ(0, client->num_draws()); |
+ |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ 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()); |
+ 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()); |
+ 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(make_scoped_ptr(client).Pass(), 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()); |
+ 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()); |
+ 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()); |
+ 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 +802,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(make_scoped_ptr(client).Pass(), 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(); |
+ 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()); |
+ 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()); |
+ 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(make_scoped_ptr(client).Pass(), 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()); |
+ 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()); |
+ 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()); |
+ 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(make_scoped_ptr(client).Pass(), 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()); |
+ 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()); |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_EQ(2, client->num_draws()); |
} |
class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient { |
@@ -834,241 +925,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(make_scoped_ptr(client).Pass(), 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(make_scoped_ptr(client).Pass(), 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 +1182,1168 @@ 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(make_scoped_ptr(client).Pass(), 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()); |
+ 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()); |
+ 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(make_scoped_ptr(client).Pass(), 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, 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()); |
+ 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), |
+ task_runner().DelayToNextTaskTime().InMicroseconds()) |
+ << scheduler_->AsValue()->ToString(); |
+ 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), |
+ task_runner().DelayToNextTaskTime().InMicroseconds()) |
+ << scheduler_->AsValue()->ToString(); |
+ 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, 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ client_->Reset(); |
+ |
+ 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(); |
+ 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(); |
+ 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()); |
+ now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
+ base::TimeDelta::FromMicroseconds(1)); |
+ task_runner().RunUntilTime(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(); |
+ task_runner().RunUntilTime(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; |
+TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) { |
+ 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()); |
+ 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() - |
- BeginFrameArgs::DefaultEstimatedParentDrawTime() + |
- base::TimeDelta::FromMicroseconds(1)); |
+ 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()); |
+ 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(); |
+ 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; |
- |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooLate) { |
+ 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()); |
+ 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)); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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()); |
+ now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() - |
+ base::TimeDelta::FromMicroseconds(1)); |
+ task_runner().RunUntilTime(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 = now_src()->Now(); |
+ task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); |
+ base::TimeTicks after_deadline = 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); |
+ |
+ scheduler_->SetCanStart(); |
+ scheduler_->SetVisible(true); |
+ scheduler_->SetCanDraw(true); |
-TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStarted) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- scheduler_settings.use_external_begin_frame_source = true; |
+ EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_); |
+ client_->Reset(); |
+ scheduler_->DidCreateAndInitializeOutputSurface(); |
+ EXPECT_NO_ACTION(client_); |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ 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(); |
+ 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()); |
+ 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(); |
+ task_runner().RunUntilTime(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(); |
+ 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; |
- |
- CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsPrepareTiles) { |
+ scheduler_settings_.use_external_begin_frame_source = true; |
+ SetUpScheduler(true); |
- scheduler->SetNeedsPrepareTiles(); |
- scheduler->SetNeedsRedraw(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
+ scheduler_->SetNeedsPrepareTiles(); |
+ 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()); |
+ client_->Reset(); |
+ EXPECT_SCOPED(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(); |
+ 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, 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(); |
+ 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(); |
+ 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, 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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 = now_src()->Now(); |
+ EXPECT_TRUE( |
+ task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true))); |
+ after_deadline = 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 = now_src()->Now(); |
+ EXPECT_TRUE( |
+ task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true))); |
+ after_deadline = 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 = now_src()->Now(); |
+ EXPECT_TRUE( |
+ task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true))); |
+ after_deadline = 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); |
+ task_runner().SetAutoAdvanceNowToPendingTasks(false); |
// Deadline task is pending |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.task_runner().RunPendingTasks(); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ 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(); |
+ now_src()->AdvanceNowMicroseconds(15000); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ 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); |
+ task_runner().SetAutoAdvanceNowToPendingTasks(false); |
// Deadline task is pending |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.task_runner().RunPendingTasks(); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ 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(); |
+ 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(); |
+ 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(); |
+ 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() |
- .RunPendingTasks(); // Run posted deadline and BeginFrame. |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
+ task_runner().RunPendingTasks(); // Run posted deadline and BeginFrame. |
+ 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(); |
+ |
+ 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(); |
+ |
+ task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 2); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ client_->Reset(); |
+ |
+ 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(); |
+ 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(); |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
} |
} // namespace |