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
3 // found in the LICENSE file.
8 #include "base/basictypes.h"
9 #include "base/gtest_prod_util.h"
10 #include "base/test/test_simple_task_runner.h"
11 #include "cc/scheduler/begin_frame_source.h"
12 #include "cc/test/begin_frame_args_test.h"
13 #include "cc/test/scheduler_test_common.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
17 // Macros to help set up expected calls on the MockBeginFrameObserver.
18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \
20 ::testing::Expectation exp = \
21 EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \
22 BEGINFRAME_FROM_HERE, frame_time, deadline, \
23 interval))).InSequence((obs).sequence); \
26 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \
28 BeginFrameArgs args = CreateBeginFrameArgsForTesting( \
29 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \
30 ::testing::Expectation exp = \
31 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \
32 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \
33 .Times(::testing::AnyNumber()) \
35 .WillRepeatedly(::testing::Return(args)); \
38 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting
39 // observer behaviour).
40 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \
43 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \
44 BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \
45 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \
46 ASSERT_FALSE(old_args == new_args); \
47 (source).TestOnBeginFrame(new_args); \
48 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \
51 // When dropping LastUsedBeginFrameArgs **shouldn't** change.
52 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \
53 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval);
55 // When used LastUsedBeginFrameArgs **should** be updated.
56 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \
57 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval);
62 class MockBeginFrameObserver
: public BeginFrameObserver
{
64 MOCK_METHOD1(OnBeginFrame
, void(const BeginFrameArgs
&));
65 MOCK_CONST_METHOD0(LastUsedBeginFrameArgs
, const BeginFrameArgs());
67 virtual void AsValueInto(base::trace_event::TracedValue
* dict
) const {
68 dict
->SetString("type", "MockBeginFrameObserver");
69 dict
->BeginDictionary("last_begin_frame_args");
70 LastUsedBeginFrameArgs().AsValueInto(dict
);
71 dict
->EndDictionary();
74 // A value different from the normal default returned by a BeginFrameObserver
75 // so it is easiable traced back here.
76 static const BeginFrameArgs kDefaultBeginFrameArgs
;
78 MockBeginFrameObserver() {
79 // Set a "default" value returned by LastUsedBeginFrameArgs so that gMock
80 // doesn't fail an assert and instead returns useful information.
81 EXPECT_CALL(*this, LastUsedBeginFrameArgs())
82 .Times(::testing::AnyNumber())
84 .WillRepeatedly(::testing::Return(kDefaultBeginFrameArgs
));
86 virtual ~MockBeginFrameObserver() {}
88 ::testing::Sequence sequence
;
91 TEST(MockBeginFrameObserverTest
, ExpectOnBeginFrame
) {
92 ::testing::NiceMock
<MockBeginFrameObserver
> obs
;
93 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
94 EXPECT_BEGIN_FRAME_USED(obs
, 400, 600, 300);
95 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
97 EXPECT_EQ(obs
.LastUsedBeginFrameArgs(),
98 MockBeginFrameObserver::kDefaultBeginFrameArgs
);
100 obs
.OnBeginFrame(CreateBeginFrameArgsForTesting(
101 BEGINFRAME_FROM_HERE
, 100, 200,
102 300)); // One call to LastUsedBeginFrameArgs
104 obs
.LastUsedBeginFrameArgs(),
105 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300));
107 obs
.OnBeginFrame(CreateBeginFrameArgsForTesting(
108 BEGINFRAME_FROM_HERE
, 400, 600,
109 300)); // Multiple calls to LastUsedBeginFrameArgs
111 obs
.LastUsedBeginFrameArgs(),
112 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 400, 600, 300));
114 obs
.LastUsedBeginFrameArgs(),
115 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 400, 600, 300));
117 obs
.OnBeginFrame(CreateBeginFrameArgsForTesting(
118 BEGINFRAME_FROM_HERE
, 700, 900,
119 300)); // No calls to LastUsedBeginFrameArgs
122 TEST(MockBeginFrameObserverTest
, ExpectOnBeginFrameStatus
) {
123 ::testing::NiceMock
<MockBeginFrameObserver
> obs
;
124 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
125 EXPECT_BEGIN_FRAME_DROP(obs
, 400, 600, 300);
126 EXPECT_BEGIN_FRAME_DROP(obs
, 450, 650, 300);
127 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
129 EXPECT_EQ(obs
.LastUsedBeginFrameArgs(),
130 MockBeginFrameObserver::kDefaultBeginFrameArgs
);
134 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300));
136 obs
.LastUsedBeginFrameArgs(),
137 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300));
141 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 400, 600, 300));
143 obs
.LastUsedBeginFrameArgs(),
144 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300));
148 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 450, 650, 300));
150 obs
.LastUsedBeginFrameArgs(),
151 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300));
155 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 700, 900, 300));
157 obs
.LastUsedBeginFrameArgs(),
158 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 700, 900, 300));
161 const BeginFrameArgs
MockBeginFrameObserver::kDefaultBeginFrameArgs
=
162 CreateBeginFrameArgsForTesting(
166 FROM_HERE_WITH_EXPLICIT_FUNCTION(
167 "MockBeginFrameObserver::kDefaultBeginFrameArgs"),
173 // BeginFrameObserverBase testing ---------------------------------------
174 class MockMinimalBeginFrameObserverBase
: public BeginFrameObserverBase
{
176 MOCK_METHOD1(OnBeginFrameDerivedImpl
, bool(const BeginFrameArgs
&));
177 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_
; }
180 TEST(BeginFrameObserverBaseTest
, OnBeginFrameImplementation
) {
181 using ::testing::Return
;
182 MockMinimalBeginFrameObserverBase obs
;
183 ::testing::InSequence ordered
; // These calls should be ordered
185 // Initial conditions
186 EXPECT_EQ(BeginFrameArgs(), obs
.LastUsedBeginFrameArgs());
187 EXPECT_EQ(0, obs
.dropped_begin_frame_args());
190 EXPECT_DEATH({ obs
.OnBeginFrame(BeginFrameArgs()); }, "");
193 BeginFrameArgs args1
=
194 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 100, 200, 300);
195 EXPECT_CALL(obs
, OnBeginFrameDerivedImpl(args1
)).WillOnce(Return(true));
196 obs
.OnBeginFrame(args1
);
197 EXPECT_EQ(args1
, obs
.LastUsedBeginFrameArgs());
198 EXPECT_EQ(0, obs
.dropped_begin_frame_args());
202 obs
.OnBeginFrame(CreateBeginFrameArgsForTesting(
203 BEGINFRAME_FROM_HERE
, 50, 200, 300));
208 // Returning false shouldn't update the LastUsedBeginFrameArgs value.
209 BeginFrameArgs args2
=
210 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 200, 300, 400);
211 EXPECT_CALL(obs
, OnBeginFrameDerivedImpl(args2
)).WillOnce(Return(false));
212 obs
.OnBeginFrame(args2
);
213 EXPECT_EQ(args1
, obs
.LastUsedBeginFrameArgs());
214 EXPECT_EQ(1, obs
.dropped_begin_frame_args());
216 BeginFrameArgs args3
=
217 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE
, 150, 300, 400);
218 EXPECT_CALL(obs
, OnBeginFrameDerivedImpl(args3
)).WillOnce(Return(true));
219 obs
.OnBeginFrame(args3
);
220 EXPECT_EQ(args3
, obs
.LastUsedBeginFrameArgs());
221 EXPECT_EQ(1, obs
.dropped_begin_frame_args());
224 // BeginFrameSource testing ----------------------------------------------
225 TEST(BeginFrameSourceBaseTest
, ObserverManipulation
) {
226 MockBeginFrameObserver obs
;
227 MockBeginFrameObserver otherObs
;
228 FakeBeginFrameSource source
;
230 source
.AddObserver(&obs
);
231 EXPECT_EQ(&obs
, source
.GetObserver());
234 // Adding an observer when an observer already exists should DCHECK fail.
235 EXPECT_DEATH({ source
.AddObserver(&otherObs
); }, "");
237 // Removing wrong observer should DCHECK fail.
238 EXPECT_DEATH({ source
.RemoveObserver(&otherObs
); }, "");
240 // Removing an observer when there is no observer should DCHECK fail.
242 source
.RemoveObserver(&obs
);
243 source
.RemoveObserver(&obs
);
247 source
.RemoveObserver(&obs
);
249 source
.AddObserver(&otherObs
);
250 EXPECT_EQ(&otherObs
, source
.GetObserver());
251 source
.RemoveObserver(&otherObs
);
254 TEST(BeginFrameSourceBaseTest
, Observer
) {
255 FakeBeginFrameSource source
;
256 MockBeginFrameObserver obs
;
257 source
.AddObserver(&obs
);
258 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
259 EXPECT_BEGIN_FRAME_DROP(obs
, 400, 600, 300);
260 EXPECT_BEGIN_FRAME_DROP(obs
, 450, 650, 300);
261 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
263 SEND_BEGIN_FRAME_USED(source
, 100, 200, 300);
264 SEND_BEGIN_FRAME_DROP(source
, 400, 600, 300);
265 SEND_BEGIN_FRAME_DROP(source
, 450, 650, 300);
266 SEND_BEGIN_FRAME_USED(source
, 700, 900, 300);
269 TEST(BeginFrameSourceBaseTest
, NoObserver
) {
270 FakeBeginFrameSource source
;
271 SEND_BEGIN_FRAME_DROP(source
, 100, 200, 300);
274 TEST(BeginFrameSourceBaseTest
, NeedsBeginFrames
) {
275 FakeBeginFrameSource source
;
276 EXPECT_FALSE(source
.NeedsBeginFrames());
277 source
.SetNeedsBeginFrames(true);
278 EXPECT_TRUE(source
.NeedsBeginFrames());
279 source
.SetNeedsBeginFrames(false);
280 EXPECT_FALSE(source
.NeedsBeginFrames());
283 class LoopingBeginFrameObserver
: public BeginFrameObserverBase
{
285 BeginFrameSource
* source_
;
287 void AsValueInto(base::trace_event::TracedValue
* dict
) const override
{
288 dict
->SetString("type", "LoopingBeginFrameObserver");
289 dict
->BeginDictionary("source");
290 source_
->AsValueInto(dict
);
291 dict
->EndDictionary();
295 // BeginFrameObserverBase
296 bool OnBeginFrameDerivedImpl(const BeginFrameArgs
& args
) override
{
301 TEST(BeginFrameSourceBaseTest
, DetectAsValueIntoLoop
) {
302 LoopingBeginFrameObserver obs
;
303 FakeBeginFrameSource source
;
305 obs
.source_
= &source
;
306 source
.AddObserver(&obs
);
308 scoped_refptr
<base::trace_event::TracedValue
> state
=
309 new base::trace_event::TracedValue();
310 source
.AsValueInto(state
.get());
313 // BackToBackBeginFrameSource testing -----------------------------------------
314 class TestBackToBackBeginFrameSource
: public BackToBackBeginFrameSource
{
316 static scoped_ptr
<TestBackToBackBeginFrameSource
> Create(
317 base::SimpleTestTickClock
* now_src
,
318 base::SingleThreadTaskRunner
* task_runner
) {
319 return make_scoped_ptr(
320 new TestBackToBackBeginFrameSource(now_src
, task_runner
));
324 TestBackToBackBeginFrameSource(base::SimpleTestTickClock
* now_src
,
325 base::SingleThreadTaskRunner
* task_runner
)
326 : BackToBackBeginFrameSource(task_runner
), now_src_(now_src
) {}
328 base::TimeTicks
Now() override
{ return now_src_
->NowTicks(); }
331 base::SimpleTestTickClock
* now_src_
;
334 class BackToBackBeginFrameSourceTest
: public ::testing::Test
{
336 static const int64_t kDeadline
;
337 static const int64_t kInterval
;
339 scoped_ptr
<base::SimpleTestTickClock
> now_src_
;
340 scoped_refptr
<OrderedSimpleTaskRunner
> task_runner_
;
341 scoped_ptr
<TestBackToBackBeginFrameSource
> source_
;
342 scoped_ptr
<MockBeginFrameObserver
> obs_
;
344 void SetUp() override
{
345 now_src_
.reset(new base::SimpleTestTickClock());
346 now_src_
->Advance(base::TimeDelta::FromMicroseconds(1000));
348 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_
.get(), false));
349 task_runner_
->SetRunTaskLimit(1);
350 source_
= TestBackToBackBeginFrameSource::Create(now_src_
.get(),
352 obs_
= make_scoped_ptr(new ::testing::StrictMock
<MockBeginFrameObserver
>());
353 source_
->AddObserver(obs_
.get());
356 void TearDown() override
{ obs_
.reset(); }
359 const int64_t BackToBackBeginFrameSourceTest::kDeadline
=
360 BeginFrameArgs::DefaultInterval().ToInternalValue();
362 const int64_t BackToBackBeginFrameSourceTest::kInterval
=
363 BeginFrameArgs::DefaultInterval().ToInternalValue();
365 TEST_F(BackToBackBeginFrameSourceTest
, SetNeedsBeginFramesSendsBeginFrame
) {
366 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
367 source_
->SetNeedsBeginFrames(true);
368 EXPECT_TRUE(task_runner_
->HasPendingTasks());
369 task_runner_
->RunUntilIdle();
371 EXPECT_BEGIN_FRAME_USED(*obs_
, 1100, 1100 + kDeadline
, kInterval
);
372 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
373 source_
->DidFinishFrame(0);
374 task_runner_
->RunUntilIdle();
377 TEST_F(BackToBackBeginFrameSourceTest
,
378 DidFinishFrameThenSetNeedsBeginFramesProducesNoFrame
) {
379 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
380 source_
->SetNeedsBeginFrames(true);
381 task_runner_
->RunUntilIdle();
383 source_
->SetNeedsBeginFrames(false);
384 source_
->DidFinishFrame(0);
386 EXPECT_FALSE(task_runner_
->HasPendingTasks());
389 TEST_F(BackToBackBeginFrameSourceTest
,
390 SetNeedsBeginFramesThenDidFinishFrameProducesNoFrame
) {
391 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
392 source_
->SetNeedsBeginFrames(true);
393 task_runner_
->RunUntilIdle();
395 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
396 source_
->DidFinishFrame(0);
397 source_
->SetNeedsBeginFrames(false);
399 EXPECT_TRUE(task_runner_
->HasPendingTasks());
400 task_runner_
->RunUntilIdle();
403 TEST_F(BackToBackBeginFrameSourceTest
,
404 DidFinishFrameThenTogglingSetNeedsBeginFramesProducesCorrectFrame
) {
405 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
406 source_
->SetNeedsBeginFrames(true);
407 task_runner_
->RunUntilIdle();
409 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
411 source_
->SetNeedsBeginFrames(false);
412 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
413 source_
->DidFinishFrame(0);
414 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
415 source_
->SetNeedsBeginFrames(false);
416 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
417 source_
->SetNeedsBeginFrames(true);
419 EXPECT_BEGIN_FRAME_USED(*obs_
, 1130, 1130 + kDeadline
, kInterval
);
420 EXPECT_TRUE(task_runner_
->HasPendingTasks());
421 task_runner_
->RunUntilIdle();
424 TEST_F(BackToBackBeginFrameSourceTest
,
425 TogglingSetNeedsBeginFramesThenDidFinishFrameProducesCorrectFrame
) {
426 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
427 source_
->SetNeedsBeginFrames(true);
428 task_runner_
->RunUntilIdle();
430 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
431 source_
->DidFinishFrame(0);
432 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
433 source_
->SetNeedsBeginFrames(false);
434 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
435 source_
->SetNeedsBeginFrames(true);
436 now_src_
->Advance(base::TimeDelta::FromMicroseconds(10));
438 EXPECT_BEGIN_FRAME_USED(*obs_
, 1130, 1130 + kDeadline
, kInterval
);
439 EXPECT_TRUE(task_runner_
->HasPendingTasks());
440 task_runner_
->RunUntilIdle();
443 TEST_F(BackToBackBeginFrameSourceTest
, DidFinishFrameNeedsBeginFrameFalse
) {
444 source_
->SetNeedsBeginFrames(false);
445 source_
->DidFinishFrame(0);
446 EXPECT_FALSE(task_runner_
->RunPendingTasks());
449 TEST_F(BackToBackBeginFrameSourceTest
, DidFinishFrameRemainingFrames
) {
450 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
451 source_
->SetNeedsBeginFrames(true);
452 task_runner_
->RunUntilIdle();
454 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
456 source_
->DidFinishFrame(3);
457 EXPECT_FALSE(task_runner_
->HasPendingTasks());
458 source_
->DidFinishFrame(2);
459 EXPECT_FALSE(task_runner_
->HasPendingTasks());
460 source_
->DidFinishFrame(1);
461 EXPECT_FALSE(task_runner_
->HasPendingTasks());
463 EXPECT_BEGIN_FRAME_USED(*obs_
, 1100, 1100 + kDeadline
, kInterval
);
464 source_
->DidFinishFrame(0);
465 EXPECT_EQ(base::TimeDelta(), task_runner_
->DelayToNextTaskTime());
466 task_runner_
->RunUntilIdle();
469 TEST_F(BackToBackBeginFrameSourceTest
, DidFinishFrameMultipleCallsIdempotent
) {
470 source_
->SetNeedsBeginFrames(true);
471 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
472 task_runner_
->RunUntilIdle();
474 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
475 source_
->DidFinishFrame(0);
476 source_
->DidFinishFrame(0);
477 source_
->DidFinishFrame(0);
478 EXPECT_BEGIN_FRAME_USED(*obs_
, 1100, 1100 + kDeadline
, kInterval
);
479 task_runner_
->RunUntilIdle();
481 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
482 source_
->DidFinishFrame(0);
483 source_
->DidFinishFrame(0);
484 source_
->DidFinishFrame(0);
485 EXPECT_BEGIN_FRAME_USED(*obs_
, 1200, 1200 + kDeadline
, kInterval
);
486 task_runner_
->RunUntilIdle();
489 TEST_F(BackToBackBeginFrameSourceTest
, DelayInPostedTaskProducesCorrectFrame
) {
490 EXPECT_BEGIN_FRAME_USED(*obs_
, 1000, 1000 + kDeadline
, kInterval
);
491 source_
->SetNeedsBeginFrames(true);
492 task_runner_
->RunUntilIdle();
494 now_src_
->Advance(base::TimeDelta::FromMicroseconds(100));
495 source_
->DidFinishFrame(0);
496 now_src_
->Advance(base::TimeDelta::FromMicroseconds(50));
497 EXPECT_BEGIN_FRAME_USED(*obs_
, 1150, 1150 + kDeadline
, kInterval
);
499 EXPECT_TRUE(task_runner_
->HasPendingTasks());
500 task_runner_
->RunUntilIdle();
503 // SyntheticBeginFrameSource testing ------------------------------------------
504 class SyntheticBeginFrameSourceTest
: public ::testing::Test
{
506 scoped_ptr
<base::SimpleTestTickClock
> now_src_
;
507 scoped_refptr
<OrderedSimpleTaskRunner
> task_runner_
;
508 scoped_ptr
<TestSyntheticBeginFrameSource
> source_
;
509 scoped_ptr
<MockBeginFrameObserver
> obs_
;
511 void SetUp() override
{
512 now_src_
.reset(new base::SimpleTestTickClock());
513 now_src_
->Advance(base::TimeDelta::FromMicroseconds(1000));
515 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_
.get(), false));
516 source_
= TestSyntheticBeginFrameSource::Create(
517 now_src_
.get(), task_runner_
.get(),
518 base::TimeDelta::FromMicroseconds(10000));
519 obs_
= make_scoped_ptr(new MockBeginFrameObserver());
520 source_
->AddObserver(obs_
.get());
523 void TearDown() override
{ obs_
.reset(); }
526 TEST_F(SyntheticBeginFrameSourceTest
,
527 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick
) {
528 now_src_
->Advance(base::TimeDelta::FromMicroseconds(9010));
529 EXPECT_CALL((*obs_
), OnBeginFrame(CreateBeginFrameArgsForTesting(
530 BEGINFRAME_FROM_HERE
, 10000, 20000, 10000,
531 BeginFrameArgs::MISSED
)));
532 source_
->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
533 // No tasks should need to be run for this to occur.
536 TEST_F(SyntheticBeginFrameSourceTest
,
537 SetNeedsBeginFramesCallsCausesOnBeginFrame
) {
538 source_
->SetNeedsBeginFrames(true);
539 EXPECT_EQ(10000, task_runner_
->NextTaskTime().ToInternalValue());
541 EXPECT_BEGIN_FRAME_USED(*obs_
, 10000, 20000, 10000);
542 now_src_
->Advance(base::TimeDelta::FromMicroseconds(9010));
543 task_runner_
->RunPendingTasks();
546 TEST_F(SyntheticBeginFrameSourceTest
, BasicOperation
) {
547 task_runner_
->SetAutoAdvanceNowToPendingTasks(true);
549 source_
->SetNeedsBeginFrames(true);
550 EXPECT_BEGIN_FRAME_USED(*obs_
, 10000, 20000, 10000);
551 EXPECT_BEGIN_FRAME_USED(*obs_
, 20000, 30000, 10000);
552 EXPECT_BEGIN_FRAME_USED(*obs_
, 30000, 40000, 10000);
553 task_runner_
->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
555 source_
->SetNeedsBeginFrames(false);
557 task_runner_
->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
560 TEST_F(SyntheticBeginFrameSourceTest
, VSyncChanges
) {
561 task_runner_
->SetAutoAdvanceNowToPendingTasks(true);
562 source_
->SetNeedsBeginFrames(true);
564 EXPECT_BEGIN_FRAME_USED(*obs_
, 10000, 20000, 10000);
565 EXPECT_BEGIN_FRAME_USED(*obs_
, 20000, 30000, 10000);
566 EXPECT_BEGIN_FRAME_USED(*obs_
, 30000, 40000, 10000);
567 task_runner_
->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
569 // Update the vsync information
570 source_
->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
571 base::TimeDelta::FromMicroseconds(10001));
573 EXPECT_BEGIN_FRAME_USED(*obs_
, 40000, 47502, 10001);
574 EXPECT_BEGIN_FRAME_USED(*obs_
, 47502, 57503, 10001);
575 EXPECT_BEGIN_FRAME_USED(*obs_
, 57503, 67504, 10001);
576 task_runner_
->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
579 // BeginFrameSourceMultiplexer testing -----------------------------------
580 class BeginFrameSourceMultiplexerTest
: public ::testing::Test
{
582 void SetUp() override
{
583 mux_
= BeginFrameSourceMultiplexer::Create();
585 source1_store_
= make_scoped_ptr(new FakeBeginFrameSource());
586 source2_store_
= make_scoped_ptr(new FakeBeginFrameSource());
587 source3_store_
= make_scoped_ptr(new FakeBeginFrameSource());
589 source1_
= source1_store_
.get();
590 source2_
= source2_store_
.get();
591 source3_
= source3_store_
.get();
594 void TearDown() override
{
595 // Make sure the mux is torn down before the sources.
599 scoped_ptr
<BeginFrameSourceMultiplexer
> mux_
;
600 FakeBeginFrameSource
* source1_
;
601 FakeBeginFrameSource
* source2_
;
602 FakeBeginFrameSource
* source3_
;
605 scoped_ptr
<FakeBeginFrameSource
> source1_store_
;
606 scoped_ptr
<FakeBeginFrameSource
> source2_store_
;
607 scoped_ptr
<FakeBeginFrameSource
> source3_store_
;
610 TEST_F(BeginFrameSourceMultiplexerTest
, SourcesManipulation
) {
611 EXPECT_EQ(NULL
, mux_
->ActiveSource());
613 mux_
->AddSource(source1_
);
614 EXPECT_EQ(source1_
, mux_
->ActiveSource());
616 mux_
->SetActiveSource(NULL
);
617 EXPECT_EQ(NULL
, mux_
->ActiveSource());
619 mux_
->SetActiveSource(source1_
);
622 // Setting a source which isn't in the mux as active should DCHECK fail.
623 EXPECT_DEATH({ mux_
->SetActiveSource(source2_
); }, "");
625 // Adding a source which is already added should DCHECK fail.
626 EXPECT_DEATH({ mux_
->AddSource(source1_
); }, "");
628 // Removing a source which isn't in the mux should DCHECK fail.
629 EXPECT_DEATH({ mux_
->RemoveSource(source2_
); }, "");
631 // Removing the active source fails
632 EXPECT_DEATH({ mux_
->RemoveSource(source1_
); }, "");
635 // Test manipulation doesn't segfault.
636 mux_
->AddSource(source2_
);
637 mux_
->RemoveSource(source2_
);
639 mux_
->AddSource(source2_
);
640 mux_
->SetActiveSource(source2_
);
641 EXPECT_EQ(source2_
, mux_
->ActiveSource());
643 mux_
->RemoveSource(source1_
);
646 TEST_F(BeginFrameSourceMultiplexerTest
, NeedsBeginFrames
) {
647 mux_
->AddSource(source1_
);
648 mux_
->AddSource(source2_
);
649 mux_
->SetActiveSource(source1_
);
650 EXPECT_EQ(source1_
->NeedsBeginFrames(), false);
651 EXPECT_EQ(source2_
->NeedsBeginFrames(), false);
653 // Check SetNeedsFrames works
654 mux_
->SetNeedsBeginFrames(true);
655 EXPECT_EQ(source1_
->NeedsBeginFrames(), true);
656 EXPECT_EQ(source2_
->NeedsBeginFrames(), false);
658 mux_
->SetNeedsBeginFrames(false);
659 EXPECT_EQ(source1_
->NeedsBeginFrames(), false);
660 EXPECT_EQ(source2_
->NeedsBeginFrames(), false);
662 // Checking that switching the source makes SetNeedsFrames on the
663 // subsources correctly.
664 mux_
->SetNeedsBeginFrames(true);
666 mux_
->SetActiveSource(source1_
);
667 EXPECT_EQ(source1_
->NeedsBeginFrames(), true);
668 EXPECT_EQ(source2_
->NeedsBeginFrames(), false);
670 mux_
->SetActiveSource(source2_
);
671 EXPECT_EQ(source1_
->NeedsBeginFrames(), false);
672 EXPECT_EQ(source2_
->NeedsBeginFrames(), true);
675 TEST_F(BeginFrameSourceMultiplexerTest
, BeginFramesSimple
) {
676 mux_
->AddSource(source1_
);
677 mux_
->AddSource(source2_
);
678 mux_
->SetActiveSource(source1_
);
680 MockBeginFrameObserver obs
;
681 mux_
->AddObserver(&obs
);
682 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
683 EXPECT_BEGIN_FRAME_USED(obs
, 400, 600, 300);
685 mux_
->SetActiveSource(source1_
);
687 SEND_BEGIN_FRAME_USED(*source1_
, 100, 200, 300);
688 SEND_BEGIN_FRAME_DROP(*source2_
, 200, 500, 300);
690 mux_
->SetActiveSource(source2_
);
691 SEND_BEGIN_FRAME_USED(*source2_
, 400, 600, 300);
692 SEND_BEGIN_FRAME_DROP(*source1_
, 500, 700, 300);
695 TEST_F(BeginFrameSourceMultiplexerTest
, BeginFramesBackwardsProtection
) {
696 mux_
->AddSource(source1_
);
697 mux_
->AddSource(source2_
);
699 MockBeginFrameObserver obs
;
700 mux_
->AddObserver(&obs
);
701 EXPECT_BEGIN_FRAME_USED(obs
, 400, 600, 300);
702 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
703 EXPECT_BEGIN_FRAME_USED(obs
, 1000, 1200, 300);
704 EXPECT_BEGIN_FRAME_USED(obs
, 1001, 1201, 301);
706 mux_
->SetActiveSource(source1_
);
707 SEND_BEGIN_FRAME_USED(*source1_
, 400, 600, 300);
708 SEND_BEGIN_FRAME_USED(*source1_
, 700, 900, 300);
710 mux_
->SetActiveSource(source2_
);
711 SEND_BEGIN_FRAME_DROP(*source2_
, 699, 899, 300);
712 SEND_BEGIN_FRAME_USED(*source2_
, 1000, 1200, 300);
714 mux_
->SetActiveSource(source1_
);
715 SEND_BEGIN_FRAME_USED(*source1_
, 1001, 1201, 301);
718 TEST_F(BeginFrameSourceMultiplexerTest
, MinimumIntervalNegativeFails
) {
721 { mux_
->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
726 TEST_F(BeginFrameSourceMultiplexerTest
, MinimumIntervalZero
) {
727 mux_
->SetMinimumInterval(base::TimeDelta());
728 mux_
->AddSource(source1_
);
730 MockBeginFrameObserver obs
;
731 mux_
->AddObserver(&obs
);
732 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
733 EXPECT_BEGIN_FRAME_USED(obs
, 400, 600, 300);
734 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
736 SEND_BEGIN_FRAME_USED(*source1_
, 100, 200, 300);
737 SEND_BEGIN_FRAME_USED(*source1_
, 400, 600, 300);
738 SEND_BEGIN_FRAME_USED(*source1_
, 700, 900, 300);
741 TEST_F(BeginFrameSourceMultiplexerTest
, MinimumIntervalBasic
) {
742 mux_
->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
743 mux_
->AddSource(source1_
);
745 MockBeginFrameObserver obs
;
746 mux_
->AddObserver(&obs
);
747 EXPECT_BEGIN_FRAME_USED(obs
, 100, 200, 300);
748 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
750 SEND_BEGIN_FRAME_USED(*source1_
, 100, 200, 300);
751 SEND_BEGIN_FRAME_DROP(*source1_
, 400, 600, 300);
752 SEND_BEGIN_FRAME_USED(*source1_
, 700, 900, 300);
755 TEST_F(BeginFrameSourceMultiplexerTest
, MinimumIntervalWithMultipleSources
) {
756 mux_
->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
757 mux_
->AddSource(source1_
);
758 mux_
->AddSource(source2_
);
760 MockBeginFrameObserver obs
;
761 mux_
->AddObserver(&obs
);
762 EXPECT_BEGIN_FRAME_USED(obs
, 400, 600, 300);
763 EXPECT_BEGIN_FRAME_USED(obs
, 700, 900, 300);
764 EXPECT_BEGIN_FRAME_USED(obs
, 1050, 1250, 300);
766 mux_
->SetActiveSource(source1_
);
767 SEND_BEGIN_FRAME_USED(*source1_
, 400, 600, 300);
768 SEND_BEGIN_FRAME_USED(*source1_
, 700, 900, 300);
770 mux_
->SetActiveSource(source2_
);
771 SEND_BEGIN_FRAME_DROP(*source2_
, 750, 1050, 300);
772 SEND_BEGIN_FRAME_USED(*source2_
, 1050, 1250, 300);
774 mux_
->SetActiveSource(source1_
);
775 SEND_BEGIN_FRAME_DROP(*source2_
, 1100, 1400, 300);