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

Side by Side Diff: cc/scheduler/scheduler_unittest.cc

Issue 2632563003: [cc] Calculate the correct latest_confirmed_sequence_number in cc::Scheduler. (Closed)
Patch Set: Move CompositorFrame freshness updates + address other comments. Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/scheduler/scheduler.h" 5 #include "cc/scheduler/scheduler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 UNTHROTTLED_BFS, 231 UNTHROTTLED_BFS,
232 THROTTLED_BFS, 232 THROTTLED_BFS,
233 }; 233 };
234 234
235 class SchedulerTest : public testing::Test { 235 class SchedulerTest : public testing::Test {
236 public: 236 public:
237 SchedulerTest() 237 SchedulerTest()
238 : now_src_(new base::SimpleTestTickClock()), 238 : now_src_(new base::SimpleTestTickClock()),
239 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), 239 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)),
240 fake_external_begin_frame_source_(nullptr), 240 fake_external_begin_frame_source_(nullptr),
241 fake_compositor_timing_history_(nullptr), 241 fake_compositor_timing_history_(nullptr) {
242 next_begin_frame_number_(BeginFrameArgs::kStartingFrameNumber) {
243 now_src_->Advance(base::TimeDelta::FromMicroseconds(10000)); 242 now_src_->Advance(base::TimeDelta::FromMicroseconds(10000));
244 // A bunch of tests require NowTicks() 243 // A bunch of tests require NowTicks()
245 // to be > BeginFrameArgs::DefaultInterval() 244 // to be > BeginFrameArgs::DefaultInterval()
246 now_src_->Advance(base::TimeDelta::FromMilliseconds(100)); 245 now_src_->Advance(base::TimeDelta::FromMilliseconds(100));
247 // Fail if we need to run 100 tasks in a row. 246 // Fail if we need to run 100 tasks in a row.
248 task_runner_->SetRunTaskLimit(100); 247 task_runner_->SetRunTaskLimit(100);
249 } 248 }
250 249
251 ~SchedulerTest() override {} 250 ~SchedulerTest() override {}
252 251
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 task_runner_->RunTasksWhile(client_->FrameHasNotAdvancedCallback()); 400 task_runner_->RunTasksWhile(client_->FrameHasNotAdvancedCallback());
402 } 401 }
403 } 402 }
404 403
405 BeginFrameArgs SendNextBeginFrame() { 404 BeginFrameArgs SendNextBeginFrame() {
406 DCHECK_EQ(scheduler_->begin_frame_source(), 405 DCHECK_EQ(scheduler_->begin_frame_source(),
407 fake_external_begin_frame_source_.get()); 406 fake_external_begin_frame_source_.get());
408 // Creep the time forward so that any BeginFrameArgs is not equal to the 407 // Creep the time forward so that any BeginFrameArgs is not equal to the
409 // last one otherwise we violate the BeginFrameSource contract. 408 // last one otherwise we violate the BeginFrameSource contract.
410 now_src_->Advance(BeginFrameArgs::DefaultInterval()); 409 now_src_->Advance(BeginFrameArgs::DefaultInterval());
411 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 410 BeginFrameArgs args =
412 BEGINFRAME_FROM_HERE, fake_external_begin_frame_source_->source_id(), 411 fake_external_begin_frame_source_->CreateBeginFrameArgs(
413 next_begin_frame_number_, now_src()); 412 BEGINFRAME_FROM_HERE, now_src());
414 next_begin_frame_number_++;
415 fake_external_begin_frame_source_->TestOnBeginFrame(args); 413 fake_external_begin_frame_source_->TestOnBeginFrame(args);
416 return args; 414 return args;
417 } 415 }
418 416
419 FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { 417 FakeExternalBeginFrameSource* fake_external_begin_frame_source() const {
420 return fake_external_begin_frame_source_.get(); 418 return fake_external_begin_frame_source_.get();
421 } 419 }
422 420
423 void AdvanceAndMissOneFrame(); 421 void AdvanceAndMissOneFrame();
424 void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame); 422 void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame);
425 void ImplFrameSkippedAfterLateAck(bool receive_ack_before_deadline); 423 void ImplFrameSkippedAfterLateAck(bool receive_ack_before_deadline);
426 void ImplFrameNotSkippedAfterLateAck(); 424 void ImplFrameNotSkippedAfterLateAck();
427 void BeginFramesNotFromClient(BeginFrameSourceType bfs_type); 425 void BeginFramesNotFromClient(BeginFrameSourceType bfs_type);
428 void BeginFramesNotFromClient_IsDrawThrottled(BeginFrameSourceType bfs_type); 426 void BeginFramesNotFromClient_IsDrawThrottled(BeginFrameSourceType bfs_type);
429 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, 427 bool BeginMainFrameOnCriticalPath(TreePriority tree_priority,
430 ScrollHandlerState scroll_handler_state, 428 ScrollHandlerState scroll_handler_state,
431 base::TimeDelta durations); 429 base::TimeDelta durations);
432 430
433 std::unique_ptr<base::SimpleTestTickClock> now_src_; 431 std::unique_ptr<base::SimpleTestTickClock> now_src_;
434 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; 432 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
435 std::unique_ptr<FakeExternalBeginFrameSource> 433 std::unique_ptr<FakeExternalBeginFrameSource>
436 fake_external_begin_frame_source_; 434 fake_external_begin_frame_source_;
437 std::unique_ptr<SyntheticBeginFrameSource> synthetic_frame_source_; 435 std::unique_ptr<SyntheticBeginFrameSource> synthetic_frame_source_;
438 std::unique_ptr<SyntheticBeginFrameSource> unthrottled_frame_source_; 436 std::unique_ptr<SyntheticBeginFrameSource> unthrottled_frame_source_;
439 SchedulerSettings scheduler_settings_; 437 SchedulerSettings scheduler_settings_;
440 std::unique_ptr<FakeSchedulerClient> client_; 438 std::unique_ptr<FakeSchedulerClient> client_;
441 std::unique_ptr<TestScheduler> scheduler_; 439 std::unique_ptr<TestScheduler> scheduler_;
442 FakeCompositorTimingHistory* fake_compositor_timing_history_; 440 FakeCompositorTimingHistory* fake_compositor_timing_history_;
443 uint64_t next_begin_frame_number_;
444 }; 441 };
445 442
446 TEST_F(SchedulerTest, InitializeCompositorFrameSinkDoesNotBeginImplFrame) { 443 TEST_F(SchedulerTest, InitializeCompositorFrameSinkDoesNotBeginImplFrame) {
447 SetUpSchedulerWithNoCompositorFrameSink(EXTERNAL_BFS); 444 SetUpSchedulerWithNoCompositorFrameSink(EXTERNAL_BFS);
448 scheduler_->SetVisible(true); 445 scheduler_->SetVisible(true);
449 scheduler_->SetCanDraw(true); 446 scheduler_->SetCanDraw(true);
450 447
451 EXPECT_SINGLE_ACTION("ScheduledActionBeginCompositorFrameSinkCreation", 448 EXPECT_SINGLE_ACTION("ScheduledActionBeginCompositorFrameSinkCreation",
452 client_); 449 client_);
453 client_->Reset(); 450 client_->Reset();
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 // if it can activate before the deadline. 1328 // if it can activate before the deadline.
1332 SetUpScheduler(EXTERNAL_BFS); 1329 SetUpScheduler(EXTERNAL_BFS);
1333 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); 1330 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
1334 1331
1335 AdvanceAndMissOneFrame(); 1332 AdvanceAndMissOneFrame();
1336 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); 1333 EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
1337 scheduler_->SetNeedsBeginMainFrame(); 1334 scheduler_->SetNeedsBeginMainFrame();
1338 1335
1339 // Advance frame and create a begin frame. 1336 // Advance frame and create a begin frame.
1340 now_src_->Advance(BeginFrameArgs::DefaultInterval()); 1337 now_src_->Advance(BeginFrameArgs::DefaultInterval());
1341 BeginFrameArgs args = CreateBeginFrameArgsForTesting( 1338 BeginFrameArgs args = fake_external_begin_frame_source_->CreateBeginFrameArgs(
1342 BEGINFRAME_FROM_HERE, fake_external_begin_frame_source_->source_id(), 1339 BEGINFRAME_FROM_HERE, now_src());
1343 next_begin_frame_number_, now_src());
1344 next_begin_frame_number_++;
1345 1340
1346 // Deliver this begin frame super late. 1341 // Deliver this begin frame super late.
1347 now_src_->Advance(BeginFrameArgs::DefaultInterval() * 100); 1342 now_src_->Advance(BeginFrameArgs::DefaultInterval() * 100);
1348 fake_external_begin_frame_source_->TestOnBeginFrame(args); 1343 fake_external_begin_frame_source_->TestOnBeginFrame(args);
1349 1344
1350 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); 1345 task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
1351 EXPECT_EQ(true, scheduler_->MainThreadMissedLastDeadline()); 1346 EXPECT_EQ(true, scheduler_->MainThreadMissedLastDeadline());
1352 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3); 1347 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
1353 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 3); 1348 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 3);
1354 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3); 1349 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 2, 3);
(...skipping 1894 matching lines...) Expand 10 before | Expand all | Expand 10 after
3249 SMOOTHNESS_TAKES_PRIORITY, 3244 SMOOTHNESS_TAKES_PRIORITY,
3250 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration)); 3245 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration));
3251 } 3246 }
3252 3247
3253 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { 3248 TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) {
3254 EXPECT_FALSE(BeginMainFrameOnCriticalPath( 3249 EXPECT_FALSE(BeginMainFrameOnCriticalPath(
3255 SMOOTHNESS_TAKES_PRIORITY, 3250 SMOOTHNESS_TAKES_PRIORITY,
3256 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); 3251 ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration));
3257 } 3252 }
3258 3253
3254 TEST_F(SchedulerTest, BeginFrameAckForFinishedImplFrame) {
3255 // Sets up scheduler and sends two BeginFrames, both finished.
3256 SetUpScheduler(EXTERNAL_BFS);
3257
3258 // Expect the last ack to be for last BeginFrame, which didn't cause damage.
3259 uint64_t last_begin_frame_number =
3260 fake_external_begin_frame_source_->next_begin_frame_number() - 1;
3261 uint64_t latest_confirmed_sequence_number = last_begin_frame_number;
3262 bool has_damage = false;
3263 EXPECT_EQ(
3264 BeginFrameAck(fake_external_begin_frame_source_->source_id(),
3265 last_begin_frame_number, latest_confirmed_sequence_number,
3266 0, has_damage),
3267 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3268
3269 // Run a successful redraw and verify that a new ack is sent.
3270 scheduler_->SetNeedsRedraw();
3271 client_->Reset();
3272
3273 BeginFrameArgs args = SendNextBeginFrame();
3274 EXPECT_LT(latest_confirmed_sequence_number, args.sequence_number);
3275 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3276 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3277 EXPECT_TRUE(scheduler_->begin_frames_expected());
3278 client_->Reset();
3279
3280 task_runner().RunPendingTasks(); // Run posted deadline.
3281 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3282 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3283 EXPECT_TRUE(scheduler_->begin_frames_expected());
3284 client_->Reset();
3285
3286 // Successful draw caused damage.
3287 latest_confirmed_sequence_number = args.sequence_number;
3288 has_damage = true;
3289 EXPECT_EQ(
3290 BeginFrameAck(args.source_id, args.sequence_number,
3291 latest_confirmed_sequence_number, 0, has_damage),
3292 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3293
3294 // Request another redraw, but fail it. Verify that a new ack is sent, but
3295 // that its |latest_confirmed_sequence_number| didn't change.
3296 scheduler_->SetNeedsRedraw();
3297 client_->Reset();
3298
3299 args = SendNextBeginFrame();
3300 EXPECT_LT(latest_confirmed_sequence_number, args.sequence_number);
3301 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3302 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3303 EXPECT_TRUE(scheduler_->begin_frames_expected());
3304 client_->Reset();
3305
3306 client_->SetSwapWillHappenIfDrawHappens(false);
3307 task_runner().RunPendingTasks(); // Run posted deadline.
3308 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3309 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3310 EXPECT_TRUE(scheduler_->begin_frames_expected());
3311 client_->Reset();
3312
3313 // Failed draw: no damage and unconfirmed frame.
3314 has_damage = false;
3315 EXPECT_EQ(
3316 BeginFrameAck(args.source_id, args.sequence_number,
3317 latest_confirmed_sequence_number, 0, has_damage),
3318 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3319 }
3320
3321 TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) {
3322 SetUpScheduler(EXTERNAL_BFS);
3323
3324 // To get into a high latency state, this test disables automatic swap acks.
3325 client_->SetAutomaticSubmitCompositorFrameAck(false);
3326 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
3327
3328 // Run a successful redraw that submits a compositor frame but doesn't receive
3329 // a swap ack. Verify that a BeginFrameAck is sent for it.
3330 scheduler_->SetNeedsRedraw();
3331 client_->Reset();
3332
3333 BeginFrameArgs args = SendNextBeginFrame();
3334 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3335 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3336 EXPECT_TRUE(scheduler_->begin_frames_expected());
3337 client_->Reset();
3338
3339 task_runner().RunPendingTasks(); // Run posted deadline.
3340 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3341 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3342 EXPECT_TRUE(scheduler_->begin_frames_expected());
3343 client_->Reset();
3344
3345 // Successful draw caused damage.
3346 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3347 bool has_damage = true;
3348 EXPECT_EQ(
3349 BeginFrameAck(args.source_id, args.sequence_number,
3350 latest_confirmed_sequence_number, 0, has_damage),
3351 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3352
3353 // Request another redraw that will be skipped because the swap ack is still
3354 // missing. Verify that a new BeginFrameAck is sent.
3355 scheduler_->SetNeedsRedraw();
3356 client_->Reset();
3357
3358 args = SendNextBeginFrame();
3359 EXPECT_LT(latest_confirmed_sequence_number, args.sequence_number);
3360 EXPECT_NO_ACTION(client_);
3361 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3362 EXPECT_TRUE(scheduler_->begin_frames_expected());
3363 client_->Reset();
3364
3365 // Skipped draw: no damage and unconfirmed frame.
3366 has_damage = false;
3367 EXPECT_EQ(
3368 BeginFrameAck(args.source_id, args.sequence_number,
3369 latest_confirmed_sequence_number, 0, has_damage),
3370 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3371 }
3372
3373 TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) {
3374 SetUpScheduler(EXTERNAL_BFS);
3375
3376 // Request tile preparation to schedule a proactive BeginFrame.
3377 scheduler_->SetNeedsPrepareTiles();
3378 client_->Reset();
3379
3380 BeginFrameArgs args = SendNextBeginFrame();
3381 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3382 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3383 // Until tiles were prepared, further proactive BeginFrames are expected.
3384 EXPECT_TRUE(scheduler_->begin_frames_expected());
3385 client_->Reset();
3386
3387 // Send the next BeginFrame before the previous one's deadline was executed.
3388 // This should trigger the previous BeginFrame's deadline synchronously,
3389 // during which tiles will be prepared. As a result of that, no further
3390 // BeginFrames will be needed, and the new BeginFrame should be dropped.
3391 args = SendNextBeginFrame();
3392 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 3);
3393 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
3394 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
3395 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3396 EXPECT_FALSE(scheduler_->begin_frames_expected());
3397 client_->Reset();
3398
3399 // Latest ack should be for the dropped BeginFrame. Since we don't have
3400 // further updates, its |latest_confirmed_sequence_number| should be for the
3401 // dropped BeginFrame, too.
3402 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3403 bool has_damage = false;
3404 EXPECT_EQ(
3405 BeginFrameAck(args.source_id, args.sequence_number,
3406 latest_confirmed_sequence_number, 0, has_damage),
3407 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3408 }
3409
3410 TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) {
3411 SetUpScheduler(EXTERNAL_BFS);
3412
3413 // Last confirmed frame was last BeginFrame.
3414 uint64_t latest_confirmed_sequence_number =
3415 fake_external_begin_frame_source_->next_begin_frame_number() - 1;
3416
3417 scheduler_->SetNeedsRedraw();
3418 client_->Reset();
3419
3420 // Send a missed BeginFrame with a passed deadline.
3421 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3422 BeginFrameArgs args = fake_external_begin_frame_source_->CreateBeginFrameArgs(
3423 BEGINFRAME_FROM_HERE, now_src());
3424 args.type = BeginFrameArgs::MISSED;
3425 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3426 EXPECT_GT(now_src_->NowTicks(), args.deadline);
3427 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3428
3429 EXPECT_NO_ACTION(client_);
3430 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3431 client_->Reset();
3432
3433 // Latest ack should be for the missed BeginFrame that was too late: no damage
3434 // and unconfirmed frame.
3435 bool has_damage = false;
3436 EXPECT_EQ(
3437 BeginFrameAck(args.source_id, args.sequence_number,
3438 latest_confirmed_sequence_number, 0, has_damage),
3439 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3440 }
3441
3442 TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) {
3443 SetUpScheduler(EXTERNAL_BFS);
3444
3445 scheduler_->SetNeedsRedraw();
3446 client_->Reset();
3447
3448 // Send a BeginFrame with a different source_id.
3449 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3450 uint32_t source_id = fake_external_begin_frame_source_->source_id() + 1;
3451 BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
3452 source_id, 1, now_src());
3453 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3454
3455 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3456 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3457 EXPECT_TRUE(scheduler_->begin_frames_expected());
3458 client_->Reset();
3459
3460 task_runner().RunPendingTasks(); // Run posted deadline.
3461 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3462 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3463 EXPECT_TRUE(scheduler_->begin_frames_expected());
3464 client_->Reset();
3465
3466 // Successful draw caused damage.
3467 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3468 bool has_damage = true;
3469 EXPECT_EQ(
3470 BeginFrameAck(args.source_id, args.sequence_number,
3471 latest_confirmed_sequence_number, 0, has_damage),
3472 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3473 }
3474
3475 TEST_F(SchedulerTest,
3476 BeginFrameAckForLateMissedBeginFrameWithDifferentSourceId) {
3477 SetUpScheduler(EXTERNAL_BFS);
3478
3479 scheduler_->SetNeedsRedraw();
3480 client_->Reset();
3481
3482 // Send a missed BeginFrame with a passed deadline and different source_id.
3483 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3484 uint32_t source_id = fake_external_begin_frame_source_->source_id() + 1;
3485 BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
3486 source_id, 1, now_src());
3487 args.type = BeginFrameArgs::MISSED;
3488 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3489 EXPECT_GT(now_src_->NowTicks(), args.deadline);
3490 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3491
3492 EXPECT_NO_ACTION(client_);
3493 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3494 client_->Reset();
3495
3496 // Latest ack should be for the missed BeginFrame that was too late: no damage
3497 // and unconfirmed frame. Because the source_id changed, the
3498 // |latest_confirmed_sequence_number| should be set to invalid.
3499 uint64_t latest_confirmed_sequence_number =
3500 BeginFrameArgs::kInvalidFrameNumber;
3501 bool has_damage = false;
3502 EXPECT_EQ(
3503 BeginFrameAck(args.source_id, args.sequence_number,
3504 latest_confirmed_sequence_number, 0, has_damage),
3505 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3506 }
3507
3259 } // namespace 3508 } // namespace
3260 } // namespace cc 3509 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698