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

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: Small fix. Created 6 years, 3 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 ::testing::Mock::VerifyAndClearExpectations(&obs);
113 }
114
115 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) {
116 ::testing::NiceMock<MockBeginFrameObserver> obs;
117 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
118 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300);
119 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300);
120 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
121
122 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
123 MockBeginFrameObserver::kDefaultBeginFrameArgs);
124
125 // Used
126 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300));
127 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
128 CreateBeginFrameArgsForTesting(100, 200, 300));
129
130 // Dropped
131 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300));
132 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
133 CreateBeginFrameArgsForTesting(100, 200, 300));
134
135 // Dropped
136 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300));
137 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
138 CreateBeginFrameArgsForTesting(100, 200, 300));
139
140 // Used
141 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300));
142 EXPECT_EQ(obs.LastUsedBeginFrameArgs(),
143 CreateBeginFrameArgsForTesting(700, 900, 300));
144
145 ::testing::Mock::VerifyAndClearExpectations(&obs);
146 }
147
148 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs =
149 CreateBeginFrameArgsForTesting(-1, -1, -1);
150
151 // BeginFrameSource testing ----------------------------------------------
152 TEST(BeginFrameSourceTest, ObserverManipulation) {
153 MockBeginFrameObserver obs;
154 MockBeginFrameObserver otherObs;
155 FakeBeginFrameSource source;
156
157 source.AddObserver(&obs);
158 EXPECT_EQ(&obs, source.GetObserver());
159
160 #ifndef NDEBUG
161 // Adding an observer when an observer already exists should DCHECK fail.
162 EXPECT_DEATH({ source.AddObserver(&otherObs); }, "");
163
164 // Removing wrong observer should DCHECK fail.
165 EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, "");
166
167 // Removing an observer when there is no observer should DCHECK fail.
168 EXPECT_DEATH({
169 source.RemoveObserver(&obs);
170 source.RemoveObserver(&obs);
171 },
172 "");
173 #endif
174 source.RemoveObserver(&obs);
175
176 source.AddObserver(&otherObs);
177 EXPECT_EQ(&otherObs, source.GetObserver());
178 source.RemoveObserver(&otherObs);
179 }
180
181 TEST(BeginFrameSourceTest, Observer) {
182 FakeBeginFrameSource source;
183 MockBeginFrameObserver obs;
184 source.AddObserver(&obs);
185 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
186 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300);
187 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300);
188 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
189
190 SEND_BEGIN_FRAME_USED(source, 100, 200, 300);
191 SEND_BEGIN_FRAME_DROP(source, 400, 600, 300);
192 SEND_BEGIN_FRAME_DROP(source, 450, 650, 300);
193 SEND_BEGIN_FRAME_USED(source, 700, 900, 300);
194 }
195
196 TEST(BeginFrameSourceTest, NoObserver) {
197 FakeBeginFrameSource source;
198 SEND_BEGIN_FRAME_DROP(source, 100, 200, 300);
199 }
200
201 class LoopingBeginFrameObserver : public BeginFrameObserverMixIn {
202 public:
203 BeginFrameSource* source_;
204
205 virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE {
206 dict->SetString("type", "LoopingBeginFrameObserver");
207 dict->BeginDictionary("source");
208 source_->AsValueInto(dict);
209 dict->EndDictionary();
210 }
211
212 protected:
213 // BeginFrameObserverMixIn
214 virtual bool ProcessBeginFrameArgs(const BeginFrameArgs& args) OVERRIDE {
215 return true;
216 }
217 };
218
219 TEST(BeginFrameSourceTest, DetectAsValueIntoLoop) {
220 LoopingBeginFrameObserver obs;
221 FakeBeginFrameSource source;
222
223 obs.source_ = &source;
224 source.AddObserver(&obs);
225
226 scoped_refptr<base::debug::TracedValue> state =
227 new base::debug::TracedValue();
228 source.AsValueInto(state.get());
229 }
230
231 // BackToBackBeginFrameSource testing -----------------------------------------
232 class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource {
233 public:
234 static scoped_ptr<TestBackToBackBeginFrameSource> Create(
235 scoped_refptr<TestNowSource> now_src,
236 base::SingleThreadTaskRunner* task_runner) {
237 return make_scoped_ptr(
238 new TestBackToBackBeginFrameSource(now_src, task_runner));
239 }
240
241 protected:
242 TestBackToBackBeginFrameSource(scoped_refptr<TestNowSource> now_src,
243 base::SingleThreadTaskRunner* task_runner)
244 : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {}
245
246 virtual base::TimeTicks Now() OVERRIDE { return now_src_->Now(); }
247
248 scoped_refptr<TestNowSource> now_src_;
249 };
250
251 class BackToBackBeginFrameSourceTest : public ::testing::Test {
252 public:
253 static const int64_t kDeadline;
254 static const int64_t kInterval;
255
256 scoped_refptr<TestNowSource> now_src_;
257 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
258 scoped_ptr<TestBackToBackBeginFrameSource> source_;
259 scoped_ptr<MockBeginFrameObserver> obs_;
260
261 virtual void SetUp() OVERRIDE {
262 now_src_ = TestNowSource::Create(1000);
263 task_runner_ =
264 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
265 task_runner_->SetRunTaskLimit(1);
266 source_ =
267 TestBackToBackBeginFrameSource::Create(now_src_, task_runner_.get());
268 obs_ = make_scoped_ptr(new ::testing::StrictMock<MockBeginFrameObserver>());
269 source_->AddObserver(obs_.get());
270 }
271
272 virtual void TearDown() OVERRIDE { obs_.reset(); }
273 };
274
275 const int64_t BackToBackBeginFrameSourceTest::kDeadline =
276 BeginFrameArgs::DefaultInterval().ToInternalValue();
277
278 const int64_t BackToBackBeginFrameSourceTest::kInterval =
279 BeginFrameArgs::DefaultInterval().ToInternalValue();
280
281 TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) {
282 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
283 source_->SetNeedsBeginFrames(true);
284 EXPECT_TRUE(task_runner_->HasPendingTasks());
285 task_runner_->RunUntilIdle();
286
287 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
288 now_src_->AdvanceNowMicroseconds(100);
289 source_->DidFinishFrame(0);
290 task_runner_->RunUntilIdle();
291 }
292
293 TEST_F(BackToBackBeginFrameSourceTest,
294 DidFinishFrameThenSetNeedsBeginFramesProducesNoFrame) {
295 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
296 source_->SetNeedsBeginFrames(true);
297 task_runner_->RunUntilIdle();
298
299 source_->SetNeedsBeginFrames(false);
300 source_->DidFinishFrame(0);
301
302 EXPECT_FALSE(task_runner_->HasPendingTasks());
303 }
304
305 TEST_F(BackToBackBeginFrameSourceTest,
306 SetNeedsBeginFramesThenDidFinishFrameProducesNoFrame) {
307 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
308 source_->SetNeedsBeginFrames(true);
309 task_runner_->RunUntilIdle();
310
311 now_src_->AdvanceNowMicroseconds(100);
312 source_->DidFinishFrame(0);
313 source_->SetNeedsBeginFrames(false);
314
315 EXPECT_TRUE(task_runner_->HasPendingTasks());
316 task_runner_->RunUntilIdle();
317 }
318
319 TEST_F(BackToBackBeginFrameSourceTest,
320 DidFinishFrameThenTogglingSetNeedsBeginFramesProducesCorrectFrame) {
321 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
322 source_->SetNeedsBeginFrames(true);
323 task_runner_->RunUntilIdle();
324
325 now_src_->AdvanceNowMicroseconds(100);
326
327 source_->SetNeedsBeginFrames(false);
328 now_src_->AdvanceNowMicroseconds(10);
329 source_->DidFinishFrame(0);
330 now_src_->AdvanceNowMicroseconds(10);
331 source_->SetNeedsBeginFrames(false);
332 now_src_->AdvanceNowMicroseconds(10);
333 source_->SetNeedsBeginFrames(true);
334
335 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
336 EXPECT_TRUE(task_runner_->HasPendingTasks());
337 task_runner_->RunUntilIdle();
338 }
339
340 TEST_F(BackToBackBeginFrameSourceTest,
341 TogglingSetNeedsBeginFramesThenDidFinishFrameProducesCorrectFrame) {
342 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
343 source_->SetNeedsBeginFrames(true);
344 task_runner_->RunUntilIdle();
345
346 now_src_->AdvanceNowMicroseconds(100);
347 source_->DidFinishFrame(0);
348 now_src_->AdvanceNowMicroseconds(10);
349 source_->SetNeedsBeginFrames(false);
350 now_src_->AdvanceNowMicroseconds(10);
351 source_->SetNeedsBeginFrames(true);
352 now_src_->AdvanceNowMicroseconds(10);
353
354 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval);
355 EXPECT_TRUE(task_runner_->HasPendingTasks());
356 task_runner_->RunUntilIdle();
357 }
358
359 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNeedsBeginFrameFalse) {
360 source_->SetNeedsBeginFrames(false);
361 source_->DidFinishFrame(0);
362 EXPECT_FALSE(task_runner_->RunPendingTasks());
363 }
364
365 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
366 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
367 source_->SetNeedsBeginFrames(true);
368 task_runner_->RunUntilIdle();
369
370 now_src_->AdvanceNowMicroseconds(100);
371
372 source_->DidFinishFrame(3);
373 EXPECT_FALSE(task_runner_->HasPendingTasks());
374 source_->DidFinishFrame(2);
375 EXPECT_FALSE(task_runner_->HasPendingTasks());
376 source_->DidFinishFrame(1);
377 EXPECT_FALSE(task_runner_->HasPendingTasks());
378
379 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
380 source_->DidFinishFrame(0);
381 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
382 task_runner_->RunUntilIdle();
383 }
384
385 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) {
386 source_->SetNeedsBeginFrames(true);
387 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
388 task_runner_->RunUntilIdle();
389
390 now_src_->AdvanceNowMicroseconds(100);
391 source_->DidFinishFrame(0);
392 source_->DidFinishFrame(0);
393 source_->DidFinishFrame(0);
394 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval);
395 task_runner_->RunUntilIdle();
396
397 now_src_->AdvanceNowMicroseconds(100);
398 source_->DidFinishFrame(0);
399 source_->DidFinishFrame(0);
400 source_->DidFinishFrame(0);
401 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval);
402 task_runner_->RunUntilIdle();
403 }
404
405 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
406 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval);
407 source_->SetNeedsBeginFrames(true);
408 task_runner_->RunUntilIdle();
409
410 now_src_->AdvanceNowMicroseconds(100);
411 source_->DidFinishFrame(0);
412 now_src_->AdvanceNowMicroseconds(50);
413 EXPECT_BEGIN_FRAME_USED(*obs_, 1150, 1150 + kDeadline, kInterval);
414
415 EXPECT_TRUE(task_runner_->HasPendingTasks());
416 task_runner_->RunUntilIdle();
417 }
418
419 // SyntheticBeginFrameSource testing ------------------------------------------
420 class SyntheticBeginFrameSourceTest : public ::testing::Test {
421 public:
422 scoped_refptr<TestNowSource> now_src_;
423 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
424 scoped_ptr<TestSyntheticBeginFrameSource> source_;
425 scoped_ptr<MockBeginFrameObserver> obs_;
426
427 virtual void SetUp() OVERRIDE {
428 now_src_ = TestNowSource::Create(1000);
429 task_runner_ =
430 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
431 source_ = TestSyntheticBeginFrameSource::Create(
432 now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000));
433 obs_ = make_scoped_ptr(new MockBeginFrameObserver());
434 source_->AddObserver(obs_.get());
435 }
436
437 virtual void TearDown() OVERRIDE { obs_.reset(); }
438 };
439
440 TEST_F(SyntheticBeginFrameSourceTest,
441 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
442 now_src_->SetNowMicroseconds(10010);
443 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
444 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
445 // No tasks should need to be run for this to occur.
446 }
447
448 TEST_F(SyntheticBeginFrameSourceTest,
449 SetNeedsBeginFramesCallsCausesOnBeginFrame) {
450 source_->SetNeedsBeginFrames(true);
451 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
452
453 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
454 now_src_->SetNowMicroseconds(10010);
455 task_runner_->RunPendingTasks();
456 }
457
458 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
459 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
460
461 source_->SetNeedsBeginFrames(true);
462 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
463 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000);
464 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000);
465 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
466
467 source_->SetNeedsBeginFrames(false);
468 // No new frames....
469 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
470 }
471
472 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
473 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
474 source_->SetNeedsBeginFrames(true);
475
476 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000);
477 EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000);
478 EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000);
479 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
480
481 // Update the vsync information
482 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
483 base::TimeDelta::FromMicroseconds(10001));
484
485 EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001);
486 EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001);
487 EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001);
488 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
489 }
490
491 // BeginFrameSourceMultiplexer testing -----------------------------------
492 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
493 protected:
494 virtual void SetUp() OVERRIDE {
495 mux_ = BeginFrameSourceMultiplexer::Create();
496
497 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
498 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
499 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
500
501 source1_ = source1_store_.get();
502 source2_ = source2_store_.get();
503 source3_ = source3_store_.get();
504 }
505
506 virtual void TearDown() OVERRIDE {
507 // Make sure the mux is torn down before the sources.
508 mux_.reset();
509 }
510
511 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
512 FakeBeginFrameSource* source1_;
513 FakeBeginFrameSource* source2_;
514 FakeBeginFrameSource* source3_;
515
516 private:
517 scoped_ptr<FakeBeginFrameSource> source1_store_;
518 scoped_ptr<FakeBeginFrameSource> source2_store_;
519 scoped_ptr<FakeBeginFrameSource> source3_store_;
520 };
521
522 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
523 EXPECT_EQ(NULL, mux_->ActiveSource());
524
525 mux_->AddSource(source1_);
526 EXPECT_EQ(source1_, mux_->ActiveSource());
527
528 mux_->SetActiveSource(NULL);
529 EXPECT_EQ(NULL, mux_->ActiveSource());
530
531 mux_->SetActiveSource(source1_);
532
533 #ifndef NDEBUG
534 // Setting a source which isn't in the mux as active should DCHECK fail.
535 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
536
537 // Adding a source which is already added should DCHECK fail.
538 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
539
540 // Removing a source which isn't in the mux should DCHECK fail.
541 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
542
543 // Removing the active source fails
544 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
545 #endif
546
547 // Test manipulation doesn't segfault.
548 mux_->AddSource(source2_);
549 mux_->RemoveSource(source2_);
550
551 mux_->AddSource(source2_);
552 mux_->SetActiveSource(source2_);
553 EXPECT_EQ(source2_, mux_->ActiveSource());
554
555 mux_->RemoveSource(source1_);
556 }
557
558 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
559 mux_->AddSource(source1_);
560 mux_->AddSource(source2_);
561 mux_->SetActiveSource(source1_);
562 EXPECT_EQ(source1_->needs_begin_frames_, false);
563 EXPECT_EQ(source2_->needs_begin_frames_, false);
564
565 // Check SetNeedsFrames works
566 mux_->SetNeedsBeginFrames(true);
567 EXPECT_EQ(source1_->needs_begin_frames_, true);
568 EXPECT_EQ(source2_->needs_begin_frames_, false);
569
570 mux_->SetNeedsBeginFrames(false);
571 EXPECT_EQ(source1_->needs_begin_frames_, false);
572 EXPECT_EQ(source2_->needs_begin_frames_, false);
573
574 // Checking that switching the source makes SetNeedsFrames on the
575 // subsources correctly.
576 mux_->SetNeedsBeginFrames(true);
577
578 mux_->SetActiveSource(source1_);
579 EXPECT_EQ(source1_->needs_begin_frames_, true);
580 EXPECT_EQ(source2_->needs_begin_frames_, false);
581
582 mux_->SetActiveSource(source2_);
583 EXPECT_EQ(source1_->needs_begin_frames_, false);
584 EXPECT_EQ(source2_->needs_begin_frames_, true);
585 }
586
587 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
588 mux_->AddSource(source1_);
589 mux_->AddSource(source2_);
590 mux_->SetActiveSource(source1_);
591
592 MockBeginFrameObserver obs;
593 mux_->AddObserver(&obs);
594 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
595 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
596
597 mux_->SetActiveSource(source1_);
598
599 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
600 SEND_BEGIN_FRAME_DROP(*source2_, 200, 500, 300);
601
602 mux_->SetActiveSource(source2_);
603 SEND_BEGIN_FRAME_USED(*source2_, 400, 600, 300);
604 SEND_BEGIN_FRAME_DROP(*source1_, 500, 700, 300);
605 }
606
607 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
608 mux_->AddSource(source1_);
609 mux_->AddSource(source2_);
610
611 MockBeginFrameObserver obs;
612 mux_->AddObserver(&obs);
613 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
614 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
615 EXPECT_BEGIN_FRAME_USED(obs, 1000, 1200, 300);
616 EXPECT_BEGIN_FRAME_USED(obs, 1001, 1201, 301);
617
618 mux_->SetActiveSource(source1_);
619 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
620 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
621
622 mux_->SetActiveSource(source2_);
623 SEND_BEGIN_FRAME_DROP(*source2_, 699, 899, 300);
624 SEND_BEGIN_FRAME_USED(*source2_, 1000, 1200, 300);
625
626 mux_->SetActiveSource(source1_);
627 SEND_BEGIN_FRAME_USED(*source1_, 1001, 1201, 301);
628 }
629
630 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) {
631 #ifndef NDEBUG
632 EXPECT_DEATH(
633 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
634 "");
635 #endif
636 }
637
638 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) {
639 mux_->SetMinimumInterval(base::TimeDelta());
640 mux_->AddSource(source1_);
641
642 MockBeginFrameObserver obs;
643 mux_->AddObserver(&obs);
644 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
645 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
646 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
647
648 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
649 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
650 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
651 }
652
653 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) {
654 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
655 mux_->AddSource(source1_);
656
657 MockBeginFrameObserver obs;
658 mux_->AddObserver(&obs);
659 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300);
660 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
661
662 SEND_BEGIN_FRAME_USED(*source1_, 100, 200, 300);
663 SEND_BEGIN_FRAME_DROP(*source1_, 400, 600, 300);
664 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
665 }
666
667 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) {
668 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
669 mux_->AddSource(source1_);
670 mux_->AddSource(source2_);
671
672 MockBeginFrameObserver obs;
673 mux_->AddObserver(&obs);
674 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300);
675 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300);
676 EXPECT_BEGIN_FRAME_USED(obs, 1050, 1250, 300);
677
678 mux_->SetActiveSource(source1_);
679 SEND_BEGIN_FRAME_USED(*source1_, 400, 600, 300);
680 SEND_BEGIN_FRAME_USED(*source1_, 700, 900, 300);
681
682 mux_->SetActiveSource(source2_);
683 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300);
684 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300);
685
686 mux_->SetActiveSource(source1_);
687 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300);
688 }
689
690 } // namespace
691 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698