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

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

Powered by Google App Engine
This is Rietveld 408576698