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

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

Powered by Google App Engine
This is Rietveld 408576698