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

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: Testing.. 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*));
Sami 2014/09/18 13:55:08 Unused?
mithro-old 2014/09/19 02:45:39 Removed.
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{};
Sami 2014/09/18 13:55:08 nit: space before {}.
mithro-old 2014/09/19 02:45:39 Done.
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;
Sami 2014/09/18 13:55:08 const?
mithro-old 2014/09/19 02:45:39 Done.
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 // Verify the initial vsync information
409 EXPECT_EQ(1000, source_->VSyncTimebase().ToInternalValue());
410 EXPECT_EQ(base::TimeDelta::FromMicroseconds(10000), source_->VSyncInterval());
411
412 // Update the vsync information
413 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
414 base::TimeDelta::FromMicroseconds(10001));
415
416 // Verify the updated vsync information
417 EXPECT_EQ(27500, source_->VSyncTimebase().ToInternalValue());
418 EXPECT_EQ(10001, source_->VSyncInterval().InMicroseconds());
419
420 EXPECT_BEGIN_FRAME_P(obs_, 40000, 47502, 10001);
421 EXPECT_BEGIN_FRAME_P(obs_, 47502, 57503, 10001);
422 EXPECT_BEGIN_FRAME_P(obs_, 57503, 67504, 10001);
423 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
424 }
425
426 // BeginFrameSourceMultiplexer testing -----------------------------------
427 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
428 protected:
429 virtual void SetUp() OVERRIDE {
430 mux_ = BeginFrameSourceMultiplexer::Create();
431
432 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
433 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
434 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
435
436 source1_ = source1_store_.get();
437 source2_ = source2_store_.get();
438 source3_ = source3_store_.get();
439 }
440
441 virtual void TearDown() OVERRIDE {
442 // Make sure the mux is torn down before the sources.
443 mux_.reset();
444 }
445
446 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
447 FakeBeginFrameSource* source1_;
448 FakeBeginFrameSource* source2_;
449 FakeBeginFrameSource* source3_;
450
451 private:
452 scoped_ptr<FakeBeginFrameSource> source1_store_;
453 scoped_ptr<FakeBeginFrameSource> source2_store_;
454 scoped_ptr<FakeBeginFrameSource> source3_store_;
455 };
456
457 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
458 EXPECT_EQ(NULL, mux_->ActiveSource());
459
460 mux_->AddSource(source1_);
461 EXPECT_EQ(source1_, mux_->ActiveSource());
462
463 mux_->SetActiveSource(NULL);
464 EXPECT_EQ(NULL, mux_->ActiveSource());
465
466 mux_->SetActiveSource(source1_);
467
468 #ifndef NDEBUG
469 // Setting a source which isn't in the mux as active should DCHECK fail.
470 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
471
472 // Adding a source which is already added should DCHECK fail.
473 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
474
475 // Removing a source which isn't in the mux should DCHECK fail.
476 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
477
478 // Removing the active source fails
479 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
480 #endif
481
482 // Test manipulation doesn't segfault.
483 mux_->AddSource(source2_);
484 mux_->RemoveSource(source2_);
485
486 mux_->AddSource(source2_);
487 mux_->SetActiveSource(source2_);
488 EXPECT_EQ(source2_, mux_->ActiveSource());
489
490 mux_->RemoveSource(source1_);
491 }
492
493 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
494 mux_->AddSource(source1_);
495 mux_->AddSource(source2_);
496 mux_->SetActiveSource(source1_);
497 EXPECT_EQ(source1_->needs_begin_frames_, false);
498 EXPECT_EQ(source2_->needs_begin_frames_, false);
499
500 // Check SetNeedsFrames works
501 mux_->SetNeedsBeginFrames(true);
502 EXPECT_EQ(source1_->needs_begin_frames_, true);
503 EXPECT_EQ(source2_->needs_begin_frames_, false);
504
505 mux_->SetNeedsBeginFrames(false);
506 EXPECT_EQ(source1_->needs_begin_frames_, false);
507 EXPECT_EQ(source2_->needs_begin_frames_, false);
508
509 // Checking that switching the source makes SetNeedsFrames on the
510 // subsources correctly.
511 mux_->SetNeedsBeginFrames(true);
512
513 mux_->SetActiveSource(source1_);
514 EXPECT_EQ(source1_->needs_begin_frames_, true);
515 EXPECT_EQ(source2_->needs_begin_frames_, false);
516
517 mux_->SetActiveSource(source2_);
518 EXPECT_EQ(source1_->needs_begin_frames_, false);
519 EXPECT_EQ(source2_->needs_begin_frames_, true);
520 }
521
522 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
523 mux_->AddSource(source1_);
524 mux_->AddSource(source2_);
525 mux_->SetActiveSource(source1_);
526
527 MockBeginFrameObserver obs;
528 mux_->AddObserver(&obs);
529 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
530 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
531
532 mux_->SetActiveSource(source1_);
533
534 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
535 SEND_BEGIN_FRAME_P(source2_, 200, 500, 300); // Not received
536
537 mux_->SetActiveSource(source2_);
538 SEND_BEGIN_FRAME_P(source2_, 400, 600, 300);
539 SEND_BEGIN_FRAME_P(source1_, 500, 700, 300); // Not received
540 }
541
542 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
543 mux_->AddSource(source1_);
544 mux_->AddSource(source2_);
545
546 MockBeginFrameObserver obs;
547 mux_->AddObserver(&obs);
548 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
549 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
550 EXPECT_BEGIN_FRAME(obs, 1000, 1200, 300);
551 EXPECT_BEGIN_FRAME(obs, 1001, 1201, 301);
552
553 mux_->SetActiveSource(source1_);
554 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
555 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
556
557 mux_->SetActiveSource(source2_);
558 SEND_BEGIN_FRAME_P(source2_, 699, 899, 300); // Skipped
559 SEND_BEGIN_FRAME_P(source2_, 1000, 1200, 300);
560
561 mux_->SetActiveSource(source1_);
562 SEND_BEGIN_FRAME_P(source1_, 1001, 1201, 301);
563 }
564
565 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) {
566 #ifndef NDEBUG
567 EXPECT_DEATH(
568 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
569 "");
570 #endif
571 }
572
573 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) {
574 mux_->SetMinimumInterval(base::TimeDelta());
575 mux_->AddSource(source1_);
576
577 MockBeginFrameObserver obs;
578 mux_->AddObserver(&obs);
579 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
580 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
581 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
582
583 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
584 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
585 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
586 }
587
588 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) {
589 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
590 mux_->AddSource(source1_);
591
592 MockBeginFrameObserver obs;
593 mux_->AddObserver(&obs);
594 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
595 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
596
597 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
598 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300); // Skipped
599 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
600 }
601
602 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) {
603 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
604 mux_->AddSource(source1_);
605 mux_->AddSource(source2_);
606
607 MockBeginFrameObserver obs;
608 mux_->AddObserver(&obs);
609 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
610 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
611 EXPECT_BEGIN_FRAME(obs, 1050, 1250, 300);
612
613 mux_->SetActiveSource(source1_);
614 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
615 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
616
617 mux_->SetActiveSource(source2_);
618 SEND_BEGIN_FRAME_P(source2_, 750, 1050, 300); // Skipped
619 SEND_BEGIN_FRAME_P(source2_, 1050, 1250, 300);
620
621 mux_->SetActiveSource(source1_);
622 SEND_BEGIN_FRAME_P(source2_, 1100, 1400, 300); // Skipped
623 }
624
625 } // namespace
626 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698