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

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: rebase. 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_ACTION("WillBeginImplFrame", client_, 0, 1);
3275 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3276 EXPECT_TRUE(scheduler_->begin_frames_expected());
3277 client_->Reset();
3278
3279 task_runner().RunPendingTasks(); // Run posted deadline.
3280 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3281 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3282 EXPECT_TRUE(scheduler_->begin_frames_expected());
3283 client_->Reset();
3284
3285 // Successful draw caused damage.
3286 latest_confirmed_sequence_number = args.sequence_number;
3287 has_damage = true;
3288 EXPECT_EQ(
3289 BeginFrameAck(args.source_id, args.sequence_number,
3290 latest_confirmed_sequence_number, 0, has_damage),
3291 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3292
3293 // Request another redraw, but fail it. Verify that a new ack is sent, but
3294 // that its |latest_confirmed_sequence_number| didn't change.
3295 scheduler_->SetNeedsRedraw();
3296 client_->Reset();
3297
3298 args = SendNextBeginFrame();
brianderson 2017/02/14 23:58:56 EXPECT_NE(args.sequence_number, latest_confirmed_s
Eric Seckler 2017/02/17 00:07:27 Done, here and in similar places.
3299 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3300 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3301 EXPECT_TRUE(scheduler_->begin_frames_expected());
3302 client_->Reset();
3303
3304 client_->SetSwapWillHappenIfDrawHappens(false);
3305 task_runner().RunPendingTasks(); // Run posted deadline.
3306 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3307 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3308 EXPECT_TRUE(scheduler_->begin_frames_expected());
3309 client_->Reset();
3310
3311 // Failed draw: no damage and unconfirmed frame.
3312 has_damage = false;
3313 EXPECT_EQ(
3314 BeginFrameAck(args.source_id, args.sequence_number,
3315 latest_confirmed_sequence_number, 0, has_damage),
3316 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3317 }
3318
3319 TEST_F(SchedulerTest, BeginFrameAckForSkippedImplFrame) {
3320 SetUpScheduler(EXTERNAL_BFS);
3321
3322 // To get into a high latency state, this test disables automatic swap acks.
3323 client_->SetAutomaticSubmitCompositorFrameAck(false);
3324 fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
3325
3326 // Run a successful redraw that submits a compositor frame but doesn't receive
3327 // a swap ack. Verify that a BeginFrameAck is sent for it.
3328 scheduler_->SetNeedsRedraw();
3329 client_->Reset();
3330
3331 BeginFrameArgs args = SendNextBeginFrame();
3332 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3333 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3334 EXPECT_TRUE(scheduler_->begin_frames_expected());
3335 client_->Reset();
3336
3337 task_runner().RunPendingTasks(); // Run posted deadline.
3338 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3339 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3340 EXPECT_TRUE(scheduler_->begin_frames_expected());
3341 client_->Reset();
3342
3343 // Successful draw caused damage.
3344 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3345 bool has_damage = true;
3346 EXPECT_EQ(
3347 BeginFrameAck(args.source_id, args.sequence_number,
3348 latest_confirmed_sequence_number, 0, has_damage),
3349 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3350
3351 // Request another redraw that will be skipped because the swap ack is still
3352 // missing. Verify that a new BeginFrameAck is sent.
3353 scheduler_->SetNeedsRedraw();
3354 client_->Reset();
3355
3356 args = SendNextBeginFrame();
3357 EXPECT_NO_ACTION(client_);
3358 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3359 EXPECT_TRUE(scheduler_->begin_frames_expected());
3360 client_->Reset();
3361
3362 // Skipped draw: no damage and unconfirmed frame.
3363 has_damage = false;
3364 EXPECT_EQ(
3365 BeginFrameAck(args.source_id, args.sequence_number,
3366 latest_confirmed_sequence_number, 0, has_damage),
3367 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3368 }
3369
3370 TEST_F(SchedulerTest, BeginFrameAckForBeginFrameBeforeLastDeadline) {
3371 SetUpScheduler(EXTERNAL_BFS);
3372
3373 // Request tile preparation to schedule a proactive BeginFrame.
3374 scheduler_->SetNeedsPrepareTiles();
3375 client_->Reset();
3376
3377 BeginFrameArgs args = SendNextBeginFrame();
3378 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3379 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3380 // Until tiles were prepared, further proactive BeginFrames are expected.
3381 EXPECT_TRUE(scheduler_->begin_frames_expected());
3382 client_->Reset();
3383
3384 // Send the next BeginFrame before the previous one's deadline was executed.
3385 // This should trigger the previous BeginFrame's deadline synchronously,
3386 // during which tiles will be prepared. As a result of that, no further
3387 // BeginFrames will be needed, and the new BeginFrame should be dropped.
3388 args = SendNextBeginFrame();
3389 EXPECT_ACTION("ScheduledActionPrepareTiles", client_, 0, 3);
3390 EXPECT_ACTION("RemoveObserver(this)", client_, 1, 3);
3391 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
3392 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3393 EXPECT_FALSE(scheduler_->begin_frames_expected());
3394 client_->Reset();
3395
3396 // Latest ack should be for the dropped BeginFrame. Since we don't have
3397 // further updates, its |latest_confirmed_sequence_number| should be for the
3398 // dropped
3399 // BeginFrame, too.
brianderson 2017/02/14 23:58:56 Comment wrapping could use cleanup here.
Eric Seckler 2017/02/17 00:07:27 Done.
3400 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3401 bool has_damage = false;
3402 EXPECT_EQ(
3403 BeginFrameAck(args.source_id, args.sequence_number,
3404 latest_confirmed_sequence_number, 0, has_damage),
3405 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3406 }
3407
3408 TEST_F(SchedulerTest, BeginFrameAckForLateMissedBeginFrame) {
3409 SetUpScheduler(EXTERNAL_BFS);
3410
3411 // Last confirmed frame was last BeginFrame.
3412 uint64_t latest_confirmed_sequence_number =
3413 fake_external_begin_frame_source_->next_begin_frame_number() - 1;
3414
3415 scheduler_->SetNeedsRedraw();
3416 client_->Reset();
3417
3418 // Send a missed BeginFrame with a passed deadline.
3419 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3420 BeginFrameArgs args = fake_external_begin_frame_source_->CreateBeginFrameArgs(
3421 BEGINFRAME_FROM_HERE, now_src());
3422 args.type = BeginFrameArgs::MISSED;
3423 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3424 EXPECT_GT(now_src_->NowTicks(), args.deadline);
3425 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3426
3427 EXPECT_NO_ACTION(client_);
3428 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3429 client_->Reset();
3430
3431 // Latest ack should be for the missed BeginFrame that was too late: no damage
3432 // and unconfirmed frame.
3433 bool has_damage = false;
3434 EXPECT_EQ(
3435 BeginFrameAck(args.source_id, args.sequence_number,
3436 latest_confirmed_sequence_number, 0, has_damage),
3437 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3438 }
3439
3440 TEST_F(SchedulerTest, BeginFrameAckForFinishedBeginFrameWithNewSourceId) {
3441 SetUpScheduler(EXTERNAL_BFS);
3442
3443 scheduler_->SetNeedsRedraw();
3444 client_->Reset();
3445
3446 // Send a BeginFrame with a different source_id.
3447 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3448 uint32_t source_id = fake_external_begin_frame_source_->source_id() + 1;
3449 BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
3450 source_id, 1, now_src());
3451 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3452
3453 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 1);
3454 EXPECT_TRUE(client_->IsInsideBeginImplFrame());
3455 EXPECT_TRUE(scheduler_->begin_frames_expected());
3456 client_->Reset();
3457
3458 task_runner().RunPendingTasks(); // Run posted deadline.
3459 EXPECT_ACTION("ScheduledActionDrawIfPossible", client_, 0, 1);
3460 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3461 EXPECT_TRUE(scheduler_->begin_frames_expected());
3462 client_->Reset();
3463
3464 // Successful draw caused damage.
3465 uint64_t latest_confirmed_sequence_number = args.sequence_number;
3466 bool has_damage = true;
3467 EXPECT_EQ(
3468 BeginFrameAck(args.source_id, args.sequence_number,
3469 latest_confirmed_sequence_number, 0, has_damage),
3470 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3471 }
3472
3473 TEST_F(SchedulerTest,
3474 BeginFrameAckForLateMissedBeginFrameWithDifferentSourceId) {
3475 SetUpScheduler(EXTERNAL_BFS);
3476
3477 scheduler_->SetNeedsRedraw();
3478 client_->Reset();
3479
3480 // Send a missed BeginFrame with a passed deadline and different source_id.
3481 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3482 uint32_t source_id = fake_external_begin_frame_source_->source_id() + 1;
3483 BeginFrameArgs args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
3484 source_id, 1, now_src());
3485 args.type = BeginFrameArgs::MISSED;
3486 now_src_->Advance(BeginFrameArgs::DefaultInterval());
3487 EXPECT_GT(now_src_->NowTicks(), args.deadline);
3488 fake_external_begin_frame_source_->TestOnBeginFrame(args);
3489
3490 EXPECT_NO_ACTION(client_);
3491 EXPECT_FALSE(client_->IsInsideBeginImplFrame());
3492 client_->Reset();
3493
3494 // Latest ack should be for the missed BeginFrame that was too late: no damage
3495 // and unconfirmed frame. Because the source_id changed, the
3496 // |latest_confirmed_sequence_number| should be set to invalid.
3497 uint64_t latest_confirmed_sequence_number =
3498 BeginFrameArgs::kInvalidFrameNumber;
3499 bool has_damage = false;
3500 EXPECT_EQ(
3501 BeginFrameAck(args.source_id, args.sequence_number,
3502 latest_confirmed_sequence_number, 0, has_damage),
3503 fake_external_begin_frame_source_->LastAckForObserver(scheduler_.get()));
3504 }
3505
3259 } // namespace 3506 } // namespace
3260 } // namespace cc 3507 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698