Chromium Code Reviews| 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..5c30abdeec8dfb5773f449278f162d67f9834e13 |
| --- /dev/null |
| +++ b/media/base/text_renderer_unittest.cc |
| @@ -0,0 +1,3284 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
nit: s/ (c)// New files are supposed to use a head
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| +// 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/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::Invoke; |
| +using ::testing::_; |
| + |
| +namespace media { |
| + |
| +class TextRendererTest; |
| +class TextTrackTest; |
| + |
| +// To store the cue delivered by the text renderer, when it receives |
| +// a decoder buffer. |
| +struct TextCueTest { |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
This looks almost identical to the TextCue object.
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + base::TimeDelta start_; |
| + base::TimeDelta end_; |
| + std::string id_; |
| + std::string content_; |
| + std::string settings_; |
| + |
| + TextCueTest(const base::TimeDelta& start, |
| + const base::TimeDelta& end, |
| + const std::string& id, |
| + const std::string& content, |
| + const std::string& settings) |
| + : start_(start), |
| + end_(end), |
| + id_(id), |
| + content_(content), |
| + settings_(settings) { |
| + } |
| +}; |
| + |
| +// Grant last wishes to the TextTrackTest object. |
| +void RemoveTextTrackTest(TextRendererTest* text_renderer_test, |
| + TextTrackTest* text_track); |
| + |
| +// A local implementation of the TextTrack interface. It simply |
| +// stores the cue(s) delivered by the text renderer, allowing the |
| +// this test framework to compare the cue received to the cue |
| +// pushed downstream. |
| +class TextTrackTest : public TextTrack { |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
nit:s/TextTrackTest/FakeTextTrack/ since this is a
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + public: |
| + TextTrackTest(TextRendererTest* text_renderer_test, |
| + unsigned idx, |
| + const TextTrackConfig& config) |
| + : text_renderer_test_(text_renderer_test), |
| + index_(idx), |
| + config_(config) { |
| + } |
| + virtual ~TextTrackTest() { |
| + RemoveTextTrackTest(text_renderer_test_, this); |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
Pass a Closure into the constructor instead so thi
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + } |
| + virtual void addWebVTTCue(const base::TimeDelta& start, |
| + const base::TimeDelta& end, |
| + const std::string& id, |
| + const std::string& content, |
| + const std::string& settings) OVERRIDE { |
| + cues_.push_back(TextCueTest(start, end, id, content, settings)); |
| + } |
| + |
| + TextRendererTest* const text_renderer_test_; |
| + |
| + // Index of this TextTrack object in the vector of such objects |
| + // maintained by the TextRendererTest object. |
| + const unsigned index_; |
| + |
| + const TextTrackConfig config_; |
| + |
| + typedef std::vector<TextCueTest> Cues; |
| + Cues cues_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(TextTrackTest); |
| +}; |
| + |
| +// Local implementation of the DemuxerStream. These are the stream objects |
| +// we pass to the text renderer object when streams are added and removed. |
| +class TextTrackStream : public DemuxerStream { |
| + public: |
| + TextTrackStream() |
| + : message_loop_(base::MessageLoopProxy::current()) { |
| + } |
| + virtual ~TextTrackStream() { |
| + DCHECK(read_cb_.is_null()); |
| + } |
| + |
| + // DemuxerStream implementation. |
| + MOCK_METHOD1(Read, void(const ReadCB&)); |
| + MOCK_METHOD0(audio_decoder_config, AudioDecoderConfig()); |
| + MOCK_METHOD0(video_decoder_config, VideoDecoderConfig()); |
| + virtual Type type() OVERRIDE { return DemuxerStream::TEXT; } |
| + MOCK_METHOD0(EnableBitstreamConverter, void()); |
| + |
| + // Local methods |
| + |
| + void DoRead(const ReadCB& read_cb) { |
| + EXPECT_FALSE(read_cb.is_null()); |
| + EXPECT_TRUE(read_cb_.is_null()); |
| + read_cb_ = read_cb; |
| + } |
| + |
| + void SatisfyPendingRead(const base::TimeDelta& start, |
| + const base::TimeDelta& duration, |
| + const std::string& id, |
| + const std::string& content, |
| + const std::string& settings) { |
| + EXPECT_FALSE(read_cb_.is_null()); |
| + |
| + const uint8* const data = reinterpret_cast<const uint8*>(content.data()); |
| + |
| + std::vector<uint8> side_data; |
| + MakeSideData(id.begin(), id.end(), |
| + settings.begin(), settings.end(), |
| + &side_data); |
| + |
| + scoped_refptr<DecoderBuffer> buffer; |
| + |
| + buffer = DecoderBuffer::CopyFrom(data, |
| + content.size(), |
| + side_data.data(), |
| + side_data.size()); |
| + |
| + buffer->set_timestamp(start); |
| + buffer->set_duration(duration); |
| + |
| + base::ResetAndReturn(&read_cb_).Run(kOk, buffer); |
| + } |
| + |
| + void AbortPendingRead() { |
| + EXPECT_FALSE(read_cb_.is_null()); |
| + base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); |
| + } |
| + |
| + void SendEosNotification() { |
| + EXPECT_FALSE(read_cb_.is_null()); |
| + base::ResetAndReturn(&read_cb_).Run(kOk, DecoderBuffer::CreateEOSBuffer()); |
| + } |
| + |
| + scoped_refptr<base::MessageLoopProxy> message_loop_; |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
Why do you need this? It doesn't look like you are
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + ReadCB read_cb_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(TextTrackStream); |
| +}; |
| + |
| +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(); |
| + } |
| + |
| + TextTrackStream* CreateTextTrack() { |
| + text_track_streams_.push_back(new TextTrackStream); |
| + return text_track_streams_.back(); |
| + } |
| + |
| + void AddTextTrack(TextKind kind, |
| + const std::string& name, |
| + const std::string& language) { |
| + EXPECT_CALL(*this, OnAddTextTrack(_,_)) |
| + .WillOnce(Invoke(this, &TextRendererTest::DoAddTextTrack)); |
| + |
| + const TextTrackConfig config(kind, name, language); |
| + text_renderer_->AddTextStream(text_track_streams_.back(), config); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_FALSE(text_tracks_.empty()); |
| + TextTrackTest* const text_track = text_tracks_.back(); |
| + EXPECT_TRUE(text_track->config_.Matches(config)); |
| + } |
| + |
| + MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&, |
| + const AddTextTrackDoneCB&)); |
| + |
| + void DoAddTextTrack(const TextTrackConfig& config, |
| + const AddTextTrackDoneCB& done_cb) { |
| + const unsigned idx = text_tracks_.size(); |
| + scoped_ptr<TextTrackTest> text_track(new TextTrackTest(this, |
| + idx, |
| + config)); |
| + // text_track is owned by text renderer, but we cache it here so we |
| + // can inspect it. It gets removed from the cache when the text renderer |
| + // deallocates it. |
| + text_tracks_.push_back(text_track.get()); |
| + done_cb.Run(text_track.Pass()); |
| + } |
| + |
| + 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 AbortPendingReads() { |
| + for (TextTrackStreams::iterator itr = text_track_streams_.begin(); |
| + itr != text_track_streams_.end(); ++itr) { |
| + (*itr)->AbortPendingRead(); |
| + } |
| + } |
| + |
| + void SendEosNotifications() { |
| + for (TextTrackStreams::iterator itr = text_track_streams_.begin(); |
| + itr != text_track_streams_.end(); ++itr) { |
| + (*itr)->SendEosNotification(); |
| + } |
| + } |
| + |
| + void SendCues(bool expect_cue) { |
| + DCHECK(text_track_streams_.size() == text_tracks_.size()); |
| + |
| + const base::TimeDelta start; |
| + const base::TimeDelta duration = base::TimeDelta::FromSeconds(42); |
| + std::string id = "stratford-on-guy"; |
| + std::string content = "Yo Yo Buddy Yup Yup Word To Ya Muthuh"; |
| + std::string settings = ""; |
| + SatisfyPendingReads(start, duration, id, content, settings); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + for (TextTracks::iterator itr = text_tracks_.begin(); |
| + itr != text_tracks_.end(); ++itr) { |
| + TextTrackTest* const text_track = *itr; |
| + |
| + TextTrackTest::Cues& cues = text_track->cues_; |
| + |
| + if (cues.empty()) { |
| + EXPECT_FALSE(expect_cue); |
| + continue; |
| + } |
| + |
| + EXPECT_TRUE(expect_cue); |
| + ASSERT_EQ(cues.size(), 1); |
| + |
| + TextCueTest& cue = cues.back(); |
| + EXPECT_EQ(cue.start_, start); |
| + EXPECT_EQ(cue.end_, start + duration); |
| + EXPECT_EQ(cue.id_, id); |
| + EXPECT_EQ(cue.content_, content); |
| + EXPECT_EQ(cue.settings_, settings); |
| + } |
| + } |
| + |
| + void SendCue(unsigned idx, bool expect_cue) { |
| + TextTrackStream* const text_stream = text_track_streams_[idx]; |
| + |
| + const base::TimeDelta start; |
| + const base::TimeDelta duration = base::TimeDelta::FromSeconds(42); |
| + std::string id = "Dance Of The Seven Veils"; |
| + std::string content = "Girly Sound"; |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
nit: I think we should have more neutral test text
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + std::string settings = ""; |
| + text_stream->SatisfyPendingRead(start, duration, id, content, settings); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackTest* const text_track = text_tracks_[idx]; |
| + |
| + TextTrackTest::Cues& cues = text_track->cues_; |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
Do you really need to keep the cues around? It see
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + |
| + if (cues.empty()) { |
| + EXPECT_FALSE(expect_cue); |
| + return; |
| + } |
| + |
| + EXPECT_TRUE(expect_cue); |
| + ASSERT_EQ(cues.size(), 1); |
| + |
| + TextCueTest& cue = cues.back(); |
| + EXPECT_EQ(cue.start_, start); |
| + EXPECT_EQ(cue.end_, start + duration); |
| + EXPECT_EQ(cue.id_, id); |
| + EXPECT_EQ(cue.content_, content); |
| + EXPECT_EQ(cue.settings_, settings); |
| + } |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
To avoid duplicate code, it seems like SendCues()
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + |
| + void RemoveTextTrackTest(TextTrackTest* text_track_test) { |
| + const unsigned idx = text_track_test->index_; |
| + DCHECK(text_tracks_[idx] == text_track_test); |
| + text_tracks_[idx] = NULL; |
| + } |
| + |
| + 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<TextTrackStream> TextTrackStreams; |
| + TextTrackStreams text_track_streams_; |
| + |
| + typedef std::vector<TextTrackTest*> TextTracks; |
| + TextTracks text_tracks_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(TextRendererTest); |
| +}; |
| + |
| +void RemoveTextTrackTest(TextRendererTest* text_renderer_test, |
| + TextTrackTest* text_track) { |
| + text_renderer_test->RemoveTextTrackTest(text_track); |
| +} |
| + |
| +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) { |
| + CreateTextRenderer(); |
| + CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTextTracks2Only) { |
| + CreateTextRenderer(); |
| + CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "track 1", ""); |
| + CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "track 2", ""); |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayOnly) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
I think it might be better if you change DoRead()
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
nit: In almost all cases where Play() is called it
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay2A) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay2B) { |
|
acolwell GONE FROM CHROMIUM
2013/11/10 19:48:08
nit: Typically when we have variants of the same t
Matthew Heaney (Chromium)
2013/11/13 05:44:49
Done.
|
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayAddCue) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayAddCue2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosOnly) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosOnly2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueEos) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueEos2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, TestStopPending) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, TestStopPending2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPausePending) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPausePending2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCues(true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCues(true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2A) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2B) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosFlush) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnFlush()); |
| + text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosFlush2) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnFlush()); |
| + text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTextTrackOnlyRemove) { |
| + CreateTextRenderer(); |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTextTracks2OnlyRemove) { |
| + CreateTextRenderer(); |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "track 1", ""); |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "track 2", ""); |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlayRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveC) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackBeforePlay2RemoveD) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlayRemove) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay2ARemoveA) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay2ARemoveB) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddTrackAfterPlay2BRemove) { |
| + CreateTextRenderer(); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayAddCueRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayAddCue2Remove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosOnlyRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosOnly2Remove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueEosRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueEos2Remove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .Times(2) |
| + .WillRepeatedly(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCues(true); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, TestStopPendingRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, TestStopPending2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, TestStopPending2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPauseRemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPauseRemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + AbortPendingReads(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause2RemoveC) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayPause2RemoveD) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPausePendingRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPausePending2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPausePending2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePendingRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCues(true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCue(1, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCue(1, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPauseRemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPauseRemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2ARemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2ARemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2ARemoveC) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2ARemoveD) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2BRemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2BRemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2BRemoveC) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosPause2BRemoveD) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosFlushRemove) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnFlush()); |
| + text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosFlush2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnFlush()); |
| + text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayEosFlush2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + SendEosNotifications(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnFlush()); |
| + text_renderer_->Flush(base::Bind(&TextRendererTest::OnFlush, |
| + base::Unretained(this))); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayShort2A) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayShort2B) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCue(1, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayShort2RemoveA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayShort2RemoveB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + EXPECT_FALSE(text_tracks_[0]); |
| + EXPECT_TRUE(text_renderer_->HasTracks()); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_2); |
| + EXPECT_FALSE(text_tracks_[1]); |
| + EXPECT_FALSE(text_renderer_->HasTracks()); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePendingCancel) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_stream->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending2CancelA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCuePausePending2CancelB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + SendCue(1, true); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueStopPendingCancel) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + text_stream->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueStopPending2CancelA) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + SendCue(0, false); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + text_stream_2->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, PlayCueStopPending2CancelB) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* const text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* const text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + SendCue(1, false); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddRemoveAdd) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream); |
| + text_track_streams_.clear(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "", ""); |
| + |
| + EXPECT_CALL(*text_stream, Read(_)) |
| + .WillOnce(Invoke(text_stream, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddRemoveAdd2A) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + text_track_streams_.erase(text_track_streams_.begin()); |
| + |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddRemoveAdd2B) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + text_track_streams_.erase(text_track_streams_.begin()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnPause()); |
| + EXPECT_CALL(*this, OnEnd()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + DestroyTextRenderer(); |
| +} |
| + |
| +TEST_F(TextRendererTest, AddRemoveAdd2C) { |
| + CreateTextRenderer(); |
| + |
| + TextTrackStream* text_stream_1 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "1", ""); |
| + |
| + EXPECT_CALL(*text_stream_1, Read(_)) |
| + .WillOnce(Invoke(text_stream_1, &TextTrackStream::DoRead)); |
| + |
| + TextTrackStream* text_stream_2 = CreateTextTrack(); |
| + AddTextTrack(kTextSubtitles, "2", ""); |
| + |
| + EXPECT_CALL(*text_stream_2, Read(_)) |
| + .WillOnce(Invoke(text_stream_2, &TextTrackStream::DoRead)); |
| + |
| + EXPECT_CALL(*this, OnPlay()); |
| + |
| + text_renderer_->Play(base::Bind(&TextRendererTest::OnPlay, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_stream_1->AbortPendingRead(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->RemoveTextStream(text_stream_1); |
| + text_track_streams_.erase(text_track_streams_.begin()); |
| + |
| + text_renderer_->Pause(base::Bind(&TextRendererTest::OnPause, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_->Stop(base::Bind(&TextRendererTest::OnStop, |
| + base::Unretained(this))); |
| + message_loop_.RunUntilIdle(); |
| + |
| + EXPECT_CALL(*this, OnStop()); |
| + text_stream_2->SendEosNotification(); |
| + message_loop_.RunUntilIdle(); |
| + |
| + text_renderer_.reset(); |
| + text_track_streams_.clear(); |
| +} |
| + |
| +} // namespace media |