Chromium Code Reviews| Index: cc/scheduler/scheduler_unittest.cc |
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
| index 256acd5bd8f6a211637b8d72b24e295485d0db86..a93eb2a7cf0d946c13dc175c9016602609e49be5 100644 |
| --- a/cc/scheduler/scheduler_unittest.cc |
| +++ b/cc/scheduler/scheduler_unittest.cc |
| @@ -10,6 +10,8 @@ |
| #include "base/logging.h" |
| #include "base/memory/scoped_vector.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/power_monitor/power_monitor.h" |
| +#include "base/power_monitor/power_monitor_source.h" |
| #include "base/run_loop.h" |
| #include "base/time/time.h" |
| #include "cc/test/begin_frame_args_test.h" |
| @@ -90,13 +92,17 @@ class FakeSchedulerClient : public SchedulerClient { |
| scheduler_->settings().throttle_frame_production; |
| if (external_begin_frame) { |
| - scheduler_->BeginFrame(CreateBeginFrameArgsForTesting(now_src_)); |
| + SendBeginFrame(); |
| } |
| EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false))); |
| EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
| } |
| + void SendBeginFrame() { |
|
brianderson
2014/09/12 22:05:27
Can you call this AdvanceFrameSynchronousDeadline
sunnyps
2014/09/15 21:52:48
Done.
|
| + scheduler_->BeginFrame(CreateBeginFrameArgsForTesting(now_src_)); |
| + } |
| + |
| OrderedSimpleTaskRunner& task_runner() { return scheduler_->task_runner(); } |
| TestNowSource* now_src() { return now_src_.get(); } |
| @@ -1909,5 +1915,90 @@ TEST(SchedulerTest, |
| EXPECT_FALSE(scheduler->IsSyntheticBeginFrameSourceActive()); |
| } |
| +class FakePowerMonitorSource : public base::PowerMonitorSource { |
|
brianderson
2014/09/12 22:05:27
+bajones to make sure this FakePowerMonitorSource
sunnyps
2014/09/15 21:52:48
Done.
|
| + public: |
| + FakePowerMonitorSource() {} |
| + virtual ~FakePowerMonitorSource() {} |
| + void GeneratePowerStateEvent(bool on_battery_power) { |
| + on_battery_power_impl_ = on_battery_power; |
| + ProcessPowerEvent(POWER_STATE_EVENT); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + } |
| + virtual bool IsOnBatteryPowerImpl() OVERRIDE { |
| + return on_battery_power_impl_; |
| + } |
| + |
| + private: |
| + bool on_battery_power_impl_; |
| +}; |
| + |
| +TEST(SchedulerTest, HighLatencyModeOnBattery) { |
|
brianderson
2014/09/12 22:05:27
This test looks good, however please create a vers
sunnyps
2014/09/15 21:52:48
I thought we decided to remove that test because r
|
| + // Create the power monitor before creating the scheduler |
| + FakePowerMonitorSource* power_monitor_source = new FakePowerMonitorSource; |
| + base::PowerMonitor power_monitor( |
| + (scoped_ptr<base::PowerMonitorSource>(power_monitor_source))); |
| + |
| + FakeSchedulerClient client; |
| + SchedulerSettings settings; |
| + settings.high_latency_mode_on_battery = true; |
| + TestScheduler* scheduler = client.CreateScheduler(settings); |
| + |
| + scheduler->SetCanStart(); |
| + scheduler->SetVisible(true); |
| + scheduler->SetCanDraw(true); |
| + |
| + EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| + InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| + |
| + // On non-battery power |
| + EXPECT_FALSE(power_monitor.IsOnBatteryPower()); |
| + |
| + client.Reset(); |
| + scheduler->SetNeedsCommit(); |
| + EXPECT_TRUE(client.needs_begin_frame()); |
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
| + client.Reset(); |
| + |
| + client.SendBeginFrame(); |
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| + // The scheduler schedules a BeginMainFrame because it NeedsCommit |
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| + // The scheduler waits for the renderer |
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client.Reset(); |
| + |
| + client.task_runner().RunPendingTasks(); // Run posted deadline. |
| + EXPECT_NO_ACTION(client); |
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + EXPECT_TRUE(client.needs_begin_frame()); |
| + client.Reset(); |
| + |
| + // Switch to battery power |
| + power_monitor_source->GeneratePowerStateEvent(true); |
| + EXPECT_TRUE(power_monitor.IsOnBatteryPower()); |
| + |
| + client.SendBeginFrame(); |
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| + // The scheduler does not post a deadline task, neither does it schedule |
| + // another BeginMainFrame because it's still waiting for the last one |
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| + client.Reset(); |
| + |
| + // Do nothing until the next BeginFrame is called |
| + EXPECT_NO_ACTION(client); |
| + EXPECT_TRUE(client.needs_begin_frame()); |
| + client.Reset(); |
| + |
| + // Switch to non-battery power |
| + power_monitor_source->GeneratePowerStateEvent(false); |
| + EXPECT_FALSE(power_monitor.IsOnBatteryPower()); |
| + |
| + client.SendBeginFrame(); |
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| + // The scheduler waits for the renderer |
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| + client.Reset(); |
| +} |
| + |
| } // namespace |
| } // namespace cc |