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

Unified Diff: cc/scheduler/scheduler_unittest.cc

Issue 2418593002: Fix scheduler bug in skipping main frames (Closed)
Patch Set: Rename expected draw function after danakj changes Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/scheduler/scheduler.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/scheduler/scheduler_unittest.cc
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 14796e608f4c0589cce4c0e8f23d991d860f5600..ace12c64bdc1c3a2d44030f153e2e4c3868f8958 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -415,6 +415,7 @@ class SchedulerTest : public testing::Test {
return fake_external_begin_frame_source_.get();
}
+ void AdvanceAndMissOneFrame();
void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame);
void ImplFrameSkippedAfterLateAck(bool receive_ack_before_deadline);
void ImplFrameNotSkippedAfterLateAck();
@@ -1282,8 +1283,7 @@ TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostCompositorFrameSink) {
EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
}
-void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
- bool expect_send_begin_main_frame) {
+void SchedulerTest::AdvanceAndMissOneFrame() {
// Impl thread hits deadline before commit finishes.
scheduler_->SetNeedsBeginMainFrame();
EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
@@ -1300,8 +1300,13 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
EXPECT_ACTION("ScheduledActionCommit", client_, 3, 5);
EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 4, 5);
EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
-
client_->Reset();
+}
+
+void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
+ bool expect_send_begin_main_frame) {
+ AdvanceAndMissOneFrame();
+
scheduler_->SetNeedsBeginMainFrame();
EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
EXPECT_SCOPED(AdvanceFrame());
@@ -1314,6 +1319,33 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
client_->HasAction("ScheduledActionSendBeginMainFrame"));
}
+TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateBeginFrame) {
+ // If a begin frame is delivered extremely late (because the browser has
+ // some contention), make sure that the main frame is not skipped even
+ // if it can activate before the deadline.
+ SetUpScheduler(EXTERNAL_BFS);
+ fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
+
+ AdvanceAndMissOneFrame();
+ EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
+ scheduler_->SetNeedsBeginMainFrame();
+
+ // Advance frame and create a begin frame.
+ now_src_->Advance(BeginFrameArgs::DefaultInterval());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
+
+ // Deliver this begin frame super late.
+ now_src_->Advance(BeginFrameArgs::DefaultInterval() * 100);
+ fake_external_begin_frame_source_->TestOnBeginFrame(args);
+
+ task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
+ EXPECT_EQ(true, scheduler_->MainThreadMissedLastDeadline());
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 3);
+ EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
+}
+
TEST_F(SchedulerTest, MainFrameSkippedAfterLateCommit) {
SetUpScheduler(EXTERNAL_BFS);
fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
« no previous file with comments | « cc/scheduler/scheduler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698