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

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

Issue 267783004: Refactoring the way begin frame sources inside scheduler work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Trying an alternative to OnMissedBeginFrames method. Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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.
4
5 #include <deque>
6 #include <string>
7
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"
16
17 // Macros to help set up expected calls on the MockBeginFrameObserver.
18 #define EXPECT_BEGIN_FRAME_DROP(obs, ...) \
19 { \
20 ::testing::Expectation exp = \
21 EXPECT_CALL((obs), \
22 OnBeginFrame(CreateBeginFrameArgsForTesting(__VA_ARGS__))) \
23 .InSequence((obs).sequence); \
24 }
25
26 #define EXPECT_BEGIN_FRAME_USED(obs, ...) \
27 { \
28 ::testing::Expectation exp = \
29 EXPECT_CALL((obs), \
30 OnBeginFrame(CreateBeginFrameArgsForTesting(__VA_ARGS__))) \
31 .InSequence((obs).sequence); \
32 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \
33 .Times(::testing::AnyNumber()) \
34 .After(exp) \
35 .WillRepeatedly( \
36 ::testing::Return(CreateBeginFrameArgsForTesting(__VA_ARGS__))); \
37 }
38
39 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting
40 // observer behaviour).
41 #define SEND_BEGIN_FRAME(args_equal_to, source, ...) \
42 { \
43 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \
44 BeginFrameArgs new_args = CreateBeginFrameArgsForTesting(__VA_ARGS__); \
45 ASSERT_TRUE(!(old_args == new_args)); \
46 (source).TestOnBeginFrame(new_args); \
47 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \
48 }
49
50 #define SEND_BEGIN_FRAME_DROP(...) \
51 SEND_BEGIN_FRAME(old_args, \
52 __VA_ARGS__); // When dropping LastUsedBeginFrameArgs
53 // **shouldn't** change.
54
55 #define SEND_BEGIN_FRAME_USED(...) \
56 SEND_BEGIN_FRAME(new_args, __VA_ARGS__); // When used LastUsedBeginFrameArgs
57 // **should** be updated.
58
59 namespace cc {
60 namespace {
61
62 class MockBeginFrameObserver : public BeginFrameObserver {
63 public:
64 MOCK_METHOD1(OnBeginFrame, void(const BeginFrameArgs&));
65 MOCK_CONST_METHOD0(LastUsedBeginFrameArgs, const BeginFrameArgs());
66
67 virtual void AsValueInto(base::debug::TracedValue* dict) const {
68 dict->SetString("type", "MockBeginFrameObserver");
69 dict->BeginDictionary("last_begin_frame_args");
70 LastUsedBeginFrameArgs().AsValueInto(dict);
71 dict->EndDictionary();
72 }
73
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;
77
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())
83 .InSequence(sequence)
84 .WillRepeatedly(::testing::Return(kDefaultBeginFrameArgs));
85 }
86 virtual ~MockBeginFrameObserver() {}
87
88 ::testing::Sequence sequence;
89 };
90
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);
96
97 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
98 MockBeginFrameObserver::kDefaultBeginFrameArgs);
99
100 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
101 100, 200, 300)); // One call to LastUsedBeginFrameArgs
102 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
103 CreateBeginFrameArgsForTesting(100, 200, 300));
104
105 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
106 400, 600, 300)); // Multiple calls to LastUsedBeginFrameArgs
107 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
108 CreateBeginFrameArgsForTesting(400, 600, 300));
109 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
110 CreateBeginFrameArgsForTesting(400, 600, 300));
111
112 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
113 700, 900, 300)); // No calls to LastUsedBeginFrameArgs
114 }
115
116 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) {
117 ::testing::NiceMock<MockBeginFrameObserver> obs;
118 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
119 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300);
120 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300);
121 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
122
123 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
124 MockBeginFrameObserver::kDefaultBeginFrameArgs);
125
126 // Used
127 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300));
128 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
129 CreateBeginFrameArgsForTesting(100, 200, 300));
130
131 // Dropped
132 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300));
133 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
134 CreateBeginFrameArgsForTesting(100, 200, 300));
135
136 // Dropped
137 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300));
138 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
139 CreateBeginFrameArgsForTesting(100, 200, 300));
140
141 // Used
142 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300));
143 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
144 CreateBeginFrameArgsForTesting(700, 900, 300));
145 }
146
147 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs =
148 CreateBeginFrameArgsForTesting(-1, -1, -1);
149
150 // BeginFrameObserverMixIn testing ---------------------------------------
151 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn {
152 public:
153 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&));
154 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; }
155 };
156
157 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) {
158 using ::testing::Return;
159 MockMinimalBeginFrameObserverMixIn obs;
160 ::testing::InSequence ordered; // These calls should be ordered
161
162 // Initial conditions
163 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs());
164 EXPECT_EQ(0, obs.dropped_begin_frame_args());
165
166 #ifndef NDEBUG
167 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, "");
168 #endif
169
170 BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(100, 200, 300);
171 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true));
172 obs.OnBeginFrame(args1);
173 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
174 EXPECT_EQ(0, obs.dropped_begin_frame_args());
175
176 #ifndef NDEBUG
177 EXPECT_DEATH(
178 { obs.OnBeginFrame(CreateBeginFrameArgsForTesting(50, 200, 300)); }, "");
179 #endif
180
181 // Returning false shouldn't update the LastUsedBeginFrameArgs value.
182 BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(200, 300, 400);
183 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false));
184 obs.OnBeginFrame(args2);
185 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs());
186 EXPECT_EQ(1, obs.dropped_begin_frame_args());
187
188 BeginFrameArgs args3 = CreateBeginFrameArgsForTesting(150, 300, 400);
189 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true));
190 obs.OnBeginFrame(args3);
191 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs());
192 EXPECT_EQ(1, obs.dropped_begin_frame_args());
193 }
194
195 // BeginFrameSource testing ----------------------------------------------
196 class BeginFrameSourceTest : public ::testing::Test {};
197
198 TEST_F(BeginFrameSourceTest, ObserverManipulation) {
199 MockBeginFrameObserver obs;
200 MockBeginFrameObserver otherObs;
201 FakeBeginFrameSource source;
202
203 source.AddObserver(&obs);
204 EXPECT_EQ(&obs, source.GetObserver());
205
206 #ifndef NDEBUG
207 // Adding an observer when an observer already exists should DCHECK fail.
208 EXPECT_DEATH({ source.AddObserver(&otherObs); }, "");
209
210 // Removing wrong observer should DCHECK fail.
211 EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, "");
212
213 // Removing an observer when there is no observer should DCHECK fail.
214 EXPECT_DEATH({
215 source.RemoveObserver(&obs);
216 source.RemoveObserver(&obs);
217 },
218 "");
219 #endif
220 source.RemoveObserver(&obs);
221
222 source.AddObserver(&otherObs);
223 EXPECT_EQ(&otherObs, source.GetObserver());
224 source.RemoveObserver(&otherObs);
225 }
226
227 TEST_F(BeginFrameSourceTest, Observer) {
228 FakeBeginFrameSource source;
229 MockBeginFrameObserver obs;
230 source.AddObserver(&obs);
231 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
232 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300);
233 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300);
234 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
235
236 SEND_BEGIN_FRAME_USED(source, 100, 200, 300);
237 SEND_BEGIN_FRAME_DROP(source, 400, 600, 300);
238 SEND_BEGIN_FRAME_DROP(source, 450, 650, 300);
239 SEND_BEGIN_FRAME_USED(source, 700, 900, 300);
240 }
241
242 TEST_F(BeginFrameSourceTest, NoObserver) {
243 FakeBeginFrameSource source;
244 SEND_BEGIN_FRAME_DROP(source, 100, 200, 300);
245 }
246
247 class LoopingBeginFrameObserver : public BeginFrameObserverMixIn {
248 public:
249 BeginFrameSource* source_;
250
251 virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE {
252 dict->SetString("type", "LoopingBeginFrameObserver");
253 dict->BeginDictionary("source");
254 source_->AsValueInto(dict);
255 dict->EndDictionary();
256 }
257
258 protected:
259 // BeginFrameObserverMixIn
260 virtual bool OnBeginFrameMixInDelegate(const BeginFrameArgs& args) OVERRIDE {
261 return true;
262 }
263 };
264
265 TEST_F(BeginFrameSourceTest, DetectAsValueIntoLoop) {
266 LoopingBeginFrameObserver obs;
267 FakeBeginFrameSource source;
268
269 obs.source_ = &source;
270 source.AddObserver(&obs);
271
272 scoped_refptr<base::debug::TracedValue> state =
273 new base::debug::TracedValue();
274 source.AsValueInto(state.get());
275 }
276
277 // BackToBackBeginFrameSource testing -----------------------------------------
278 class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource {
279 public:
280 static scoped_ptr<TestBackToBackBeginFrameSource> Create(
281 scoped_refptr<TestNowSource> now_src,
282 base::SingleThreadTaskRunner* task_runner) {
283 return make_scoped_ptr(
284 new TestBackToBackBeginFrameSource(now_src, task_runner));
285 }
286
287 protected:
288 TestBackToBackBeginFrameSource(scoped_refptr<TestNowSource> now_src,
289 base::SingleThreadTaskRunner* task_runner)
290 : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {}
291
292 virtual base::TimeTicks Now() OVERRIDE { return now_src_->Now(); }
293
294 scoped_refptr<TestNowSource> now_src_;
295 };
296
297 class BackToBackBeginFrameSourceTest : public ::testing::Test {
298 public:
299 static const int64_t kDeadline;
300 static const int64_t kInterval;
301
302 scoped_refptr<TestNowSource> now_src_;
303 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
304 scoped_ptr<TestBackToBackBeginFrameSource> source_;
305 scoped_ptr<MockBeginFrameObserver> obs_;
306
307 virtual void SetUp() OVERRIDE {
308 now_src_ = TestNowSource::Create(1000);
309 task_runner_ =
310 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
311 task_runner_->SetRunTaskLimit(1);
312 source_ =
313 TestBackToBackBeginFrameSource::Create(now_src_, task_runner_.get());
314 obs_ = make_scoped_ptr(new ::testing::StrictMock<MockBeginFrameObserver>());
315 source_->AddObserver(obs_.get());
316 }
317
318 virtual void TearDown() OVERRIDE { obs_.reset(); }
319 };
320
321 const int64_t BackToBackBeginFrameSourceTest::kDeadline =
322 BeginFrameArgs::DefaultInterval().ToInternalValue();
323
324 const int64_t BackToBackBeginFrameSourceTest::kInterval =
325 BeginFrameArgs::DefaultInterval().ToInternalValue();
326
327 TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) {
328 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
329 source_->SetNeedsBeginFrames(true);
330 EXPECT_TRUE(task_runner_->HasPendingTasks());
331 task_runner_->RunUntilIdle();
332
333 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
334 now_src_->AdvanceNowMicroseconds(100);
335 source_->DidFinishFrame(0);
336 task_runner_->RunUntilIdle();
337 }
338
339 TEST_F(BackToBackBeginFrameSourceTest,
340 DidFinishFrameThenSetNeedsBeginFramesProducesNoFrame) {
341 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
342 source_->SetNeedsBeginFrames(true);
343 task_runner_->RunUntilIdle();
344
345 source_->SetNeedsBeginFrames(false);
346 source_->DidFinishFrame(0);
347
348 EXPECT_FALSE(task_runner_->HasPendingTasks());
349 }
350
351 TEST_F(BackToBackBeginFrameSourceTest,
352 SetNeedsBeginFramesThenDidFinishFrameProducesNoFrame) {
353 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
354 source_->SetNeedsBeginFrames(true);
355 task_runner_->RunUntilIdle();
356
357 now_src_->AdvanceNowMicroseconds(100);
358 source_->DidFinishFrame(0);
359 source_->SetNeedsBeginFrames(false);
360
361 EXPECT_TRUE(task_runner_->HasPendingTasks());
362 task_runner_->RunUntilIdle();
363 }
364
365 TEST_F(BackToBackBeginFrameSourceTest,
366 DidFinishFrameThenTogglingSetNeedsBeginFramesProducesCorrectFrame) {
367 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
368 source_->SetNeedsBeginFrames(true);
369 task_runner_->RunUntilIdle();
370
371 now_src_->AdvanceNowMicroseconds(100);
372
373 source_->SetNeedsBeginFrames(false);
374 now_src_->AdvanceNowMicroseconds(10);
375 source_->DidFinishFrame(0);
376 now_src_->AdvanceNowMicroseconds(10);
377 source_->SetNeedsBeginFrames(false);
378 now_src_->AdvanceNowMicroseconds(10);
379 source_->SetNeedsBeginFrames(true);
380
381 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
382 EXPECT_TRUE(task_runner_->HasPendingTasks());
383 task_runner_->RunUntilIdle();
384 }
385
386 TEST_F(BackToBackBeginFrameSourceTest,
387 TogglingSetNeedsBeginFramesThenDidFinishFrameProducesCorrectFrame) {
388 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
389 source_->SetNeedsBeginFrames(true);
390 task_runner_->RunUntilIdle();
391
392 now_src_->AdvanceNowMicroseconds(100);
393 source_->DidFinishFrame(0);
394 now_src_->AdvanceNowMicroseconds(10);
395 source_->SetNeedsBeginFrames(false);
396 now_src_->AdvanceNowMicroseconds(10);
397 source_->SetNeedsBeginFrames(true);
398 now_src_->AdvanceNowMicroseconds(10);
399
400 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
401 EXPECT_TRUE(task_runner_->HasPendingTasks());
402 task_runner_->RunUntilIdle();
403 }
404
405 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNeedsBeginFrameFalse) {
406 source_->SetNeedsBeginFrames(false);
407 source_->DidFinishFrame(0);
408 EXPECT_FALSE(task_runner_->RunPendingTasks());
409 }
410
411 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
412 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
413 source_->SetNeedsBeginFrames(true);
414 task_runner_->RunUntilIdle();
415
416 now_src_->AdvanceNowMicroseconds(100);
417
418 source_->DidFinishFrame(3);
419 EXPECT_FALSE(task_runner_->HasPendingTasks());
420 source_->DidFinishFrame(2);
421 EXPECT_FALSE(task_runner_->HasPendingTasks());
422 source_->DidFinishFrame(1);
423 EXPECT_FALSE(task_runner_->HasPendingTasks());
424
425 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
426 source_->DidFinishFrame(0);
427 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
428 task_runner_->RunUntilIdle();
429 }
430
431 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) {
432 source_->SetNeedsBeginFrames(true);
433 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
434 task_runner_->RunUntilIdle();
435
436 now_src_->AdvanceNowMicroseconds(100);
437 source_->DidFinishFrame(0);
438 source_->DidFinishFrame(0);
439 source_->DidFinishFrame(0);
440 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
441 task_runner_->RunUntilIdle();
442
443 now_src_->AdvanceNowMicroseconds(100);
444 source_->DidFinishFrame(0);
445 source_->DidFinishFrame(0);
446 source_->DidFinishFrame(0);
447 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval);
448 task_runner_->RunUntilIdle();
449 }
450
451 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
452 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
453 source_->SetNeedsBeginFrames(true);
454 task_runner_->RunUntilIdle();
455
456 now_src_->AdvanceNowMicroseconds(100);
457 source_->DidFinishFrame(0);
458 now_src_->AdvanceNowMicroseconds(50);
459 EXPECT_BEGIN_FRAME_USED(*obs_, 1150, 1150 + kDeadline, kInterval);
460
461 EXPECT_TRUE(task_runner_->HasPendingTasks());
462 task_runner_->RunUntilIdle();
463 }
464
465 // SyntheticBeginFrameSource testing ------------------------------------------
466 class SyntheticBeginFrameSourceTest : public ::testing::Test {
467 public:
468 scoped_refptr<TestNowSource> now_src_;
469 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
470 scoped_ptr<TestSyntheticBeginFrameSource> source_;
471 scoped_ptr<MockBeginFrameObserver> obs_;
472
473 virtual void SetUp() OVERRIDE {
474 now_src_ = TestNowSource::Create(1000);
475 task_runner_ =
476 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
477 source_ = TestSyntheticBeginFrameSource::Create(
478 now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000));
479 obs_ = make_scoped_ptr(new MockBeginFrameObserver());
480 source_->AddObserver(obs_.get());
481 }
482
483 virtual void TearDown() OVERRIDE { obs_.reset(); }
484 };
485
486 TEST_F(SyntheticBeginFrameSourceTest,
487 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
488 now_src_->SetNowMicroseconds(10010);
489 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000, BeginFrameArgs::MISSED);
490 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
491 // No tasks should need to be run for this to occur.
492 }
493
494 TEST_F(SyntheticBeginFrameSourceTest,
495 SetNeedsBeginFramesCallsCausesOnBeginFrame) {
496 source_->SetNeedsBeginFrames(true);
497 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
498
499 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
500 now_src_->SetNowMicroseconds(10010);
501 task_runner_->RunPendingTasks();
502 }
503
504 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
505 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
506
507 source_->SetNeedsBeginFrames(true);
508 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
509 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000);
510 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000);
511 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
512
513 source_->SetNeedsBeginFrames(false);
514 // No new frames....
515 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
516 }
517
518 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
519 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
520 source_->SetNeedsBeginFrames(true);
521
522 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
523 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000);
524 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000);
525 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
526
527 // Update the vsync information
528 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
529 base::TimeDelta::FromMicroseconds(10001));
530
531 EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001);
532 EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001);
533 EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001);
534 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
535 }
536
537 // BeginFrameSourceMultiplexer testing -----------------------------------
538 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
539 protected:
540 virtual void SetUp() OVERRIDE {
541 mux_ = BeginFrameSourceMultiplexer::Create();
542
543 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
544 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
545 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
546
547 source1_ = source1_store_.get();
548 source2_ = source2_store_.get();
549 source3_ = source3_store_.get();
550 }
551
552 virtual void TearDown() OVERRIDE {
553 // Make sure the mux is torn down before the sources.
554 mux_.reset();
555 }
556
557 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
558 FakeBeginFrameSource* source1_;
559 FakeBeginFrameSource* source2_;
560 FakeBeginFrameSource* source3_;
561
562 private:
563 scoped_ptr<FakeBeginFrameSource> source1_store_;
564 scoped_ptr<FakeBeginFrameSource> source2_store_;
565 scoped_ptr<FakeBeginFrameSource> source3_store_;
566 };
567
568 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
569 EXPECT_EQ(NULL, mux_->ActiveSource());
570
571 mux_->AddSource(source1_);
572 EXPECT_EQ(source1_, mux_->ActiveSource());
573
574 mux_->SetActiveSource(NULL);
575 EXPECT_EQ(NULL, mux_->ActiveSource());
576
577 mux_->SetActiveSource(source1_);
578
579 #ifndef NDEBUG
580 // Setting a source which isn't in the mux as active should DCHECK fail.
581 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
582
583 // Adding a source which is already added should DCHECK fail.
584 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
585
586 // Removing a source which isn't in the mux should DCHECK fail.
587 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
588
589 // Removing the active source fails
590 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
591 #endif
592
593 // Test manipulation doesn't segfault.
594 mux_->AddSource(source2_);
595 mux_->RemoveSource(source2_);
596
597 mux_->AddSource(source2_);
598 mux_->SetActiveSource(source2_);
599 EXPECT_EQ(source2_, mux_->ActiveSource());
600
601 mux_->RemoveSource(source1_);
602 }
603
604 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
605 mux_->AddSource(source1_);
606 mux_->AddSource(source2_);
607 mux_->SetActiveSource(source1_);
608 EXPECT_EQ(source1_->needs_begin_frames_, false);
609 EXPECT_EQ(source2_->needs_begin_frames_, false);
610
611 // Check SetNeedsFrames works
612 mux_->SetNeedsBeginFrames(true);
613 EXPECT_EQ(source1_->needs_begin_frames_, true);
614 EXPECT_EQ(source2_->needs_begin_frames_, false);
615
616 mux_->SetNeedsBeginFrames(false);
617 EXPECT_EQ(source1_->needs_begin_frames_, false);
618 EXPECT_EQ(source2_->needs_begin_frames_, false);
619
620 // Checking that switching the source makes SetNeedsFrames on the
621 // subsources correctly.
622 mux_->SetNeedsBeginFrames(true);
623
624 mux_->SetActiveSource(source1_);
625 EXPECT_EQ(source1_->needs_begin_frames_, true);
626 EXPECT_EQ(source2_->needs_begin_frames_, false);
627
628 mux_->SetActiveSource(source2_);
629 EXPECT_EQ(source1_->needs_begin_frames_, false);
630 EXPECT_EQ(source2_->needs_begin_frames_, true);
631 }
632
633 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
634 mux_->AddSource(source1_);
635 mux_->AddSource(source2_);
636 mux_->SetActiveSource(source1_);
637
638 MockBeginFrameObserver obs;
639 mux_->AddObserver(&obs);
640 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
641 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
642
643 mux_->SetActiveSource(source1_);
644
645 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
646 SEND_BEGIN_FRAME_DROP(*source2_, 200, 500, 300);
647
648 mux_->SetActiveSource(source2_);
649 SEND_BEGIN_FRAME_USED(*source2_, 400, 600, 300);
650 SEND_BEGIN_FRAME_DROP(*source1_, 500, 700, 300);
651 }
652
653 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
654 mux_->AddSource(source1_);
655 mux_->AddSource(source2_);
656
657 MockBeginFrameObserver obs;
658 mux_->AddObserver(&obs);
659 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
660 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
661 EXPECT_BEGIN_FRAME_USED(obs, 1000, 1200, 300);
662 EXPECT_BEGIN_FRAME_USED(obs, 1001, 1201, 301);
663
664 mux_->SetActiveSource(source1_);
665 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
666 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
667
668 mux_->SetActiveSource(source2_);
669 SEND_BEGIN_FRAME_DROP(*source2_, 699, 899, 300);
670 SEND_BEGIN_FRAME_USED(*source2_, 1000, 1200, 300);
671
672 mux_->SetActiveSource(source1_);
673 SEND_BEGIN_FRAME_USED(*source1_, 1001, 1201, 301);
674 }
675
676 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) {
677 #ifndef NDEBUG
678 EXPECT_DEATH(
679 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
680 "");
681 #endif
682 }
683
684 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) {
685 mux_->SetMinimumInterval(base::TimeDelta());
686 mux_->AddSource(source1_);
687
688 MockBeginFrameObserver obs;
689 mux_->AddObserver(&obs);
690 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
691 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
692 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
693
694 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
695 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
696 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
697 }
698
699 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) {
700 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
701 mux_->AddSource(source1_);
702
703 MockBeginFrameObserver obs;
704 mux_->AddObserver(&obs);
705 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
706 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
707
708 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
709 SEND_BEGIN_FRAME_DROP(*source1_, 400, 600, 300);
710 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
711 }
712
713 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) {
714 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
715 mux_->AddSource(source1_);
716 mux_->AddSource(source2_);
717
718 MockBeginFrameObserver obs;
719 mux_->AddObserver(&obs);
720 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
721 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
722 EXPECT_BEGIN_FRAME_USED(obs, 1050, 1250, 300);
723
724 mux_->SetActiveSource(source1_);
725 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
726 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
727
728 mux_->SetActiveSource(source2_);
729 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300);
730 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300);
731
732 mux_->SetActiveSource(source1_);
733 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300);
734 }
735
736 } // namespace
737 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698