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

Unified Diff: media/base/text_renderer_unittest.cc

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: fix compile errors 11/21 #6 Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/text_renderer.cc ('k') | media/base/text_track.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/text_renderer_unittest.cc
diff --git a/media/base/text_renderer_unittest.cc b/media/base/text_renderer_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0188763afb0516b247a86ae5676c6887f4212c21
--- /dev/null
+++ b/media/base/text_renderer_unittest.cc
@@ -0,0 +1,1382 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+#include "base/memory/scoped_vector.h"
+#include "base/message_loop/message_loop.h"
+#include "media/base/audio_decoder_config.h"
+#include "media/base/decoder_buffer.h"
+#include "media/base/demuxer_stream.h"
+#include "media/base/fake_text_track_stream.h"
+#include "media/base/text_renderer.h"
+#include "media/base/text_track_config.h"
+#include "media/base/video_decoder_config.h"
+#include "media/filters/webvtt_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::Eq;
+using ::testing::Exactly;
+using ::testing::Invoke;
+using ::testing::_;
+
+namespace media {
+
+// Local implementation of the TextTrack interface.
+class FakeTextTrack : public TextTrack {
+ public:
+ FakeTextTrack(const base::Closure& destroy_cb,
+ const TextTrackConfig& config)
+ : destroy_cb_(destroy_cb),
+ config_(config) {
+ }
+ virtual ~FakeTextTrack() {
+ destroy_cb_.Run();
+ }
+
+ MOCK_METHOD5(addWebVTTCue, void(const base::TimeDelta& start,
+ const base::TimeDelta& end,
+ const std::string& id,
+ const std::string& content,
+ const std::string& settings));
+
+ const base::Closure destroy_cb_;
+ const TextTrackConfig config_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FakeTextTrack);
+};
+
+class TextRendererTest : public testing::Test {
+ public:
+ TextRendererTest() {}
+
+ void CreateTextRenderer() {
+ DCHECK(!text_renderer_);
+
+ text_renderer_.reset(
+ new TextRenderer(message_loop_.message_loop_proxy(),
+ base::Bind(&TextRendererTest::OnAddTextTrack,
+ base::Unretained(this))));
+ text_renderer_->Initialize(base::Bind(&TextRendererTest::OnEnd,
+ base::Unretained(this)));
+ }
+
+ void DestroyTextRenderer() {
+ EXPECT_CALL(*this, OnStop());
+ text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+
+ text_renderer_.reset();
+ text_track_streams_.clear();
+ }
+
+ void AddTextTrack(TextKind kind,
+ const std::string& name,
+ const std::string& language,
+ bool expect_read) {
+ const size_t idx = text_track_streams_.size();
+ text_track_streams_.push_back(new FakeTextTrackStream);
+
+ if (expect_read)
+ ExpectRead(idx);
+
+ const TextTrackConfig config(kind, name, language);
+ text_renderer_->AddTextStream(text_track_streams_.back(), config);
+ message_loop_.RunUntilIdle();
+
+ EXPECT_EQ(text_tracks_.size(), text_track_streams_.size());
+ FakeTextTrack* const text_track = text_tracks_.back();
+ EXPECT_TRUE(text_track);
+ EXPECT_TRUE(text_track->config_.Matches(config));
+ }
+
+ void OnAddTextTrack(const TextTrackConfig& config,
+ const AddTextTrackDoneCB& done_cb) {
+ base::Closure destroy_cb =
+ base::Bind(&TextRendererTest::OnDestroyTextTrack,
+ base::Unretained(this),
+ text_tracks_.size());
+ // Text track objects are owned by the text renderer, but we cache them
+ // here so we can inspect them. They get removed from our cache when the
+ // text renderer deallocates them.
+ text_tracks_.push_back(new FakeTextTrack(destroy_cb, config));
+ scoped_ptr<TextTrack> text_track(text_tracks_.back());
+ done_cb.Run(text_track.Pass());
+ }
+
+ void RemoveTextTrack(unsigned idx) {
+ FakeTextTrackStream* const stream = text_track_streams_[idx];
+ text_renderer_->RemoveTextStream(stream);
+ EXPECT_FALSE(text_tracks_[idx]);
+ }
+
+ void SatisfyPendingReads(const base::TimeDelta& start,
+ const base::TimeDelta& duration,
+ const std::string& id,
+ const std::string& content,
+ const std::string& settings) {
+ for (TextTrackStreams::iterator itr = text_track_streams_.begin();
+ itr != text_track_streams_.end(); ++itr) {
+ (*itr)->SatisfyPendingRead(start, duration, id, content, settings);
+ }
+ }
+
+ void AbortPendingRead(unsigned idx) {
+ FakeTextTrackStream* const stream = text_track_streams_[idx];
+ stream->AbortPendingRead();
+ message_loop_.RunUntilIdle();
+ }
+
+ void AbortPendingReads() {
+ for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
+ AbortPendingRead(idx);
+ }
+ }
+
+ void SendEosNotification(unsigned idx) {
+ FakeTextTrackStream* const stream = text_track_streams_[idx];
+ stream->SendEosNotification();
+ message_loop_.RunUntilIdle();
+ }
+
+ void SendEosNotifications() {
+ for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
+ SendEosNotification(idx);
+ }
+ }
+
+ void SendCue(unsigned idx, bool expect_cue) {
+ FakeTextTrackStream* const text_stream = text_track_streams_[idx];
+
+ const base::TimeDelta start;
+ const base::TimeDelta duration = base::TimeDelta::FromSeconds(42);
+ const std::string id = "id";
+ const std::string content = "subtitle";
+ const std::string settings;
+
+ if (expect_cue) {
+ FakeTextTrack* const text_track = text_tracks_[idx];
+ EXPECT_CALL(*text_track, addWebVTTCue(start,
+ start + duration,
+ id,
+ content,
+ settings));
+ }
+
+ text_stream->SatisfyPendingRead(start, duration, id, content, settings);
+ message_loop_.RunUntilIdle();
+ }
+
+ void SendCues(bool expect_cue) {
+ for (size_t idx = 0; idx < text_track_streams_.size(); ++idx) {
+ SendCue(idx, expect_cue);
+ }
+ }
+
+ void OnDestroyTextTrack(unsigned idx) {
+ text_tracks_[idx] = NULL;
+ }
+
+ void Play() {
+ EXPECT_CALL(*this, OnPlay());
+ text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ }
+
+ void Pause() {
+ text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ }
+
+ void Flush() {
+ EXPECT_CALL(*this, OnFlush());
+ text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush,
+ base::Unretained(this)));
+ }
+
+ void Stop() {
+ text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ }
+
+ void ExpectRead(size_t idx) {
+ FakeTextTrackStream* const stream = text_track_streams_[idx];
+ EXPECT_CALL(*stream, OnRead());
+ }
+
+ MOCK_METHOD0(OnEnd, void());
+ MOCK_METHOD0(OnStop, void());
+ MOCK_METHOD0(OnPlay, void());
+ MOCK_METHOD0(OnPause, void());
+ MOCK_METHOD0(OnFlush, void());
+
+ scoped_ptr<TextRenderer> text_renderer_;
+ base::MessageLoop message_loop_;
+
+ typedef ScopedVector<FakeTextTrackStream> TextTrackStreams;
+ TextTrackStreams text_track_streams_;
+
+ typedef std::vector<FakeTextTrack*> TextTracks;
+ TextTracks text_tracks_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TextRendererTest);
+};
+
+TEST_F(TextRendererTest, CreateTextRendererNoInit) {
+ text_renderer_.reset(
+ new TextRenderer(message_loop_.message_loop_proxy(),
+ base::Bind(&TextRendererTest::OnAddTextTrack,
+ base::Unretained(this))));
+ text_renderer_.reset();
+}
+
+TEST_F(TextRendererTest, TestStop) {
+ CreateTextRenderer();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTextTrackOnly_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", false);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTextTrackOnly_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "track 1", "", false);
+ AddTextTrack(kTextSubtitles, "track 2", "", false);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayOnly) {
+ CreateTextRenderer();
+ Play();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlay_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlay_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackAfter) {
+ CreateTextRenderer();
+ Play();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlay_TwoTracksAfter) {
+ CreateTextRenderer();
+ Play();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlay_OneTrackBeforeOneTrackAfter) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ Play();
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayAddCue_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ ExpectRead(0);
+ SendCues(true);
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayAddCue_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ ExpectRead(0);
+ ExpectRead(1);
+ SendCues(true);
+ AbortPendingReads();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosOnly_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosOnly_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCueEos_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ ExpectRead(0);
+ SendCues(true);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCueEos_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ ExpectRead(0);
+ ExpectRead(1);
+ SendCues(true);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, StopPending_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Stop();
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotifications();
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, StopPending_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Stop();
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotifications();
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, PlayPause_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingReads();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayPause_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingReads();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPausePending_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPausePending_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePending_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendCues(true);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePending_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendCues(true);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_SplitEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosFlush_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ Flush();
+ ExpectRead(0);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosFlush_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ Flush();
+ ExpectRead(0);
+ ExpectRead(1);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTextTrackOnlyRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", false);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTextTrackOnlyRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "track 1", "", false);
+ AddTextTrack(kTextSubtitles, "track 2", "", false);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlayRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlayRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlayRemove_SeparateCancel) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ AbortPendingRead(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveOneThenPlay) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", false);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ Play();
+ AbortPendingRead(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackBeforePlayRemove_RemoveTwoThenPlay) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", false);
+ AddTextTrack(kTextSubtitles, "2", "", false);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ Play();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlayRemove_OneTrack) {
+ CreateTextRenderer();
+ Play();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlayRemove_TwoTracks) {
+ CreateTextRenderer();
+ Play();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitCancel) {
+ CreateTextRenderer();
+ Play();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ AbortPendingRead(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddTrackAfterPlayRemove_SplitAdd) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ Play();
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ AbortPendingRead(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayAddCueRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ ExpectRead(0);
+ SendCues(true);
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayAddCueRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ ExpectRead(0);
+ ExpectRead(1);
+ SendCues(true);
+ AbortPendingRead(0);
+ AbortPendingRead(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosOnlyRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosOnlyRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCueEosRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ ExpectRead(0);
+ SendCues(true);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCueEosRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ ExpectRead(0);
+ ExpectRead(1);
+ SendCues(true);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, TestStopPendingRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Stop();
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, TestStopPendingRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Stop();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, TestStopPendingRemove_RemoveThenSendEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Stop();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, PlayPauseRemove_PauseThenRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingReads();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayPauseRemove_RemoveThanPause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayPause_PauseThenRemoveTwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingReads();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayPauseRemove_RemoveThenPauseTwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingReads();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayPauseRemove_SplitCancel) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ AbortPendingRead(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+
+TEST_F(TextRendererTest, PlayPauseRemove_PauseLast) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ AbortPendingRead(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPausePendingRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPausePendingRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPausePendingRemove_SplitEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendCues(true);
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ EXPECT_CALL(*this, OnPause());
+ SendCue(1, true);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingRemove_SplitSendCue) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ SendCue(1, true);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPauseRemove_PauseThenRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPauseRemove_RemoveThenPause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_PauseThenRemoveTwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_RemovePauseRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_EosThenPause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_PauseLast) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_EosPauseRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_EosRemovePause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosPause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosPause_EosRemoveEosRemovePause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosFlushRemove_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ Flush();
+ ExpectRead(0);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ RemoveTextTrack(0);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosFlushRemove_TwoTracks) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ Flush();
+ ExpectRead(0);
+ ExpectRead(1);
+ Play();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayEosFlushRemove_EosRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotifications();
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ Flush();
+ ExpectRead(0);
+ ExpectRead(1);
+ Play();
+ SendEosNotification(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayShort_SendCueThenEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayShort_EosThenSendCue) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendEosNotification(0);
+ EXPECT_CALL(*this, OnPause());
+ SendCue(1, true);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayShortRemove_SendEosRemove) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayShortRemove_SendRemoveEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ RemoveTextTrack(1);
+ EXPECT_FALSE(text_renderer_->HasTracks());
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingCancel_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ AbortPendingRead(0);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingCancel_SendThenCancel) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ SendCue(0, true);
+ EXPECT_CALL(*this, OnPause());
+ AbortPendingRead(1);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCuePausePendingCancel_CancelThenSend) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ AbortPendingRead(0);
+ EXPECT_CALL(*this, OnPause());
+ SendCue(1, true);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, PlayCueStopPendingCancel_OneTrack) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ Pause();
+ Stop();
+ EXPECT_CALL(*this, OnStop());
+ AbortPendingRead(0);
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, PlayCueStopPendingCancel_SendThenCancel) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ Stop();
+ SendCue(0, false);
+ EXPECT_CALL(*this, OnStop());
+ AbortPendingRead(1);
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, PlayCueStopPendingCancel_CancelThenSend) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ Pause();
+ Stop();
+ AbortPendingRead(0);
+ EXPECT_CALL(*this, OnStop());
+ SendCue(1, false);
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+TEST_F(TextRendererTest, AddRemoveAdd) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_CALL(*this, OnPause());
+ Pause();
+ AddTextTrack(kTextSubtitles, "", "", true);
+ Play();
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddRemoveEos) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ EXPECT_CALL(*this, OnEnd());
+ SendEosNotification(1);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddRemovePause) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ Pause();
+ EXPECT_CALL(*this, OnPause());
+ SendEosNotification(1);
+ DestroyTextRenderer();
+}
+
+TEST_F(TextRendererTest, AddRemovePauseStop) {
+ CreateTextRenderer();
+ AddTextTrack(kTextSubtitles, "1", "", true);
+ AddTextTrack(kTextSubtitles, "2", "", true);
+ Play();
+ AbortPendingRead(0);
+ RemoveTextTrack(0);
+ EXPECT_TRUE(text_renderer_->HasTracks());
+ Pause();
+ Stop();
+ EXPECT_CALL(*this, OnStop());
+ SendEosNotification(1);
+ text_renderer_.reset();
+ text_track_streams_.clear();
+}
+
+} // namespace media
« no previous file with comments | « media/base/text_renderer.cc ('k') | media/base/text_track.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698