OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 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 <vector> | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/callback_helpers.h" | |
9 #include "base/memory/scoped_vector.h" | |
10 #include "base/message_loop/message_loop.h" | |
11 #include "media/base/audio_decoder_config.h" | |
12 #include "media/base/decoder_buffer.h" | |
13 #include "media/base/demuxer_stream.h" | |
14 #include "media/base/text_renderer.h" | |
15 #include "media/base/text_track_config.h" | |
16 #include "media/base/video_decoder_config.h" | |
17 #include "media/filters/webvtt_util.h" | |
18 #include "testing/gmock/include/gmock/gmock.h" | |
19 #include "testing/gtest/include/gtest/gtest.h" | |
20 | |
21 using ::testing::Eq; | |
22 using ::testing::Exactly; | |
23 using ::testing::Invoke; | |
24 using ::testing::_; | |
25 | |
26 namespace media { | |
27 | |
28 class TextRendererTest; | |
29 class FakeTextTrack; | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
nit: I don't think these 2 forward declarations ar
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
30 | |
31 // Local implementation of the TextTrack interface. | |
32 class FakeTextTrack : public TextTrack { | |
33 public: | |
34 FakeTextTrack(const base::Closure& destroy_cb, | |
35 const TextTrackConfig& config) | |
36 : destroy_cb_(destroy_cb), | |
37 config_(config) { | |
38 } | |
39 virtual ~FakeTextTrack() { | |
40 destroy_cb_.Run(); | |
41 } | |
42 | |
43 MOCK_METHOD5(addWebVTTCue, void(const base::TimeDelta& start, | |
44 const base::TimeDelta& end, | |
45 const std::string& id, | |
46 const std::string& content, | |
47 const std::string& settings)); | |
48 | |
49 const base::Closure destroy_cb_; | |
50 const TextTrackConfig config_; | |
51 | |
52 private: | |
53 DISALLOW_COPY_AND_ASSIGN(FakeTextTrack); | |
54 }; | |
55 | |
56 // Local implementation of the DemuxerStream. These are the stream objects | |
57 // we pass to the text renderer object when streams are added and removed. | |
58 class TextTrackStream : public DemuxerStream { | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
Why do you need this? This looks very similar to F
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
59 public: | |
60 TextTrackStream() {} | |
61 virtual ~TextTrackStream() { | |
62 DCHECK(read_cb_.is_null()); | |
63 } | |
64 | |
65 // DemuxerStream implementation. | |
66 | |
67 void Read(const ReadCB& read_cb) { | |
68 OnRead(); | |
69 EXPECT_FALSE(read_cb.is_null()); | |
70 EXPECT_TRUE(read_cb_.is_null()); | |
71 read_cb_ = read_cb; | |
72 } | |
73 | |
74 MOCK_METHOD0(audio_decoder_config, AudioDecoderConfig()); | |
75 MOCK_METHOD0(video_decoder_config, VideoDecoderConfig()); | |
76 virtual Type type() OVERRIDE { return DemuxerStream::TEXT; } | |
77 MOCK_METHOD0(EnableBitstreamConverter, void()); | |
78 | |
79 // Local methods | |
80 | |
81 MOCK_METHOD0(OnRead, void()); | |
82 | |
83 void SatisfyPendingRead(const base::TimeDelta& start, | |
84 const base::TimeDelta& duration, | |
85 const std::string& id, | |
86 const std::string& content, | |
87 const std::string& settings) { | |
88 EXPECT_FALSE(read_cb_.is_null()); | |
89 | |
90 const uint8* const data = reinterpret_cast<const uint8*>(content.data()); | |
91 | |
92 std::vector<uint8> side_data; | |
93 MakeSideData(id.begin(), id.end(), | |
94 settings.begin(), settings.end(), | |
95 &side_data); | |
96 | |
97 scoped_refptr<DecoderBuffer> buffer; | |
98 | |
99 buffer = DecoderBuffer::CopyFrom(data, | |
100 content.size(), | |
101 side_data.data(), | |
102 side_data.size()); | |
103 | |
104 buffer->set_timestamp(start); | |
105 buffer->set_duration(duration); | |
106 | |
107 base::ResetAndReturn(&read_cb_).Run(kOk, buffer); | |
108 } | |
109 | |
110 void AbortPendingRead() { | |
111 EXPECT_FALSE(read_cb_.is_null()); | |
112 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); | |
113 } | |
114 | |
115 void SendEosNotification() { | |
116 EXPECT_FALSE(read_cb_.is_null()); | |
117 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer()); | |
118 } | |
119 | |
120 ReadCB read_cb_; | |
121 | |
122 private: | |
123 DISALLOW_COPY_AND_ASSIGN(TextTrackStream); | |
124 }; | |
125 | |
126 class TextRendererTest : public testing::Test { | |
127 public: | |
128 TextRendererTest() {} | |
129 | |
130 void CreateTextRenderer() { | |
131 DCHECK(!text_renderer_); | |
132 | |
133 text_renderer_.reset( | |
134 new TextRenderer(message_loop_.message_loop_proxy(), | |
135 base::Bind(&TextRendererTest::OnAddTextTrack, | |
136 base::Unretained(this)))); | |
137 text_renderer_->Initialize(base::Bind(&TextRendererTest::OnEnd, | |
138 base::Unretained(this))); | |
139 } | |
140 | |
141 void DestroyTextRenderer() { | |
142 EXPECT_CALL(*this, OnStop()); | |
143 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, | |
144 base::Unretained(this))); | |
145 message_loop_.RunUntilIdle(); | |
146 | |
147 text_renderer_.reset(); | |
148 text_track_streams_.clear(); | |
149 } | |
150 | |
151 void AddTextTrack(TextKind kind, | |
152 const std::string& name, | |
153 const std::string& language, | |
154 bool expect_read) { | |
155 const size_t idx = text_track_streams_.size(); | |
156 text_track_streams_.push_back(new TextTrackStream); | |
157 | |
158 if (expect_read) | |
159 ExpectRead(idx); | |
160 | |
161 const TextTrackConfig config(kind, name, language); | |
162 text_renderer_->AddTextStream(text_track_streams_.back(), config); | |
163 message_loop_.RunUntilIdle(); | |
164 | |
165 EXPECT_EQ(text_tracks_.size(), text_track_streams_.size()); | |
166 FakeTextTrack* const text_track = text_tracks_.back(); | |
167 EXPECT_TRUE(text_track); | |
168 EXPECT_TRUE(text_track->config_.Matches(config)); | |
169 } | |
170 | |
171 void OnAddTextTrack(const TextTrackConfig& config, | |
172 const AddTextTrackDoneCB& done_cb) { | |
173 base::Closure destroy_cb = | |
174 base::Bind(&TextRendererTest::OnDestroyTextTrack, | |
175 base::Unretained(this), | |
176 text_tracks_.size()); | |
177 scoped_ptr<FakeTextTrack> text_track(new FakeTextTrack(destroy_cb, | |
178 config)); | |
179 // text_track is owned by text renderer, but we cache it here so we | |
180 // can inspect it. It gets removed from the cache when the text renderer | |
181 // deallocates it. | |
182 text_tracks_.push_back(text_track.get()); | |
183 done_cb.Run(text_track.Pass()); | |
184 } | |
185 | |
186 void RemoveTextTrack(unsigned idx) { | |
187 TextTrackStream* const stream = text_track_streams_[idx]; | |
188 text_renderer_->RemoveTextStream(stream); | |
189 EXPECT_FALSE(text_tracks_[idx]); | |
190 } | |
191 | |
192 void SatisfyPendingReads(const base::TimeDelta& start, | |
193 const base::TimeDelta& duration, | |
194 const std::string& id, | |
195 const std::string& content, | |
196 const std::string& settings) { | |
197 for (TextTrackStreams::iterator itr = text_track_streams_.begin(); | |
198 itr != text_track_streams_.end(); ++itr) { | |
199 (*itr)->SatisfyPendingRead(start, duration, id, content, settings); | |
200 } | |
201 } | |
202 | |
203 void AbortPendingRead(unsigned idx) { | |
204 TextTrackStream* const stream = text_track_streams_[idx]; | |
205 stream->AbortPendingRead(); | |
206 message_loop_.RunUntilIdle(); | |
207 } | |
208 | |
209 void AbortPendingReads() { | |
210 for (unsigned idx = 0; idx < text_track_streams_.size(); ++idx) { | |
211 AbortPendingRead(idx); | |
212 } | |
213 } | |
214 | |
215 void SendEosNotification(unsigned idx) { | |
216 TextTrackStream* const stream = text_track_streams_[idx]; | |
217 stream->SendEosNotification(); | |
218 message_loop_.RunUntilIdle(); | |
219 } | |
220 | |
221 void SendEosNotifications() { | |
222 for (unsigned idx = 0; idx < text_track_streams_.size(); ++idx) { | |
223 SendEosNotification(idx); | |
224 } | |
225 } | |
226 | |
227 void SendCue(unsigned idx, bool expect_cue) { | |
228 TextTrackStream* const text_stream = text_track_streams_[idx]; | |
229 | |
230 const base::TimeDelta start; | |
231 const base::TimeDelta duration = base::TimeDelta::FromSeconds(42); | |
232 const std::string id = "id"; | |
233 const std::string content = "subtitle"; | |
234 const std::string settings; | |
235 | |
236 if (expect_cue) { | |
237 FakeTextTrack* const text_track = text_tracks_[idx]; | |
238 EXPECT_CALL(*text_track, addWebVTTCue(Eq(start), | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
nit: You shouldn't need the Eq on all the paramete
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
239 Eq(start + duration), | |
240 Eq(id), | |
241 Eq(content), | |
242 Eq(settings))) | |
243 .Times(Exactly(1)); | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
nit: I don't think you should need the Times(Exact
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
244 } | |
245 | |
246 text_stream->SatisfyPendingRead(start, duration, id, content, settings); | |
247 message_loop_.RunUntilIdle(); | |
248 } | |
249 | |
250 void SendCues(bool expect_cue) { | |
251 for (unsigned idx = 0; idx < text_track_streams_.size(); ++idx) { | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
nit: You should use size_t here and in other simil
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
252 SendCue(idx, expect_cue); | |
253 } | |
254 } | |
255 | |
256 void OnDestroyTextTrack(unsigned idx) { | |
257 text_tracks_[idx] = NULL; | |
258 } | |
259 | |
260 void Play() { | |
261 EXPECT_CALL(*this, OnPlay()); | |
262 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, | |
263 base::Unretained(this))); | |
264 message_loop_.RunUntilIdle(); | |
265 } | |
266 | |
267 void Pause() { | |
268 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, | |
269 base::Unretained(this))); | |
270 message_loop_.RunUntilIdle(); | |
271 } | |
272 | |
273 void Flush() { | |
274 EXPECT_CALL(*this, OnFlush()); | |
275 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, | |
276 base::Unretained(this))); | |
277 } | |
278 | |
279 void Stop() { | |
280 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, | |
281 base::Unretained(this))); | |
282 message_loop_.RunUntilIdle(); | |
283 } | |
284 | |
285 void ExpectRead(unsigned idx) { | |
286 TextTrackStream* const stream = text_track_streams_[idx]; | |
287 EXPECT_CALL(*stream, OnRead()).Times(1); | |
acolwell GONE FROM CHROMIUM
2013/11/20 01:15:24
nit: Times(1) should be unnecessary.
Matthew Heaney (Chromium)
2013/11/20 19:23:16
Done.
| |
288 } | |
289 | |
290 MOCK_METHOD0(OnEnd, void()); | |
291 MOCK_METHOD0(OnStop, void()); | |
292 MOCK_METHOD0(OnPlay, void()); | |
293 MOCK_METHOD0(OnPause, void()); | |
294 MOCK_METHOD0(OnFlush, void()); | |
295 | |
296 scoped_ptr<TextRenderer> text_renderer_; | |
297 base::MessageLoop message_loop_; | |
298 | |
299 typedef ScopedVector<TextTrackStream> TextTrackStreams; | |
300 TextTrackStreams text_track_streams_; | |
301 | |
302 typedef std::vector<FakeTextTrack*> TextTracks; | |
303 TextTracks text_tracks_; | |
304 | |
305 private: | |
306 DISALLOW_COPY_AND_ASSIGN(TextRendererTest); | |
307 }; | |
308 | |
309 TEST_F(TextRendererTest, CreateTextRendererNoInit) { | |
310 text_renderer_.reset( | |
311 new TextRenderer(message_loop_.message_loop_proxy(), | |
312 base::Bind(&TextRendererTest::OnAddTextTrack, | |
313 base::Unretained(this)))); | |
314 text_renderer_.reset(); | |
315 } | |
316 | |
317 TEST_F(TextRendererTest, TestStop) { | |
318 CreateTextRenderer(); | |
319 DestroyTextRenderer(); | |
320 } | |
321 | |
322 TEST_F(TextRendererTest, AddTextTrackOnly_OneTrack) { | |
323 CreateTextRenderer(); | |
324 AddTextTrack(kTextSubtitles, "", "", false); | |
325 DestroyTextRenderer(); | |
326 } | |
327 | |
328 TEST_F(TextRendererTest, AddTextTrackOnly_TwoTracks) { | |
329 CreateTextRenderer(); | |
330 AddTextTrack(kTextSubtitles, "track 1", "", false); | |
331 AddTextTrack(kTextSubtitles, "track 2", "", false); | |
332 DestroyTextRenderer(); | |
333 } | |
334 | |
335 TEST_F(TextRendererTest, PlayOnly) { | |
336 CreateTextRenderer(); | |
337 Play(); | |
338 DestroyTextRenderer(); | |
339 } | |
340 | |
341 TEST_F(TextRendererTest, AddTrackBeforePlay_OneTrack) { | |
342 CreateTextRenderer(); | |
343 AddTextTrack(kTextSubtitles, "", "", true); | |
344 Play(); | |
345 AbortPendingReads(); | |
346 DestroyTextRenderer(); | |
347 } | |
348 | |
349 TEST_F(TextRendererTest, AddTrackBeforePlay_TwoTracks) { | |
350 CreateTextRenderer(); | |
351 AddTextTrack(kTextSubtitles, "1", "", true); | |
352 AddTextTrack(kTextSubtitles, "2", "", true); | |
353 Play(); | |
354 AbortPendingReads(); | |
355 DestroyTextRenderer(); | |
356 } | |
357 | |
358 TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackAfter) { | |
359 CreateTextRenderer(); | |
360 Play(); | |
361 AddTextTrack(kTextSubtitles, "", "", true); | |
362 AbortPendingReads(); | |
363 DestroyTextRenderer(); | |
364 } | |
365 | |
366 TEST_F(TextRendererTest, AddTrackAfterPlay_TwoTracksAfter) { | |
367 CreateTextRenderer(); | |
368 Play(); | |
369 AddTextTrack(kTextSubtitles, "1", "", true); | |
370 AddTextTrack(kTextSubtitles, "2", "", true); | |
371 AbortPendingReads(); | |
372 DestroyTextRenderer(); | |
373 } | |
374 | |
375 TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackBeforeOneTrackAfter) { | |
376 CreateTextRenderer(); | |
377 AddTextTrack(kTextSubtitles, "1", "", true); | |
378 Play(); | |
379 AddTextTrack(kTextSubtitles, "2", "", true); | |
380 AbortPendingReads(); | |
381 DestroyTextRenderer(); | |
382 } | |
383 | |
384 TEST_F(TextRendererTest, PlayAddCue_OneTrack) { | |
385 CreateTextRenderer(); | |
386 AddTextTrack(kTextSubtitles, "", "", true); | |
387 Play(); | |
388 ExpectRead(0); | |
389 SendCues(true); | |
390 AbortPendingReads(); | |
391 DestroyTextRenderer(); | |
392 } | |
393 | |
394 TEST_F(TextRendererTest, PlayAddCue_TwoTracks) { | |
395 CreateTextRenderer(); | |
396 AddTextTrack(kTextSubtitles, "1", "", true); | |
397 AddTextTrack(kTextSubtitles, "2", "", true); | |
398 Play(); | |
399 ExpectRead(0); | |
400 ExpectRead(1); | |
401 SendCues(true); | |
402 AbortPendingReads(); | |
403 DestroyTextRenderer(); | |
404 } | |
405 | |
406 TEST_F(TextRendererTest, PlayEosOnly_OneTrack) { | |
407 CreateTextRenderer(); | |
408 AddTextTrack(kTextSubtitles, "", "", true); | |
409 Play(); | |
410 EXPECT_CALL(*this, OnEnd()); | |
411 SendEosNotifications(); | |
412 DestroyTextRenderer(); | |
413 } | |
414 | |
415 TEST_F(TextRendererTest, PlayEosOnly_TwoTracks) { | |
416 CreateTextRenderer(); | |
417 AddTextTrack(kTextSubtitles, "1", "", true); | |
418 AddTextTrack(kTextSubtitles, "2", "", true); | |
419 Play(); | |
420 EXPECT_CALL(*this, OnEnd()); | |
421 SendEosNotifications(); | |
422 DestroyTextRenderer(); | |
423 } | |
424 | |
425 TEST_F(TextRendererTest, PlayCueEos_OneTrack) { | |
426 CreateTextRenderer(); | |
427 AddTextTrack(kTextSubtitles, "", "", true); | |
428 Play(); | |
429 ExpectRead(0); | |
430 SendCues(true); | |
431 EXPECT_CALL(*this, OnEnd()); | |
432 SendEosNotifications(); | |
433 DestroyTextRenderer(); | |
434 } | |
435 | |
436 TEST_F(TextRendererTest, PlayCueEos_TwoTracks) { | |
437 CreateTextRenderer(); | |
438 AddTextTrack(kTextSubtitles, "1", "", true); | |
439 AddTextTrack(kTextSubtitles, "2", "", true); | |
440 Play(); | |
441 ExpectRead(0); | |
442 ExpectRead(1); | |
443 SendCues(true); | |
444 EXPECT_CALL(*this, OnEnd()); | |
445 SendEosNotifications(); | |
446 DestroyTextRenderer(); | |
447 } | |
448 | |
449 TEST_F(TextRendererTest, StopPending_OneTrack) { | |
450 CreateTextRenderer(); | |
451 AddTextTrack(kTextSubtitles, "", "", true); | |
452 Play(); | |
453 Stop(); | |
454 EXPECT_CALL(*this, OnStop()); | |
455 SendEosNotifications(); | |
456 text_renderer_.reset(); | |
457 text_track_streams_.clear(); | |
458 } | |
459 | |
460 TEST_F(TextRendererTest, StopPending_TwoTracks) { | |
461 CreateTextRenderer(); | |
462 AddTextTrack(kTextSubtitles, "1", "", true); | |
463 AddTextTrack(kTextSubtitles, "2", "", true); | |
464 Play(); | |
465 Stop(); | |
466 EXPECT_CALL(*this, OnStop()); | |
467 SendEosNotifications(); | |
468 text_renderer_.reset(); | |
469 text_track_streams_.clear(); | |
470 } | |
471 | |
472 TEST_F(TextRendererTest, PlayPause_OneTrack) { | |
473 CreateTextRenderer(); | |
474 AddTextTrack(kTextSubtitles, "", "", true); | |
475 Play(); | |
476 AbortPendingReads(); | |
477 EXPECT_CALL(*this, OnPause()); | |
478 Pause(); | |
479 DestroyTextRenderer(); | |
480 } | |
481 | |
482 TEST_F(TextRendererTest, PlayPause_TwoTracks) { | |
483 CreateTextRenderer(); | |
484 AddTextTrack(kTextSubtitles, "1", "", true); | |
485 AddTextTrack(kTextSubtitles, "2", "", true); | |
486 Play(); | |
487 AbortPendingReads(); | |
488 EXPECT_CALL(*this, OnPause()); | |
489 Pause(); | |
490 DestroyTextRenderer(); | |
491 } | |
492 | |
493 TEST_F(TextRendererTest, PlayEosPausePending_OneTrack) { | |
494 CreateTextRenderer(); | |
495 AddTextTrack(kTextSubtitles, "", "", true); | |
496 Play(); | |
497 Pause(); | |
498 EXPECT_CALL(*this, OnPause()); | |
499 SendEosNotifications(); | |
500 DestroyTextRenderer(); | |
501 } | |
502 | |
503 TEST_F(TextRendererTest, PlayEosPausePending_TwoTracks) { | |
504 CreateTextRenderer(); | |
505 AddTextTrack(kTextSubtitles, "1", "", true); | |
506 AddTextTrack(kTextSubtitles, "2", "", true); | |
507 Play(); | |
508 Pause(); | |
509 EXPECT_CALL(*this, OnPause()); | |
510 SendEosNotifications(); | |
511 DestroyTextRenderer(); | |
512 } | |
513 | |
514 TEST_F(TextRendererTest, PlayCuePausePending_OneTrack) { | |
515 CreateTextRenderer(); | |
516 AddTextTrack(kTextSubtitles, "", "", true); | |
517 Play(); | |
518 Pause(); | |
519 EXPECT_CALL(*this, OnPause()); | |
520 SendCues(true); | |
521 DestroyTextRenderer(); | |
522 } | |
523 | |
524 TEST_F(TextRendererTest, PlayCuePausePending_TwoTracks) { | |
525 CreateTextRenderer(); | |
526 AddTextTrack(kTextSubtitles, "1", "", true); | |
527 AddTextTrack(kTextSubtitles, "2", "", true); | |
528 Play(); | |
529 Pause(); | |
530 EXPECT_CALL(*this, OnPause()); | |
531 SendCues(true); | |
532 DestroyTextRenderer(); | |
533 } | |
534 | |
535 TEST_F(TextRendererTest, PlayEosPause_OneTrack) { | |
536 CreateTextRenderer(); | |
537 AddTextTrack(kTextSubtitles, "", "", true); | |
538 Play(); | |
539 EXPECT_CALL(*this, OnEnd()); | |
540 SendEosNotifications(); | |
541 EXPECT_CALL(*this, OnPause()); | |
542 Pause(); | |
543 DestroyTextRenderer(); | |
544 } | |
545 | |
546 TEST_F(TextRendererTest, PlayEosPause_TwoTracks) { | |
547 CreateTextRenderer(); | |
548 AddTextTrack(kTextSubtitles, "1", "", true); | |
549 AddTextTrack(kTextSubtitles, "2", "", true); | |
550 Play(); | |
551 EXPECT_CALL(*this, OnEnd()); | |
552 SendEosNotifications(); | |
553 EXPECT_CALL(*this, OnPause()); | |
554 Pause(); | |
555 DestroyTextRenderer(); | |
556 } | |
557 | |
558 TEST_F(TextRendererTest, PlayEosPause_SplitEos) { | |
559 CreateTextRenderer(); | |
560 AddTextTrack(kTextSubtitles, "1", "", true); | |
561 AddTextTrack(kTextSubtitles, "2", "", true); | |
562 Play(); | |
563 SendEosNotification(0); | |
564 EXPECT_CALL(*this, OnEnd()); | |
565 SendEosNotification(1); | |
566 EXPECT_CALL(*this, OnPause()); | |
567 Pause(); | |
568 DestroyTextRenderer(); | |
569 } | |
570 | |
571 TEST_F(TextRendererTest, PlayEosFlush_OneTrack) { | |
572 CreateTextRenderer(); | |
573 AddTextTrack(kTextSubtitles, "", "", true); | |
574 Play(); | |
575 EXPECT_CALL(*this, OnEnd()); | |
576 SendEosNotifications(); | |
577 EXPECT_CALL(*this, OnPause()); | |
578 Pause(); | |
579 Flush(); | |
580 ExpectRead(0); | |
581 Play(); | |
582 EXPECT_CALL(*this, OnEnd()); | |
583 SendEosNotifications(); | |
584 DestroyTextRenderer(); | |
585 } | |
586 | |
587 TEST_F(TextRendererTest, PlayEosFlush_TwoTracks) { | |
588 CreateTextRenderer(); | |
589 AddTextTrack(kTextSubtitles, "1", "", true); | |
590 AddTextTrack(kTextSubtitles, "2", "", true); | |
591 Play(); | |
592 EXPECT_CALL(*this, OnEnd()); | |
593 SendEosNotifications(); | |
594 EXPECT_CALL(*this, OnPause()); | |
595 Pause(); | |
596 Flush(); | |
597 ExpectRead(0); | |
598 ExpectRead(1); | |
599 Play(); | |
600 EXPECT_CALL(*this, OnEnd()); | |
601 SendEosNotifications(); | |
602 DestroyTextRenderer(); | |
603 } | |
604 | |
605 TEST_F(TextRendererTest, AddTextTrackOnlyRemove_OneTrack) { | |
606 CreateTextRenderer(); | |
607 AddTextTrack(kTextSubtitles, "", "", false); | |
608 EXPECT_TRUE(text_renderer_->HasTracks()); | |
609 DestroyTextRenderer(); | |
610 } | |
611 | |
612 TEST_F(TextRendererTest, AddTextTrackOnlyRemove_TwoTracks) { | |
613 CreateTextRenderer(); | |
614 AddTextTrack(kTextSubtitles, "track 1", "", false); | |
615 AddTextTrack(kTextSubtitles, "track 2", "", false); | |
616 RemoveTextTrack(0); | |
617 EXPECT_TRUE(text_renderer_->HasTracks()); | |
618 RemoveTextTrack(1); | |
619 EXPECT_FALSE(text_renderer_->HasTracks()); | |
620 DestroyTextRenderer(); | |
621 } | |
622 | |
623 TEST_F(TextRendererTest, AddTrackBeforePlayRemove_OneTrack) { | |
624 CreateTextRenderer(); | |
625 AddTextTrack(kTextSubtitles, "", "", true); | |
626 Play(); | |
627 AbortPendingReads(); | |
628 RemoveTextTrack(0); | |
629 EXPECT_FALSE(text_renderer_->HasTracks()); | |
630 DestroyTextRenderer(); | |
631 } | |
632 | |
633 TEST_F(TextRendererTest, AddTrackBeforePlayRemove_TwoTracks) { | |
634 CreateTextRenderer(); | |
635 AddTextTrack(kTextSubtitles, "1", "", true); | |
636 AddTextTrack(kTextSubtitles, "2", "", true); | |
637 Play(); | |
638 AbortPendingReads(); | |
639 RemoveTextTrack(0); | |
640 EXPECT_TRUE(text_renderer_->HasTracks()); | |
641 RemoveTextTrack(1); | |
642 EXPECT_FALSE(text_renderer_->HasTracks()); | |
643 DestroyTextRenderer(); | |
644 } | |
645 | |
646 TEST_F(TextRendererTest, AddTrackBeforePlayRemove_SeparateCancel) { | |
647 CreateTextRenderer(); | |
648 AddTextTrack(kTextSubtitles, "1", "", true); | |
649 AddTextTrack(kTextSubtitles, "2", "", true); | |
650 Play(); | |
651 AbortPendingRead(0); | |
652 RemoveTextTrack(0); | |
653 EXPECT_TRUE(text_renderer_->HasTracks()); | |
654 AbortPendingRead(1); | |
655 RemoveTextTrack(1); | |
656 EXPECT_FALSE(text_renderer_->HasTracks()); | |
657 DestroyTextRenderer(); | |
658 } | |
659 | |
660 TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveOneThenPlay) { | |
661 CreateTextRenderer(); | |
662 AddTextTrack(kTextSubtitles, "1", "", false); | |
663 AddTextTrack(kTextSubtitles, "2", "", true); | |
664 RemoveTextTrack(0); | |
665 EXPECT_TRUE(text_renderer_->HasTracks()); | |
666 Play(); | |
667 AbortPendingRead(1); | |
668 RemoveTextTrack(1); | |
669 EXPECT_FALSE(text_renderer_->HasTracks()); | |
670 DestroyTextRenderer(); | |
671 } | |
672 | |
673 TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveTwoThenPlay) { | |
674 CreateTextRenderer(); | |
675 AddTextTrack(kTextSubtitles, "1", "", false); | |
676 AddTextTrack(kTextSubtitles, "2", "", false); | |
677 RemoveTextTrack(0); | |
678 EXPECT_TRUE(text_renderer_->HasTracks()); | |
679 RemoveTextTrack(1); | |
680 EXPECT_FALSE(text_renderer_->HasTracks()); | |
681 Play(); | |
682 DestroyTextRenderer(); | |
683 } | |
684 | |
685 TEST_F(TextRendererTest, AddTrackAfterPlayRemove_OneTrack) { | |
686 CreateTextRenderer(); | |
687 Play(); | |
688 AddTextTrack(kTextSubtitles, "", "", true); | |
689 AbortPendingReads(); | |
690 RemoveTextTrack(0); | |
691 EXPECT_FALSE(text_renderer_->HasTracks()); | |
692 DestroyTextRenderer(); | |
693 } | |
694 | |
695 TEST_F(TextRendererTest, AddTrackAfterPlayRemove_TwoTracks) { | |
696 CreateTextRenderer(); | |
697 Play(); | |
698 AddTextTrack(kTextSubtitles, "1", "", true); | |
699 AddTextTrack(kTextSubtitles, "2", "", true); | |
700 AbortPendingReads(); | |
701 RemoveTextTrack(0); | |
702 EXPECT_TRUE(text_renderer_->HasTracks()); | |
703 RemoveTextTrack(1); | |
704 EXPECT_FALSE(text_renderer_->HasTracks()); | |
705 DestroyTextRenderer(); | |
706 } | |
707 | |
708 TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitCancel) { | |
709 CreateTextRenderer(); | |
710 Play(); | |
711 AddTextTrack(kTextSubtitles, "1", "", true); | |
712 AddTextTrack(kTextSubtitles, "2", "", true); | |
713 AbortPendingRead(0); | |
714 RemoveTextTrack(0); | |
715 EXPECT_TRUE(text_renderer_->HasTracks()); | |
716 AbortPendingRead(1); | |
717 RemoveTextTrack(1); | |
718 EXPECT_FALSE(text_renderer_->HasTracks()); | |
719 DestroyTextRenderer(); | |
720 } | |
721 | |
722 TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitAdd) { | |
723 CreateTextRenderer(); | |
724 AddTextTrack(kTextSubtitles, "1", "", true); | |
725 Play(); | |
726 AddTextTrack(kTextSubtitles, "2", "", true); | |
727 AbortPendingRead(0); | |
728 RemoveTextTrack(0); | |
729 EXPECT_TRUE(text_renderer_->HasTracks()); | |
730 AbortPendingRead(1); | |
731 RemoveTextTrack(1); | |
732 EXPECT_FALSE(text_renderer_->HasTracks()); | |
733 DestroyTextRenderer(); | |
734 } | |
735 | |
736 TEST_F(TextRendererTest, PlayAddCueRemove_OneTrack) { | |
737 CreateTextRenderer(); | |
738 AddTextTrack(kTextSubtitles, "", "", true); | |
739 Play(); | |
740 ExpectRead(0); | |
741 SendCues(true); | |
742 AbortPendingReads(); | |
743 RemoveTextTrack(0); | |
744 EXPECT_FALSE(text_renderer_->HasTracks()); | |
745 DestroyTextRenderer(); | |
746 } | |
747 | |
748 TEST_F(TextRendererTest, PlayAddCueRemove_TwoTracks) { | |
749 CreateTextRenderer(); | |
750 AddTextTrack(kTextSubtitles, "1", "", true); | |
751 AddTextTrack(kTextSubtitles, "2", "", true); | |
752 Play(); | |
753 ExpectRead(0); | |
754 ExpectRead(1); | |
755 SendCues(true); | |
756 AbortPendingRead(0); | |
757 AbortPendingRead(1); | |
758 RemoveTextTrack(0); | |
759 EXPECT_TRUE(text_renderer_->HasTracks()); | |
760 RemoveTextTrack(1); | |
761 EXPECT_FALSE(text_renderer_->HasTracks()); | |
762 DestroyTextRenderer(); | |
763 } | |
764 | |
765 TEST_F(TextRendererTest, PlayEosOnlyRemove_OneTrack) { | |
766 CreateTextRenderer(); | |
767 AddTextTrack(kTextSubtitles, "", "", true); | |
768 Play(); | |
769 EXPECT_CALL(*this, OnEnd()); | |
770 SendEosNotifications(); | |
771 RemoveTextTrack(0); | |
772 EXPECT_FALSE(text_renderer_->HasTracks()); | |
773 DestroyTextRenderer(); | |
774 } | |
775 | |
776 TEST_F(TextRendererTest, PlayEosOnlyRemove_TwoTracks) { | |
777 CreateTextRenderer(); | |
778 AddTextTrack(kTextSubtitles, "1", "", true); | |
779 AddTextTrack(kTextSubtitles, "2", "", true); | |
780 Play(); | |
781 EXPECT_CALL(*this, OnEnd()); | |
782 SendEosNotifications(); | |
783 RemoveTextTrack(0); | |
784 EXPECT_TRUE(text_renderer_->HasTracks()); | |
785 RemoveTextTrack(1); | |
786 EXPECT_FALSE(text_renderer_->HasTracks()); | |
787 DestroyTextRenderer(); | |
788 } | |
789 | |
790 TEST_F(TextRendererTest, PlayCueEosRemove_OneTrack) { | |
791 CreateTextRenderer(); | |
792 AddTextTrack(kTextSubtitles, "", "", true); | |
793 Play(); | |
794 ExpectRead(0); | |
795 SendCues(true); | |
796 EXPECT_CALL(*this, OnEnd()); | |
797 SendEosNotifications(); | |
798 RemoveTextTrack(0); | |
799 EXPECT_FALSE(text_renderer_->HasTracks()); | |
800 DestroyTextRenderer(); | |
801 } | |
802 | |
803 TEST_F(TextRendererTest, PlayCueEosRemove_TwoTracks) { | |
804 CreateTextRenderer(); | |
805 AddTextTrack(kTextSubtitles, "1", "", true); | |
806 AddTextTrack(kTextSubtitles, "2", "", true); | |
807 Play(); | |
808 ExpectRead(0); | |
809 ExpectRead(1); | |
810 SendCues(true); | |
811 EXPECT_CALL(*this, OnEnd()); | |
812 SendEosNotifications(); | |
813 RemoveTextTrack(0); | |
814 EXPECT_TRUE(text_renderer_->HasTracks()); | |
815 RemoveTextTrack(1); | |
816 EXPECT_FALSE(text_renderer_->HasTracks()); | |
817 DestroyTextRenderer(); | |
818 } | |
819 | |
820 TEST_F(TextRendererTest, TestStopPendingRemove_OneTrack) { | |
821 CreateTextRenderer(); | |
822 AddTextTrack(kTextSubtitles, "", "", true); | |
823 Play(); | |
824 Stop(); | |
825 EXPECT_CALL(*this, OnStop()); | |
826 SendEosNotifications(); | |
827 RemoveTextTrack(0); | |
828 EXPECT_FALSE(text_renderer_->HasTracks()); | |
829 text_renderer_.reset(); | |
830 text_track_streams_.clear(); | |
831 } | |
832 | |
833 TEST_F(TextRendererTest, TestStopPendingRemove_TwoTracks) { | |
834 CreateTextRenderer(); | |
835 AddTextTrack(kTextSubtitles, "1", "", true); | |
836 AddTextTrack(kTextSubtitles, "2", "", true); | |
837 Play(); | |
838 Stop(); | |
839 SendEosNotification(0); | |
840 EXPECT_CALL(*this, OnStop()); | |
841 SendEosNotification(1); | |
842 RemoveTextTrack(0); | |
843 EXPECT_TRUE(text_renderer_->HasTracks()); | |
844 RemoveTextTrack(1); | |
845 EXPECT_FALSE(text_renderer_->HasTracks()); | |
846 text_renderer_.reset(); | |
847 text_track_streams_.clear(); | |
848 } | |
849 | |
850 TEST_F(TextRendererTest, TestStopPendingRemove_RemoveThenSendEos) { | |
851 CreateTextRenderer(); | |
852 AddTextTrack(kTextSubtitles, "1", "", true); | |
853 AddTextTrack(kTextSubtitles, "2", "", true); | |
854 Play(); | |
855 Stop(); | |
856 SendEosNotification(0); | |
857 RemoveTextTrack(0); | |
858 EXPECT_TRUE(text_renderer_->HasTracks()); | |
859 EXPECT_CALL(*this, OnStop()); | |
860 SendEosNotification(1); | |
861 RemoveTextTrack(1); | |
862 EXPECT_FALSE(text_renderer_->HasTracks()); | |
863 text_renderer_.reset(); | |
864 text_track_streams_.clear(); | |
865 } | |
866 | |
867 TEST_F(TextRendererTest, PlayPauseRemove_PauseThenRemove) { | |
868 CreateTextRenderer(); | |
869 AddTextTrack(kTextSubtitles, "", "", true); | |
870 Play(); | |
871 AbortPendingReads(); | |
872 EXPECT_CALL(*this, OnPause()); | |
873 Pause(); | |
874 RemoveTextTrack(0); | |
875 EXPECT_FALSE(text_renderer_->HasTracks()); | |
876 DestroyTextRenderer(); | |
877 } | |
878 | |
879 TEST_F(TextRendererTest, PlayPauseRemove_RemoveThanPause) { | |
880 CreateTextRenderer(); | |
881 AddTextTrack(kTextSubtitles, "", "", true); | |
882 Play(); | |
883 AbortPendingReads(); | |
884 RemoveTextTrack(0); | |
885 EXPECT_FALSE(text_renderer_->HasTracks()); | |
886 EXPECT_CALL(*this, OnPause()); | |
887 Pause(); | |
888 DestroyTextRenderer(); | |
889 } | |
890 | |
891 TEST_F(TextRendererTest, PlayPause_PauseThenRemoveTwoTracks) { | |
892 CreateTextRenderer(); | |
893 AddTextTrack(kTextSubtitles, "1", "", true); | |
894 AddTextTrack(kTextSubtitles, "2", "", true); | |
895 Play(); | |
896 AbortPendingReads(); | |
897 EXPECT_CALL(*this, OnPause()); | |
898 Pause(); | |
899 RemoveTextTrack(0); | |
900 EXPECT_TRUE(text_renderer_->HasTracks()); | |
901 RemoveTextTrack(1); | |
902 EXPECT_FALSE(text_renderer_->HasTracks()); | |
903 DestroyTextRenderer(); | |
904 } | |
905 | |
906 TEST_F(TextRendererTest, PlayPauseRemove_RemoveThenPauseTwoTracks) { | |
907 CreateTextRenderer(); | |
908 AddTextTrack(kTextSubtitles, "1", "", true); | |
909 AddTextTrack(kTextSubtitles, "2", "", true); | |
910 Play(); | |
911 AbortPendingReads(); | |
912 RemoveTextTrack(0); | |
913 EXPECT_TRUE(text_renderer_->HasTracks()); | |
914 EXPECT_CALL(*this, OnPause()); | |
915 Pause(); | |
916 RemoveTextTrack(1); | |
917 EXPECT_FALSE(text_renderer_->HasTracks()); | |
918 DestroyTextRenderer(); | |
919 } | |
920 | |
921 TEST_F(TextRendererTest, PlayPauseRemove_SplitCancel) { | |
922 CreateTextRenderer(); | |
923 AddTextTrack(kTextSubtitles, "1", "", true); | |
924 AddTextTrack(kTextSubtitles, "2", "", true); | |
925 Play(); | |
926 AbortPendingRead(0); | |
927 RemoveTextTrack(0); | |
928 EXPECT_TRUE(text_renderer_->HasTracks()); | |
929 AbortPendingRead(1); | |
930 EXPECT_CALL(*this, OnPause()); | |
931 Pause(); | |
932 RemoveTextTrack(1); | |
933 EXPECT_FALSE(text_renderer_->HasTracks()); | |
934 DestroyTextRenderer(); | |
935 } | |
936 | |
937 | |
938 TEST_F(TextRendererTest, PlayPauseRemove_PauseLast) { | |
939 CreateTextRenderer(); | |
940 AddTextTrack(kTextSubtitles, "1", "", true); | |
941 AddTextTrack(kTextSubtitles, "2", "", true); | |
942 Play(); | |
943 AbortPendingRead(0); | |
944 RemoveTextTrack(0); | |
945 EXPECT_TRUE(text_renderer_->HasTracks()); | |
946 AbortPendingRead(1); | |
947 RemoveTextTrack(1); | |
948 EXPECT_FALSE(text_renderer_->HasTracks()); | |
949 EXPECT_CALL(*this, OnPause()); | |
950 Pause(); | |
951 DestroyTextRenderer(); | |
952 } | |
953 | |
954 TEST_F(TextRendererTest, PlayEosPausePendingRemove_OneTrack) { | |
955 CreateTextRenderer(); | |
956 AddTextTrack(kTextSubtitles, "", "", true); | |
957 Play(); | |
958 Pause(); | |
959 EXPECT_CALL(*this, OnPause()); | |
960 SendEosNotifications(); | |
961 RemoveTextTrack(0); | |
962 EXPECT_FALSE(text_renderer_->HasTracks()); | |
963 DestroyTextRenderer(); | |
964 } | |
965 | |
966 TEST_F(TextRendererTest, PlayEosPausePendingRemove_TwoTracks) { | |
967 CreateTextRenderer(); | |
968 AddTextTrack(kTextSubtitles, "1", "", true); | |
969 AddTextTrack(kTextSubtitles, "2", "", true); | |
970 Play(); | |
971 Pause(); | |
972 SendEosNotification(0); | |
973 EXPECT_CALL(*this, OnPause()); | |
974 SendEosNotification(1); | |
975 RemoveTextTrack(0); | |
976 EXPECT_TRUE(text_renderer_->HasTracks()); | |
977 RemoveTextTrack(1); | |
978 EXPECT_FALSE(text_renderer_->HasTracks()); | |
979 DestroyTextRenderer(); | |
980 } | |
981 | |
982 TEST_F(TextRendererTest, PlayEosPausePendingRemove_SplitEos) { | |
983 CreateTextRenderer(); | |
984 AddTextTrack(kTextSubtitles, "1", "", true); | |
985 AddTextTrack(kTextSubtitles, "2", "", true); | |
986 Play(); | |
987 Pause(); | |
988 SendEosNotification(0); | |
989 RemoveTextTrack(0); | |
990 EXPECT_TRUE(text_renderer_->HasTracks()); | |
991 EXPECT_CALL(*this, OnPause()); | |
992 SendEosNotification(1); | |
993 RemoveTextTrack(1); | |
994 EXPECT_FALSE(text_renderer_->HasTracks()); | |
995 DestroyTextRenderer(); | |
996 } | |
997 | |
998 TEST_F(TextRendererTest, PlayCuePausePendingRemove_OneTrack) { | |
999 CreateTextRenderer(); | |
1000 AddTextTrack(kTextSubtitles, "", "", true); | |
1001 Play(); | |
1002 Pause(); | |
1003 EXPECT_CALL(*this, OnPause()); | |
1004 SendCues(true); | |
1005 RemoveTextTrack(0); | |
1006 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1007 DestroyTextRenderer(); | |
1008 } | |
1009 | |
1010 TEST_F(TextRendererTest, PlayCuePausePendingRemove_TwoTracks) { | |
1011 CreateTextRenderer(); | |
1012 AddTextTrack(kTextSubtitles, "1", "", true); | |
1013 AddTextTrack(kTextSubtitles, "2", "", true); | |
1014 Play(); | |
1015 Pause(); | |
1016 SendCue(0, true); | |
1017 EXPECT_CALL(*this, OnPause()); | |
1018 SendCue(1, true); | |
1019 RemoveTextTrack(0); | |
1020 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1021 RemoveTextTrack(1); | |
1022 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1023 DestroyTextRenderer(); | |
1024 } | |
1025 | |
1026 TEST_F(TextRendererTest, PlayCuePausePendingRemove_SplitSendCue) { | |
1027 CreateTextRenderer(); | |
1028 AddTextTrack(kTextSubtitles, "1", "", true); | |
1029 AddTextTrack(kTextSubtitles, "2", "", true); | |
1030 Play(); | |
1031 Pause(); | |
1032 SendCue(0, true); | |
1033 RemoveTextTrack(0); | |
1034 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1035 EXPECT_CALL(*this, OnPause()); | |
1036 SendCue(1, true); | |
1037 RemoveTextTrack(1); | |
1038 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1039 DestroyTextRenderer(); | |
1040 } | |
1041 | |
1042 TEST_F(TextRendererTest, PlayEosPauseRemove_PauseThenRemove) { | |
1043 CreateTextRenderer(); | |
1044 AddTextTrack(kTextSubtitles, "", "", true); | |
1045 Play(); | |
1046 EXPECT_CALL(*this, OnEnd()); | |
1047 SendEosNotifications(); | |
1048 EXPECT_CALL(*this, OnPause()); | |
1049 Pause(); | |
1050 RemoveTextTrack(0); | |
1051 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1052 DestroyTextRenderer(); | |
1053 } | |
1054 | |
1055 TEST_F(TextRendererTest, PlayEosPauseRemove_RemoveThenPause) { | |
1056 CreateTextRenderer(); | |
1057 AddTextTrack(kTextSubtitles, "", "", true); | |
1058 Play(); | |
1059 EXPECT_CALL(*this, OnEnd()); | |
1060 SendEosNotifications(); | |
1061 RemoveTextTrack(0); | |
1062 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1063 EXPECT_CALL(*this, OnPause()); | |
1064 Pause(); | |
1065 DestroyTextRenderer(); | |
1066 } | |
1067 | |
1068 TEST_F(TextRendererTest, PlayEosPause_PauseThenRemoveTwoTracks) { | |
1069 CreateTextRenderer(); | |
1070 AddTextTrack(kTextSubtitles, "1", "", true); | |
1071 AddTextTrack(kTextSubtitles, "2", "", true); | |
1072 Play(); | |
1073 SendEosNotification(0); | |
1074 EXPECT_CALL(*this, OnEnd()); | |
1075 SendEosNotification(1); | |
1076 EXPECT_CALL(*this, OnPause()); | |
1077 Pause(); | |
1078 RemoveTextTrack(0); | |
1079 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1080 RemoveTextTrack(1); | |
1081 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1082 DestroyTextRenderer(); | |
1083 } | |
1084 | |
1085 TEST_F(TextRendererTest, PlayEosPause_RemovePauseRemove) { | |
1086 CreateTextRenderer(); | |
1087 AddTextTrack(kTextSubtitles, "1", "", true); | |
1088 AddTextTrack(kTextSubtitles, "2", "", true); | |
1089 Play(); | |
1090 SendEosNotification(0); | |
1091 EXPECT_CALL(*this, OnEnd()); | |
1092 SendEosNotification(1); | |
1093 RemoveTextTrack(0); | |
1094 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1095 EXPECT_CALL(*this, OnPause()); | |
1096 Pause(); | |
1097 RemoveTextTrack(1); | |
1098 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1099 DestroyTextRenderer(); | |
1100 } | |
1101 | |
1102 TEST_F(TextRendererTest, PlayEosPause_EosThenPause) { | |
1103 CreateTextRenderer(); | |
1104 AddTextTrack(kTextSubtitles, "1", "", true); | |
1105 AddTextTrack(kTextSubtitles, "2", "", true); | |
1106 Play(); | |
1107 SendEosNotification(0); | |
1108 RemoveTextTrack(0); | |
1109 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1110 EXPECT_CALL(*this, OnEnd()); | |
1111 SendEosNotification(1); | |
1112 EXPECT_CALL(*this, OnPause()); | |
1113 Pause(); | |
1114 RemoveTextTrack(1); | |
1115 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1116 DestroyTextRenderer(); | |
1117 } | |
1118 | |
1119 TEST_F(TextRendererTest, PlayEosPause_PauseLast) { | |
1120 CreateTextRenderer(); | |
1121 AddTextTrack(kTextSubtitles, "1", "", true); | |
1122 AddTextTrack(kTextSubtitles, "2", "", true); | |
1123 Play(); | |
1124 SendEosNotification(0); | |
1125 RemoveTextTrack(0); | |
1126 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1127 EXPECT_CALL(*this, OnEnd()); | |
1128 SendEosNotification(1); | |
1129 RemoveTextTrack(1); | |
1130 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1131 EXPECT_CALL(*this, OnPause()); | |
1132 Pause(); | |
1133 DestroyTextRenderer(); | |
1134 } | |
1135 | |
1136 TEST_F(TextRendererTest, PlayEosPause_EosPauseRemove) { | |
1137 CreateTextRenderer(); | |
1138 AddTextTrack(kTextSubtitles, "1", "", true); | |
1139 AddTextTrack(kTextSubtitles, "2", "", true); | |
1140 Play(); | |
1141 SendEosNotification(0); | |
1142 EXPECT_CALL(*this, OnEnd()); | |
1143 SendEosNotification(1); | |
1144 EXPECT_CALL(*this, OnPause()); | |
1145 Pause(); | |
1146 RemoveTextTrack(0); | |
1147 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1148 RemoveTextTrack(1); | |
1149 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1150 DestroyTextRenderer(); | |
1151 } | |
1152 | |
1153 TEST_F(TextRendererTest, PlayEosPause_EosRemovePause) { | |
1154 CreateTextRenderer(); | |
1155 AddTextTrack(kTextSubtitles, "1", "", true); | |
1156 AddTextTrack(kTextSubtitles, "2", "", true); | |
1157 Play(); | |
1158 SendEosNotification(0); | |
1159 EXPECT_CALL(*this, OnEnd()); | |
1160 SendEosNotification(1); | |
1161 RemoveTextTrack(0); | |
1162 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1163 EXPECT_CALL(*this, OnPause()); | |
1164 Pause(); | |
1165 RemoveTextTrack(1); | |
1166 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1167 DestroyTextRenderer(); | |
1168 } | |
1169 | |
1170 TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosPause) { | |
1171 CreateTextRenderer(); | |
1172 AddTextTrack(kTextSubtitles, "1", "", true); | |
1173 AddTextTrack(kTextSubtitles, "2", "", true); | |
1174 Play(); | |
1175 SendEosNotification(0); | |
1176 RemoveTextTrack(0); | |
1177 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1178 EXPECT_CALL(*this, OnEnd()); | |
1179 SendEosNotification(1); | |
1180 EXPECT_CALL(*this, OnPause()); | |
1181 Pause(); | |
1182 RemoveTextTrack(1); | |
1183 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1184 DestroyTextRenderer(); | |
1185 } | |
1186 | |
1187 TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosRemovePause) { | |
1188 CreateTextRenderer(); | |
1189 AddTextTrack(kTextSubtitles, "1", "", true); | |
1190 AddTextTrack(kTextSubtitles, "2", "", true); | |
1191 Play(); | |
1192 SendEosNotification(0); | |
1193 RemoveTextTrack(0); | |
1194 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1195 EXPECT_CALL(*this, OnEnd()); | |
1196 SendEosNotification(1); | |
1197 RemoveTextTrack(1); | |
1198 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1199 EXPECT_CALL(*this, OnPause()); | |
1200 Pause(); | |
1201 DestroyTextRenderer(); | |
1202 } | |
1203 | |
1204 TEST_F(TextRendererTest, PlayEosFlushRemove_OneTrack) { | |
1205 CreateTextRenderer(); | |
1206 AddTextTrack(kTextSubtitles, "", "", true); | |
1207 Play(); | |
1208 EXPECT_CALL(*this, OnEnd()); | |
1209 SendEosNotifications(); | |
1210 EXPECT_CALL(*this, OnPause()); | |
1211 Pause(); | |
1212 Flush(); | |
1213 ExpectRead(0); | |
1214 Play(); | |
1215 EXPECT_CALL(*this, OnEnd()); | |
1216 SendEosNotifications(); | |
1217 RemoveTextTrack(0); | |
1218 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1219 DestroyTextRenderer(); | |
1220 } | |
1221 | |
1222 TEST_F(TextRendererTest, PlayEosFlushRemove_TwoTracks) { | |
1223 CreateTextRenderer(); | |
1224 AddTextTrack(kTextSubtitles, "1", "", true); | |
1225 AddTextTrack(kTextSubtitles, "2", "", true); | |
1226 Play(); | |
1227 EXPECT_CALL(*this, OnEnd()); | |
1228 SendEosNotifications(); | |
1229 EXPECT_CALL(*this, OnPause()); | |
1230 Pause(); | |
1231 Flush(); | |
1232 ExpectRead(0); | |
1233 ExpectRead(1); | |
1234 Play(); | |
1235 SendEosNotification(0); | |
1236 EXPECT_CALL(*this, OnEnd()); | |
1237 SendEosNotification(1); | |
1238 RemoveTextTrack(0); | |
1239 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1240 RemoveTextTrack(1); | |
1241 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1242 DestroyTextRenderer(); | |
1243 } | |
1244 | |
1245 TEST_F(TextRendererTest, PlayEosFlushRemove_EosRemove) { | |
1246 CreateTextRenderer(); | |
1247 AddTextTrack(kTextSubtitles, "1", "", true); | |
1248 AddTextTrack(kTextSubtitles, "2", "", true); | |
1249 Play(); | |
1250 EXPECT_CALL(*this, OnEnd()); | |
1251 SendEosNotifications(); | |
1252 EXPECT_CALL(*this, OnPause()); | |
1253 Pause(); | |
1254 Flush(); | |
1255 ExpectRead(0); | |
1256 ExpectRead(1); | |
1257 Play(); | |
1258 SendEosNotification(0); | |
1259 RemoveTextTrack(0); | |
1260 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1261 EXPECT_CALL(*this, OnEnd()); | |
1262 SendEosNotification(1); | |
1263 RemoveTextTrack(1); | |
1264 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1265 DestroyTextRenderer(); | |
1266 } | |
1267 | |
1268 TEST_F(TextRendererTest, PlayShort_SendCueThenEos) { | |
1269 CreateTextRenderer(); | |
1270 AddTextTrack(kTextSubtitles, "1", "", true); | |
1271 AddTextTrack(kTextSubtitles, "2", "", true); | |
1272 Play(); | |
1273 Pause(); | |
1274 SendCue(0, true); | |
1275 EXPECT_CALL(*this, OnPause()); | |
1276 SendEosNotification(1); | |
1277 DestroyTextRenderer(); | |
1278 } | |
1279 | |
1280 TEST_F(TextRendererTest, PlayShort_EosThenSendCue) { | |
1281 CreateTextRenderer(); | |
1282 AddTextTrack(kTextSubtitles, "1", "", true); | |
1283 AddTextTrack(kTextSubtitles, "2", "", true); | |
1284 Play(); | |
1285 Pause(); | |
1286 SendEosNotification(0); | |
1287 EXPECT_CALL(*this, OnPause()); | |
1288 SendCue(1, true); | |
1289 DestroyTextRenderer(); | |
1290 } | |
1291 | |
1292 TEST_F(TextRendererTest, PlayShortRemove_SendEosRemove) { | |
1293 CreateTextRenderer(); | |
1294 AddTextTrack(kTextSubtitles, "1", "", true); | |
1295 AddTextTrack(kTextSubtitles, "2", "", true); | |
1296 Play(); | |
1297 Pause(); | |
1298 SendCue(0, true); | |
1299 EXPECT_CALL(*this, OnPause()); | |
1300 SendEosNotification(1); | |
1301 RemoveTextTrack(0); | |
1302 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1303 RemoveTextTrack(1); | |
1304 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1305 DestroyTextRenderer(); | |
1306 } | |
1307 | |
1308 TEST_F(TextRendererTest, PlayShortRemove_SendRemoveEos) { | |
1309 CreateTextRenderer(); | |
1310 AddTextTrack(kTextSubtitles, "1", "", true); | |
1311 AddTextTrack(kTextSubtitles, "2", "", true); | |
1312 Play(); | |
1313 Pause(); | |
1314 SendCue(0, true); | |
1315 RemoveTextTrack(0); | |
1316 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1317 EXPECT_CALL(*this, OnPause()); | |
1318 SendEosNotification(1); | |
1319 RemoveTextTrack(1); | |
1320 EXPECT_FALSE(text_renderer_->HasTracks()); | |
1321 DestroyTextRenderer(); | |
1322 } | |
1323 | |
1324 TEST_F(TextRendererTest, PlayCuePausePendingCancel_OneTrack) { | |
1325 CreateTextRenderer(); | |
1326 AddTextTrack(kTextSubtitles, "", "", true); | |
1327 Play(); | |
1328 Pause(); | |
1329 EXPECT_CALL(*this, OnPause()); | |
1330 AbortPendingRead(0); | |
1331 DestroyTextRenderer(); | |
1332 } | |
1333 | |
1334 TEST_F(TextRendererTest, PlayCuePausePendingCancel_SendThenCancel) { | |
1335 CreateTextRenderer(); | |
1336 AddTextTrack(kTextSubtitles, "1", "", true); | |
1337 AddTextTrack(kTextSubtitles, "2", "", true); | |
1338 Play(); | |
1339 Pause(); | |
1340 SendCue(0, true); | |
1341 EXPECT_CALL(*this, OnPause()); | |
1342 AbortPendingRead(1); | |
1343 DestroyTextRenderer(); | |
1344 } | |
1345 | |
1346 TEST_F(TextRendererTest, PlayCuePausePendingCancel_CancelThenSend) { | |
1347 CreateTextRenderer(); | |
1348 AddTextTrack(kTextSubtitles, "1", "", true); | |
1349 AddTextTrack(kTextSubtitles, "2", "", true); | |
1350 Play(); | |
1351 Pause(); | |
1352 AbortPendingRead(0); | |
1353 EXPECT_CALL(*this, OnPause()); | |
1354 SendCue(1, true); | |
1355 DestroyTextRenderer(); | |
1356 } | |
1357 | |
1358 TEST_F(TextRendererTest, PlayCueStopPendingCancel_OneTrack) { | |
1359 CreateTextRenderer(); | |
1360 AddTextTrack(kTextSubtitles, "", "", true); | |
1361 Play(); | |
1362 Pause(); | |
1363 Stop(); | |
1364 EXPECT_CALL(*this, OnStop()); | |
1365 AbortPendingRead(0); | |
1366 text_renderer_.reset(); | |
1367 text_track_streams_.clear(); | |
1368 } | |
1369 | |
1370 TEST_F(TextRendererTest, PlayCueStopPendingCancel_SendThenCancel) { | |
1371 CreateTextRenderer(); | |
1372 AddTextTrack(kTextSubtitles, "1", "", true); | |
1373 AddTextTrack(kTextSubtitles, "2", "", true); | |
1374 Play(); | |
1375 Pause(); | |
1376 Stop(); | |
1377 SendCue(0, false); | |
1378 EXPECT_CALL(*this, OnStop()); | |
1379 AbortPendingRead(1); | |
1380 text_renderer_.reset(); | |
1381 text_track_streams_.clear(); | |
1382 } | |
1383 | |
1384 TEST_F(TextRendererTest, PlayCueStopPendingCancel_CancelThenSend) { | |
1385 CreateTextRenderer(); | |
1386 AddTextTrack(kTextSubtitles, "1", "", true); | |
1387 AddTextTrack(kTextSubtitles, "2", "", true); | |
1388 Play(); | |
1389 Pause(); | |
1390 Stop(); | |
1391 AbortPendingRead(0); | |
1392 EXPECT_CALL(*this, OnStop()); | |
1393 SendCue(1, false); | |
1394 text_renderer_.reset(); | |
1395 text_track_streams_.clear(); | |
1396 } | |
1397 | |
1398 TEST_F(TextRendererTest, AddRemoveAdd) { | |
1399 CreateTextRenderer(); | |
1400 AddTextTrack(kTextSubtitles, "", "", true); | |
1401 Play(); | |
1402 AbortPendingRead(0); | |
1403 RemoveTextTrack(0); | |
1404 EXPECT_CALL(*this, OnPause()); | |
1405 Pause(); | |
1406 AddTextTrack(kTextSubtitles, "", "", true); | |
1407 Play(); | |
1408 EXPECT_CALL(*this, OnEnd()); | |
1409 SendEosNotification(1); | |
1410 DestroyTextRenderer(); | |
1411 } | |
1412 | |
1413 TEST_F(TextRendererTest, AddRemoveEos) { | |
1414 CreateTextRenderer(); | |
1415 AddTextTrack(kTextSubtitles, "1", "", true); | |
1416 AddTextTrack(kTextSubtitles, "2", "", true); | |
1417 Play(); | |
1418 AbortPendingRead(0); | |
1419 RemoveTextTrack(0); | |
1420 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1421 EXPECT_CALL(*this, OnEnd()); | |
1422 SendEosNotification(1); | |
1423 DestroyTextRenderer(); | |
1424 } | |
1425 | |
1426 TEST_F(TextRendererTest, AddRemovePause) { | |
1427 CreateTextRenderer(); | |
1428 AddTextTrack(kTextSubtitles, "1", "", true); | |
1429 AddTextTrack(kTextSubtitles, "2", "", true); | |
1430 Play(); | |
1431 AbortPendingRead(0); | |
1432 RemoveTextTrack(0); | |
1433 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1434 Pause(); | |
1435 EXPECT_CALL(*this, OnPause()); | |
1436 SendEosNotification(1); | |
1437 DestroyTextRenderer(); | |
1438 } | |
1439 | |
1440 TEST_F(TextRendererTest, AddRemovePauseStop) { | |
1441 CreateTextRenderer(); | |
1442 AddTextTrack(kTextSubtitles, "1", "", true); | |
1443 AddTextTrack(kTextSubtitles, "2", "", true); | |
1444 Play(); | |
1445 AbortPendingRead(0); | |
1446 RemoveTextTrack(0); | |
1447 EXPECT_TRUE(text_renderer_->HasTracks()); | |
1448 Pause(); | |
1449 Stop(); | |
1450 EXPECT_CALL(*this, OnStop()); | |
1451 SendEosNotification(1); | |
1452 text_renderer_.reset(); | |
1453 text_track_streams_.clear(); | |
1454 } | |
1455 | |
1456 } // namespace media | |
OLD | NEW |