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

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

Powered by Google App Engine
This is Rietveld 408576698