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