Home | History | Annotate | Download | only in base
      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:
     32   FakeTextTrack(const base::Closure& destroy_cb,
     33                 const TextTrackConfig& config)
     34       : destroy_cb_(destroy_cb),
     35         config_(config) {
     36   }
     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:
     56   TextRendererTest() {}
     57 
     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 
     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 
     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 
     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 
    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 
    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 
    130   void AbortPendingRead(unsigned idx) {
    131     FakeTextTrackStream* const stream = text_track_streams_[idx];
    132     stream->AbortPendingRead();
    133     message_loop_.RunUntilIdle();
    134   }
    135 
    136   void AbortPendingReads() {
    137     for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
    138       AbortPendingRead(idx);
    139     }
    140   }
    141 
    142   void SendEosNotification(unsigned idx) {
    143     FakeTextTrackStream* const stream = text_track_streams_[idx];
    144     stream->SendEosNotification();
    145     message_loop_.RunUntilIdle();
    146   }
    147 
    148   void SendEosNotifications() {
    149     for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
    150       SendEosNotification(idx);
    151     }
    152   }
    153 
    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 
    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 
    182   void OnDestroyTextTrack(unsigned idx) {
    183     text_tracks_[idx] = NULL;
    184   }
    185 
    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 
    193   void Pause() {
    194     text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
    195                                      base::Unretained(this)));
    196     message_loop_.RunUntilIdle();
    197   }
    198 
    199   void Flush() {
    200     EXPECT_CALL(*this, OnFlush());
    201     text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
    202                                      base::Unretained(this)));
    203   }
    204 
    205   void Stop() {
    206     text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
    207                                     base::Unretained(this)));
    208     message_loop_.RunUntilIdle();
    209   }
    210 
    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 
    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 
    243 TEST_F(TextRendererTest, TestStop) {
    244   CreateTextRenderer();
    245   DestroyTextRenderer();
    246 }
    247 
    248 TEST_F(TextRendererTest, AddTextTrackOnly_OneTrack) {
    249   CreateTextRenderer();
    250   AddTextTrack(kTextSubtitles, "", "", false);
    251   DestroyTextRenderer();
    252 }
    253 
    254 TEST_F(TextRendererTest, AddTextTrackOnly_TwoTracks) {
    255   CreateTextRenderer();
    256   AddTextTrack(kTextSubtitles, "track 1", "", false);
    257   AddTextTrack(kTextSubtitles, "track 2", "", false);
    258   DestroyTextRenderer();
    259 }
    260 
    261 TEST_F(TextRendererTest, PlayOnly) {
    262   CreateTextRenderer();
    263   Play();
    264   DestroyTextRenderer();
    265 }
    266 
    267 TEST_F(TextRendererTest, AddTrackBeforePlay_OneTrack) {
    268   CreateTextRenderer();
    269   AddTextTrack(kTextSubtitles, "", "", true);
    270   Play();
    271   AbortPendingReads();
    272   DestroyTextRenderer();
    273 }
    274 
    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 
    284 TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackAfter) {
    285   CreateTextRenderer();
    286   Play();
    287   AddTextTrack(kTextSubtitles, "", "", true);
    288   AbortPendingReads();
    289   DestroyTextRenderer();
    290 }
    291 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    531 TEST_F(TextRendererTest, AddTextTrackOnlyRemove_OneTrack) {
    532   CreateTextRenderer();
    533   AddTextTrack(kTextSubtitles, "", "", false);
    534   EXPECT_TRUE(text_renderer_->HasTracks());
    535   DestroyTextRenderer();
    536 }
    537 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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 
   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