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

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/04) 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 (c) 2013 The Chromium Authors. All rights reserved.
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 nit: s/ (c)// New files are supposed to use a head
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
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::Invoke;
22 using ::testing::_;
23
24 namespace media {
25
26 class TextRendererTest;
27 class TextTrackTest;
28
29 // To store the cue delivered by the text renderer, when it receives
30 // a decoder buffer.
31 struct TextCueTest {
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 This looks almost identical to the TextCue object.
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
32 base::TimeDelta start_;
33 base::TimeDelta end_;
34 std::string id_;
35 std::string content_;
36 std::string settings_;
37
38 TextCueTest(const base::TimeDelta& start,
39 const base::TimeDelta& end,
40 const std::string& id,
41 const std::string& content,
42 const std::string& settings)
43 : start_(start),
44 end_(end),
45 id_(id),
46 content_(content),
47 settings_(settings) {
48 }
49 };
50
51 // Grant last wishes to the TextTrackTest object.
52 void RemoveTextTrackTest(TextRendererTest* text_renderer_test,
53 TextTrackTest* text_track);
54
55 // A local implementation of the TextTrack interface. It simply
56 // stores the cue(s) delivered by the text renderer, allowing the
57 // this test framework to compare the cue received to the cue
58 // pushed downstream.
59 class TextTrackTest : public TextTrack {
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 nit:s/TextTrackTest/FakeTextTrack/ since this is a
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
60 public:
61 TextTrackTest(TextRendererTest* text_renderer_test,
62 unsigned idx,
63 const TextTrackConfig& config)
64 : text_renderer_test_(text_renderer_test),
65 index_(idx),
66 config_(config) {
67 }
68 virtual ~TextTrackTest() {
69 RemoveTextTrackTest(text_renderer_test_, this);
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 Pass a Closure into the constructor instead so thi
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
70 }
71 virtual void addWebVTTCue(const base::TimeDelta& start,
72 const base::TimeDelta& end,
73 const std::string& id,
74 const std::string& content,
75 const std::string& settings) OVERRIDE {
76 cues_.push_back(TextCueTest(start, end, id, content, settings));
77 }
78
79 TextRendererTest* const text_renderer_test_;
80
81 // Index of this TextTrack object in the vector of such objects
82 // maintained by the TextRendererTest object.
83 const unsigned index_;
84
85 const TextTrackConfig config_;
86
87 typedef std::vector<TextCueTest> Cues;
88 Cues cues_;
89
90 private:
91 DISALLOW_COPY_AND_ASSIGN(TextTrackTest);
92 };
93
94 // Local implementation of the DemuxerStream. These are the stream objects
95 // we pass to the text renderer object when streams are added and removed.
96 class TextTrackStream : public DemuxerStream {
97 public:
98 TextTrackStream()
99 : message_loop_(base::MessageLoopProxy::current()) {
100 }
101 virtual ~TextTrackStream() {
102 DCHECK(read_cb_.is_null());
103 }
104
105 // DemuxerStream implementation.
106 MOCK_METHOD1(Read, void(const ReadCB&));
107 MOCK_METHOD0(audio_decoder_config, AudioDecoderConfig());
108 MOCK_METHOD0(video_decoder_config, VideoDecoderConfig());
109 virtual Type type() OVERRIDE { return DemuxerStream::TEXT; }
110 MOCK_METHOD0(EnableBitstreamConverter, void());
111
112 // Local methods
113
114 void DoRead(const ReadCB& read_cb) {
115 EXPECT_FALSE(read_cb.is_null());
116 EXPECT_TRUE(read_cb_.is_null());
117 read_cb_ = read_cb;
118 }
119
120 void SatisfyPendingRead(const base::TimeDelta& start,
121 const base::TimeDelta& duration,
122 const std::string& id,
123 const std::string& content,
124 const std::string& settings) {
125 EXPECT_FALSE(read_cb_.is_null());
126
127 const uint8* const data = reinterpret_cast<const uint8*>(content.data());
128
129 std::vector<uint8> side_data;
130 MakeSideData(id.begin(), id.end(),
131 settings.begin(), settings.end(),
132 &side_data);
133
134 scoped_refptr<DecoderBuffer> buffer;
135
136 buffer = DecoderBuffer::CopyFrom(data,
137 content.size(),
138 side_data.data(),
139 side_data.size());
140
141 buffer->set_timestamp(start);
142 buffer->set_duration(duration);
143
144 base::ResetAndReturn(&read_cb_).Run(kOk, buffer);
145 }
146
147 void AbortPendingRead() {
148 EXPECT_FALSE(read_cb_.is_null());
149 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
150 }
151
152 void SendEosNotification() {
153 EXPECT_FALSE(read_cb_.is_null());
154 base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer());
155 }
156
157 scoped_refptr<base::MessageLoopProxy> message_loop_;
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 Why do you need this? It doesn't look like you are
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
158 ReadCB read_cb_;
159
160 private:
161 DISALLOW_COPY_AND_ASSIGN(TextTrackStream);
162 };
163
164 class TextRendererTest : public testing::Test {
165 public:
166 TextRendererTest() {}
167
168 void CreateTextRenderer() {
169 DCHECK(!text_renderer_);
170
171 text_renderer_.reset(
172 new TextRenderer(message_loop_.message_loop_proxy(),
173 base::Bind(&TextRendererTest::OnAddTextTrack,
174 base::Unretained(this))));
175 text_renderer_->Initialize(base::Bind(&TextRendererTest::OnEnd,
176 base::Unretained(this)));
177 }
178
179 void DestroyTextRenderer() {
180 EXPECT_CALL(*this, OnStop());
181 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
182 base::Unretained(this)));
183 message_loop_.RunUntilIdle();
184
185 text_renderer_.reset();
186 text_track_streams_.clear();
187 }
188
189 TextTrackStream* CreateTextTrack() {
190 text_track_streams_.push_back(new TextTrackStream);
191 return text_track_streams_.back();
192 }
193
194 void AddTextTrack(TextKind kind,
195 const std::string& name,
196 const std::string& language) {
197 EXPECT_CALL(*this, OnAddTextTrack(_,_))
198 .WillOnce(Invoke(this, &TextRendererTest::DoAddTextTrack));
199
200 const TextTrackConfig config(kind, name, language);
201 text_renderer_->AddTextStream(text_track_streams_.back(), config);
202 message_loop_.RunUntilIdle();
203
204 EXPECT_FALSE(text_tracks_.empty());
205 TextTrackTest* const text_track = text_tracks_.back();
206 EXPECT_TRUE(text_track->config_.Matches(config));
207 }
208
209 MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&,
210 const AddTextTrackDoneCB&));
211
212 void DoAddTextTrack(const TextTrackConfig& config,
213 const AddTextTrackDoneCB& done_cb) {
214 const unsigned idx = text_tracks_.size();
215 scoped_ptr<TextTrackTest> text_track(new TextTrackTest(this,
216 idx,
217 config));
218 // text_track is owned by text renderer, but we cache it here so we
219 // can inspect it. It gets removed from the cache when the text renderer
220 // deallocates it.
221 text_tracks_.push_back(text_track.get());
222 done_cb.Run(text_track.Pass());
223 }
224
225 void SatisfyPendingReads(const base::TimeDelta& start,
226 const base::TimeDelta& duration,
227 const std::string& id,
228 const std::string& content,
229 const std::string& settings) {
230 for (TextTrackStreams::iterator itr = text_track_streams_.begin();
231 itr != text_track_streams_.end(); ++itr) {
232 (*itr)->SatisfyPendingRead(start, duration, id, content, settings);
233 }
234 }
235
236 void AbortPendingReads() {
237 for (TextTrackStreams::iterator itr = text_track_streams_.begin();
238 itr != text_track_streams_.end(); ++itr) {
239 (*itr)->AbortPendingRead();
240 }
241 }
242
243 void SendEosNotifications() {
244 for (TextTrackStreams::iterator itr = text_track_streams_.begin();
245 itr != text_track_streams_.end(); ++itr) {
246 (*itr)->SendEosNotification();
247 }
248 }
249
250 void SendCues(bool expect_cue) {
251 DCHECK(text_track_streams_.size() == text_tracks_.size());
252
253 const base::TimeDelta start;
254 const base::TimeDelta duration = base::TimeDelta::FromSeconds(42);
255 std::string id = "stratford-on-guy";
256 std::string content = "Yo Yo Buddy Yup Yup Word To Ya Muthuh";
257 std::string settings = "";
258 SatisfyPendingReads(start, duration, id, content, settings);
259
260 message_loop_.RunUntilIdle();
261
262 for (TextTracks::iterator itr = text_tracks_.begin();
263 itr != text_tracks_.end(); ++itr) {
264 TextTrackTest* const text_track = *itr;
265
266 TextTrackTest::Cues& cues = text_track->cues_;
267
268 if (cues.empty()) {
269 EXPECT_FALSE(expect_cue);
270 continue;
271 }
272
273 EXPECT_TRUE(expect_cue);
274 ASSERT_EQ(cues.size(), 1);
275
276 TextCueTest& cue = cues.back();
277 EXPECT_EQ(cue.start_, start);
278 EXPECT_EQ(cue.end_, start + duration);
279 EXPECT_EQ(cue.id_, id);
280 EXPECT_EQ(cue.content_, content);
281 EXPECT_EQ(cue.settings_, settings);
282 }
283 }
284
285 void SendCue(unsigned idx, bool expect_cue) {
286 TextTrackStream* const text_stream = text_track_streams_[idx];
287
288 const base::TimeDelta start;
289 const base::TimeDelta duration = base::TimeDelta::FromSeconds(42);
290 std::string id = "Dance Of The Seven Veils";
291 std::string content = "Girly Sound";
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 nit: I think we should have more neutral test text
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
292 std::string settings = "";
293 text_stream->SatisfyPendingRead(start, duration, id, content, settings);
294
295 message_loop_.RunUntilIdle();
296
297 TextTrackTest* const text_track = text_tracks_[idx];
298
299 TextTrackTest::Cues& cues = text_track->cues_;
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 Do you really need to keep the cues around? It see
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
300
301 if (cues.empty()) {
302 EXPECT_FALSE(expect_cue);
303 return;
304 }
305
306 EXPECT_TRUE(expect_cue);
307 ASSERT_EQ(cues.size(), 1);
308
309 TextCueTest& cue = cues.back();
310 EXPECT_EQ(cue.start_, start);
311 EXPECT_EQ(cue.end_, start + duration);
312 EXPECT_EQ(cue.id_, id);
313 EXPECT_EQ(cue.content_, content);
314 EXPECT_EQ(cue.settings_, settings);
315 }
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 To avoid duplicate code, it seems like SendCues()
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
316
317 void RemoveTextTrackTest(TextTrackTest* text_track_test) {
318 const unsigned idx = text_track_test->index_;
319 DCHECK(text_tracks_[idx] == text_track_test);
320 text_tracks_[idx] = NULL;
321 }
322
323 MOCK_METHOD0(OnEnd, void());
324 MOCK_METHOD0(OnStop, void());
325 MOCK_METHOD0(OnPlay, void());
326 MOCK_METHOD0(OnPause, void());
327 MOCK_METHOD0(OnFlush, void());
328
329 scoped_ptr<TextRenderer> text_renderer_;
330 base::MessageLoop message_loop_;
331
332 typedef ScopedVector<TextTrackStream> TextTrackStreams;
333 TextTrackStreams text_track_streams_;
334
335 typedef std::vector<TextTrackTest*> TextTracks;
336 TextTracks text_tracks_;
337
338 private:
339 DISALLOW_COPY_AND_ASSIGN(TextRendererTest);
340 };
341
342 void RemoveTextTrackTest(TextRendererTest* text_renderer_test,
343 TextTrackTest* text_track) {
344 text_renderer_test->RemoveTextTrackTest(text_track);
345 }
346
347 TEST_F(TextRendererTest, CreateTextRendererNoInit) {
348 text_renderer_.reset(
349 new TextRenderer(message_loop_.message_loop_proxy(),
350 base::Bind(&TextRendererTest::OnAddTextTrack,
351 base::Unretained(this))));
352 text_renderer_.reset();
353 }
354
355 TEST_F(TextRendererTest, TestStop) {
356 CreateTextRenderer();
357 DestroyTextRenderer();
358 }
359
360 TEST_F(TextRendererTest, AddTextTrackOnly) {
361 CreateTextRenderer();
362 CreateTextTrack();
363 AddTextTrack(kTextSubtitles, "", "");
364 DestroyTextRenderer();
365 }
366
367 TEST_F(TextRendererTest, AddTextTracks2Only) {
368 CreateTextRenderer();
369 CreateTextTrack();
370 AddTextTrack(kTextSubtitles, "track 1", "");
371 CreateTextTrack();
372 AddTextTrack(kTextSubtitles, "track 2", "");
373 DestroyTextRenderer();
374 }
375
376 TEST_F(TextRendererTest, PlayOnly) {
377 CreateTextRenderer();
378
379 EXPECT_CALL(*this, OnPlay());
380
381 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
382 base::Unretained(this)));
383 DestroyTextRenderer();
384 }
385
386 TEST_F(TextRendererTest, AddTrackBeforePlay) {
387 CreateTextRenderer();
388
389 TextTrackStream* const text_stream = CreateTextTrack();
390 AddTextTrack(kTextSubtitles, "", "");
391
392 EXPECT_CALL(*this, OnPlay());
393
394 EXPECT_CALL(*text_stream, Read(_))
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 I think it might be better if you change DoRead()
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
395 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
396
397 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
398 base::Unretained(this)));
399 message_loop_.RunUntilIdle();
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 nit: In almost all cases where Play() is called it
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
400
401 AbortPendingReads();
402 message_loop_.RunUntilIdle();
403
404 DestroyTextRenderer();
405 }
406
407 TEST_F(TextRendererTest, AddTrackBeforePlay2) {
408 CreateTextRenderer();
409
410 TextTrackStream* const text_stream_1 = CreateTextTrack();
411 AddTextTrack(kTextSubtitles, "1", "");
412
413 TextTrackStream* const text_stream_2 = CreateTextTrack();
414 AddTextTrack(kTextSubtitles, "2", "");
415
416 EXPECT_CALL(*this, OnPlay());
417
418 EXPECT_CALL(*text_stream_1, Read(_))
419 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
420
421 EXPECT_CALL(*text_stream_2, Read(_))
422 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
423
424 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
425 base::Unretained(this)));
426 message_loop_.RunUntilIdle();
427
428 AbortPendingReads();
429 message_loop_.RunUntilIdle();
430
431 DestroyTextRenderer();
432 }
433
434 TEST_F(TextRendererTest, AddTrackAfterPlay) {
435 CreateTextRenderer();
436
437 EXPECT_CALL(*this, OnPlay());
438
439 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
440 base::Unretained(this)));
441 message_loop_.RunUntilIdle();
442
443 TextTrackStream* const text_stream = CreateTextTrack();
444 EXPECT_CALL(*text_stream, Read(_))
445 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
446
447 AddTextTrack(kTextSubtitles, "", "");
448
449 message_loop_.RunUntilIdle();
450
451 AbortPendingReads();
452 message_loop_.RunUntilIdle();
453
454 DestroyTextRenderer();
455 }
456
457 TEST_F(TextRendererTest, AddTrackAfterPlay2A) {
458 CreateTextRenderer();
459
460 EXPECT_CALL(*this, OnPlay());
461
462 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
463 base::Unretained(this)));
464 message_loop_.RunUntilIdle();
465
466 TextTrackStream* const text_stream_1 = CreateTextTrack();
467 EXPECT_CALL(*text_stream_1, Read(_))
468 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
469
470 AddTextTrack(kTextSubtitles, "1", "");
471
472 TextTrackStream* const text_stream_2 = CreateTextTrack();
473 EXPECT_CALL(*text_stream_2, Read(_))
474 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
475
476 AddTextTrack(kTextSubtitles, "2", "");
477
478 message_loop_.RunUntilIdle();
479
480 AbortPendingReads();
481 message_loop_.RunUntilIdle();
482
483 DestroyTextRenderer();
484 }
485
486 TEST_F(TextRendererTest, AddTrackAfterPlay2B) {
acolwell GONE FROM CHROMIUM 2013/11/10 19:48:08 nit: Typically when we have variants of the same t
Matthew Heaney (Chromium) 2013/11/13 05:44:49 Done.
487 CreateTextRenderer();
488
489 EXPECT_CALL(*this, OnPlay());
490
491 TextTrackStream* const text_stream_1 = CreateTextTrack();
492 EXPECT_CALL(*text_stream_1, Read(_))
493 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
494
495 AddTextTrack(kTextSubtitles, "1", "");
496
497 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
498 base::Unretained(this)));
499 message_loop_.RunUntilIdle();
500
501 TextTrackStream* const text_stream_2 = CreateTextTrack();
502 EXPECT_CALL(*text_stream_2, Read(_))
503 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
504
505 AddTextTrack(kTextSubtitles, "2", "");
506
507 message_loop_.RunUntilIdle();
508
509 AbortPendingReads();
510 message_loop_.RunUntilIdle();
511
512 DestroyTextRenderer();
513 }
514
515 TEST_F(TextRendererTest, PlayAddCue) {
516 CreateTextRenderer();
517
518 TextTrackStream* const text_stream = CreateTextTrack();
519 AddTextTrack(kTextSubtitles, "", "");
520
521 EXPECT_CALL(*this, OnPlay());
522
523 EXPECT_CALL(*text_stream, Read(_))
524 .Times(2)
525 .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead));
526
527 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
528 base::Unretained(this)));
529 message_loop_.RunUntilIdle();
530
531 SendCues(true);
532
533 AbortPendingReads();
534 message_loop_.RunUntilIdle();
535
536 DestroyTextRenderer();
537 }
538
539 TEST_F(TextRendererTest, PlayAddCue2) {
540 CreateTextRenderer();
541
542 TextTrackStream* const text_stream_1 = CreateTextTrack();
543 AddTextTrack(kTextSubtitles, "1", "");
544
545 EXPECT_CALL(*text_stream_1, Read(_))
546 .Times(2)
547 .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead));
548
549 TextTrackStream* const text_stream_2 = CreateTextTrack();
550 AddTextTrack(kTextSubtitles, "2", "");
551
552 EXPECT_CALL(*text_stream_2, Read(_))
553 .Times(2)
554 .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead));
555
556 EXPECT_CALL(*this, OnPlay());
557
558 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
559 base::Unretained(this)));
560 message_loop_.RunUntilIdle();
561
562 SendCues(true);
563
564 AbortPendingReads();
565 message_loop_.RunUntilIdle();
566
567 DestroyTextRenderer();
568 }
569
570 TEST_F(TextRendererTest, PlayEosOnly) {
571 CreateTextRenderer();
572
573 TextTrackStream* const text_stream = CreateTextTrack();
574 AddTextTrack(kTextSubtitles, "", "");
575
576 EXPECT_CALL(*this, OnPlay());
577
578 EXPECT_CALL(*text_stream, Read(_))
579 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
580
581 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
582 base::Unretained(this)));
583 message_loop_.RunUntilIdle();
584
585 EXPECT_CALL(*this, OnEnd());
586 SendEosNotifications();
587 message_loop_.RunUntilIdle();
588
589 DestroyTextRenderer();
590 }
591
592 TEST_F(TextRendererTest, PlayEosOnly2) {
593 CreateTextRenderer();
594
595 TextTrackStream* const text_stream_1 = CreateTextTrack();
596 AddTextTrack(kTextSubtitles, "1", "");
597
598 EXPECT_CALL(*text_stream_1, Read(_))
599 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
600
601 TextTrackStream* const text_stream_2 = CreateTextTrack();
602 AddTextTrack(kTextSubtitles, "2", "");
603
604 EXPECT_CALL(*text_stream_2, Read(_))
605 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
606
607 EXPECT_CALL(*this, OnPlay());
608
609 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
610 base::Unretained(this)));
611 message_loop_.RunUntilIdle();
612
613 EXPECT_CALL(*this, OnEnd());
614 SendEosNotifications();
615 message_loop_.RunUntilIdle();
616
617 DestroyTextRenderer();
618 }
619
620 TEST_F(TextRendererTest, PlayCueEos) {
621 CreateTextRenderer();
622
623 TextTrackStream* const text_stream = CreateTextTrack();
624 AddTextTrack(kTextSubtitles, "", "");
625
626 EXPECT_CALL(*this, OnPlay());
627
628 EXPECT_CALL(*text_stream, Read(_))
629 .Times(2)
630 .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead));
631
632 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
633 base::Unretained(this)));
634 message_loop_.RunUntilIdle();
635
636 SendCues(true);
637
638 EXPECT_CALL(*this, OnEnd());
639 SendEosNotifications();
640 message_loop_.RunUntilIdle();
641
642 DestroyTextRenderer();
643 }
644
645 TEST_F(TextRendererTest, PlayCueEos2) {
646 CreateTextRenderer();
647
648 TextTrackStream* const text_stream_1 = CreateTextTrack();
649 AddTextTrack(kTextSubtitles, "1", "");
650
651 EXPECT_CALL(*text_stream_1, Read(_))
652 .Times(2)
653 .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead));
654
655 TextTrackStream* const text_stream_2 = CreateTextTrack();
656 AddTextTrack(kTextSubtitles, "2", "");
657
658 EXPECT_CALL(*text_stream_2, Read(_))
659 .Times(2)
660 .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead));
661 EXPECT_CALL(*this, OnPlay());
662
663 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
664 base::Unretained(this)));
665 message_loop_.RunUntilIdle();
666
667 SendCues(true);
668
669 EXPECT_CALL(*this, OnEnd());
670 SendEosNotifications();
671 message_loop_.RunUntilIdle();
672
673 DestroyTextRenderer();
674 }
675
676 TEST_F(TextRendererTest, TestStopPending) {
677 CreateTextRenderer();
678
679 TextTrackStream* const text_stream = CreateTextTrack();
680 AddTextTrack(kTextSubtitles, "", "");
681
682 EXPECT_CALL(*this, OnPlay());
683
684 EXPECT_CALL(*text_stream, Read(_))
685 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
686
687 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
688 base::Unretained(this)));
689 message_loop_.RunUntilIdle();
690
691 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
692 base::Unretained(this)));
693
694 EXPECT_CALL(*this, OnStop());
695 SendEosNotifications();
696 message_loop_.RunUntilIdle();
697
698 text_renderer_.reset();
699 text_track_streams_.clear();
700 }
701
702 TEST_F(TextRendererTest, TestStopPending2) {
703 CreateTextRenderer();
704
705 TextTrackStream* const text_stream_1 = CreateTextTrack();
706 AddTextTrack(kTextSubtitles, "1", "");
707
708 EXPECT_CALL(*text_stream_1, Read(_))
709 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
710
711 TextTrackStream* const text_stream_2 = CreateTextTrack();
712 AddTextTrack(kTextSubtitles, "2", "");
713
714 EXPECT_CALL(*text_stream_2, Read(_))
715 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
716
717 EXPECT_CALL(*this, OnPlay());
718
719 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
720 base::Unretained(this)));
721 message_loop_.RunUntilIdle();
722
723 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
724 base::Unretained(this)));
725
726 EXPECT_CALL(*this, OnStop());
727 SendEosNotifications();
728 message_loop_.RunUntilIdle();
729
730 text_renderer_.reset();
731 text_track_streams_.clear();
732 }
733
734 TEST_F(TextRendererTest, PlayPause) {
735 CreateTextRenderer();
736
737 TextTrackStream* const text_stream = CreateTextTrack();
738 AddTextTrack(kTextSubtitles, "", "");
739
740 EXPECT_CALL(*this, OnPlay());
741
742 EXPECT_CALL(*text_stream, Read(_))
743 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
744
745 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
746 base::Unretained(this)));
747 message_loop_.RunUntilIdle();
748
749 AbortPendingReads();
750 message_loop_.RunUntilIdle();
751
752 EXPECT_CALL(*this, OnPause());
753
754 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
755 base::Unretained(this)));
756 message_loop_.RunUntilIdle();
757
758 DestroyTextRenderer();
759 }
760
761 TEST_F(TextRendererTest, PlayPause2) {
762 CreateTextRenderer();
763
764 TextTrackStream* const text_stream_1 = CreateTextTrack();
765 AddTextTrack(kTextSubtitles, "1", "");
766
767 EXPECT_CALL(*text_stream_1, Read(_))
768 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
769
770 TextTrackStream* const text_stream_2 = CreateTextTrack();
771 AddTextTrack(kTextSubtitles, "2", "");
772
773 EXPECT_CALL(*text_stream_2, Read(_))
774 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
775
776 EXPECT_CALL(*this, OnPlay());
777
778 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
779 base::Unretained(this)));
780 message_loop_.RunUntilIdle();
781
782 AbortPendingReads();
783 message_loop_.RunUntilIdle();
784
785 EXPECT_CALL(*this, OnPause());
786
787 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
788 base::Unretained(this)));
789 message_loop_.RunUntilIdle();
790
791 DestroyTextRenderer();
792 }
793
794 TEST_F(TextRendererTest, PlayEosPausePending) {
795 CreateTextRenderer();
796
797 TextTrackStream* const text_stream = CreateTextTrack();
798 AddTextTrack(kTextSubtitles, "", "");
799
800 EXPECT_CALL(*this, OnPlay());
801
802 EXPECT_CALL(*text_stream, Read(_))
803 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
804
805 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
806 base::Unretained(this)));
807 message_loop_.RunUntilIdle();
808
809 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
810 base::Unretained(this)));
811 message_loop_.RunUntilIdle();
812
813 EXPECT_CALL(*this, OnPause());
814 EXPECT_CALL(*this, OnEnd());
815 SendEosNotifications();
816 message_loop_.RunUntilIdle();
817
818 DestroyTextRenderer();
819 }
820
821 TEST_F(TextRendererTest, PlayEosPausePending2) {
822 CreateTextRenderer();
823
824 TextTrackStream* const text_stream_1 = CreateTextTrack();
825 AddTextTrack(kTextSubtitles, "1", "");
826
827 EXPECT_CALL(*text_stream_1, Read(_))
828 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
829
830 TextTrackStream* const text_stream_2 = CreateTextTrack();
831 AddTextTrack(kTextSubtitles, "2", "");
832
833 EXPECT_CALL(*text_stream_2, Read(_))
834 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
835
836 EXPECT_CALL(*this, OnPlay());
837
838 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
839 base::Unretained(this)));
840 message_loop_.RunUntilIdle();
841
842 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
843 base::Unretained(this)));
844 message_loop_.RunUntilIdle();
845
846 EXPECT_CALL(*this, OnPause());
847 EXPECT_CALL(*this, OnEnd());
848 SendEosNotifications();
849 message_loop_.RunUntilIdle();
850
851 DestroyTextRenderer();
852 }
853
854 TEST_F(TextRendererTest, PlayCuePausePending) {
855 CreateTextRenderer();
856
857 TextTrackStream* const text_stream = CreateTextTrack();
858 AddTextTrack(kTextSubtitles, "", "");
859
860 EXPECT_CALL(*this, OnPlay());
861
862 EXPECT_CALL(*text_stream, Read(_))
863 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
864
865 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
866 base::Unretained(this)));
867 message_loop_.RunUntilIdle();
868
869 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
870 base::Unretained(this)));
871 message_loop_.RunUntilIdle();
872
873 EXPECT_CALL(*this, OnPause());
874 SendCues(true);
875 message_loop_.RunUntilIdle();
876
877 DestroyTextRenderer();
878 }
879
880 TEST_F(TextRendererTest, PlayCuePausePending2) {
881 CreateTextRenderer();
882
883 TextTrackStream* const text_stream_1 = CreateTextTrack();
884 AddTextTrack(kTextSubtitles, "1", "");
885
886 EXPECT_CALL(*text_stream_1, Read(_))
887 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
888
889 TextTrackStream* const text_stream_2 = CreateTextTrack();
890 AddTextTrack(kTextSubtitles, "2", "");
891
892 EXPECT_CALL(*text_stream_2, Read(_))
893 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
894
895 EXPECT_CALL(*this, OnPlay());
896
897 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
898 base::Unretained(this)));
899 message_loop_.RunUntilIdle();
900
901 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
902 base::Unretained(this)));
903 message_loop_.RunUntilIdle();
904
905 EXPECT_CALL(*this, OnPause());
906 SendCues(true);
907 message_loop_.RunUntilIdle();
908
909 DestroyTextRenderer();
910 }
911
912 TEST_F(TextRendererTest, PlayEosPause) {
913 CreateTextRenderer();
914
915 TextTrackStream* const text_stream = CreateTextTrack();
916 AddTextTrack(kTextSubtitles, "", "");
917
918 EXPECT_CALL(*this, OnPlay());
919 EXPECT_CALL(*text_stream, Read(_))
920 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
921
922 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
923 base::Unretained(this)));
924 message_loop_.RunUntilIdle();
925
926 EXPECT_CALL(*this, OnEnd());
927 SendEosNotifications();
928 message_loop_.RunUntilIdle();
929
930 EXPECT_CALL(*this, OnPause());
931 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
932 base::Unretained(this)));
933 message_loop_.RunUntilIdle();
934
935 DestroyTextRenderer();
936 }
937
938 TEST_F(TextRendererTest, PlayEosPause2A) {
939 CreateTextRenderer();
940
941 TextTrackStream* const text_stream_1 = CreateTextTrack();
942 AddTextTrack(kTextSubtitles, "1", "");
943
944 EXPECT_CALL(*text_stream_1, Read(_))
945 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
946
947 TextTrackStream* const text_stream_2 = CreateTextTrack();
948 AddTextTrack(kTextSubtitles, "2", "");
949
950 EXPECT_CALL(*text_stream_2, Read(_))
951 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
952
953 EXPECT_CALL(*this, OnPlay());
954
955 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
956 base::Unretained(this)));
957 message_loop_.RunUntilIdle();
958
959 EXPECT_CALL(*this, OnEnd());
960 SendEosNotifications();
961 message_loop_.RunUntilIdle();
962
963 EXPECT_CALL(*this, OnPause());
964 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
965 base::Unretained(this)));
966 message_loop_.RunUntilIdle();
967
968 DestroyTextRenderer();
969 }
970
971 TEST_F(TextRendererTest, PlayEosPause2B) {
972 CreateTextRenderer();
973
974 TextTrackStream* const text_stream_1 = CreateTextTrack();
975 AddTextTrack(kTextSubtitles, "1", "");
976
977 EXPECT_CALL(*text_stream_1, Read(_))
978 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
979
980 TextTrackStream* const text_stream_2 = CreateTextTrack();
981 AddTextTrack(kTextSubtitles, "2", "");
982
983 EXPECT_CALL(*text_stream_2, Read(_))
984 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
985
986 EXPECT_CALL(*this, OnPlay());
987
988 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
989 base::Unretained(this)));
990 message_loop_.RunUntilIdle();
991
992 text_stream_1->SendEosNotification();
993 message_loop_.RunUntilIdle();
994
995 EXPECT_CALL(*this, OnEnd());
996 text_stream_2->SendEosNotification();
997 message_loop_.RunUntilIdle();
998
999 EXPECT_CALL(*this, OnPause());
1000 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1001 base::Unretained(this)));
1002 message_loop_.RunUntilIdle();
1003
1004 DestroyTextRenderer();
1005 }
1006
1007 TEST_F(TextRendererTest, PlayEosFlush) {
1008 CreateTextRenderer();
1009
1010 TextTrackStream* const text_stream = CreateTextTrack();
1011 AddTextTrack(kTextSubtitles, "", "");
1012
1013 EXPECT_CALL(*text_stream, Read(_))
1014 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1015
1016 EXPECT_CALL(*this, OnPlay());
1017 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1018 base::Unretained(this)));
1019 message_loop_.RunUntilIdle();
1020
1021 EXPECT_CALL(*this, OnEnd());
1022 SendEosNotifications();
1023 message_loop_.RunUntilIdle();
1024
1025 EXPECT_CALL(*this, OnFlush());
1026 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
1027 base::Unretained(this)));
1028
1029 EXPECT_CALL(*text_stream, Read(_))
1030 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1031
1032 EXPECT_CALL(*this, OnPlay());
1033 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1034 base::Unretained(this)));
1035 message_loop_.RunUntilIdle();
1036
1037 EXPECT_CALL(*this, OnEnd());
1038 SendEosNotifications();
1039 message_loop_.RunUntilIdle();
1040
1041 DestroyTextRenderer();
1042 }
1043
1044 TEST_F(TextRendererTest, PlayEosFlush2) {
1045 CreateTextRenderer();
1046
1047 TextTrackStream* const text_stream_1 = CreateTextTrack();
1048 AddTextTrack(kTextSubtitles, "1", "");
1049
1050 EXPECT_CALL(*text_stream_1, Read(_))
1051 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1052
1053 TextTrackStream* const text_stream_2 = CreateTextTrack();
1054 AddTextTrack(kTextSubtitles, "2", "");
1055
1056 EXPECT_CALL(*text_stream_2, Read(_))
1057 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1058
1059 EXPECT_CALL(*this, OnPlay());
1060 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1061 base::Unretained(this)));
1062 message_loop_.RunUntilIdle();
1063
1064 EXPECT_CALL(*this, OnEnd());
1065 SendEosNotifications();
1066 message_loop_.RunUntilIdle();
1067
1068 EXPECT_CALL(*this, OnFlush());
1069 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
1070 base::Unretained(this)));
1071
1072 EXPECT_CALL(*text_stream_1, Read(_))
1073 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1074
1075 EXPECT_CALL(*text_stream_2, Read(_))
1076 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1077
1078 EXPECT_CALL(*this, OnPlay());
1079 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1080 base::Unretained(this)));
1081 message_loop_.RunUntilIdle();
1082
1083 EXPECT_CALL(*this, OnEnd());
1084 SendEosNotifications();
1085 message_loop_.RunUntilIdle();
1086
1087 DestroyTextRenderer();
1088 }
1089
1090 TEST_F(TextRendererTest, AddTextTrackOnlyRemove) {
1091 CreateTextRenderer();
1092 TextTrackStream* const text_stream = CreateTextTrack();
1093 AddTextTrack(kTextSubtitles, "", "");
1094 text_renderer_->RemoveTextStream(text_stream);
1095 EXPECT_FALSE(text_tracks_[0]);
1096 EXPECT_FALSE(text_renderer_->HasTracks());
1097 DestroyTextRenderer();
1098 }
1099
1100 TEST_F(TextRendererTest, AddTextTracks2OnlyRemove) {
1101 CreateTextRenderer();
1102 TextTrackStream* const text_stream_1 = CreateTextTrack();
1103 AddTextTrack(kTextSubtitles, "track 1", "");
1104 TextTrackStream* const text_stream_2 = CreateTextTrack();
1105 AddTextTrack(kTextSubtitles, "track 2", "");
1106 text_renderer_->RemoveTextStream(text_stream_1);
1107 EXPECT_FALSE(text_tracks_[0]);
1108 EXPECT_TRUE(text_renderer_->HasTracks());
1109 text_renderer_->RemoveTextStream(text_stream_2);
1110 EXPECT_FALSE(text_tracks_[1]);
1111 EXPECT_FALSE(text_renderer_->HasTracks());
1112 DestroyTextRenderer();
1113 }
1114
1115 TEST_F(TextRendererTest, AddTrackBeforePlayRemove) {
1116 CreateTextRenderer();
1117
1118 TextTrackStream* const text_stream = CreateTextTrack();
1119 AddTextTrack(kTextSubtitles, "", "");
1120
1121 EXPECT_CALL(*this, OnPlay());
1122
1123 EXPECT_CALL(*text_stream, Read(_))
1124 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1125
1126 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1127 base::Unretained(this)));
1128 message_loop_.RunUntilIdle();
1129
1130 AbortPendingReads();
1131 message_loop_.RunUntilIdle();
1132
1133 text_renderer_->RemoveTextStream(text_stream);
1134 EXPECT_FALSE(text_tracks_[0]);
1135 EXPECT_FALSE(text_renderer_->HasTracks());
1136
1137 DestroyTextRenderer();
1138 }
1139
1140 TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveA) {
1141 CreateTextRenderer();
1142
1143 TextTrackStream* const text_stream_1 = CreateTextTrack();
1144 AddTextTrack(kTextSubtitles, "1", "");
1145
1146 TextTrackStream* const text_stream_2 = CreateTextTrack();
1147 AddTextTrack(kTextSubtitles, "2", "");
1148
1149 EXPECT_CALL(*this, OnPlay());
1150
1151 EXPECT_CALL(*text_stream_1, Read(_))
1152 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1153
1154 EXPECT_CALL(*text_stream_2, Read(_))
1155 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1156
1157 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1158 base::Unretained(this)));
1159 message_loop_.RunUntilIdle();
1160
1161 AbortPendingReads();
1162 message_loop_.RunUntilIdle();
1163
1164 text_renderer_->RemoveTextStream(text_stream_1);
1165 EXPECT_FALSE(text_tracks_[0]);
1166 EXPECT_TRUE(text_renderer_->HasTracks());
1167 text_renderer_->RemoveTextStream(text_stream_2);
1168 EXPECT_FALSE(text_tracks_[1]);
1169 EXPECT_FALSE(text_renderer_->HasTracks());
1170
1171 DestroyTextRenderer();
1172 }
1173
1174 TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveB) {
1175 CreateTextRenderer();
1176
1177 TextTrackStream* const text_stream_1 = CreateTextTrack();
1178 AddTextTrack(kTextSubtitles, "1", "");
1179
1180 TextTrackStream* const text_stream_2 = CreateTextTrack();
1181 AddTextTrack(kTextSubtitles, "2", "");
1182
1183 EXPECT_CALL(*this, OnPlay());
1184
1185 EXPECT_CALL(*text_stream_1, Read(_))
1186 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1187
1188 EXPECT_CALL(*text_stream_2, Read(_))
1189 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1190
1191 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1192 base::Unretained(this)));
1193 message_loop_.RunUntilIdle();
1194
1195 text_stream_1->AbortPendingRead();
1196 message_loop_.RunUntilIdle();
1197
1198 text_renderer_->RemoveTextStream(text_stream_1);
1199 EXPECT_FALSE(text_tracks_[0]);
1200 EXPECT_TRUE(text_renderer_->HasTracks());
1201
1202 text_stream_2->AbortPendingRead();
1203 message_loop_.RunUntilIdle();
1204
1205 text_renderer_->RemoveTextStream(text_stream_2);
1206 EXPECT_FALSE(text_tracks_[1]);
1207 EXPECT_FALSE(text_renderer_->HasTracks());
1208
1209 DestroyTextRenderer();
1210 }
1211
1212 TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveC) {
1213 CreateTextRenderer();
1214
1215 TextTrackStream* const text_stream_1 = CreateTextTrack();
1216 AddTextTrack(kTextSubtitles, "1", "");
1217
1218 TextTrackStream* const text_stream_2 = CreateTextTrack();
1219 AddTextTrack(kTextSubtitles, "2", "");
1220
1221 text_renderer_->RemoveTextStream(text_stream_1);
1222 EXPECT_FALSE(text_tracks_[0]);
1223 EXPECT_TRUE(text_renderer_->HasTracks());
1224
1225 EXPECT_CALL(*text_stream_2, Read(_))
1226 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1227
1228 EXPECT_CALL(*this, OnPlay());
1229
1230 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1231 base::Unretained(this)));
1232 message_loop_.RunUntilIdle();
1233
1234 text_stream_2->AbortPendingRead();
1235 message_loop_.RunUntilIdle();
1236
1237 text_renderer_->RemoveTextStream(text_stream_2);
1238 EXPECT_FALSE(text_tracks_[1]);
1239 EXPECT_FALSE(text_renderer_->HasTracks());
1240
1241 DestroyTextRenderer();
1242 }
1243
1244 TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveD) {
1245 CreateTextRenderer();
1246
1247 TextTrackStream* const text_stream_1 = CreateTextTrack();
1248 AddTextTrack(kTextSubtitles, "1", "");
1249
1250 TextTrackStream* const text_stream_2 = CreateTextTrack();
1251 AddTextTrack(kTextSubtitles, "2", "");
1252
1253 text_renderer_->RemoveTextStream(text_stream_1);
1254 EXPECT_FALSE(text_tracks_[0]);
1255 EXPECT_TRUE(text_renderer_->HasTracks());
1256
1257 text_renderer_->RemoveTextStream(text_stream_2);
1258 EXPECT_FALSE(text_tracks_[1]);
1259 EXPECT_FALSE(text_renderer_->HasTracks());
1260
1261 EXPECT_CALL(*this, OnPlay());
1262
1263 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1264 base::Unretained(this)));
1265 message_loop_.RunUntilIdle();
1266
1267 DestroyTextRenderer();
1268 }
1269
1270 TEST_F(TextRendererTest, AddTrackAfterPlayRemove) {
1271 CreateTextRenderer();
1272
1273 EXPECT_CALL(*this, OnPlay());
1274
1275 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1276 base::Unretained(this)));
1277 message_loop_.RunUntilIdle();
1278
1279 TextTrackStream* const text_stream = CreateTextTrack();
1280 EXPECT_CALL(*text_stream, Read(_))
1281 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1282
1283 AddTextTrack(kTextSubtitles, "", "");
1284
1285 message_loop_.RunUntilIdle();
1286
1287 AbortPendingReads();
1288 message_loop_.RunUntilIdle();
1289
1290 text_renderer_->RemoveTextStream(text_stream);
1291 EXPECT_FALSE(text_tracks_[0]);
1292 EXPECT_FALSE(text_renderer_->HasTracks());
1293
1294 DestroyTextRenderer();
1295 }
1296
1297 TEST_F(TextRendererTest, AddTrackAfterPlay2ARemoveA) {
1298 CreateTextRenderer();
1299
1300 EXPECT_CALL(*this, OnPlay());
1301
1302 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1303 base::Unretained(this)));
1304 message_loop_.RunUntilIdle();
1305
1306 TextTrackStream* const text_stream_1 = CreateTextTrack();
1307 EXPECT_CALL(*text_stream_1, Read(_))
1308 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1309
1310 AddTextTrack(kTextSubtitles, "1", "");
1311
1312 TextTrackStream* const text_stream_2 = CreateTextTrack();
1313 EXPECT_CALL(*text_stream_2, Read(_))
1314 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1315
1316 AddTextTrack(kTextSubtitles, "2", "");
1317
1318 message_loop_.RunUntilIdle();
1319
1320 AbortPendingReads();
1321 message_loop_.RunUntilIdle();
1322
1323 text_renderer_->RemoveTextStream(text_stream_1);
1324 EXPECT_FALSE(text_tracks_[0]);
1325 EXPECT_TRUE(text_renderer_->HasTracks());
1326
1327 text_renderer_->RemoveTextStream(text_stream_2);
1328 EXPECT_FALSE(text_tracks_[1]);
1329 EXPECT_FALSE(text_renderer_->HasTracks());
1330
1331 DestroyTextRenderer();
1332 }
1333
1334 TEST_F(TextRendererTest, AddTrackAfterPlay2ARemoveB) {
1335 CreateTextRenderer();
1336
1337 EXPECT_CALL(*this, OnPlay());
1338
1339 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1340 base::Unretained(this)));
1341 message_loop_.RunUntilIdle();
1342
1343 TextTrackStream* const text_stream_1 = CreateTextTrack();
1344 EXPECT_CALL(*text_stream_1, Read(_))
1345 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1346
1347 AddTextTrack(kTextSubtitles, "1", "");
1348
1349 TextTrackStream* const text_stream_2 = CreateTextTrack();
1350 EXPECT_CALL(*text_stream_2, Read(_))
1351 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1352
1353 AddTextTrack(kTextSubtitles, "2", "");
1354
1355 message_loop_.RunUntilIdle();
1356
1357 text_stream_1->AbortPendingRead();
1358 message_loop_.RunUntilIdle();
1359
1360 text_renderer_->RemoveTextStream(text_stream_1);
1361 EXPECT_FALSE(text_tracks_[0]);
1362 EXPECT_TRUE(text_renderer_->HasTracks());
1363
1364 text_stream_2->AbortPendingRead();
1365 message_loop_.RunUntilIdle();
1366
1367 text_renderer_->RemoveTextStream(text_stream_2);
1368 EXPECT_FALSE(text_tracks_[1]);
1369 EXPECT_FALSE(text_renderer_->HasTracks());
1370
1371 DestroyTextRenderer();
1372 }
1373
1374 TEST_F(TextRendererTest, AddTrackAfterPlay2BRemove) {
1375 CreateTextRenderer();
1376
1377 EXPECT_CALL(*this, OnPlay());
1378
1379 TextTrackStream* const text_stream_1 = CreateTextTrack();
1380 EXPECT_CALL(*text_stream_1, Read(_))
1381 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1382
1383 AddTextTrack(kTextSubtitles, "1", "");
1384
1385 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1386 base::Unretained(this)));
1387 message_loop_.RunUntilIdle();
1388
1389 TextTrackStream* const text_stream_2 = CreateTextTrack();
1390 EXPECT_CALL(*text_stream_2, Read(_))
1391 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1392
1393 AddTextTrack(kTextSubtitles, "2", "");
1394
1395 message_loop_.RunUntilIdle();
1396
1397 text_stream_1->AbortPendingRead();
1398 message_loop_.RunUntilIdle();
1399
1400 text_renderer_->RemoveTextStream(text_stream_1);
1401 EXPECT_FALSE(text_tracks_[0]);
1402 EXPECT_TRUE(text_renderer_->HasTracks());
1403
1404 text_stream_2->AbortPendingRead();
1405 message_loop_.RunUntilIdle();
1406
1407 text_renderer_->RemoveTextStream(text_stream_2);
1408 EXPECT_FALSE(text_tracks_[1]);
1409 EXPECT_FALSE(text_renderer_->HasTracks());
1410
1411 DestroyTextRenderer();
1412 }
1413
1414 TEST_F(TextRendererTest, PlayAddCueRemove) {
1415 CreateTextRenderer();
1416
1417 TextTrackStream* const text_stream = CreateTextTrack();
1418 AddTextTrack(kTextSubtitles, "", "");
1419
1420 EXPECT_CALL(*text_stream, Read(_))
1421 .Times(2)
1422 .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead));
1423
1424 EXPECT_CALL(*this, OnPlay());
1425
1426 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1427 base::Unretained(this)));
1428 message_loop_.RunUntilIdle();
1429
1430 SendCues(true);
1431
1432 AbortPendingReads();
1433 message_loop_.RunUntilIdle();
1434
1435 text_renderer_->RemoveTextStream(text_stream);
1436 EXPECT_FALSE(text_tracks_[0]);
1437 EXPECT_FALSE(text_renderer_->HasTracks());
1438
1439 DestroyTextRenderer();
1440 }
1441
1442 TEST_F(TextRendererTest, PlayAddCue2Remove) {
1443 CreateTextRenderer();
1444
1445 TextTrackStream* const text_stream_1 = CreateTextTrack();
1446 AddTextTrack(kTextSubtitles, "1", "");
1447
1448 EXPECT_CALL(*text_stream_1, Read(_))
1449 .Times(2)
1450 .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead));
1451
1452 TextTrackStream* const text_stream_2 = CreateTextTrack();
1453 AddTextTrack(kTextSubtitles, "2", "");
1454
1455 EXPECT_CALL(*text_stream_2, Read(_))
1456 .Times(2)
1457 .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead));
1458
1459 EXPECT_CALL(*this, OnPlay());
1460
1461 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1462 base::Unretained(this)));
1463 message_loop_.RunUntilIdle();
1464
1465 SendCues(true);
1466
1467 text_stream_1->AbortPendingRead();
1468 message_loop_.RunUntilIdle();
1469
1470 text_stream_2->AbortPendingRead();
1471 message_loop_.RunUntilIdle();
1472
1473 text_renderer_->RemoveTextStream(text_stream_1);
1474 EXPECT_FALSE(text_tracks_[0]);
1475 EXPECT_TRUE(text_renderer_->HasTracks());
1476
1477 text_renderer_->RemoveTextStream(text_stream_2);
1478 EXPECT_FALSE(text_tracks_[1]);
1479 EXPECT_FALSE(text_renderer_->HasTracks());
1480
1481 DestroyTextRenderer();
1482 }
1483
1484 TEST_F(TextRendererTest, PlayEosOnlyRemove) {
1485 CreateTextRenderer();
1486
1487 TextTrackStream* const text_stream = CreateTextTrack();
1488 AddTextTrack(kTextSubtitles, "", "");
1489
1490 EXPECT_CALL(*this, OnPlay());
1491
1492 EXPECT_CALL(*text_stream, Read(_))
1493 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1494
1495 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1496 base::Unretained(this)));
1497 message_loop_.RunUntilIdle();
1498
1499 EXPECT_CALL(*this, OnEnd());
1500 SendEosNotifications();
1501 message_loop_.RunUntilIdle();
1502
1503 text_renderer_->RemoveTextStream(text_stream);
1504 EXPECT_FALSE(text_tracks_[0]);
1505 EXPECT_FALSE(text_renderer_->HasTracks());
1506
1507 DestroyTextRenderer();
1508 }
1509
1510 TEST_F(TextRendererTest, PlayEosOnly2Remove) {
1511 CreateTextRenderer();
1512
1513 TextTrackStream* const text_stream_1 = CreateTextTrack();
1514 AddTextTrack(kTextSubtitles, "1", "");
1515
1516 EXPECT_CALL(*text_stream_1, Read(_))
1517 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1518
1519 TextTrackStream* const text_stream_2 = CreateTextTrack();
1520 AddTextTrack(kTextSubtitles, "2", "");
1521
1522 EXPECT_CALL(*text_stream_2, Read(_))
1523 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1524
1525 EXPECT_CALL(*this, OnPlay());
1526
1527 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1528 base::Unretained(this)));
1529 message_loop_.RunUntilIdle();
1530
1531 EXPECT_CALL(*this, OnEnd());
1532 SendEosNotifications();
1533 message_loop_.RunUntilIdle();
1534
1535 text_renderer_->RemoveTextStream(text_stream_1);
1536 EXPECT_FALSE(text_tracks_[0]);
1537 EXPECT_TRUE(text_renderer_->HasTracks());
1538
1539 text_renderer_->RemoveTextStream(text_stream_2);
1540 EXPECT_FALSE(text_tracks_[1]);
1541 EXPECT_FALSE(text_renderer_->HasTracks());
1542
1543 DestroyTextRenderer();
1544 }
1545
1546 TEST_F(TextRendererTest, PlayCueEosRemove) {
1547 CreateTextRenderer();
1548
1549 TextTrackStream* const text_stream = CreateTextTrack();
1550 AddTextTrack(kTextSubtitles, "", "");
1551
1552 EXPECT_CALL(*this, OnPlay());
1553
1554 EXPECT_CALL(*text_stream, Read(_))
1555 .Times(2)
1556 .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead));
1557
1558 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1559 base::Unretained(this)));
1560 message_loop_.RunUntilIdle();
1561
1562 SendCues(true);
1563
1564 EXPECT_CALL(*this, OnEnd());
1565 SendEosNotifications();
1566 message_loop_.RunUntilIdle();
1567
1568 text_renderer_->RemoveTextStream(text_stream);
1569 EXPECT_FALSE(text_tracks_[0]);
1570 EXPECT_FALSE(text_renderer_->HasTracks());
1571
1572 DestroyTextRenderer();
1573 }
1574
1575 TEST_F(TextRendererTest, PlayCueEos2Remove) {
1576 CreateTextRenderer();
1577
1578 TextTrackStream* const text_stream_1 = CreateTextTrack();
1579 AddTextTrack(kTextSubtitles, "1", "");
1580
1581 EXPECT_CALL(*text_stream_1, Read(_))
1582 .Times(2)
1583 .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead));
1584
1585 TextTrackStream* const text_stream_2 = CreateTextTrack();
1586 AddTextTrack(kTextSubtitles, "2", "");
1587
1588 EXPECT_CALL(*text_stream_2, Read(_))
1589 .Times(2)
1590 .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead));
1591 EXPECT_CALL(*this, OnPlay());
1592
1593 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1594 base::Unretained(this)));
1595 message_loop_.RunUntilIdle();
1596
1597 SendCues(true);
1598
1599 EXPECT_CALL(*this, OnEnd());
1600 SendEosNotifications();
1601 message_loop_.RunUntilIdle();
1602
1603 text_renderer_->RemoveTextStream(text_stream_1);
1604 EXPECT_FALSE(text_tracks_[0]);
1605 EXPECT_TRUE(text_renderer_->HasTracks());
1606
1607 text_renderer_->RemoveTextStream(text_stream_2);
1608 EXPECT_FALSE(text_tracks_[1]);
1609 EXPECT_FALSE(text_renderer_->HasTracks());
1610
1611 DestroyTextRenderer();
1612 }
1613
1614 TEST_F(TextRendererTest, TestStopPendingRemove) {
1615 CreateTextRenderer();
1616
1617 TextTrackStream* const text_stream = CreateTextTrack();
1618 AddTextTrack(kTextSubtitles, "", "");
1619
1620 EXPECT_CALL(*this, OnPlay());
1621
1622 EXPECT_CALL(*text_stream, Read(_))
1623 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1624
1625 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1626 base::Unretained(this)));
1627 message_loop_.RunUntilIdle();
1628
1629 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
1630 base::Unretained(this)));
1631
1632 EXPECT_CALL(*this, OnStop());
1633 SendEosNotifications();
1634 message_loop_.RunUntilIdle();
1635
1636 text_renderer_->RemoveTextStream(text_stream);
1637 EXPECT_FALSE(text_tracks_[0]);
1638 EXPECT_FALSE(text_renderer_->HasTracks());
1639
1640 text_renderer_.reset();
1641 text_track_streams_.clear();
1642 }
1643
1644 TEST_F(TextRendererTest, TestStopPending2RemoveA) {
1645 CreateTextRenderer();
1646
1647 TextTrackStream* const text_stream_1 = CreateTextTrack();
1648 AddTextTrack(kTextSubtitles, "1", "");
1649
1650 EXPECT_CALL(*text_stream_1, Read(_))
1651 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1652
1653 TextTrackStream* const text_stream_2 = CreateTextTrack();
1654 AddTextTrack(kTextSubtitles, "2", "");
1655
1656 EXPECT_CALL(*text_stream_2, Read(_))
1657 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1658
1659 EXPECT_CALL(*this, OnPlay());
1660
1661 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1662 base::Unretained(this)));
1663 message_loop_.RunUntilIdle();
1664
1665 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
1666 base::Unretained(this)));
1667
1668 text_stream_1->SendEosNotification();
1669 message_loop_.RunUntilIdle();
1670
1671 EXPECT_CALL(*this, OnStop());
1672 text_stream_2->SendEosNotification();
1673 message_loop_.RunUntilIdle();
1674
1675 text_renderer_->RemoveTextStream(text_stream_1);
1676 EXPECT_FALSE(text_tracks_[0]);
1677 EXPECT_TRUE(text_renderer_->HasTracks());
1678
1679 text_renderer_->RemoveTextStream(text_stream_2);
1680 EXPECT_FALSE(text_tracks_[1]);
1681 EXPECT_FALSE(text_renderer_->HasTracks());
1682
1683 text_renderer_.reset();
1684 text_track_streams_.clear();
1685 }
1686
1687 TEST_F(TextRendererTest, TestStopPending2RemoveB) {
1688 CreateTextRenderer();
1689
1690 TextTrackStream* const text_stream_1 = CreateTextTrack();
1691 AddTextTrack(kTextSubtitles, "1", "");
1692
1693 EXPECT_CALL(*text_stream_1, Read(_))
1694 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1695
1696 TextTrackStream* const text_stream_2 = CreateTextTrack();
1697 AddTextTrack(kTextSubtitles, "2", "");
1698
1699 EXPECT_CALL(*text_stream_2, Read(_))
1700 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1701
1702 EXPECT_CALL(*this, OnPlay());
1703
1704 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1705 base::Unretained(this)));
1706 message_loop_.RunUntilIdle();
1707
1708 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
1709 base::Unretained(this)));
1710
1711 text_stream_1->SendEosNotification();
1712 message_loop_.RunUntilIdle();
1713
1714 text_renderer_->RemoveTextStream(text_stream_1);
1715 EXPECT_FALSE(text_tracks_[0]);
1716 EXPECT_TRUE(text_renderer_->HasTracks());
1717
1718 EXPECT_CALL(*this, OnStop());
1719 text_stream_2->SendEosNotification();
1720 message_loop_.RunUntilIdle();
1721
1722 text_renderer_->RemoveTextStream(text_stream_2);
1723 EXPECT_FALSE(text_tracks_[1]);
1724 EXPECT_FALSE(text_renderer_->HasTracks());
1725
1726 text_renderer_.reset();
1727 text_track_streams_.clear();
1728 }
1729
1730 TEST_F(TextRendererTest, PlayPauseRemoveA) {
1731 CreateTextRenderer();
1732
1733 TextTrackStream* const text_stream = CreateTextTrack();
1734 AddTextTrack(kTextSubtitles, "", "");
1735
1736 EXPECT_CALL(*this, OnPlay());
1737
1738 EXPECT_CALL(*text_stream, Read(_))
1739 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1740
1741 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1742 base::Unretained(this)));
1743 message_loop_.RunUntilIdle();
1744
1745 AbortPendingReads();
1746 message_loop_.RunUntilIdle();
1747
1748 EXPECT_CALL(*this, OnPause());
1749
1750 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1751 base::Unretained(this)));
1752 message_loop_.RunUntilIdle();
1753
1754 text_renderer_->RemoveTextStream(text_stream);
1755 EXPECT_FALSE(text_tracks_[0]);
1756 EXPECT_FALSE(text_renderer_->HasTracks());
1757
1758 DestroyTextRenderer();
1759 }
1760
1761 TEST_F(TextRendererTest, PlayPauseRemoveB) {
1762 CreateTextRenderer();
1763
1764 TextTrackStream* const text_stream = CreateTextTrack();
1765 AddTextTrack(kTextSubtitles, "", "");
1766
1767 EXPECT_CALL(*this, OnPlay());
1768
1769 EXPECT_CALL(*text_stream, Read(_))
1770 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1771
1772 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1773 base::Unretained(this)));
1774 message_loop_.RunUntilIdle();
1775
1776 AbortPendingReads();
1777 message_loop_.RunUntilIdle();
1778
1779 text_renderer_->RemoveTextStream(text_stream);
1780 EXPECT_FALSE(text_tracks_[0]);
1781 EXPECT_FALSE(text_renderer_->HasTracks());
1782
1783 EXPECT_CALL(*this, OnPause());
1784 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1785 base::Unretained(this)));
1786 message_loop_.RunUntilIdle();
1787
1788 DestroyTextRenderer();
1789 }
1790
1791 TEST_F(TextRendererTest, PlayPause2RemoveA) {
1792 CreateTextRenderer();
1793
1794 TextTrackStream* const text_stream_1 = CreateTextTrack();
1795 AddTextTrack(kTextSubtitles, "1", "");
1796
1797 EXPECT_CALL(*text_stream_1, Read(_))
1798 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1799
1800 TextTrackStream* const text_stream_2 = CreateTextTrack();
1801 AddTextTrack(kTextSubtitles, "2", "");
1802
1803 EXPECT_CALL(*text_stream_2, Read(_))
1804 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1805
1806 EXPECT_CALL(*this, OnPlay());
1807
1808 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1809 base::Unretained(this)));
1810 message_loop_.RunUntilIdle();
1811
1812 AbortPendingReads();
1813 message_loop_.RunUntilIdle();
1814
1815 EXPECT_CALL(*this, OnPause());
1816
1817 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1818 base::Unretained(this)));
1819 message_loop_.RunUntilIdle();
1820
1821 text_renderer_->RemoveTextStream(text_stream_1);
1822 EXPECT_FALSE(text_tracks_[0]);
1823 EXPECT_TRUE(text_renderer_->HasTracks());
1824
1825 text_renderer_->RemoveTextStream(text_stream_2);
1826 EXPECT_FALSE(text_tracks_[1]);
1827 EXPECT_FALSE(text_renderer_->HasTracks());
1828
1829 DestroyTextRenderer();
1830 }
1831
1832 TEST_F(TextRendererTest, PlayPause2RemoveB) {
1833 CreateTextRenderer();
1834
1835 TextTrackStream* const text_stream_1 = CreateTextTrack();
1836 AddTextTrack(kTextSubtitles, "1", "");
1837
1838 EXPECT_CALL(*text_stream_1, Read(_))
1839 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1840
1841 TextTrackStream* const text_stream_2 = CreateTextTrack();
1842 AddTextTrack(kTextSubtitles, "2", "");
1843
1844 EXPECT_CALL(*text_stream_2, Read(_))
1845 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1846
1847 EXPECT_CALL(*this, OnPlay());
1848
1849 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1850 base::Unretained(this)));
1851 message_loop_.RunUntilIdle();
1852
1853 text_stream_1->AbortPendingRead();
1854 message_loop_.RunUntilIdle();
1855
1856 text_stream_2->AbortPendingRead();
1857 message_loop_.RunUntilIdle();
1858
1859 text_renderer_->RemoveTextStream(text_stream_1);
1860 EXPECT_FALSE(text_tracks_[0]);
1861 EXPECT_TRUE(text_renderer_->HasTracks());
1862
1863 EXPECT_CALL(*this, OnPause());
1864 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1865 base::Unretained(this)));
1866 message_loop_.RunUntilIdle();
1867
1868 text_renderer_->RemoveTextStream(text_stream_2);
1869 EXPECT_FALSE(text_tracks_[1]);
1870 EXPECT_FALSE(text_renderer_->HasTracks());
1871
1872 DestroyTextRenderer();
1873 }
1874
1875 TEST_F(TextRendererTest, PlayPause2RemoveC) {
1876 CreateTextRenderer();
1877
1878 TextTrackStream* const text_stream_1 = CreateTextTrack();
1879 AddTextTrack(kTextSubtitles, "1", "");
1880
1881 EXPECT_CALL(*text_stream_1, Read(_))
1882 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1883
1884 TextTrackStream* const text_stream_2 = CreateTextTrack();
1885 AddTextTrack(kTextSubtitles, "2", "");
1886
1887 EXPECT_CALL(*text_stream_2, Read(_))
1888 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1889
1890 EXPECT_CALL(*this, OnPlay());
1891
1892 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1893 base::Unretained(this)));
1894 message_loop_.RunUntilIdle();
1895
1896 text_stream_1->AbortPendingRead();
1897 message_loop_.RunUntilIdle();
1898
1899 text_renderer_->RemoveTextStream(text_stream_1);
1900 EXPECT_FALSE(text_tracks_[0]);
1901 EXPECT_TRUE(text_renderer_->HasTracks());
1902
1903 text_stream_2->AbortPendingRead();
1904 message_loop_.RunUntilIdle();
1905
1906 EXPECT_CALL(*this, OnPause());
1907 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1908 base::Unretained(this)));
1909 message_loop_.RunUntilIdle();
1910
1911 text_renderer_->RemoveTextStream(text_stream_2);
1912 EXPECT_FALSE(text_tracks_[1]);
1913 EXPECT_FALSE(text_renderer_->HasTracks());
1914
1915 DestroyTextRenderer();
1916 }
1917
1918 TEST_F(TextRendererTest, PlayPause2RemoveD) {
1919 CreateTextRenderer();
1920
1921 TextTrackStream* const text_stream_1 = CreateTextTrack();
1922 AddTextTrack(kTextSubtitles, "1", "");
1923
1924 EXPECT_CALL(*text_stream_1, Read(_))
1925 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
1926
1927 TextTrackStream* const text_stream_2 = CreateTextTrack();
1928 AddTextTrack(kTextSubtitles, "2", "");
1929
1930 EXPECT_CALL(*text_stream_2, Read(_))
1931 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
1932
1933 EXPECT_CALL(*this, OnPlay());
1934
1935 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1936 base::Unretained(this)));
1937 message_loop_.RunUntilIdle();
1938
1939 text_stream_1->AbortPendingRead();
1940 message_loop_.RunUntilIdle();
1941
1942 text_renderer_->RemoveTextStream(text_stream_1);
1943 EXPECT_FALSE(text_tracks_[0]);
1944 EXPECT_TRUE(text_renderer_->HasTracks());
1945
1946 text_stream_2->AbortPendingRead();
1947 message_loop_.RunUntilIdle();
1948
1949 text_renderer_->RemoveTextStream(text_stream_2);
1950 EXPECT_FALSE(text_tracks_[1]);
1951 EXPECT_FALSE(text_renderer_->HasTracks());
1952
1953 EXPECT_CALL(*this, OnPause());
1954 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1955 base::Unretained(this)));
1956 message_loop_.RunUntilIdle();
1957
1958 DestroyTextRenderer();
1959 }
1960
1961 TEST_F(TextRendererTest, PlayEosPausePendingRemove) {
1962 CreateTextRenderer();
1963
1964 TextTrackStream* const text_stream = CreateTextTrack();
1965 AddTextTrack(kTextSubtitles, "", "");
1966
1967 EXPECT_CALL(*this, OnPlay());
1968
1969 EXPECT_CALL(*text_stream, Read(_))
1970 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
1971
1972 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
1973 base::Unretained(this)));
1974 message_loop_.RunUntilIdle();
1975
1976 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
1977 base::Unretained(this)));
1978 message_loop_.RunUntilIdle();
1979
1980 EXPECT_CALL(*this, OnPause());
1981 EXPECT_CALL(*this, OnEnd());
1982 SendEosNotifications();
1983 message_loop_.RunUntilIdle();
1984
1985 text_renderer_->RemoveTextStream(text_stream);
1986 EXPECT_FALSE(text_tracks_[0]);
1987 EXPECT_FALSE(text_renderer_->HasTracks());
1988
1989 DestroyTextRenderer();
1990 }
1991
1992 TEST_F(TextRendererTest, PlayEosPausePending2RemoveA) {
1993 CreateTextRenderer();
1994
1995 TextTrackStream* const text_stream_1 = CreateTextTrack();
1996 AddTextTrack(kTextSubtitles, "1", "");
1997
1998 EXPECT_CALL(*text_stream_1, Read(_))
1999 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2000
2001 TextTrackStream* const text_stream_2 = CreateTextTrack();
2002 AddTextTrack(kTextSubtitles, "2", "");
2003
2004 EXPECT_CALL(*text_stream_2, Read(_))
2005 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2006
2007 EXPECT_CALL(*this, OnPlay());
2008
2009 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2010 base::Unretained(this)));
2011 message_loop_.RunUntilIdle();
2012
2013 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2014 base::Unretained(this)));
2015 message_loop_.RunUntilIdle();
2016
2017 text_stream_1->SendEosNotification();
2018 message_loop_.RunUntilIdle();
2019
2020 EXPECT_CALL(*this, OnPause());
2021 EXPECT_CALL(*this, OnEnd());
2022 text_stream_2->SendEosNotification();
2023 message_loop_.RunUntilIdle();
2024
2025 text_renderer_->RemoveTextStream(text_stream_1);
2026 EXPECT_FALSE(text_tracks_[0]);
2027 EXPECT_TRUE(text_renderer_->HasTracks());
2028
2029 text_renderer_->RemoveTextStream(text_stream_2);
2030 EXPECT_FALSE(text_tracks_[1]);
2031 EXPECT_FALSE(text_renderer_->HasTracks());
2032
2033 DestroyTextRenderer();
2034 }
2035
2036 TEST_F(TextRendererTest, PlayEosPausePending2RemoveB) {
2037 CreateTextRenderer();
2038
2039 TextTrackStream* const text_stream_1 = CreateTextTrack();
2040 AddTextTrack(kTextSubtitles, "1", "");
2041
2042 EXPECT_CALL(*text_stream_1, Read(_))
2043 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2044
2045 TextTrackStream* const text_stream_2 = CreateTextTrack();
2046 AddTextTrack(kTextSubtitles, "2", "");
2047
2048 EXPECT_CALL(*text_stream_2, Read(_))
2049 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2050
2051 EXPECT_CALL(*this, OnPlay());
2052
2053 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2054 base::Unretained(this)));
2055 message_loop_.RunUntilIdle();
2056
2057 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2058 base::Unretained(this)));
2059 message_loop_.RunUntilIdle();
2060
2061 text_stream_1->SendEosNotification();
2062 message_loop_.RunUntilIdle();
2063
2064 text_renderer_->RemoveTextStream(text_stream_1);
2065 EXPECT_FALSE(text_tracks_[0]);
2066 EXPECT_TRUE(text_renderer_->HasTracks());
2067
2068 EXPECT_CALL(*this, OnPause());
2069 EXPECT_CALL(*this, OnEnd());
2070 text_stream_2->SendEosNotification();
2071 message_loop_.RunUntilIdle();
2072
2073 text_renderer_->RemoveTextStream(text_stream_2);
2074 EXPECT_FALSE(text_tracks_[1]);
2075 EXPECT_FALSE(text_renderer_->HasTracks());
2076
2077 DestroyTextRenderer();
2078 }
2079
2080 TEST_F(TextRendererTest, PlayCuePausePendingRemove) {
2081 CreateTextRenderer();
2082
2083 TextTrackStream* const text_stream = CreateTextTrack();
2084 AddTextTrack(kTextSubtitles, "", "");
2085
2086 EXPECT_CALL(*this, OnPlay());
2087
2088 EXPECT_CALL(*text_stream, Read(_))
2089 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2090
2091 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2092 base::Unretained(this)));
2093 message_loop_.RunUntilIdle();
2094
2095 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2096 base::Unretained(this)));
2097 message_loop_.RunUntilIdle();
2098
2099 EXPECT_CALL(*this, OnPause());
2100 SendCues(true);
2101 message_loop_.RunUntilIdle();
2102
2103 text_renderer_->RemoveTextStream(text_stream);
2104 EXPECT_FALSE(text_tracks_[0]);
2105 EXPECT_FALSE(text_renderer_->HasTracks());
2106
2107 DestroyTextRenderer();
2108 }
2109
2110 TEST_F(TextRendererTest, PlayCuePausePending2RemoveA) {
2111 CreateTextRenderer();
2112
2113 TextTrackStream* const text_stream_1 = CreateTextTrack();
2114 AddTextTrack(kTextSubtitles, "1", "");
2115
2116 EXPECT_CALL(*text_stream_1, Read(_))
2117 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2118
2119 TextTrackStream* const text_stream_2 = CreateTextTrack();
2120 AddTextTrack(kTextSubtitles, "2", "");
2121
2122 EXPECT_CALL(*text_stream_2, Read(_))
2123 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2124
2125 EXPECT_CALL(*this, OnPlay());
2126
2127 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2128 base::Unretained(this)));
2129 message_loop_.RunUntilIdle();
2130
2131 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2132 base::Unretained(this)));
2133 message_loop_.RunUntilIdle();
2134
2135 SendCue(0, true);
2136 message_loop_.RunUntilIdle();
2137
2138 EXPECT_CALL(*this, OnPause());
2139 SendCue(1, true);
2140 message_loop_.RunUntilIdle();
2141
2142 text_renderer_->RemoveTextStream(text_stream_1);
2143 EXPECT_FALSE(text_tracks_[0]);
2144 EXPECT_TRUE(text_renderer_->HasTracks());
2145
2146 text_renderer_->RemoveTextStream(text_stream_2);
2147 EXPECT_FALSE(text_tracks_[1]);
2148 EXPECT_FALSE(text_renderer_->HasTracks());
2149
2150 DestroyTextRenderer();
2151 }
2152
2153 TEST_F(TextRendererTest, PlayCuePausePending2RemoveB) {
2154 CreateTextRenderer();
2155
2156 TextTrackStream* const text_stream_1 = CreateTextTrack();
2157 AddTextTrack(kTextSubtitles, "1", "");
2158
2159 EXPECT_CALL(*text_stream_1, Read(_))
2160 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2161
2162 TextTrackStream* const text_stream_2 = CreateTextTrack();
2163 AddTextTrack(kTextSubtitles, "2", "");
2164
2165 EXPECT_CALL(*text_stream_2, Read(_))
2166 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2167
2168 EXPECT_CALL(*this, OnPlay());
2169
2170 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2171 base::Unretained(this)));
2172 message_loop_.RunUntilIdle();
2173
2174 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2175 base::Unretained(this)));
2176 message_loop_.RunUntilIdle();
2177
2178 SendCue(0, true);
2179 message_loop_.RunUntilIdle();
2180
2181 text_renderer_->RemoveTextStream(text_stream_1);
2182 EXPECT_FALSE(text_tracks_[0]);
2183 EXPECT_TRUE(text_renderer_->HasTracks());
2184
2185 EXPECT_CALL(*this, OnPause());
2186 SendCue(1, true);
2187 message_loop_.RunUntilIdle();
2188
2189 text_renderer_->RemoveTextStream(text_stream_2);
2190 EXPECT_FALSE(text_tracks_[1]);
2191 EXPECT_FALSE(text_renderer_->HasTracks());
2192
2193 DestroyTextRenderer();
2194 }
2195
2196 TEST_F(TextRendererTest, PlayEosPauseRemoveA) {
2197 CreateTextRenderer();
2198
2199 TextTrackStream* const text_stream = CreateTextTrack();
2200 AddTextTrack(kTextSubtitles, "", "");
2201
2202 EXPECT_CALL(*this, OnPlay());
2203 EXPECT_CALL(*text_stream, Read(_))
2204 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2205
2206 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2207 base::Unretained(this)));
2208 message_loop_.RunUntilIdle();
2209
2210 EXPECT_CALL(*this, OnEnd());
2211 SendEosNotifications();
2212 message_loop_.RunUntilIdle();
2213
2214 EXPECT_CALL(*this, OnPause());
2215 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2216 base::Unretained(this)));
2217 message_loop_.RunUntilIdle();
2218
2219 text_renderer_->RemoveTextStream(text_stream);
2220 EXPECT_FALSE(text_tracks_[0]);
2221 EXPECT_FALSE(text_renderer_->HasTracks());
2222
2223 DestroyTextRenderer();
2224 }
2225
2226 TEST_F(TextRendererTest, PlayEosPauseRemoveB) {
2227 CreateTextRenderer();
2228
2229 TextTrackStream* const text_stream = CreateTextTrack();
2230 AddTextTrack(kTextSubtitles, "", "");
2231
2232 EXPECT_CALL(*this, OnPlay());
2233 EXPECT_CALL(*text_stream, Read(_))
2234 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2235
2236 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2237 base::Unretained(this)));
2238 message_loop_.RunUntilIdle();
2239
2240 EXPECT_CALL(*this, OnEnd());
2241 SendEosNotifications();
2242 message_loop_.RunUntilIdle();
2243
2244 text_renderer_->RemoveTextStream(text_stream);
2245 EXPECT_FALSE(text_tracks_[0]);
2246 EXPECT_FALSE(text_renderer_->HasTracks());
2247
2248 EXPECT_CALL(*this, OnPause());
2249 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2250 base::Unretained(this)));
2251 message_loop_.RunUntilIdle();
2252
2253 DestroyTextRenderer();
2254 }
2255
2256 TEST_F(TextRendererTest, PlayEosPause2ARemoveA) {
2257 CreateTextRenderer();
2258
2259 TextTrackStream* const text_stream_1 = CreateTextTrack();
2260 AddTextTrack(kTextSubtitles, "1", "");
2261
2262 EXPECT_CALL(*text_stream_1, Read(_))
2263 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2264
2265 TextTrackStream* const text_stream_2 = CreateTextTrack();
2266 AddTextTrack(kTextSubtitles, "2", "");
2267
2268 EXPECT_CALL(*text_stream_2, Read(_))
2269 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2270
2271 EXPECT_CALL(*this, OnPlay());
2272
2273 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2274 base::Unretained(this)));
2275 message_loop_.RunUntilIdle();
2276
2277 text_stream_1->SendEosNotification();
2278 message_loop_.RunUntilIdle();
2279
2280 EXPECT_CALL(*this, OnEnd());
2281 text_stream_2->SendEosNotification();
2282 message_loop_.RunUntilIdle();
2283
2284 EXPECT_CALL(*this, OnPause());
2285 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2286 base::Unretained(this)));
2287 message_loop_.RunUntilIdle();
2288
2289 text_renderer_->RemoveTextStream(text_stream_1);
2290 EXPECT_FALSE(text_tracks_[0]);
2291 EXPECT_TRUE(text_renderer_->HasTracks());
2292
2293 text_renderer_->RemoveTextStream(text_stream_2);
2294 EXPECT_FALSE(text_tracks_[1]);
2295 EXPECT_FALSE(text_renderer_->HasTracks());
2296
2297 DestroyTextRenderer();
2298 }
2299
2300 TEST_F(TextRendererTest, PlayEosPause2ARemoveB) {
2301 CreateTextRenderer();
2302
2303 TextTrackStream* const text_stream_1 = CreateTextTrack();
2304 AddTextTrack(kTextSubtitles, "1", "");
2305
2306 EXPECT_CALL(*text_stream_1, Read(_))
2307 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2308
2309 TextTrackStream* const text_stream_2 = CreateTextTrack();
2310 AddTextTrack(kTextSubtitles, "2", "");
2311
2312 EXPECT_CALL(*text_stream_2, Read(_))
2313 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2314
2315 EXPECT_CALL(*this, OnPlay());
2316
2317 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2318 base::Unretained(this)));
2319 message_loop_.RunUntilIdle();
2320
2321 text_stream_1->SendEosNotification();
2322 message_loop_.RunUntilIdle();
2323
2324 EXPECT_CALL(*this, OnEnd());
2325 text_stream_2->SendEosNotification();
2326 message_loop_.RunUntilIdle();
2327
2328 text_renderer_->RemoveTextStream(text_stream_1);
2329 EXPECT_FALSE(text_tracks_[0]);
2330 EXPECT_TRUE(text_renderer_->HasTracks());
2331
2332 EXPECT_CALL(*this, OnPause());
2333 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2334 base::Unretained(this)));
2335 message_loop_.RunUntilIdle();
2336
2337 text_renderer_->RemoveTextStream(text_stream_2);
2338 EXPECT_FALSE(text_tracks_[1]);
2339 EXPECT_FALSE(text_renderer_->HasTracks());
2340
2341 DestroyTextRenderer();
2342 }
2343
2344 TEST_F(TextRendererTest, PlayEosPause2ARemoveC) {
2345 CreateTextRenderer();
2346
2347 TextTrackStream* const text_stream_1 = CreateTextTrack();
2348 AddTextTrack(kTextSubtitles, "1", "");
2349
2350 EXPECT_CALL(*text_stream_1, Read(_))
2351 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2352
2353 TextTrackStream* const text_stream_2 = CreateTextTrack();
2354 AddTextTrack(kTextSubtitles, "2", "");
2355
2356 EXPECT_CALL(*text_stream_2, Read(_))
2357 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2358
2359 EXPECT_CALL(*this, OnPlay());
2360
2361 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2362 base::Unretained(this)));
2363 message_loop_.RunUntilIdle();
2364
2365 text_stream_1->SendEosNotification();
2366 message_loop_.RunUntilIdle();
2367
2368 text_renderer_->RemoveTextStream(text_stream_1);
2369 EXPECT_FALSE(text_tracks_[0]);
2370 EXPECT_TRUE(text_renderer_->HasTracks());
2371
2372 EXPECT_CALL(*this, OnEnd());
2373 text_stream_2->SendEosNotification();
2374 message_loop_.RunUntilIdle();
2375
2376 EXPECT_CALL(*this, OnPause());
2377 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2378 base::Unretained(this)));
2379 message_loop_.RunUntilIdle();
2380
2381 text_renderer_->RemoveTextStream(text_stream_2);
2382 EXPECT_FALSE(text_tracks_[1]);
2383 EXPECT_FALSE(text_renderer_->HasTracks());
2384
2385 DestroyTextRenderer();
2386 }
2387
2388 TEST_F(TextRendererTest, PlayEosPause2ARemoveD) {
2389 CreateTextRenderer();
2390
2391 TextTrackStream* const text_stream_1 = CreateTextTrack();
2392 AddTextTrack(kTextSubtitles, "1", "");
2393
2394 EXPECT_CALL(*text_stream_1, Read(_))
2395 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2396
2397 TextTrackStream* const text_stream_2 = CreateTextTrack();
2398 AddTextTrack(kTextSubtitles, "2", "");
2399
2400 EXPECT_CALL(*text_stream_2, Read(_))
2401 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2402
2403 EXPECT_CALL(*this, OnPlay());
2404
2405 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2406 base::Unretained(this)));
2407 message_loop_.RunUntilIdle();
2408
2409 text_stream_1->SendEosNotification();
2410 message_loop_.RunUntilIdle();
2411
2412 text_renderer_->RemoveTextStream(text_stream_1);
2413 EXPECT_FALSE(text_tracks_[0]);
2414 EXPECT_TRUE(text_renderer_->HasTracks());
2415
2416 EXPECT_CALL(*this, OnEnd());
2417 text_stream_2->SendEosNotification();
2418 message_loop_.RunUntilIdle();
2419
2420 text_renderer_->RemoveTextStream(text_stream_2);
2421 EXPECT_FALSE(text_tracks_[1]);
2422 EXPECT_FALSE(text_renderer_->HasTracks());
2423
2424 EXPECT_CALL(*this, OnPause());
2425 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2426 base::Unretained(this)));
2427 message_loop_.RunUntilIdle();
2428
2429 DestroyTextRenderer();
2430 }
2431
2432 TEST_F(TextRendererTest, PlayEosPause2BRemoveA) {
2433 CreateTextRenderer();
2434
2435 TextTrackStream* const text_stream_1 = CreateTextTrack();
2436 AddTextTrack(kTextSubtitles, "1", "");
2437
2438 EXPECT_CALL(*text_stream_1, Read(_))
2439 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2440
2441 TextTrackStream* const text_stream_2 = CreateTextTrack();
2442 AddTextTrack(kTextSubtitles, "2", "");
2443
2444 EXPECT_CALL(*text_stream_2, Read(_))
2445 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2446
2447 EXPECT_CALL(*this, OnPlay());
2448
2449 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2450 base::Unretained(this)));
2451 message_loop_.RunUntilIdle();
2452
2453 text_stream_1->SendEosNotification();
2454 message_loop_.RunUntilIdle();
2455
2456 EXPECT_CALL(*this, OnEnd());
2457 text_stream_2->SendEosNotification();
2458 message_loop_.RunUntilIdle();
2459
2460 EXPECT_CALL(*this, OnPause());
2461 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2462 base::Unretained(this)));
2463 message_loop_.RunUntilIdle();
2464
2465 text_renderer_->RemoveTextStream(text_stream_1);
2466 EXPECT_FALSE(text_tracks_[0]);
2467 EXPECT_TRUE(text_renderer_->HasTracks());
2468
2469 text_renderer_->RemoveTextStream(text_stream_2);
2470 EXPECT_FALSE(text_tracks_[1]);
2471 EXPECT_FALSE(text_renderer_->HasTracks());
2472
2473 DestroyTextRenderer();
2474 }
2475
2476 TEST_F(TextRendererTest, PlayEosPause2BRemoveB) {
2477 CreateTextRenderer();
2478
2479 TextTrackStream* const text_stream_1 = CreateTextTrack();
2480 AddTextTrack(kTextSubtitles, "1", "");
2481
2482 EXPECT_CALL(*text_stream_1, Read(_))
2483 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2484
2485 TextTrackStream* const text_stream_2 = CreateTextTrack();
2486 AddTextTrack(kTextSubtitles, "2", "");
2487
2488 EXPECT_CALL(*text_stream_2, Read(_))
2489 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2490
2491 EXPECT_CALL(*this, OnPlay());
2492
2493 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2494 base::Unretained(this)));
2495 message_loop_.RunUntilIdle();
2496
2497 text_stream_1->SendEosNotification();
2498 message_loop_.RunUntilIdle();
2499
2500 EXPECT_CALL(*this, OnEnd());
2501 text_stream_2->SendEosNotification();
2502 message_loop_.RunUntilIdle();
2503
2504 text_renderer_->RemoveTextStream(text_stream_1);
2505 EXPECT_FALSE(text_tracks_[0]);
2506 EXPECT_TRUE(text_renderer_->HasTracks());
2507
2508 EXPECT_CALL(*this, OnPause());
2509 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2510 base::Unretained(this)));
2511 message_loop_.RunUntilIdle();
2512
2513 text_renderer_->RemoveTextStream(text_stream_2);
2514 EXPECT_FALSE(text_tracks_[1]);
2515 EXPECT_FALSE(text_renderer_->HasTracks());
2516
2517 DestroyTextRenderer();
2518 }
2519
2520 TEST_F(TextRendererTest, PlayEosPause2BRemoveC) {
2521 CreateTextRenderer();
2522
2523 TextTrackStream* const text_stream_1 = CreateTextTrack();
2524 AddTextTrack(kTextSubtitles, "1", "");
2525
2526 EXPECT_CALL(*text_stream_1, Read(_))
2527 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2528
2529 TextTrackStream* const text_stream_2 = CreateTextTrack();
2530 AddTextTrack(kTextSubtitles, "2", "");
2531
2532 EXPECT_CALL(*text_stream_2, Read(_))
2533 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2534
2535 EXPECT_CALL(*this, OnPlay());
2536
2537 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2538 base::Unretained(this)));
2539 message_loop_.RunUntilIdle();
2540
2541 text_stream_1->SendEosNotification();
2542 message_loop_.RunUntilIdle();
2543
2544 text_renderer_->RemoveTextStream(text_stream_1);
2545 EXPECT_FALSE(text_tracks_[0]);
2546 EXPECT_TRUE(text_renderer_->HasTracks());
2547
2548 EXPECT_CALL(*this, OnEnd());
2549 text_stream_2->SendEosNotification();
2550 message_loop_.RunUntilIdle();
2551
2552 EXPECT_CALL(*this, OnPause());
2553 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2554 base::Unretained(this)));
2555 message_loop_.RunUntilIdle();
2556
2557 text_renderer_->RemoveTextStream(text_stream_2);
2558 EXPECT_FALSE(text_tracks_[1]);
2559 EXPECT_FALSE(text_renderer_->HasTracks());
2560
2561 DestroyTextRenderer();
2562 }
2563
2564 TEST_F(TextRendererTest, PlayEosPause2BRemoveD) {
2565 CreateTextRenderer();
2566
2567 TextTrackStream* const text_stream_1 = CreateTextTrack();
2568 AddTextTrack(kTextSubtitles, "1", "");
2569
2570 EXPECT_CALL(*text_stream_1, Read(_))
2571 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2572
2573 TextTrackStream* const text_stream_2 = CreateTextTrack();
2574 AddTextTrack(kTextSubtitles, "2", "");
2575
2576 EXPECT_CALL(*text_stream_2, Read(_))
2577 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2578
2579 EXPECT_CALL(*this, OnPlay());
2580
2581 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2582 base::Unretained(this)));
2583 message_loop_.RunUntilIdle();
2584
2585 text_stream_1->SendEosNotification();
2586 message_loop_.RunUntilIdle();
2587
2588 text_renderer_->RemoveTextStream(text_stream_1);
2589 EXPECT_FALSE(text_tracks_[0]);
2590 EXPECT_TRUE(text_renderer_->HasTracks());
2591
2592 EXPECT_CALL(*this, OnEnd());
2593 text_stream_2->SendEosNotification();
2594 message_loop_.RunUntilIdle();
2595
2596 text_renderer_->RemoveTextStream(text_stream_2);
2597 EXPECT_FALSE(text_tracks_[1]);
2598 EXPECT_FALSE(text_renderer_->HasTracks());
2599
2600 EXPECT_CALL(*this, OnPause());
2601 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2602 base::Unretained(this)));
2603 message_loop_.RunUntilIdle();
2604
2605 DestroyTextRenderer();
2606 }
2607
2608 TEST_F(TextRendererTest, PlayEosFlushRemove) {
2609 CreateTextRenderer();
2610
2611 TextTrackStream* const text_stream = CreateTextTrack();
2612 AddTextTrack(kTextSubtitles, "", "");
2613
2614 EXPECT_CALL(*text_stream, Read(_))
2615 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2616
2617 EXPECT_CALL(*this, OnPlay());
2618 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2619 base::Unretained(this)));
2620 message_loop_.RunUntilIdle();
2621
2622 EXPECT_CALL(*this, OnEnd());
2623 SendEosNotifications();
2624 message_loop_.RunUntilIdle();
2625
2626 EXPECT_CALL(*this, OnFlush());
2627 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
2628 base::Unretained(this)));
2629
2630 EXPECT_CALL(*text_stream, Read(_))
2631 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2632
2633 EXPECT_CALL(*this, OnPlay());
2634 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2635 base::Unretained(this)));
2636 message_loop_.RunUntilIdle();
2637
2638 EXPECT_CALL(*this, OnEnd());
2639 SendEosNotifications();
2640 message_loop_.RunUntilIdle();
2641
2642 text_renderer_->RemoveTextStream(text_stream);
2643 EXPECT_FALSE(text_tracks_[0]);
2644 EXPECT_FALSE(text_renderer_->HasTracks());
2645
2646 DestroyTextRenderer();
2647 }
2648
2649 TEST_F(TextRendererTest, PlayEosFlush2RemoveA) {
2650 CreateTextRenderer();
2651
2652 TextTrackStream* const text_stream_1 = CreateTextTrack();
2653 AddTextTrack(kTextSubtitles, "1", "");
2654
2655 EXPECT_CALL(*text_stream_1, Read(_))
2656 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2657
2658 TextTrackStream* const text_stream_2 = CreateTextTrack();
2659 AddTextTrack(kTextSubtitles, "2", "");
2660
2661 EXPECT_CALL(*text_stream_2, Read(_))
2662 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2663
2664 EXPECT_CALL(*this, OnPlay());
2665 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2666 base::Unretained(this)));
2667 message_loop_.RunUntilIdle();
2668
2669 EXPECT_CALL(*this, OnEnd());
2670 SendEosNotifications();
2671 message_loop_.RunUntilIdle();
2672
2673 EXPECT_CALL(*this, OnFlush());
2674 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
2675 base::Unretained(this)));
2676
2677 EXPECT_CALL(*text_stream_1, Read(_))
2678 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2679
2680 EXPECT_CALL(*text_stream_2, Read(_))
2681 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2682
2683 EXPECT_CALL(*this, OnPlay());
2684 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2685 base::Unretained(this)));
2686 message_loop_.RunUntilIdle();
2687
2688 text_stream_1->SendEosNotification();
2689 message_loop_.RunUntilIdle();
2690
2691 EXPECT_CALL(*this, OnEnd());
2692 text_stream_2->SendEosNotification();
2693 message_loop_.RunUntilIdle();
2694
2695 text_renderer_->RemoveTextStream(text_stream_1);
2696 EXPECT_FALSE(text_tracks_[0]);
2697 EXPECT_TRUE(text_renderer_->HasTracks());
2698
2699 text_renderer_->RemoveTextStream(text_stream_2);
2700 EXPECT_FALSE(text_tracks_[1]);
2701 EXPECT_FALSE(text_renderer_->HasTracks());
2702
2703 DestroyTextRenderer();
2704 }
2705
2706 TEST_F(TextRendererTest, PlayEosFlush2RemoveB) {
2707 CreateTextRenderer();
2708
2709 TextTrackStream* const text_stream_1 = CreateTextTrack();
2710 AddTextTrack(kTextSubtitles, "1", "");
2711
2712 EXPECT_CALL(*text_stream_1, Read(_))
2713 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2714
2715 TextTrackStream* const text_stream_2 = CreateTextTrack();
2716 AddTextTrack(kTextSubtitles, "2", "");
2717
2718 EXPECT_CALL(*text_stream_2, Read(_))
2719 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2720
2721 EXPECT_CALL(*this, OnPlay());
2722 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2723 base::Unretained(this)));
2724 message_loop_.RunUntilIdle();
2725
2726 EXPECT_CALL(*this, OnEnd());
2727 SendEosNotifications();
2728 message_loop_.RunUntilIdle();
2729
2730 EXPECT_CALL(*this, OnFlush());
2731 text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
2732 base::Unretained(this)));
2733
2734 EXPECT_CALL(*text_stream_1, Read(_))
2735 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2736
2737 EXPECT_CALL(*text_stream_2, Read(_))
2738 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2739
2740 EXPECT_CALL(*this, OnPlay());
2741 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2742 base::Unretained(this)));
2743 message_loop_.RunUntilIdle();
2744
2745 text_stream_1->SendEosNotification();
2746 message_loop_.RunUntilIdle();
2747
2748 text_renderer_->RemoveTextStream(text_stream_1);
2749 EXPECT_FALSE(text_tracks_[0]);
2750 EXPECT_TRUE(text_renderer_->HasTracks());
2751
2752 EXPECT_CALL(*this, OnEnd());
2753 text_stream_2->SendEosNotification();
2754 message_loop_.RunUntilIdle();
2755
2756 text_renderer_->RemoveTextStream(text_stream_2);
2757 EXPECT_FALSE(text_tracks_[1]);
2758 EXPECT_FALSE(text_renderer_->HasTracks());
2759
2760 DestroyTextRenderer();
2761 }
2762
2763 TEST_F(TextRendererTest, PlayShort2A) {
2764 CreateTextRenderer();
2765
2766 TextTrackStream* const text_stream_1 = CreateTextTrack();
2767 AddTextTrack(kTextSubtitles, "1", "");
2768
2769 EXPECT_CALL(*text_stream_1, Read(_))
2770 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2771
2772 TextTrackStream* const text_stream_2 = CreateTextTrack();
2773 AddTextTrack(kTextSubtitles, "2", "");
2774
2775 EXPECT_CALL(*text_stream_2, Read(_))
2776 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2777
2778 EXPECT_CALL(*this, OnPlay());
2779 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2780 base::Unretained(this)));
2781 message_loop_.RunUntilIdle();
2782
2783 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2784 base::Unretained(this)));
2785 message_loop_.RunUntilIdle();
2786
2787 SendCue(0, true);
2788 message_loop_.RunUntilIdle();
2789
2790 EXPECT_CALL(*this, OnPause());
2791 text_stream_2->SendEosNotification();
2792 message_loop_.RunUntilIdle();
2793
2794 DestroyTextRenderer();
2795 }
2796
2797 TEST_F(TextRendererTest, PlayShort2B) {
2798 CreateTextRenderer();
2799
2800 TextTrackStream* const text_stream_1 = CreateTextTrack();
2801 AddTextTrack(kTextSubtitles, "1", "");
2802
2803 EXPECT_CALL(*text_stream_1, Read(_))
2804 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2805
2806 TextTrackStream* const text_stream_2 = CreateTextTrack();
2807 AddTextTrack(kTextSubtitles, "2", "");
2808
2809 EXPECT_CALL(*text_stream_2, Read(_))
2810 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2811
2812 EXPECT_CALL(*this, OnPlay());
2813 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2814 base::Unretained(this)));
2815 message_loop_.RunUntilIdle();
2816
2817 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2818 base::Unretained(this)));
2819 message_loop_.RunUntilIdle();
2820
2821 text_stream_1->SendEosNotification();
2822 message_loop_.RunUntilIdle();
2823
2824 EXPECT_CALL(*this, OnPause());
2825 SendCue(1, true);
2826 message_loop_.RunUntilIdle();
2827
2828 DestroyTextRenderer();
2829 }
2830
2831 TEST_F(TextRendererTest, PlayShort2RemoveA) {
2832 CreateTextRenderer();
2833
2834 TextTrackStream* const text_stream_1 = CreateTextTrack();
2835 AddTextTrack(kTextSubtitles, "1", "");
2836
2837 EXPECT_CALL(*text_stream_1, Read(_))
2838 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2839
2840 TextTrackStream* const text_stream_2 = CreateTextTrack();
2841 AddTextTrack(kTextSubtitles, "2", "");
2842
2843 EXPECT_CALL(*text_stream_2, Read(_))
2844 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2845
2846 EXPECT_CALL(*this, OnPlay());
2847 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2848 base::Unretained(this)));
2849 message_loop_.RunUntilIdle();
2850
2851 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2852 base::Unretained(this)));
2853 message_loop_.RunUntilIdle();
2854
2855 SendCue(0, true);
2856 message_loop_.RunUntilIdle();
2857
2858 EXPECT_CALL(*this, OnPause());
2859 text_stream_2->SendEosNotification();
2860 message_loop_.RunUntilIdle();
2861
2862 text_renderer_->RemoveTextStream(text_stream_1);
2863 EXPECT_FALSE(text_tracks_[0]);
2864 EXPECT_TRUE(text_renderer_->HasTracks());
2865
2866 text_renderer_->RemoveTextStream(text_stream_2);
2867 EXPECT_FALSE(text_tracks_[1]);
2868 EXPECT_FALSE(text_renderer_->HasTracks());
2869
2870 DestroyTextRenderer();
2871 }
2872
2873 TEST_F(TextRendererTest, PlayShort2RemoveB) {
2874 CreateTextRenderer();
2875
2876 TextTrackStream* const text_stream_1 = CreateTextTrack();
2877 AddTextTrack(kTextSubtitles, "1", "");
2878
2879 EXPECT_CALL(*text_stream_1, Read(_))
2880 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2881
2882 TextTrackStream* const text_stream_2 = CreateTextTrack();
2883 AddTextTrack(kTextSubtitles, "2", "");
2884
2885 EXPECT_CALL(*text_stream_2, Read(_))
2886 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2887
2888 EXPECT_CALL(*this, OnPlay());
2889 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2890 base::Unretained(this)));
2891 message_loop_.RunUntilIdle();
2892
2893 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2894 base::Unretained(this)));
2895 message_loop_.RunUntilIdle();
2896
2897 SendCue(0, true);
2898 message_loop_.RunUntilIdle();
2899
2900 text_renderer_->RemoveTextStream(text_stream_1);
2901 EXPECT_FALSE(text_tracks_[0]);
2902 EXPECT_TRUE(text_renderer_->HasTracks());
2903
2904 EXPECT_CALL(*this, OnPause());
2905 EXPECT_CALL(*this, OnEnd());
2906 text_stream_2->SendEosNotification();
2907 message_loop_.RunUntilIdle();
2908
2909 text_renderer_->RemoveTextStream(text_stream_2);
2910 EXPECT_FALSE(text_tracks_[1]);
2911 EXPECT_FALSE(text_renderer_->HasTracks());
2912
2913 DestroyTextRenderer();
2914 }
2915
2916 TEST_F(TextRendererTest, PlayCuePausePendingCancel) {
2917 CreateTextRenderer();
2918
2919 TextTrackStream* const text_stream = CreateTextTrack();
2920 AddTextTrack(kTextSubtitles, "", "");
2921
2922 EXPECT_CALL(*this, OnPlay());
2923
2924 EXPECT_CALL(*text_stream, Read(_))
2925 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
2926
2927 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2928 base::Unretained(this)));
2929 message_loop_.RunUntilIdle();
2930
2931 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2932 base::Unretained(this)));
2933 message_loop_.RunUntilIdle();
2934
2935 EXPECT_CALL(*this, OnPause());
2936 text_stream->AbortPendingRead();
2937 message_loop_.RunUntilIdle();
2938
2939 DestroyTextRenderer();
2940 }
2941
2942 TEST_F(TextRendererTest, PlayCuePausePending2CancelA) {
2943 CreateTextRenderer();
2944
2945 TextTrackStream* const text_stream_1 = CreateTextTrack();
2946 AddTextTrack(kTextSubtitles, "1", "");
2947
2948 EXPECT_CALL(*text_stream_1, Read(_))
2949 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2950
2951 TextTrackStream* const text_stream_2 = CreateTextTrack();
2952 AddTextTrack(kTextSubtitles, "2", "");
2953
2954 EXPECT_CALL(*text_stream_2, Read(_))
2955 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2956
2957 EXPECT_CALL(*this, OnPlay());
2958
2959 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2960 base::Unretained(this)));
2961 message_loop_.RunUntilIdle();
2962
2963 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2964 base::Unretained(this)));
2965 message_loop_.RunUntilIdle();
2966
2967 SendCue(0, true);
2968 message_loop_.RunUntilIdle();
2969
2970 EXPECT_CALL(*this, OnPause());
2971 text_stream_2->AbortPendingRead();
2972 message_loop_.RunUntilIdle();
2973
2974 DestroyTextRenderer();
2975 }
2976
2977 TEST_F(TextRendererTest, PlayCuePausePending2CancelB) {
2978 CreateTextRenderer();
2979
2980 TextTrackStream* const text_stream_1 = CreateTextTrack();
2981 AddTextTrack(kTextSubtitles, "1", "");
2982
2983 EXPECT_CALL(*text_stream_1, Read(_))
2984 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
2985
2986 TextTrackStream* const text_stream_2 = CreateTextTrack();
2987 AddTextTrack(kTextSubtitles, "2", "");
2988
2989 EXPECT_CALL(*text_stream_2, Read(_))
2990 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
2991
2992 EXPECT_CALL(*this, OnPlay());
2993
2994 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
2995 base::Unretained(this)));
2996 message_loop_.RunUntilIdle();
2997
2998 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
2999 base::Unretained(this)));
3000 message_loop_.RunUntilIdle();
3001
3002 text_stream_1->AbortPendingRead();
3003 message_loop_.RunUntilIdle();
3004
3005 EXPECT_CALL(*this, OnPause());
3006 SendCue(1, true);
3007 message_loop_.RunUntilIdle();
3008
3009 DestroyTextRenderer();
3010 }
3011
3012 TEST_F(TextRendererTest, PlayCueStopPendingCancel) {
3013 CreateTextRenderer();
3014
3015 TextTrackStream* const text_stream = CreateTextTrack();
3016 AddTextTrack(kTextSubtitles, "", "");
3017
3018 EXPECT_CALL(*this, OnPlay());
3019
3020 EXPECT_CALL(*text_stream, Read(_))
3021 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
3022
3023 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3024 base::Unretained(this)));
3025 message_loop_.RunUntilIdle();
3026
3027 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3028 base::Unretained(this)));
3029 message_loop_.RunUntilIdle();
3030
3031 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
3032 base::Unretained(this)));
3033 message_loop_.RunUntilIdle();
3034
3035 EXPECT_CALL(*this, OnStop());
3036 text_stream->AbortPendingRead();
3037 message_loop_.RunUntilIdle();
3038
3039 text_renderer_.reset();
3040 text_track_streams_.clear();
3041 }
3042
3043 TEST_F(TextRendererTest, PlayCueStopPending2CancelA) {
3044 CreateTextRenderer();
3045
3046 TextTrackStream* const text_stream_1 = CreateTextTrack();
3047 AddTextTrack(kTextSubtitles, "1", "");
3048
3049 EXPECT_CALL(*text_stream_1, Read(_))
3050 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
3051
3052 TextTrackStream* const text_stream_2 = CreateTextTrack();
3053 AddTextTrack(kTextSubtitles, "2", "");
3054
3055 EXPECT_CALL(*text_stream_2, Read(_))
3056 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
3057
3058 EXPECT_CALL(*this, OnPlay());
3059
3060 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3061 base::Unretained(this)));
3062 message_loop_.RunUntilIdle();
3063
3064 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3065 base::Unretained(this)));
3066 message_loop_.RunUntilIdle();
3067
3068 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
3069 base::Unretained(this)));
3070 message_loop_.RunUntilIdle();
3071
3072 SendCue(0, false);
3073 message_loop_.RunUntilIdle();
3074
3075 EXPECT_CALL(*this, OnStop());
3076 text_stream_2->AbortPendingRead();
3077 message_loop_.RunUntilIdle();
3078
3079 text_renderer_.reset();
3080 text_track_streams_.clear();
3081 }
3082
3083 TEST_F(TextRendererTest, PlayCueStopPending2CancelB) {
3084 CreateTextRenderer();
3085
3086 TextTrackStream* const text_stream_1 = CreateTextTrack();
3087 AddTextTrack(kTextSubtitles, "1", "");
3088
3089 EXPECT_CALL(*text_stream_1, Read(_))
3090 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
3091
3092 TextTrackStream* const text_stream_2 = CreateTextTrack();
3093 AddTextTrack(kTextSubtitles, "2", "");
3094
3095 EXPECT_CALL(*text_stream_2, Read(_))
3096 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
3097
3098 EXPECT_CALL(*this, OnPlay());
3099
3100 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3101 base::Unretained(this)));
3102 message_loop_.RunUntilIdle();
3103
3104 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3105 base::Unretained(this)));
3106 message_loop_.RunUntilIdle();
3107
3108 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
3109 base::Unretained(this)));
3110 message_loop_.RunUntilIdle();
3111
3112 text_stream_1->AbortPendingRead();
3113 message_loop_.RunUntilIdle();
3114
3115 EXPECT_CALL(*this, OnStop());
3116 SendCue(1, false);
3117 message_loop_.RunUntilIdle();
3118
3119 text_renderer_.reset();
3120 text_track_streams_.clear();
3121 }
3122
3123 TEST_F(TextRendererTest, AddRemoveAdd) {
3124 CreateTextRenderer();
3125
3126 TextTrackStream* text_stream = CreateTextTrack();
3127 AddTextTrack(kTextSubtitles, "", "");
3128
3129 EXPECT_CALL(*text_stream, Read(_))
3130 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
3131
3132 EXPECT_CALL(*this, OnPlay());
3133
3134 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3135 base::Unretained(this)));
3136 message_loop_.RunUntilIdle();
3137
3138 text_stream->AbortPendingRead();
3139 message_loop_.RunUntilIdle();
3140
3141 text_renderer_->RemoveTextStream(text_stream);
3142 text_track_streams_.clear();
3143
3144 EXPECT_CALL(*this, OnPause());
3145 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3146 base::Unretained(this)));
3147 message_loop_.RunUntilIdle();
3148
3149 text_stream = CreateTextTrack();
3150 AddTextTrack(kTextSubtitles, "", "");
3151
3152 EXPECT_CALL(*text_stream, Read(_))
3153 .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead));
3154
3155 EXPECT_CALL(*this, OnPlay());
3156
3157 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3158 base::Unretained(this)));
3159 message_loop_.RunUntilIdle();
3160
3161 EXPECT_CALL(*this, OnEnd());
3162 text_stream->SendEosNotification();
3163 message_loop_.RunUntilIdle();
3164
3165 DestroyTextRenderer();
3166 }
3167
3168 TEST_F(TextRendererTest, AddRemoveAdd2A) {
3169 CreateTextRenderer();
3170
3171 TextTrackStream* text_stream_1 = CreateTextTrack();
3172 AddTextTrack(kTextSubtitles, "1", "");
3173
3174 EXPECT_CALL(*text_stream_1, Read(_))
3175 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
3176
3177 TextTrackStream* text_stream_2 = CreateTextTrack();
3178 AddTextTrack(kTextSubtitles, "2", "");
3179
3180 EXPECT_CALL(*text_stream_2, Read(_))
3181 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
3182
3183 EXPECT_CALL(*this, OnPlay());
3184
3185 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3186 base::Unretained(this)));
3187 message_loop_.RunUntilIdle();
3188
3189 text_stream_1->AbortPendingRead();
3190 message_loop_.RunUntilIdle();
3191
3192 text_renderer_->RemoveTextStream(text_stream_1);
3193 text_track_streams_.erase(text_track_streams_.begin());
3194
3195 EXPECT_CALL(*this, OnEnd());
3196 text_stream_2->SendEosNotification();
3197 message_loop_.RunUntilIdle();
3198
3199 DestroyTextRenderer();
3200 }
3201
3202 TEST_F(TextRendererTest, AddRemoveAdd2B) {
3203 CreateTextRenderer();
3204
3205 TextTrackStream* text_stream_1 = CreateTextTrack();
3206 AddTextTrack(kTextSubtitles, "1", "");
3207
3208 EXPECT_CALL(*text_stream_1, Read(_))
3209 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
3210
3211 TextTrackStream* text_stream_2 = CreateTextTrack();
3212 AddTextTrack(kTextSubtitles, "2", "");
3213
3214 EXPECT_CALL(*text_stream_2, Read(_))
3215 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
3216
3217 EXPECT_CALL(*this, OnPlay());
3218
3219 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3220 base::Unretained(this)));
3221 message_loop_.RunUntilIdle();
3222
3223 text_stream_1->AbortPendingRead();
3224 message_loop_.RunUntilIdle();
3225
3226 text_renderer_->RemoveTextStream(text_stream_1);
3227 text_track_streams_.erase(text_track_streams_.begin());
3228
3229 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3230 base::Unretained(this)));
3231 message_loop_.RunUntilIdle();
3232
3233 EXPECT_CALL(*this, OnPause());
3234 EXPECT_CALL(*this, OnEnd());
3235 text_stream_2->SendEosNotification();
3236 message_loop_.RunUntilIdle();
3237
3238 DestroyTextRenderer();
3239 }
3240
3241 TEST_F(TextRendererTest, AddRemoveAdd2C) {
3242 CreateTextRenderer();
3243
3244 TextTrackStream* text_stream_1 = CreateTextTrack();
3245 AddTextTrack(kTextSubtitles, "1", "");
3246
3247 EXPECT_CALL(*text_stream_1, Read(_))
3248 .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead));
3249
3250 TextTrackStream* text_stream_2 = CreateTextTrack();
3251 AddTextTrack(kTextSubtitles, "2", "");
3252
3253 EXPECT_CALL(*text_stream_2, Read(_))
3254 .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead));
3255
3256 EXPECT_CALL(*this, OnPlay());
3257
3258 text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
3259 base::Unretained(this)));
3260 message_loop_.RunUntilIdle();
3261
3262 text_stream_1->AbortPendingRead();
3263 message_loop_.RunUntilIdle();
3264
3265 text_renderer_->RemoveTextStream(text_stream_1);
3266 text_track_streams_.erase(text_track_streams_.begin());
3267
3268 text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
3269 base::Unretained(this)));
3270 message_loop_.RunUntilIdle();
3271
3272 text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
3273 base::Unretained(this)));
3274 message_loop_.RunUntilIdle();
3275
3276 EXPECT_CALL(*this, OnStop());
3277 text_stream_2->SendEosNotification();
3278 message_loop_.RunUntilIdle();
3279
3280 text_renderer_.reset();
3281 text_track_streams_.clear();
3282 }
3283
3284 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698