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