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

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

Powered by Google App Engine
This is Rietveld 408576698