Chromium Code Reviews| Index: cc/scheduler/scheduler_unittest.cc |
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
| index 1049445fa7f0a331cdac6d95d20dd391e2679ca3..cbaf2768d5c7db9ef0457099ea874e28dcba81a4 100644 |
| --- a/cc/scheduler/scheduler_unittest.cc |
| +++ b/cc/scheduler/scheduler_unittest.cc |
| @@ -72,6 +72,7 @@ class FakeSchedulerClient : public SchedulerClient, |
| swap_will_happen_if_draw_happens_ = true; |
| num_draws_ = 0; |
| last_begin_main_frame_args_ = BeginFrameArgs(); |
| + last_begin_frame_ack_ = BeginFrameAck(); |
| } |
| void set_scheduler(TestScheduler* scheduler) { scheduler_ = scheduler; } |
| @@ -123,7 +124,9 @@ class FakeSchedulerClient : public SchedulerClient, |
| EXPECT_TRUE(inside_begin_impl_frame_); |
| inside_begin_impl_frame_ = false; |
| } |
| - void DidNotProduceFrame(const BeginFrameAck& ack) override {} |
| + void DidNotProduceFrame(const BeginFrameAck& ack) override { |
| + last_begin_frame_ack_ = ack; |
| + } |
| void ScheduledActionSendBeginMainFrame(const BeginFrameArgs& args) override { |
| PushAction("ScheduledActionSendBeginMainFrame"); |
| @@ -134,6 +137,8 @@ class FakeSchedulerClient : public SchedulerClient, |
| return last_begin_main_frame_args_; |
| } |
| + const BeginFrameAck& last_begin_frame_ack() { return last_begin_frame_ack_; } |
| + |
| DrawResult ScheduledActionDrawIfPossible() override { |
| PushAction("ScheduledActionDrawIfPossible"); |
| num_draws_++; |
| @@ -142,6 +147,7 @@ class FakeSchedulerClient : public SchedulerClient, |
| bool swap_will_happen = |
| draw_will_happen_ && swap_will_happen_if_draw_happens_; |
| if (swap_will_happen) { |
| + last_begin_frame_ack_ = scheduler_->CurrentBeginFrameAckForActiveTree(); |
| scheduler_->DidSubmitCompositorFrame(); |
| if (automatic_ack_) |
| @@ -151,6 +157,7 @@ class FakeSchedulerClient : public SchedulerClient, |
| } |
| DrawResult ScheduledActionDrawForced() override { |
| PushAction("ScheduledActionDrawForced"); |
| + last_begin_frame_ack_ = scheduler_->CurrentBeginFrameAckForActiveTree(); |
| return DRAW_SUCCESS; |
| } |
| void ScheduledActionCommit() override { |
| @@ -228,6 +235,7 @@ class FakeSchedulerClient : public SchedulerClient, |
| bool automatic_ack_; |
| int num_draws_; |
| BeginFrameArgs last_begin_main_frame_args_; |
| + BeginFrameAck last_begin_frame_ack_; |
| base::TimeTicks posted_begin_impl_frame_deadline_; |
| std::vector<const char*> actions_; |
| std::vector<std::unique_ptr<base::trace_event::ConvertableToTraceFormat>> |
| @@ -389,6 +397,20 @@ class SchedulerTest : public testing::Test { |
| } |
| EXPECT_FALSE(scheduler_->begin_frames_expected()); |
| + |
| + if (scheduler_->begin_frame_source() == |
| + fake_external_begin_frame_source_.get()) { |
| + // Expect the last BeginFrameAck to be for last BeginFrame, which didn't |
| + // cause damage. |
| + uint64_t last_begin_frame_number = |
| + fake_external_begin_frame_source_->next_begin_frame_number() - 1; |
| + bool has_damage = false; |
| + EXPECT_EQ(BeginFrameAck(fake_external_begin_frame_source_->source_id(), |
| + last_begin_frame_number, last_begin_frame_number, |
| + has_damage), |
| + client_->last_begin_frame_ack()); |
| + } |
| + |
| client_->Reset(); |
| } |
| @@ -2940,16 +2962,9 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) { |
| scheduler_settings_.using_synchronous_renderer_compositor = true; |
| SetUpScheduler(EXTERNAL_BFS); |
| - // Expect the last ack to be for last BeginFrame, which didn't cause damage. |
| - uint64_t last_begin_frame_number = |
| + // The last BeginFrame was confirmed. |
| + uint64_t latest_confirmed_sequence_number = |
| fake_external_begin_frame_source_->next_begin_frame_number() - 1; |
| - uint64_t latest_confirmed_sequence_number = last_begin_frame_number; |
| - bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(fake_external_begin_frame_source_->source_id(), |
| - last_begin_frame_number, latest_confirmed_sequence_number, |
| - has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| scheduler_->SetNeedsBeginMainFrame(); |
| EXPECT_SINGLE_ACTION("AddObserver(this)", client_); |
| @@ -2960,13 +2975,12 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) { |
| EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| - has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + bool has_damage = false; |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks()); |
| EXPECT_NO_ACTION(client_); |
| @@ -2975,13 +2989,12 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) { |
| args = SendNextBeginFrame(); |
| EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| scheduler_->NotifyReadyToCommit(); |
| EXPECT_ACTION("ScheduledActionCommit", client_, 0, 1); |
| @@ -2997,17 +3010,16 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) { |
| EXPECT_ACTION("ScheduledActionInvalidateCompositorFrameSink", client_, 1, 3); |
| EXPECT_ACTION("ScheduledActionBeginMainFrameNotExpectedUntil", client_, 2, 3); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| // Not confirmed yet and no damage, since not drawn yet. |
| // TODO(eseckler): In the future, |has_damage = false| will prevent us from |
| // filtering this ack (in CompositorExternalBeginFrameSource) and instead |
| // forwarding the one attached to the later submitted CompositorFrame. |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| // Android onDraw. |
| scheduler_->SetNeedsRedraw(); |
| @@ -3024,14 +3036,13 @@ TEST_F(SchedulerTest, SynchronousCompositorCommitAndVerifyBeginFrameAcks) { |
| EXPECT_ACTION("RemoveObserver(this)", client_, 2, 4); |
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 3, 4); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| latest_confirmed_sequence_number = args.sequence_number; |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, SynchronousCompositorDoubleCommitWithoutDraw) { |
| @@ -3465,16 +3476,9 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) { |
| // Sets up scheduler and sends two BeginFrames, both finished. |
| SetUpScheduler(EXTERNAL_BFS); |
| - // Expect the last ack to be for last BeginFrame, which didn't cause damage. |
| - uint64_t last_begin_frame_number = |
| + // The last BeginFrame was confirmed. |
| + uint64_t latest_confirmed_sequence_number = |
| fake_external_begin_frame_source_->next_begin_frame_number() - 1; |
| - uint64_t latest_confirmed_sequence_number = last_begin_frame_number; |
| - bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(fake_external_begin_frame_source_->source_id(), |
| - last_begin_frame_number, latest_confirmed_sequence_number, |
| - has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| // Run a successful redraw and verify that a new ack is sent. |
| scheduler_->SetNeedsRedraw(); |
| @@ -3492,15 +3496,14 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) { |
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Successful draw caused damage. |
| latest_confirmed_sequence_number = args.sequence_number; |
| - has_damage = true; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + bool has_damage = true; |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
|
sunnyps
2017/05/24 02:38:25
nit: it's fine to omit the client_->Reset at the e
Eric Seckler
2017/05/24 09:00:40
I moved this from above these checks. Should it no
|
| // Request another redraw, but fail it. Verify that a new ack is sent, but |
| // that its |latest_confirmed_sequence_number| didn't change. |
| @@ -3522,14 +3525,13 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) { |
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Failed draw: no damage and unconfirmed frame. |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) { |
| @@ -3555,15 +3557,14 @@ TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) { |
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Successful draw caused damage. |
| uint64_t latest_confirmed_sequence_number = args.sequence_number; |
| bool has_damage = true; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| // Request another redraw that will be skipped because the swap ack is still |
| // missing. Verify that a new BeginFrameAck is sent. |
| @@ -3575,14 +3576,13 @@ TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) { |
| EXPECT_NO_ACTION(client_); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Skipped draw: no damage and unconfirmed frame. |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) { |
| @@ -3610,17 +3610,16 @@ TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) { |
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_FALSE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Latest ack should be for the dropped BeginFrame. Since we don't have |
| // further updates, its |latest_confirmed_sequence_number| should be for the |
| // dropped BeginFrame, too. |
| uint64_t latest_confirmed_sequence_number = args.sequence_number; |
| bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, BeginFrameAckForDroppedBeginFrame) { |
| @@ -3651,27 +3650,25 @@ TEST_F(SchedulerTest, BeginFrameAckForDroppedBeginFrame) { |
| // not expecting any BeginFrames. |
| BeginFrameArgs second_args = SendNextBeginFrame(); |
| EXPECT_NO_ACTION(client_); |
| - client_->Reset(); |
| // Latest ack should be for the dropped (and unconfirmed) BeginFrame. |
| bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(second_args.source_id, second_args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(second_args.source_id, second_args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| task_runner().RunPendingTasks(); // Run deadline of prior BeginFrame. |
| EXPECT_ACTION("RemoveObserver(this)", client_, 0, 2); |
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
| - client_->Reset(); |
| // We'd expect an out-of-order ack for the prior BeginFrame, confirming it. |
| latest_confirmed_sequence_number = first_args.sequence_number; |
| has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(first_args.source_id, first_args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(first_args.source_id, first_args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) { |
| @@ -3695,15 +3692,14 @@ TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) { |
| EXPECT_NO_ACTION(client_); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| // Latest ack should be for the missed BeginFrame that was too late: no damage |
| // and unconfirmed frame. |
| bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) { |
| @@ -3729,15 +3725,14 @@ TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) { |
| EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| EXPECT_TRUE(scheduler_->begin_frames_expected()); |
| - client_->Reset(); |
| // Successful draw caused damage. |
| uint64_t latest_confirmed_sequence_number = args.sequence_number; |
| bool has_damage = true; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| TEST_F(SchedulerTest, |
| @@ -3759,7 +3754,6 @@ TEST_F(SchedulerTest, |
| EXPECT_NO_ACTION(client_); |
| EXPECT_FALSE(client_->IsInsideBeginImplFrame()); |
| - client_->Reset(); |
| // Latest ack should be for the missed BeginFrame that was too late: no damage |
| // and unconfirmed frame. Because the source_id changed, the |
| @@ -3767,10 +3761,10 @@ TEST_F(SchedulerTest, |
| uint64_t latest_confirmed_sequence_number = |
| BeginFrameArgs::kInvalidFrameNumber; |
| bool has_damage = false; |
| - EXPECT_EQ( |
| - BeginFrameAck(args.source_id, args.sequence_number, |
| - latest_confirmed_sequence_number, has_damage), |
| - fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get())); |
| + EXPECT_EQ(BeginFrameAck(args.source_id, args.sequence_number, |
| + latest_confirmed_sequence_number, has_damage), |
| + client_->last_begin_frame_ack()); |
| + client_->Reset(); |
| } |
| } // namespace |