OLD | NEW |
---|---|
(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 | |
OLD | NEW |