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

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: Major rewrite based on 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/gtest/include/gtest/gtest.h"
14 #include "testing/gmock/include/gmock/gmock.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::ReturnRef(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 source.RemoveObserver(&obs);
116 EXPECT_DEATH({ source.RemoveObserver(&obs); }, "");
117 #endif
118
119 source.AddObserver(&otherObs);
120 EXPECT_EQ(&otherObs, source.GetObserver());
121 source.RemoveObserver(&otherObs);
122 }
123
124 // ThrottledBeginFrameSource testing -------------------------------------
125 TEST(ThrottledBeginFrameSourceTest, NegativeIntervalFails) {
126 FakeBeginFrameSource source;
127
128 #ifndef NDEBUG
129 EXPECT_DEATH({
130 scoped_ptr<ThrottledBeginFrameSource> throttle =
131 ThrottledBeginFrameSource::Create(
132 base::TimeDelta::FromInternalValue(-100));
133 },
134 "");
135
136 scoped_ptr<ThrottledBeginFrameSource> throttle =
137 ThrottledBeginFrameSource::Create(
138 base::TimeDelta::FromInternalValue(100));
139 EXPECT_DEATH(
140 {
141 throttle->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100));
142 },
143 "");
144 #endif
145 }
146
147 TEST(ThrottledBeginFrameSourceTest, ZeroInterval) {
148 // Interval of zero should let everything through, effectively a "proxy"
149 // sink.
150 MockBeginFrameObserver obs;
151 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
152 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
153 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
154
155 FakeBeginFrameSource source;
156 scoped_ptr<ThrottledBeginFrameSource> throttle =
157 ThrottledBeginFrameSource::Create(base::TimeDelta());
158 throttle->AddSource(&source);
159 throttle->AddObserver(&obs);
160
161 SEND_BEGIN_FRAME(source, 100, 200, 300);
162 SEND_BEGIN_FRAME(source, 400, 600, 300);
163 SEND_BEGIN_FRAME(source, 700, 900, 300);
164 }
165
166 TEST(ThrottledBeginFrameSourceTest, Interval) {
167 MockBeginFrameObserver obs;
168 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
169 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
170
171 FakeBeginFrameSource source;
172 scoped_ptr<ThrottledBeginFrameSource> throttle =
173 ThrottledBeginFrameSource::Create(
174 base::TimeDelta::FromInternalValue(600));
175 throttle->AddSource(&source);
176 throttle->AddObserver(&obs);
177
178 SEND_BEGIN_FRAME(source, 100, 200, 300);
179 SEND_BEGIN_FRAME(source, 400, 600, 300);
180 SEND_BEGIN_FRAME(source, 700, 900, 300);
181 }
182
183 // BackToBackBeginFrameSource testing -----------------------------------------
184 class TestBackToBackBeginFrameSource : public BackToBackBeginFrameSource {
185 public:
186 static scoped_ptr<TestBackToBackBeginFrameSource> Create(
187 scoped_refptr<TestNowSource> now_src,
188 base::SingleThreadTaskRunner* task_runner) {
189 return make_scoped_ptr(
190 new TestBackToBackBeginFrameSource(now_src, task_runner));
191 }
192
193 protected:
194 TestBackToBackBeginFrameSource(scoped_refptr<TestNowSource> now_src,
195 base::SingleThreadTaskRunner* task_runner)
196 : BackToBackBeginFrameSource(task_runner), now_src_(now_src) {}
197
198 virtual base::TimeTicks Now() OVERRIDE { return now_src_->Now(); }
199
200 scoped_refptr<TestNowSource> now_src_;
201 };
202
203 class BackToBackBeginFrameSourceTest : public ::testing::Test {
204 public:
205 static int64_t kDeadline;
206
207 scoped_refptr<TestNowSource> now_src_;
208 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
209 scoped_ptr<TestBackToBackBeginFrameSource> source_;
210 scoped_ptr<MockBeginFrameObserver> obs_;
211
212 virtual void SetUp() OVERRIDE {
213 now_src_ = TestNowSource::Create(1000);
214 task_runner_ =
215 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
216 task_runner_->SetRunTaskLimit(1);
217 source_ =
218 TestBackToBackBeginFrameSource::Create(now_src_, task_runner_.get());
219 obs_ = make_scoped_ptr(new ::testing::StrictMock<MockBeginFrameObserver>());
220 source_->AddObserver(obs_.get());
221 }
222
223 virtual void TearDown() OVERRIDE { obs_.reset(); }
224 };
225
226 int64_t BackToBackBeginFrameSourceTest::kDeadline =
227 base::TimeDelta::FromSeconds(1000).ToInternalValue();
228
229 TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) {
230 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, -1);
231 source_->SetNeedsBeginFrames(true);
232 EXPECT_TRUE(task_runner_->HasPendingTasks());
233 task_runner_->RunUntilIdle();
234
235 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, -1);
236 now_src_->AdvanceNowMicroseconds(100);
237 source_->FinishedFrame(0);
238 task_runner_->RunUntilIdle();
239 }
240
241 TEST_F(BackToBackBeginFrameSourceTest,
242 FinishedFrameThenSetNeedsBeginFramesProducesNoFrame) {
243 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, -1);
244 source_->SetNeedsBeginFrames(true);
245 task_runner_->RunUntilIdle();
246
247 source_->SetNeedsBeginFrames(false);
248 source_->FinishedFrame(0);
249
250 EXPECT_FALSE(task_runner_->HasPendingTasks());
251 }
252
253 TEST_F(BackToBackBeginFrameSourceTest,
254 SetNeedsBeginFramesThenFinishedFrameProducesOneMoreFrame) {
255 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, -1);
256 source_->SetNeedsBeginFrames(true);
257 task_runner_->RunUntilIdle();
258
259 now_src_->AdvanceNowMicroseconds(100);
260 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, -1);
261 source_->FinishedFrame(0);
262 source_->SetNeedsBeginFrames(false);
263
264 EXPECT_TRUE(task_runner_->HasPendingTasks());
265 task_runner_->RunUntilIdle();
266 }
267
268 TEST_F(BackToBackBeginFrameSourceTest, FinishedFrameNeedsBeginFrameFalse) {
269 source_->SetNeedsBeginFrames(false);
270 source_->FinishedFrame(0);
271 EXPECT_FALSE(task_runner_->RunPendingTasks());
272 }
273
274 TEST_F(BackToBackBeginFrameSourceTest, FinishedFrameRemainingFrames) {
275 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, -1);
276 source_->SetNeedsBeginFrames(true);
277 task_runner_->RunUntilIdle();
278
279 now_src_->AdvanceNowMicroseconds(100);
280
281 source_->FinishedFrame(3);
282 EXPECT_FALSE(task_runner_->HasPendingTasks());
283 source_->FinishedFrame(2);
284 EXPECT_FALSE(task_runner_->HasPendingTasks());
285 source_->FinishedFrame(1);
286 EXPECT_FALSE(task_runner_->HasPendingTasks());
287
288 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, -1);
289 source_->FinishedFrame(0);
290 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
291 task_runner_->RunUntilIdle();
292 }
293
294 TEST_F(BackToBackBeginFrameSourceTest, FinishedFrameMultipleCallsIdempotent) {
295 source_->SetNeedsBeginFrames(true);
296 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, -1);
297 task_runner_->RunUntilIdle();
298
299 now_src_->AdvanceNowMicroseconds(100);
300 source_->FinishedFrame(0);
301 source_->FinishedFrame(0);
302 source_->FinishedFrame(0);
303 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, -1);
304 task_runner_->RunUntilIdle();
305
306 now_src_->AdvanceNowMicroseconds(100);
307 source_->FinishedFrame(0);
308 source_->FinishedFrame(0);
309 source_->FinishedFrame(0);
310 EXPECT_BEGIN_FRAME_P(obs_, 1200, 1200 + kDeadline, -1);
311 task_runner_->RunUntilIdle();
312 }
313
314 // SyntheticBeginFrameSource testing ------------------------------------------
315 class SyntheticBeginFrameSourceTest : public ::testing::Test {
316 public:
317 scoped_refptr<TestNowSource> now_src_;
318 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
319 scoped_ptr<TestSyntheticBeginFrameSource> source_;
320 scoped_ptr<MockBeginFrameObserver> obs_;
321
322 virtual void SetUp() OVERRIDE {
323 now_src_ = TestNowSource::Create(1000);
324 task_runner_ =
325 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
326 source_ = TestSyntheticBeginFrameSource::Create(
327 now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000));
328 obs_ = make_scoped_ptr(new MockBeginFrameObserver());
329 source_->AddObserver(obs_.get());
330 }
331
332 virtual void TearDown() OVERRIDE { obs_.reset(); }
333 };
334
335 TEST_F(SyntheticBeginFrameSourceTest,
336 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
337 now_src_->SetNowMicroseconds(10010);
338 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
339 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
340 // No tasks should need to be run for this to occur.
341 }
342
343 TEST_F(SyntheticBeginFrameSourceTest,
344 SetNeedsBeginFramesCallsCausesOnBeginFrame) {
345 source_->SetNeedsBeginFrames(true);
346 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
347
348 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
349 now_src_->SetNowMicroseconds(10010);
350 task_runner_->RunPendingTasks();
351 }
352
353 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
354 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
355
356 source_->SetNeedsBeginFrames(true);
357 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
358 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
359 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
360 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
361
362 source_->SetNeedsBeginFrames(false);
363 // No new frames....
364 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
365 }
366
367 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
368 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
369 source_->SetNeedsBeginFrames(true);
370
371 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
372 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
373 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
374 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
375
376 // Verify the initial vsync information
377 EXPECT_EQ(1000, source_->VSyncTimebase().ToInternalValue());
378 EXPECT_EQ(base::TimeDelta::FromMicroseconds(10000), source_->VSyncInterval());
379
380 // Update the vsync information
381 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
382 base::TimeDelta::FromMicroseconds(10001));
383
384 // Verify the updated vsync information
385 EXPECT_EQ(27500, source_->VSyncTimebase().ToInternalValue());
386 EXPECT_EQ(10001, source_->VSyncInterval().InMicroseconds());
387
388 EXPECT_BEGIN_FRAME_P(obs_, 40000, 47502, 10001);
389 EXPECT_BEGIN_FRAME_P(obs_, 47502, 57503, 10001);
390 EXPECT_BEGIN_FRAME_P(obs_, 57503, 67504, 10001);
391 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
392 }
393
394 // BeginFrameSourceMultiplexer testing -----------------------------------
395 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
396 protected:
397 virtual void SetUp() OVERRIDE {
398 mux_ = BeginFrameSourceMultiplexer::Create();
399
400 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
401 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
402 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
403
404 source1_ = source1_store_.get();
405 source2_ = source2_store_.get();
406 source3_ = source3_store_.get();
407 }
408
409 virtual void TearDown() OVERRIDE {
410 // Make sure the mux is torn down before the sources.
411 mux_.reset();
412 }
413
414 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
415 FakeBeginFrameSource* source1_;
416 FakeBeginFrameSource* source2_;
417 FakeBeginFrameSource* source3_;
418
419 private:
420 scoped_ptr<FakeBeginFrameSource> source1_store_;
421 scoped_ptr<FakeBeginFrameSource> source2_store_;
422 scoped_ptr<FakeBeginFrameSource> source3_store_;
423 };
424
425 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
426 EXPECT_EQ(NULL, mux_->ActiveSource());
427
428 mux_->AddSource(source1_);
429 EXPECT_EQ(source1_, mux_->ActiveSource());
430
431 #ifndef NDEBUG
432 // Setting a source which isn't in the mux as active should DCHECK fail.
433 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
434
435 // Adding a source which is already added should DCHECK fail.
436 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
437
438 // Removing a source which isn't in the mux should DCHECK fail.
439 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
440
441 // Removing the active source fails
442 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
443 #endif
444
445 // Test manipulation doesn't segfault.
446 mux_->AddSource(source2_);
447 mux_->RemoveSource(source2_);
448
449 mux_->AddSource(source2_);
450 mux_->SetActiveSource(source2_);
451 EXPECT_EQ(source2_, mux_->ActiveSource());
452
453 mux_->RemoveSource(source1_);
454 }
455
456 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
457 mux_->AddSource(source1_);
458 mux_->AddSource(source2_);
459 mux_->SetActiveSource(source1_);
460 EXPECT_EQ(source1_->needs_begin_frames_, false);
461 EXPECT_EQ(source2_->needs_begin_frames_, false);
462
463 // Check SetNeedsFrames works
464 mux_->SetNeedsBeginFrames(true);
465 EXPECT_EQ(source1_->needs_begin_frames_, true);
466 EXPECT_EQ(source2_->needs_begin_frames_, false);
467
468 mux_->SetNeedsBeginFrames(false);
469 EXPECT_EQ(source1_->needs_begin_frames_, false);
470 EXPECT_EQ(source2_->needs_begin_frames_, false);
471
472 // Checking that switching the source makes SetNeedsFrames on the
473 // subsources correctly.
474 mux_->SetNeedsBeginFrames(true);
475
476 mux_->SetActiveSource(source1_);
477 EXPECT_EQ(source1_->needs_begin_frames_, true);
478 EXPECT_EQ(source2_->needs_begin_frames_, false);
479
480 mux_->SetActiveSource(source2_);
481 EXPECT_EQ(source1_->needs_begin_frames_, false);
482 EXPECT_EQ(source2_->needs_begin_frames_, true);
483 }
484
485 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
486 mux_->AddSource(source1_);
487 mux_->AddSource(source2_);
488 mux_->SetActiveSource(source1_);
489
490 MockBeginFrameObserver obs;
491 mux_->AddObserver(&obs);
492 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
493 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
494
495 mux_->SetActiveSource(source1_);
496
497 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
498 SEND_BEGIN_FRAME_P(source2_, 200, 500, 300); // Not received
499
500 mux_->SetActiveSource(source2_);
501 SEND_BEGIN_FRAME_P(source2_, 400, 600, 300);
502 SEND_BEGIN_FRAME_P(source1_, 500, 700, 300); // Not received
503 }
504
505 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
506 mux_->AddSource(source1_);
507 mux_->AddSource(source2_);
508
509 MockBeginFrameObserver obs;
510 mux_->AddObserver(&obs);
511 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
512 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
513 EXPECT_BEGIN_FRAME(obs, 1000, 1200, 300);
514 EXPECT_BEGIN_FRAME(obs, 1001, 1201, 301);
515
516 mux_->SetActiveSource(source1_);
517 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
518 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
519
520 mux_->SetActiveSource(source2_);
521 SEND_BEGIN_FRAME_P(source2_, 699, 899, 300); // Skipped
522 SEND_BEGIN_FRAME_P(source2_, 1000, 1200, 300);
523
524 mux_->SetActiveSource(source1_);
525 SEND_BEGIN_FRAME_P(source1_, 1001, 1201, 301);
526 }
527
528 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesMinimumInterval) {
529 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
530 mux_->AddSource(source1_);
531 mux_->AddSource(source2_);
532
533 MockBeginFrameObserver obs;
534 mux_->AddObserver(&obs);
535 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
536 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
537 EXPECT_BEGIN_FRAME(obs, 1050, 1250, 300);
538
539 mux_->SetActiveSource(source1_);
540 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
541 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
542
543 mux_->SetActiveSource(source2_);
544 SEND_BEGIN_FRAME_P(source2_, 750, 1050, 300); // Skipped
545 SEND_BEGIN_FRAME_P(source2_, 1050, 1250, 300);
546
547 mux_->SetActiveSource(source1_);
548 SEND_BEGIN_FRAME_P(source2_, 1100, 1400, 300); // Skipped
549 }
550
551 } // namespace
552 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698