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

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: I have a race condition in LayerTreeHostTestAbortedCommitDoesntStallDisabledVsync.RunMultiThread_De… 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 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 kTimeDeltaMax;
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 base::TimeDelta::FromSeconds(1000).ToInternalValue();
204
205 int64_t BackToBackBeginFrameSourceTest::kTimeDeltaMax =
206 base::TimeDelta::Max().ToInternalValue();
207
208 TEST_F(BackToBackBeginFrameSourceTest, SetNeedsBeginFramesSendsBeginFrame) {
209 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kTimeDeltaMax);
210 source_->SetNeedsBeginFrames(true);
211 EXPECT_TRUE(task_runner_->HasPendingTasks());
212 task_runner_->RunUntilIdle();
213
214 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kTimeDeltaMax);
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, kTimeDeltaMax);
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 SetNeedsBeginFramesThenDidFinishFrameProducesOneMoreFrame) {
234 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kTimeDeltaMax);
235 source_->SetNeedsBeginFrames(true);
236 task_runner_->RunUntilIdle();
237
238 now_src_->AdvanceNowMicroseconds(100);
239 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kTimeDeltaMax);
240 source_->DidFinishFrame(0);
241 source_->SetNeedsBeginFrames(false);
242
243 EXPECT_TRUE(task_runner_->HasPendingTasks());
244 task_runner_->RunUntilIdle();
245 }
246
247 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNeedsBeginFrameFalse) {
248 source_->SetNeedsBeginFrames(false);
249 source_->DidFinishFrame(0);
250 EXPECT_FALSE(task_runner_->RunPendingTasks());
251 }
252
253 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) {
254 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kTimeDeltaMax);
255 source_->SetNeedsBeginFrames(true);
256 task_runner_->RunUntilIdle();
257
258 now_src_->AdvanceNowMicroseconds(100);
259
260 source_->DidFinishFrame(3);
261 EXPECT_FALSE(task_runner_->HasPendingTasks());
262 source_->DidFinishFrame(2);
263 EXPECT_FALSE(task_runner_->HasPendingTasks());
264 source_->DidFinishFrame(1);
265 EXPECT_FALSE(task_runner_->HasPendingTasks());
266
267 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kTimeDeltaMax);
268 source_->DidFinishFrame(0);
269 EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime());
270 task_runner_->RunUntilIdle();
271 }
272
273 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) {
274 source_->SetNeedsBeginFrames(true);
275 EXPECT_BEGIN_FRAME_P(obs_, 1000, 1000 + kDeadline, kTimeDeltaMax);
276 task_runner_->RunUntilIdle();
277
278 now_src_->AdvanceNowMicroseconds(100);
279 source_->DidFinishFrame(0);
280 source_->DidFinishFrame(0);
281 source_->DidFinishFrame(0);
282 EXPECT_BEGIN_FRAME_P(obs_, 1100, 1100 + kDeadline, kTimeDeltaMax);
283 task_runner_->RunUntilIdle();
284
285 now_src_->AdvanceNowMicroseconds(100);
286 source_->DidFinishFrame(0);
287 source_->DidFinishFrame(0);
288 source_->DidFinishFrame(0);
289 EXPECT_BEGIN_FRAME_P(obs_, 1200, 1200 + kDeadline, kTimeDeltaMax);
290 task_runner_->RunUntilIdle();
291 }
292
293 // SyntheticBeginFrameSource testing ------------------------------------------
294 class SyntheticBeginFrameSourceTest : public ::testing::Test {
295 public:
296 scoped_refptr<TestNowSource> now_src_;
297 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
298 scoped_ptr<TestSyntheticBeginFrameSource> source_;
299 scoped_ptr<MockBeginFrameObserver> obs_;
300
301 virtual void SetUp() OVERRIDE {
302 now_src_ = TestNowSource::Create(1000);
303 task_runner_ =
304 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_, false));
305 source_ = TestSyntheticBeginFrameSource::Create(
306 now_src_, task_runner_.get(), base::TimeDelta::FromMicroseconds(10000));
307 obs_ = make_scoped_ptr(new MockBeginFrameObserver());
308 source_->AddObserver(obs_.get());
309 }
310
311 virtual void TearDown() OVERRIDE { obs_.reset(); }
312 };
313
314 TEST_F(SyntheticBeginFrameSourceTest,
315 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) {
316 now_src_->SetNowMicroseconds(10010);
317 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
318 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent
319 // No tasks should need to be run for this to occur.
320 }
321
322 TEST_F(SyntheticBeginFrameSourceTest,
323 SetNeedsBeginFramesCallsCausesOnBeginFrame) {
324 source_->SetNeedsBeginFrames(true);
325 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue());
326
327 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
328 now_src_->SetNowMicroseconds(10010);
329 task_runner_->RunPendingTasks();
330 }
331
332 TEST_F(SyntheticBeginFrameSourceTest, BasicOperation) {
333 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
334
335 source_->SetNeedsBeginFrames(true);
336 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
337 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
338 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
339 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
340
341 source_->SetNeedsBeginFrames(false);
342 // No new frames....
343 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
344 }
345
346 TEST_F(SyntheticBeginFrameSourceTest, VSyncChanges) {
347 task_runner_->SetAutoAdvanceNowToPendingTasks(true);
348 source_->SetNeedsBeginFrames(true);
349
350 EXPECT_BEGIN_FRAME_P(obs_, 10000, 20000, 10000);
351 EXPECT_BEGIN_FRAME_P(obs_, 20000, 30000, 10000);
352 EXPECT_BEGIN_FRAME_P(obs_, 30000, 40000, 10000);
353 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001));
354
355 // Verify the initial vsync information
356 EXPECT_EQ(1000, source_->VSyncTimebase().ToInternalValue());
357 EXPECT_EQ(base::TimeDelta::FromMicroseconds(10000), source_->VSyncInterval());
358
359 // Update the vsync information
360 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500),
361 base::TimeDelta::FromMicroseconds(10001));
362
363 // Verify the updated vsync information
364 EXPECT_EQ(27500, source_->VSyncTimebase().ToInternalValue());
365 EXPECT_EQ(10001, source_->VSyncInterval().InMicroseconds());
366
367 EXPECT_BEGIN_FRAME_P(obs_, 40000, 47502, 10001);
368 EXPECT_BEGIN_FRAME_P(obs_, 47502, 57503, 10001);
369 EXPECT_BEGIN_FRAME_P(obs_, 57503, 67504, 10001);
370 task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000));
371 }
372
373 // BeginFrameSourceMultiplexer testing -----------------------------------
374 class BeginFrameSourceMultiplexerTest : public ::testing::Test {
375 protected:
376 virtual void SetUp() OVERRIDE {
377 mux_ = BeginFrameSourceMultiplexer::Create();
378
379 source1_store_ = make_scoped_ptr(new FakeBeginFrameSource());
380 source2_store_ = make_scoped_ptr(new FakeBeginFrameSource());
381 source3_store_ = make_scoped_ptr(new FakeBeginFrameSource());
382
383 source1_ = source1_store_.get();
384 source2_ = source2_store_.get();
385 source3_ = source3_store_.get();
386 }
387
388 virtual void TearDown() OVERRIDE {
389 // Make sure the mux is torn down before the sources.
390 mux_.reset();
391 }
392
393 scoped_ptr<BeginFrameSourceMultiplexer> mux_;
394 FakeBeginFrameSource* source1_;
395 FakeBeginFrameSource* source2_;
396 FakeBeginFrameSource* source3_;
397
398 private:
399 scoped_ptr<FakeBeginFrameSource> source1_store_;
400 scoped_ptr<FakeBeginFrameSource> source2_store_;
401 scoped_ptr<FakeBeginFrameSource> source3_store_;
402 };
403
404 TEST_F(BeginFrameSourceMultiplexerTest, SourcesManipulation) {
405 EXPECT_EQ(NULL, mux_->ActiveSource());
406
407 mux_->AddSource(source1_);
408 EXPECT_EQ(source1_, mux_->ActiveSource());
409
410 mux_->SetActiveSource(NULL);
411 EXPECT_EQ(NULL, mux_->ActiveSource());
412
413 mux_->SetActiveSource(source1_);
414
415 #ifndef NDEBUG
416 // Setting a source which isn't in the mux as active should DCHECK fail.
417 EXPECT_DEATH({ mux_->SetActiveSource(source2_); }, "");
418
419 // Adding a source which is already added should DCHECK fail.
420 EXPECT_DEATH({ mux_->AddSource(source1_); }, "");
421
422 // Removing a source which isn't in the mux should DCHECK fail.
423 EXPECT_DEATH({ mux_->RemoveSource(source2_); }, "");
424
425 // Removing the active source fails
426 EXPECT_DEATH({ mux_->RemoveSource(source1_); }, "");
427 #endif
428
429 // Test manipulation doesn't segfault.
430 mux_->AddSource(source2_);
431 mux_->RemoveSource(source2_);
432
433 mux_->AddSource(source2_);
434 mux_->SetActiveSource(source2_);
435 EXPECT_EQ(source2_, mux_->ActiveSource());
436
437 mux_->RemoveSource(source1_);
438 }
439
440 TEST_F(BeginFrameSourceMultiplexerTest, NeedsBeginFrames) {
441 mux_->AddSource(source1_);
442 mux_->AddSource(source2_);
443 mux_->SetActiveSource(source1_);
444 EXPECT_EQ(source1_->needs_begin_frames_, false);
445 EXPECT_EQ(source2_->needs_begin_frames_, false);
446
447 // Check SetNeedsFrames works
448 mux_->SetNeedsBeginFrames(true);
449 EXPECT_EQ(source1_->needs_begin_frames_, true);
450 EXPECT_EQ(source2_->needs_begin_frames_, false);
451
452 mux_->SetNeedsBeginFrames(false);
453 EXPECT_EQ(source1_->needs_begin_frames_, false);
454 EXPECT_EQ(source2_->needs_begin_frames_, false);
455
456 // Checking that switching the source makes SetNeedsFrames on the
457 // subsources correctly.
458 mux_->SetNeedsBeginFrames(true);
459
460 mux_->SetActiveSource(source1_);
461 EXPECT_EQ(source1_->needs_begin_frames_, true);
462 EXPECT_EQ(source2_->needs_begin_frames_, false);
463
464 mux_->SetActiveSource(source2_);
465 EXPECT_EQ(source1_->needs_begin_frames_, false);
466 EXPECT_EQ(source2_->needs_begin_frames_, true);
467 }
468
469 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesSimple) {
470 mux_->AddSource(source1_);
471 mux_->AddSource(source2_);
472 mux_->SetActiveSource(source1_);
473
474 MockBeginFrameObserver obs;
475 mux_->AddObserver(&obs);
476 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
477 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
478
479 mux_->SetActiveSource(source1_);
480
481 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
482 SEND_BEGIN_FRAME_P(source2_, 200, 500, 300); // Not received
483
484 mux_->SetActiveSource(source2_);
485 SEND_BEGIN_FRAME_P(source2_, 400, 600, 300);
486 SEND_BEGIN_FRAME_P(source1_, 500, 700, 300); // Not received
487 }
488
489 TEST_F(BeginFrameSourceMultiplexerTest, BeginFramesBackwardsProtection) {
490 mux_->AddSource(source1_);
491 mux_->AddSource(source2_);
492
493 MockBeginFrameObserver obs;
494 mux_->AddObserver(&obs);
495 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
496 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
497 EXPECT_BEGIN_FRAME(obs, 1000, 1200, 300);
498 EXPECT_BEGIN_FRAME(obs, 1001, 1201, 301);
499
500 mux_->SetActiveSource(source1_);
501 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
502 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
503
504 mux_->SetActiveSource(source2_);
505 SEND_BEGIN_FRAME_P(source2_, 699, 899, 300); // Skipped
506 SEND_BEGIN_FRAME_P(source2_, 1000, 1200, 300);
507
508 mux_->SetActiveSource(source1_);
509 SEND_BEGIN_FRAME_P(source1_, 1001, 1201, 301);
510 }
511
512 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalNegativeFails) {
513 #ifndef NDEBUG
514 EXPECT_DEATH(
515 { mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(-100)); },
516 "");
517 #endif
518 }
519
520 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalZero) {
521 mux_->SetMinimumInterval(base::TimeDelta());
522 mux_->AddSource(source1_);
523
524 MockBeginFrameObserver obs;
525 mux_->AddObserver(&obs);
526 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
527 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
528 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
529
530 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
531 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
532 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
533 }
534
535 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalBasic) {
536 mux_->SetMinimumInterval(base::TimeDelta::FromInternalValue(600));
537 mux_->AddSource(source1_);
538
539 MockBeginFrameObserver obs;
540 mux_->AddObserver(&obs);
541 EXPECT_BEGIN_FRAME(obs, 100, 200, 300);
542 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
543
544 SEND_BEGIN_FRAME_P(source1_, 100, 200, 300);
545 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300); // Skipped
546 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
547 }
548
549 TEST_F(BeginFrameSourceMultiplexerTest, MinimumIntervalWithMultipleSources) {
550 mux_->SetMinimumInterval(base::TimeDelta::FromMicroseconds(150));
551 mux_->AddSource(source1_);
552 mux_->AddSource(source2_);
553
554 MockBeginFrameObserver obs;
555 mux_->AddObserver(&obs);
556 EXPECT_BEGIN_FRAME(obs, 400, 600, 300);
557 EXPECT_BEGIN_FRAME(obs, 700, 900, 300);
558 EXPECT_BEGIN_FRAME(obs, 1050, 1250, 300);
559
560 mux_->SetActiveSource(source1_);
561 SEND_BEGIN_FRAME_P(source1_, 400, 600, 300);
562 SEND_BEGIN_FRAME_P(source1_, 700, 900, 300);
563
564 mux_->SetActiveSource(source2_);
565 SEND_BEGIN_FRAME_P(source2_, 750, 1050, 300); // Skipped
566 SEND_BEGIN_FRAME_P(source2_, 1050, 1250, 300);
567
568 mux_->SetActiveSource(source1_);
569 SEND_BEGIN_FRAME_P(source2_, 1100, 1400, 300); // Skipped
570 }
571
572 } // namespace
573 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698