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

Side by Side Diff: cc/scheduler/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: Fixing as per Brian's comments. 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/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(obs, ...) \
17 { \
18 ::testing::Expectation exp = \
19 EXPECT_CALL(obs, \
20 OnBeginFrame(CreateBeginFrameArgsForTesting(__VA_ARGS__))) \
21 .InSequence(obs.sequence); \
22 BeginFrameArgs args = CreateBeginFrameArgsForTesting(__VA_ARGS__); \
23 EXPECT_CALL(obs, LastBeginFrameArgs()) \
24 .Times(::testing::AnyNumber()) \
25 .After(exp) \
26 .WillRepeatedly(::testing::ReturnRefOfCopy(args)); \
27 }
28
29 #define EXPECT_BEGIN_FRAME_P(obs_ptr, ...) \
30 EXPECT_BEGIN_FRAME((*obs_ptr), __VA_ARGS__);
31
32 #define SEND_BEGIN_FRAME(source, ...) \
33 source.TestSendBeginFrame(CreateBeginFrameArgsForTesting(__VA_ARGS__));
34
35 #define SEND_BEGIN_FRAME_P(source, ...) \
36 SEND_BEGIN_FRAME((*source), __VA_ARGS__);
37
38 namespace cc {
39 namespace {
40
41 class MockBeginFrameObserver : public BeginFrameObserver {
42 public:
43 MOCK_METHOD1(OnBeginFrame, void(const BeginFrameArgs&));
44 MOCK_CONST_METHOD0(LastBeginFrameArgs, const BeginFrameArgs&());
45 // MOCK_CONST_METHOD0(AsValueInto, void(base::debug::TracedValue*));
46
47 virtual void AsValueInto(base::debug::TracedValue* dict) const {
48 dict->SetString("type", "MockBeginFrameObserver");
49 dict->BeginDictionary("last_begin_frame_args");
50 LastBeginFrameArgs().AsValueInto(dict);
51 dict->EndDictionary();
52 }
53
54 static const BeginFrameArgs kDefaultBeginFrameArgs;
55 MockBeginFrameObserver() {
56 // Set a "default" value returned by LastBeginFrameArgs so that gMock
57 // doesn't fail an assert and instead returns useful information.
58 EXPECT_CALL(*this, LastBeginFrameArgs())
59 .Times(::testing::AnyNumber())
60 .InSequence(sequence)
61 .WillRepeatedly(::testing::ReturnRef(kDefaultBeginFrameArgs));
62 }
63 virtual ~MockBeginFrameObserver() {}
64
65 ::testing::Sequence sequence;
66 };
67
68 TEST(MockBeginFrameObserverTest, Basic) {
69 ::testing::NiceMock<MockBeginFrameObserver> obs;
70 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
71 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
72 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
73
74 EXPECT_EQ(obs.LastBeginFrameArgs(),
75 MockBeginFrameObserver::kDefaultBeginFrameArgs);
76
77 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
78 100, 200, 300)); // One call to LastBeginFrameArgs
79 EXPECT_EQ(obs.LastBeginFrameArgs(),
80 CreateBeginFrameArgsForTesting(100, 200, 300));
81
82 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
83 400, 600, 300)); // Multiple calls to LastBeginFrameArgs
84 EXPECT_EQ(obs.LastBeginFrameArgs(),
85 CreateBeginFrameArgsForTesting(400, 600, 300));
86 EXPECT_EQ(obs.LastBeginFrameArgs(),
87 CreateBeginFrameArgsForTesting(400, 600, 300));
88
89 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(
90 700, 900, 300)); // No calls to LastBeginFrameArgs
91
92 ::testing::Mock::VerifyAndClearExpectations(&obs);
93 }
94
95 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs =
96 CreateBeginFrameArgsForTesting(-1, -1, -1);
97
98 // BeginFrameSource testing ----------------------------------------------
99 TEST(BeginFrameSourceTest, Observer) {
100 MockBeginFrameObserver obs;
101 MockBeginFrameObserver otherObs;
102 FakeBeginFrameSource source;
103
104 source.AddObserver(&obs);
105 EXPECT_EQ(&obs, source.GetObserver());
106
107 #ifndef NDEBUG
108 // Adding an observer when an observer already exists should DCHECK fail.
109 EXPECT_DEATH({ source.AddObserver(&otherObs); }, "");
110
111 // Removing wrong observer should DCHECK fail.
112 EXPECT_DEATH({ source.RemoveObserver(&otherObs); }, "");
113
114 // Removing an observer when there is no observer should DCHECK fail.
115 EXPECT_DEATH({
116 source.RemoveObserver(&obs);
117 source.RemoveObserver(&obs);
118 },
119 "");
120 #endif
121 source.RemoveObserver(&obs);
122
123 source.AddObserver(&otherObs);
124 EXPECT_EQ(&otherObs, source.GetObserver());
125 source.RemoveObserver(&otherObs);
126 }
127
128 class LoopingBeginFrameObserver : public BeginFrameObserver {
129 public:
130 BeginFrameArgs args_;
131 BeginFrameSource* source_;
132
133 virtual const BeginFrameArgs& LastBeginFrameArgs() const OVERRIDE {
134 return args_;
135 };
136 virtual void OnBeginFrame(const BeginFrameArgs& args) OVERRIDE{};
137
138 virtual void AsValueInto(base::debug::TracedValue* dict) const OVERRIDE {
139 dict->SetString("type", "LoopingBeginFrameObserver");
140 dict->BeginDictionary("source");
141 source_->AsValueInto(dict);
142 dict->EndDictionary();
143 }
144 };
145
146 TEST(BeginFrameSourceTest, DetectAsValueIntoLoop) {
147 LoopingBeginFrameObserver obs;
148 FakeBeginFrameSource source;
149
150 obs.source_ = &source;
151 source.AddObserver(&obs);
152
153 scoped_refptr<base::debug::TracedValue> state =
154 new base::debug::TracedValue();
155 source.AsValueInto(state.get());
156 }
157
158 // BackToBackBeginFrameSource testing -----------------------------------------
159 class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource {
160 public:
161 static scoped_ptr<TestBackToBackBeginFrameSource> Create(
162 scoped_refptr<TestNowSource> now_src,
163 base::SingleThreadTaskRunner* task_runner) {
164 return make_scoped_ptr(
165 new TestBackToBackBeginFrameSource(now_src, task_runner));
166 }
167
168 protected:
169 TestBackToBackBeginFrameSource(scoped_refptr<TestNowSource> now_src,
170 base::SingleThreadTaskRunner* task_runner)
171 : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {}
172
173 virtual base::TimeTicks Now() OVERRIDE { return now_src_->Now(); }
174
175 scoped_refptr<TestNowSource> now_src_;
176 };
177
178 class BackToBackBeginFrameSourceTest : public ::testing::Test {
179 public:
180 static int64_t kDeadline;
181 static int64_t kInterval;
182
183 scoped_refptr<TestNowSource> now_src_;
184 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
185 scoped_ptr<TestBackToBackBeginFrameSource> source_;
186 scoped_ptr<MockBeginFrameObserver> obs_;
187
188 virtual void SetUp() OVERRIDE {
189 now_src_ = TestNowSource::Create(1000);
190 task_runner_ =
191 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
192 task_runner_->SetRunTaskLimit(1);
193 source_ =
194 TestBackToBackBeginFrameSource::Create(now_src_, task_runner_.get());
195 obs_ = make_scoped_ptr(new ::testing::StrictMock<MockBeginFrameObserver>());
196 source_->AddObserver(obs_.get());
197 }
198
199 virtual void TearDown() OVERRIDE { obs_.reset(); }
200 };
201
202 int64_t BackToBackBeginFrameSourceTest::kDeadline =
203 BeginFrameArgs::DefaultInterval().ToInternalValue();
204
205 int64_t BackToBackBeginFrameSourceTest::kInterval =
206 BeginFrameArgs::DefaultInterval().ToInternalValue();
207
208 TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) {
209 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
210 source_->SetNeedsBeginFrames(true);
211 EXPECT_TRUE(task_runner_->HasPendingTasks());
212 task_runner_->RunUntilIdle();
213
214 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kInterval);
215 now_src_->AdvanceNowMicroseconds(100);
216 source_->DidFinishFrame(0);
217 task_runner_->RunUntilIdle();
218 }
219
220 TEST_F(BackToBackBeginFrameSourceTest,
221 DidFinishFrameThenSetNeedsBeginFramesProducesNoFrame) {
222 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
223 source_->SetNeedsBeginFrames(true);
224 task_runner_->RunUntilIdle();
225
226 source_->SetNeedsBeginFrames(false);
227 source_->DidFinishFrame(0);
228
229 EXPECT_FALSE(task_runner_->HasPendingTasks());
230 }
231
232 TEST_F(BackToBackBeginFrameSourceTest,
233 SetNeedsBeginFramesThenDidFinishFrameProducesNoFrame) {
234 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
235 source_->SetNeedsBeginFrames(true);
236 task_runner_->RunUntilIdle();
237
238 now_src_->AdvanceNowMicroseconds(100);
239 source_->DidFinishFrame(0);
240 source_->SetNeedsBeginFrames(false);
241
242 EXPECT_TRUE(task_runner_->HasPendingTasks());
243 task_runner_->RunUntilIdle();
244 }
245
246 TEST_F(BackToBackBeginFrameSourceTest,
247 DidFinishFrameThenTogglingSetNeedsBeginFramesProducesCorrectFrame) {
248 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
249 source_->SetNeedsBeginFrames(true);
250 task_runner_->RunUntilIdle();
251
252 now_src_->AdvanceNowMicroseconds(100);
253
254 source_->SetNeedsBeginFrames(false);
255 now_src_->AdvanceNowMicroseconds(10);
256 source_->DidFinishFrame(0);
257 now_src_->AdvanceNowMicroseconds(10);
258 source_->SetNeedsBeginFrames(false);
259 now_src_->AdvanceNowMicroseconds(10);
260 source_->SetNeedsBeginFrames(true);
261
262 EXPECT_BEGIN_FRAME_P(obs_, 1130, 1130 + kDeadline, kInterval);
263 EXPECT_TRUE(task_runner_->HasPendingTasks());
264 task_runner_->RunUntilIdle();
265 }
266
267 TEST_F(BackToBackBeginFrameSourceTest,
268 TogglingSetNeedsBeginFramesThenDidFinishFrameProducesCorrectFrame) {
269 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
270 source_->SetNeedsBeginFrames(true);
271 task_runner_->RunUntilIdle();
272
273 now_src_->AdvanceNowMicroseconds(100);
274 source_->DidFinishFrame(0);
275 now_src_->AdvanceNowMicroseconds(10);
276 source_->SetNeedsBeginFrames(false);
277 now_src_->AdvanceNowMicroseconds(10);
278 source_->SetNeedsBeginFrames(true);
279 now_src_->AdvanceNowMicroseconds(10);
280
281 EXPECT_BEGIN_FRAME_P(obs_, 1130, 1130 + kDeadline, kInterval);
282 EXPECT_TRUE(task_runner_->HasPendingTasks());
283 task_runner_->RunUntilIdle();
284 }
285
286 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNeedsBeginFrameFalse) {
287 source_->SetNeedsBeginFrames(false);
288 source_->DidFinishFrame(0);
289 EXPECT_FALSE(task_runner_->RunPendingTasks());
290 }
291
292 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
293 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
294 source_->SetNeedsBeginFrames(true);
295 task_runner_->RunUntilIdle();
296
297 now_src_->AdvanceNowMicroseconds(100);
298
299 source_->DidFinishFrame(3);
300 EXPECT_FALSE(task_runner_->HasPendingTasks());
301 source_->DidFinishFrame(2);
302 EXPECT_FALSE(task_runner_->HasPendingTasks());
303 source_->DidFinishFrame(1);
304 EXPECT_FALSE(task_runner_->HasPendingTasks());
305
306 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kInterval);
307 source_->DidFinishFrame(0);
308 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
309 task_runner_->RunUntilIdle();
310 }
311
312 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) {
313 source_->SetNeedsBeginFrames(true);
314 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
315 task_runner_->RunUntilIdle();
316
317 now_src_->AdvanceNowMicroseconds(100);
318 source_->DidFinishFrame(0);
319 source_->DidFinishFrame(0);
320 source_->DidFinishFrame(0);
321 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kInterval);
322 task_runner_->RunUntilIdle();
323
324 now_src_->AdvanceNowMicroseconds(100);
325 source_->DidFinishFrame(0);
326 source_->DidFinishFrame(0);
327 source_->DidFinishFrame(0);
328 EXPECT_BEGIN_FRAME_P(obs_, 1200, 1200 + kDeadline, kInterval);
329 task_runner_->RunUntilIdle();
330 }
331
332 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) {
333 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kInterval);
334 source_->SetNeedsBeginFrames(true);
335 task_runner_->RunUntilIdle();
336
337 now_src_->AdvanceNowMicroseconds(100);
338 source_->DidFinishFrame(0);
339 now_src_->AdvanceNowMicroseconds(50);
340 EXPECT_BEGIN_FRAME_P(obs_, 1150, 1150 + kDeadline, kInterval);
341
342 EXPECT_TRUE(task_runner_->HasPendingTasks());
343 task_runner_->RunUntilIdle();
344 }
345
346 // SyntheticBeginFrameSource testing ------------------------------------------
347 class SyntheticBeginFrameSourceTest : public ::testing::Test {
348 public:
349 scoped_refptr<TestNowSource> now_src_;
350 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
351 scoped_ptr<TestSyntheticBeginFrameSource> source_;
352 scoped_ptr<MockBeginFrameObserver> obs_;
353
354 virtual void SetUp() OVERRIDE {
355 now_src_ = TestNowSource::Create(1000);
356 task_runner_ =
357 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
358 source_ = TestSyntheticBeginFrameSource::Create(
359 now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000));
360 obs_ = make_scoped_ptr(new MockBeginFrameObserver());
361 source_->AddObserver(obs_.get());
362 }
363
364 virtual void TearDown() OVERRIDE { obs_.reset(); }
365 };
366
367 TEST_F(SyntheticBeginFrameSourceTest,
368 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
369 now_src_->SetNowMicroseconds(10010);
370 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
371 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
372 // No tasks should need to be run for this to occur.
373 }
374
375 TEST_F(SyntheticBeginFrameSourceTest,
376 SetNeedsBeginFramesCallsCausesOnBeginFrame) {
377 source_->SetNeedsBeginFrames(true);
378 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
379
380 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
381 now_src_->SetNowMicroseconds(10010);
382 task_runner_->RunPendingTasks();
383 }
384
385 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
386 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
387
388 source_->SetNeedsBeginFrames(true);
389 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
390 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
391 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
392 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
393
394 source_->SetNeedsBeginFrames(false);
395 // No new frames....
396 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
397 }
398
399 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
400 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
401 source_->SetNeedsBeginFrames(true);
402
403 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
404 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
405 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
406 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
407
408 // Update the vsync information
409 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
410 base::TimeDelta::FromMicroseconds(10001));
411
412 EXPECT_BEGIN_FRAME_P(obs_, 40000, 47502, 10001);
413 EXPECT_BEGIN_FRAME_P(obs_, 47502, 57503, 10001);
414 EXPECT_BEGIN_FRAME_P(obs_, 57503, 67504, 10001);
415 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
416 }
417
418 // BeginFrameSourceMultiplexer testing -----------------------------------
419 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
420 protected:
421 virtual void SetUp() OVERRIDE {
422 mux_ = BeginFrameSourceMultiplexer::Create();
423
424 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
425 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
426 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
427
428 source1_ = source1_store_.get();
429 source2_ = source2_store_.get();
430 source3_ = source3_store_.get();
431 }
432
433 virtual void TearDown() OVERRIDE {
434 // Make sure the mux is torn down before the sources.
435 mux_.reset();
436 }
437
438 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
439 FakeBeginFrameSource* source1_;
440 FakeBeginFrameSource* source2_;
441 FakeBeginFrameSource* source3_;
442
443 private:
444 scoped_ptr<FakeBeginFrameSource> source1_store_;
445 scoped_ptr<FakeBeginFrameSource> source2_store_;
446 scoped_ptr<FakeBeginFrameSource> source3_store_;
447 };
448
449 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
450 EXPECT_EQ(NULL, mux_->ActiveSource());
451
452 mux_->AddSource(source1_);
453 EXPECT_EQ(source1_, mux_->ActiveSource());
454
455 mux_->SetActiveSource(NULL);
456 EXPECT_EQ(NULL, mux_->ActiveSource());
457
458 mux_->SetActiveSource(source1_);
459
460 #ifndef NDEBUG
461 // Setting a source which isn't in the mux as active should DCHECK fail.
462 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
463
464 // Adding a source which is already added should DCHECK fail.
465 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
466
467 // Removing a source which isn't in the mux should DCHECK fail.
468 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
469
470 // Removing the active source fails
471 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
472 #endif
473
474 // Test manipulation doesn't segfault.
475 mux_->AddSource(source2_);
476 mux_->RemoveSource(source2_);
477
478 mux_->AddSource(source2_);
479 mux_->SetActiveSource(source2_);
480 EXPECT_EQ(source2_, mux_->ActiveSource());
481
482 mux_->RemoveSource(source1_);
483 }
484
485 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
486 mux_->AddSource(source1_);
487 mux_->AddSource(source2_);
488 mux_->SetActiveSource(source1_);
489 EXPECT_EQ(source1_->needs_begin_frames_, false);
490 EXPECT_EQ(source2_->needs_begin_frames_, false);
491
492 // Check SetNeedsFrames works
493 mux_->SetNeedsBeginFrames(true);
494 EXPECT_EQ(source1_->needs_begin_frames_, true);
495 EXPECT_EQ(source2_->needs_begin_frames_, false);
496
497 mux_->SetNeedsBeginFrames(false);
498 EXPECT_EQ(source1_->needs_begin_frames_, false);
499 EXPECT_EQ(source2_->needs_begin_frames_, false);
500
501 // Checking that switching the source makes SetNeedsFrames on the
502 // subsources correctly.
503 mux_->SetNeedsBeginFrames(true);
504
505 mux_->SetActiveSource(source1_);
506 EXPECT_EQ(source1_->needs_begin_frames_, true);
507 EXPECT_EQ(source2_->needs_begin_frames_, false);
508
509 mux_->SetActiveSource(source2_);
510 EXPECT_EQ(source1_->needs_begin_frames_, false);
511 EXPECT_EQ(source2_->needs_begin_frames_, true);
512 }
513
514 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
515 mux_->AddSource(source1_);
516 mux_->AddSource(source2_);
517 mux_->SetActiveSource(source1_);
518
519 MockBeginFrameObserver obs;
520 mux_->AddObserver(&obs);
521 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
522 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
523
524 mux_->SetActiveSource(source1_);
525
526 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
527 SEND_BEGIN_FRAME_P(source2_, 200, 500, 300); // Not received
528
529 mux_->SetActiveSource(source2_);
530 SEND_BEGIN_FRAME_P(source2_, 400, 600, 300);
531 SEND_BEGIN_FRAME_P(source1_, 500, 700, 300); // Not received
532 }
533
534 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
535 mux_->AddSource(source1_);
536 mux_->AddSource(source2_);
537
538 MockBeginFrameObserver obs;
539 mux_->AddObserver(&obs);
540 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
541 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
542 EXPECT_BEGIN_FRAME(obs, 1000, 1200, 300);
543 EXPECT_BEGIN_FRAME(obs, 1001, 1201, 301);
544
545 mux_->SetActiveSource(source1_);
546 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
547 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
548
549 mux_->SetActiveSource(source2_);
550 SEND_BEGIN_FRAME_P(source2_, 699, 899, 300); // Skipped
551 SEND_BEGIN_FRAME_P(source2_, 1000, 1200, 300);
552
553 mux_->SetActiveSource(source1_);
554 SEND_BEGIN_FRAME_P(source1_, 1001, 1201, 301);
555 }
556
557 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) {
558 #ifndef NDEBUG
559 EXPECT_DEATH(
560 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
561 "");
562 #endif
563 }
564
565 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) {
566 mux_->SetMinimumInterval(base::TimeDelta());
567 mux_->AddSource(source1_);
568
569 MockBeginFrameObserver obs;
570 mux_->AddObserver(&obs);
571 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
572 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
573 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
574
575 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
576 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
577 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
578 }
579
580 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) {
581 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
582 mux_->AddSource(source1_);
583
584 MockBeginFrameObserver obs;
585 mux_->AddObserver(&obs);
586 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
587 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
588
589 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
590 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300); // Skipped
591 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
592 }
593
594 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) {
595 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
596 mux_->AddSource(source1_);
597 mux_->AddSource(source2_);
598
599 MockBeginFrameObserver obs;
600 mux_->AddObserver(&obs);
601 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
602 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
603 EXPECT_BEGIN_FRAME(obs, 1050, 1250, 300);
604
605 mux_->SetActiveSource(source1_);
606 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
607 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
608
609 mux_->SetActiveSource(source2_);
610 SEND_BEGIN_FRAME_P(source2_, 750, 1050, 300); // Skipped
611 SEND_BEGIN_FRAME_P(source2_, 1050, 1250, 300);
612
613 mux_->SetActiveSource(source1_);
614 SEND_BEGIN_FRAME_P(source2_, 1100, 1400, 300); // Skipped
615 }
616
617 } // namespace
618 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698