Index: content/renderer/scheduler/renderer_scheduler_impl_unittest.cc |
diff --git a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc |
index 4a97a0454749f11708d1fdb98d7f81e2202a5354..d4656f5237186494fb7520f3dfcaf57516ad9a76 100644 |
--- a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc |
+++ b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc |
@@ -10,6 +10,8 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using testing::_; |
+ |
namespace content { |
namespace { |
@@ -106,6 +108,11 @@ class RendererSchedulerImplTest : public testing::Test { |
} |
} |
+ void PostUpdatePolicyOnControlRunner(base::TimeDelta delay) { |
+ base::AutoLock lock(scheduler_->incoming_signals_lock_); |
+ scheduler_->PostUpdatePolicyOnControlRunnerLocked(delay); |
+ } |
+ |
protected: |
static base::TimeDelta priority_escalation_after_input_duration() { |
return base::TimeDelta::FromMilliseconds( |
@@ -847,4 +854,67 @@ TEST_F(RendererSchedulerImplTest, InputArrivesAfterBeginFrame) { |
EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
} |
+class MockRendererSchedulerImpl : public RendererSchedulerImpl { |
+ public: |
+ MockRendererSchedulerImpl( |
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) |
+ : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} |
+ |
+ void UpdatePolicy(bool clear_pending_non_delayed_update_policy) override { |
+ update_policy_count_++; |
+ RendererSchedulerImpl::UpdatePolicy( |
+ clear_pending_non_delayed_update_policy); |
+ } |
+ |
+ int update_policy_count_; |
+}; |
+ |
+TEST_F(RendererSchedulerImplTest, OnlyOnePendingNonDelayedUpdatePolicy) { |
+ MockRendererSchedulerImpl* mock_scheduler = |
+ new MockRendererSchedulerImpl(mock_task_runner_); |
+ scheduler_.reset(mock_scheduler); |
+ |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
Sami
2015/03/10 16:19:38
Do we know what triggered the bug in the first pla
alex clarke (OOO till 29th)
2015/03/11 10:59:05
Anything that calls MaybeUpdatePolicy can potentia
|
+ PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
+ |
+ RunUntilIdle(); |
+ |
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
+} |
+ |
+TEST_F(RendererSchedulerImplTest, OnlyOnePendingDelayedUpdatePolicy) { |
+ MockRendererSchedulerImpl* mock_scheduler = |
+ new MockRendererSchedulerImpl(mock_task_runner_); |
+ scheduler_.reset(mock_scheduler); |
+ scheduler_->SetTimeSourceForTesting(clock_); |
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
+ |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1)); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(10)); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(100)); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1000)); |
+ |
+ RunUntilIdle(); |
+ |
+ EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
+} |
+ |
+TEST_F(RendererSchedulerImplTest, |
+ OnePendingDelayedAndOneNonDelayedUpdatePolicy) { |
+ MockRendererSchedulerImpl* mock_scheduler = |
+ new MockRendererSchedulerImpl(mock_task_runner_); |
+ scheduler_.reset(mock_scheduler); |
+ scheduler_->SetTimeSourceForTesting(clock_); |
+ mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
+ |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta()); |
+ PostUpdatePolicyOnControlRunner(base::TimeDelta::FromMilliseconds(1)); |
Sami
2015/03/10 16:19:38
Could you also try this the other way around to ma
alex clarke (OOO till 29th)
2015/03/11 10:59:05
It's now hard to test this directly. If you're ke
|
+ |
+ RunUntilIdle(); |
+ |
+ EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
+} |
+ |
} // namespace content |