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

Side by Side Diff: media/base/text_renderer_unittest.cc

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (11/12) Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698