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

Side by Side Diff: media/base/pipeline_impl_unittest.cc

Issue 1999893004: Splits PipelineImpl into main and media thread components. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reverts state machine changes Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/base/pipeline_impl.h" 5 #include "media/base/pipeline_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 namespace media { 48 namespace media {
49 49
50 ACTION_P(SetDemuxerProperties, duration) { 50 ACTION_P(SetDemuxerProperties, duration) {
51 arg0->SetDuration(duration); 51 arg0->SetDuration(duration);
52 } 52 }
53 53
54 ACTION_P(Stop, pipeline) { 54 ACTION_P(Stop, pipeline) {
55 pipeline->Stop(); 55 pipeline->Stop();
56 } 56 }
57 57
58 ACTION_P2(SetError, pipeline, status) { 58 ACTION_P2(SetError, renderer_client, status) {
59 pipeline->SetErrorForTesting(status); 59 (*renderer_client)->OnError(status);
60 } 60 }
61 61
62 ACTION_P2(SetBufferingState, renderer_client, buffering_state) { 62 ACTION_P2(SetBufferingState, renderer_client, buffering_state) {
63 (*renderer_client)->OnBufferingStateChange(buffering_state); 63 (*renderer_client)->OnBufferingStateChange(buffering_state);
64 } 64 }
65 65
66 ACTION_TEMPLATE(PostCallback, 66 ACTION_TEMPLATE(PostCallback,
67 HAS_1_TEMPLATE_PARAMS(int, k), 67 HAS_1_TEMPLATE_PARAMS(int, k),
68 AND_1_VALUE_PARAMS(p0)) { 68 AND_1_VALUE_PARAMS(p0)) {
69 base::ThreadTaskRunnerHandle::Get()->PostTask( 69 base::ThreadTaskRunnerHandle::Get()->PostTask(
(...skipping 21 matching lines...) Expand all
91 MOCK_METHOD1(OnResume, void(PipelineStatus)); 91 MOCK_METHOD1(OnResume, void(PipelineStatus));
92 92
93 private: 93 private:
94 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 94 DISALLOW_COPY_AND_ASSIGN(CallbackHelper);
95 }; 95 };
96 96
97 PipelineImplTest() 97 PipelineImplTest()
98 : pipeline_( 98 : pipeline_(
99 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), 99 new PipelineImpl(message_loop_.task_runner(), new MediaLog())),
100 demuxer_(new StrictMock<MockDemuxer>()), 100 demuxer_(new StrictMock<MockDemuxer>()),
101 demuxer_host_(nullptr),
101 scoped_renderer_(new StrictMock<MockRenderer>()), 102 scoped_renderer_(new StrictMock<MockRenderer>()),
102 renderer_(scoped_renderer_.get()), 103 renderer_(scoped_renderer_.get()),
103 renderer_client_(nullptr) { 104 renderer_client_(nullptr) {
104 // SetDemuxerExpectations() adds overriding expectations for expected 105 // SetDemuxerExpectations() adds overriding expectations for expected
105 // non-NULL streams. 106 // non-NULL streams.
106 DemuxerStream* null_pointer = NULL; 107 DemuxerStream* null_pointer = NULL;
107 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer)); 108 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer));
108 109
109 EXPECT_CALL(*demuxer_, GetTimelineOffset()) 110 EXPECT_CALL(*demuxer_, GetTimelineOffset())
110 .WillRepeatedly(Return(base::Time())); 111 .WillRepeatedly(Return(base::Time()));
111 112
112 EXPECT_CALL(*renderer_, GetMediaTime()) 113 EXPECT_CALL(*renderer_, GetMediaTime())
113 .WillRepeatedly(Return(base::TimeDelta())); 114 .WillRepeatedly(Return(base::TimeDelta()));
114 115
115 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); 116 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_));
116 } 117 }
117 118
118 virtual ~PipelineImplTest() { 119 virtual ~PipelineImplTest() {
119 if (!pipeline_ || !pipeline_->IsRunning()) 120 if (pipeline_->IsRunning()) {
120 return; 121 ExpectDemuxerStop();
121 122
122 ExpectDemuxerStop(); 123 // The mock demuxer doesn't stop the fake text track stream,
124 // so just stop it manually.
125 if (text_stream_)
126 text_stream_->Stop();
123 127
124 // The mock demuxer doesn't stop the fake text track stream, 128 pipeline_->Stop();
125 // so just stop it manually.
126 if (text_stream_) {
127 text_stream_->Stop();
128 message_loop_.RunUntilIdle();
129 } 129 }
130 130
131 pipeline_.reset();
131 message_loop_.RunUntilIdle(); 132 message_loop_.RunUntilIdle();
132 pipeline_->Stop();
133 DestroyPipeline();
134 } 133 }
135 134
136 void OnDemuxerError() { 135 void OnDemuxerError() { demuxer_host_->OnDemuxerError(PIPELINE_ERROR_ABORT); }
137 // Cast because OnDemuxerError is private in Pipeline.
138 static_cast<DemuxerHost*>(pipeline_.get())
139 ->OnDemuxerError(PIPELINE_ERROR_ABORT);
140 }
141 136
142 protected: 137 protected:
143 // Sets up expectations to allow the demuxer to initialize. 138 // Sets up expectations to allow the demuxer to initialize.
144 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 139 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
145 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, 140 void SetDemuxerExpectations(MockDemuxerStreamVector* streams,
146 const base::TimeDelta& duration) { 141 const base::TimeDelta& duration) {
147 EXPECT_CALL(callbacks_, OnDurationChange()); 142 EXPECT_CALL(callbacks_, OnDurationChange());
148 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 143 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
149 .WillOnce(DoAll(SetDemuxerProperties(duration), 144 .WillOnce(DoAll(SaveArg<0>(&demuxer_host_),
145 SetDemuxerProperties(duration),
150 PostCallback<1>(PIPELINE_OK))); 146 PostCallback<1>(PIPELINE_OK)));
151 147
152 // Configure the demuxer to return the streams. 148 // Configure the demuxer to return the streams.
153 for (size_t i = 0; i < streams->size(); ++i) { 149 for (size_t i = 0; i < streams->size(); ++i) {
154 DemuxerStream* stream = (*streams)[i]; 150 DemuxerStream* stream = (*streams)[i];
155 EXPECT_CALL(*demuxer_, GetStream(stream->type())) 151 EXPECT_CALL(*demuxer_, GetStream(stream->type()))
156 .WillRepeatedly(Return(stream)); 152 .WillRepeatedly(Return(stream));
157 } 153 }
158 } 154 }
159 155
(...skipping 14 matching lines...) Expand all
174 EXPECT_CALL(*renderer_, Initialize(_, _, _)) 170 EXPECT_CALL(*renderer_, Initialize(_, _, _))
175 .WillOnce( 171 .WillOnce(
176 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); 172 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK)));
177 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); 173 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream()));
178 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); 174 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream()));
179 } 175 }
180 176
181 void AddTextStream() { 177 void AddTextStream() {
182 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) 178 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _))
183 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); 179 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack));
184 static_cast<DemuxerHost*>(pipeline_.get()) 180 demuxer_host_->AddTextStream(text_stream(),
185 ->AddTextStream(text_stream(), 181 TextTrackConfig(kTextSubtitles, "", "", ""));
186 TextTrackConfig(kTextSubtitles, "", "", ""));
187 message_loop_.RunUntilIdle(); 182 message_loop_.RunUntilIdle();
188 } 183 }
189 184
190 void StartPipeline() { 185 void StartPipeline() {
191 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); 186 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0);
192 pipeline_->Start( 187 pipeline_->Start(
193 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, 188 demuxer_.get(), std::move(scoped_renderer_), &callbacks_,
194 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 189 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
195 } 190 }
196 191
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); 286 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK));
292 } 287 }
293 288
294 void DoResume(const base::TimeDelta& seek_time) { 289 void DoResume(const base::TimeDelta& seek_time) {
295 pipeline_->Resume( 290 pipeline_->Resume(
296 std::move(scoped_renderer_), seek_time, 291 std::move(scoped_renderer_), seek_time,
297 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); 292 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_)));
298 message_loop_.RunUntilIdle(); 293 message_loop_.RunUntilIdle();
299 } 294 }
300 295
301 void DestroyPipeline() {
302 // In real code Pipeline could be destroyed on a different thread. All weak
303 // pointers must have been invalidated before the stop callback returns.
304 DCHECK(!pipeline_->HasWeakPtrsForTesting());
305 pipeline_.reset();
306 }
307
308 void ExpectDemuxerStop() { 296 void ExpectDemuxerStop() {
309 if (demuxer_) 297 if (demuxer_)
310 EXPECT_CALL(*demuxer_, Stop()); 298 EXPECT_CALL(*demuxer_, Stop());
311 } 299 }
312 300
313 void DoOnAddTextTrack(const TextTrackConfig& config, 301 void DoOnAddTextTrack(const TextTrackConfig& config,
314 const AddTextTrackDoneCB& done_cb) { 302 const AddTextTrackDoneCB& done_cb) {
315 std::unique_ptr<TextTrack> text_track(new MockTextTrack); 303 std::unique_ptr<TextTrack> text_track(new MockTextTrack);
316 done_cb.Run(std::move(text_track)); 304 done_cb.Run(std::move(text_track));
317 } 305 }
318 306
319 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { 307 void RunBufferedTimeRangesTest(const base::TimeDelta duration) {
320 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); 308 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size());
321 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 309 EXPECT_FALSE(pipeline_->DidLoadingProgress());
310
322 Ranges<base::TimeDelta> ranges; 311 Ranges<base::TimeDelta> ranges;
323 ranges.Add(base::TimeDelta(), duration); 312 ranges.Add(base::TimeDelta(), duration);
324 pipeline_->OnBufferedTimeRangesChanged(ranges); 313 demuxer_host_->OnBufferedTimeRangesChanged(ranges);
314 message_loop_.RunUntilIdle();
315
325 EXPECT_TRUE(pipeline_->DidLoadingProgress()); 316 EXPECT_TRUE(pipeline_->DidLoadingProgress());
326 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 317 EXPECT_FALSE(pipeline_->DidLoadingProgress());
327 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 318 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size());
328 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); 319 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0));
329 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); 320 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0));
330 } 321 }
331 322
332 // Fixture members. 323 // Fixture members.
333 StrictMock<CallbackHelper> callbacks_; 324 StrictMock<CallbackHelper> callbacks_;
334 base::SimpleTestTickClock test_tick_clock_; 325 base::SimpleTestTickClock test_tick_clock_;
335 base::MessageLoop message_loop_; 326 base::MessageLoop message_loop_;
336 std::unique_ptr<PipelineImpl> pipeline_; 327 std::unique_ptr<PipelineImpl> pipeline_;
337 328
338 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_; 329 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_;
330 DemuxerHost* demuxer_host_;
339 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_; 331 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_;
340 StrictMock<MockRenderer>* renderer_; 332 StrictMock<MockRenderer>* renderer_;
341 StrictMock<CallbackHelper> text_renderer_callbacks_; 333 StrictMock<CallbackHelper> text_renderer_callbacks_;
342 TextRenderer* text_renderer_; 334 TextRenderer* text_renderer_;
343 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; 335 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_;
344 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; 336 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_;
345 std::unique_ptr<FakeTextTrackStream> text_stream_; 337 std::unique_ptr<FakeTextTrackStream> text_stream_;
346 RendererClient* renderer_client_; 338 RendererClient* renderer_client_;
347 VideoDecoderConfig video_decoder_config_; 339 VideoDecoderConfig video_decoder_config_;
348 PipelineMetadata metadata_; 340 PipelineMetadata metadata_;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 411
420 SetDemuxerExpectations(&streams); 412 SetDemuxerExpectations(&streams);
421 SetRendererExpectations(); 413 SetRendererExpectations();
422 414
423 StartPipelineAndExpect(PIPELINE_OK); 415 StartPipelineAndExpect(PIPELINE_OK);
424 message_loop_.RunUntilIdle(); 416 message_loop_.RunUntilIdle();
425 417
426 EXPECT_CALL(*demuxer_, Stop()) 418 EXPECT_CALL(*demuxer_, Stop())
427 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); 419 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError));
428 pipeline_->Stop(); 420 pipeline_->Stop();
421 message_loop_.RunUntilIdle();
429 } 422 }
430 423
431 TEST_F(PipelineImplTest, NoStreams) { 424 TEST_F(PipelineImplTest, NoStreams) {
432 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 425 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
433 .WillOnce(PostCallback<1>(PIPELINE_OK)); 426 .WillOnce(PostCallback<1>(PIPELINE_OK));
434 EXPECT_CALL(*demuxer_, Stop()); 427 EXPECT_CALL(*demuxer_, Stop());
435 EXPECT_CALL(callbacks_, OnMetadata(_)); 428 EXPECT_CALL(callbacks_, OnMetadata(_));
436 429
437 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); 430 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER);
438 } 431 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 streams.push_back(audio_stream()); 531 streams.push_back(audio_stream());
539 532
540 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 533 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
541 SetRendererExpectations(); 534 SetRendererExpectations();
542 535
543 // Initialize then seek! 536 // Initialize then seek!
544 StartPipelineAndExpect(PIPELINE_OK); 537 StartPipelineAndExpect(PIPELINE_OK);
545 538
546 EXPECT_CALL(*demuxer_, Stop()); 539 EXPECT_CALL(*demuxer_, Stop());
547 EXPECT_CALL(callbacks_, OnError(_)); 540 EXPECT_CALL(callbacks_, OnError(_));
548 541 OnDemuxerError();
549 static_cast<DemuxerHost*>(pipeline_.get())
550 ->OnDemuxerError(PIPELINE_ERROR_ABORT);
551 message_loop_.RunUntilIdle(); 542 message_loop_.RunUntilIdle();
552 543
553 pipeline_->Seek( 544 pipeline_->Seek(
554 base::TimeDelta::FromMilliseconds(100), 545 base::TimeDelta::FromMilliseconds(100),
555 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); 546 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
556 message_loop_.RunUntilIdle(); 547 message_loop_.RunUntilIdle();
557 } 548 }
558 549
559 TEST_F(PipelineImplTest, SuspendResume) { 550 TEST_F(PipelineImplTest, SuspendResume) {
560 CreateAudioStream(); 551 CreateAudioStream();
561 CreateVideoStream(); 552 CreateVideoStream();
562 CreateTextStream(); 553 CreateTextStream();
563 MockDemuxerStreamVector streams; 554 MockDemuxerStreamVector streams;
564 streams.push_back(audio_stream()); 555 streams.push_back(audio_stream());
565 streams.push_back(video_stream()); 556 streams.push_back(video_stream());
566 557
567 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 558 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
568 SetRendererExpectations(); 559 SetRendererExpectations();
569 560
570 StartPipelineAndExpect(PIPELINE_OK); 561 StartPipelineAndExpect(PIPELINE_OK);
571 562
572 // Inject some fake memory usage to verify its cleared after suspend. 563 // Inject some fake memory usage to verify its cleared after suspend.
573 PipelineStatistics stats; 564 PipelineStatistics stats;
574 stats.audio_memory_usage = 12345; 565 stats.audio_memory_usage = 12345;
575 stats.video_memory_usage = 67890; 566 stats.video_memory_usage = 67890;
576 renderer_client_->OnStatisticsUpdate(stats); 567 renderer_client_->OnStatisticsUpdate(stats);
568 message_loop_.RunUntilIdle();
569
577 EXPECT_EQ(stats.audio_memory_usage, 570 EXPECT_EQ(stats.audio_memory_usage,
578 pipeline_->GetStatistics().audio_memory_usage); 571 pipeline_->GetStatistics().audio_memory_usage);
579 EXPECT_EQ(stats.video_memory_usage, 572 EXPECT_EQ(stats.video_memory_usage,
580 pipeline_->GetStatistics().video_memory_usage); 573 pipeline_->GetStatistics().video_memory_usage);
581 574
582 ExpectSuspend(); 575 ExpectSuspend();
583 DoSuspend(); 576 DoSuspend();
584 577
585 EXPECT_EQ(pipeline_->GetStatistics().audio_memory_usage, 0); 578 EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage);
586 EXPECT_EQ(pipeline_->GetStatistics().video_memory_usage, 0); 579 EXPECT_EQ(0, pipeline_->GetStatistics().video_memory_usage);
587 580
588 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 581 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
589 ExpectResume(expected); 582 ExpectResume(expected);
590 DoResume(expected); 583 DoResume(expected);
591 } 584 }
592 585
593 TEST_F(PipelineImplTest, SetVolume) { 586 TEST_F(PipelineImplTest, SetVolume) {
594 CreateAudioStream(); 587 CreateAudioStream();
595 MockDemuxerStreamVector streams; 588 MockDemuxerStreamVector streams;
596 streams.push_back(audio_stream()); 589 streams.push_back(audio_stream());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 630
638 base::TimeDelta kSeekTime = kDuration / 2; 631 base::TimeDelta kSeekTime = kDuration / 2;
639 ExpectSeek(kSeekTime, false); 632 ExpectSeek(kSeekTime, false);
640 DoSeek(kSeekTime); 633 DoSeek(kSeekTime);
641 634
642 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 635 EXPECT_FALSE(pipeline_->DidLoadingProgress());
643 } 636 }
644 637
645 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { 638 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) {
646 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 639 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
647 .WillOnce(PostCallback<1>(PIPELINE_OK)); 640 .WillOnce(
641 DoAll(SaveArg<0>(&demuxer_host_), PostCallback<1>(PIPELINE_OK)));
648 EXPECT_CALL(*demuxer_, Stop()); 642 EXPECT_CALL(*demuxer_, Stop());
649 EXPECT_CALL(callbacks_, OnMetadata(_)); 643 EXPECT_CALL(callbacks_, OnMetadata(_));
650 EXPECT_CALL(callbacks_, OnStart(_)); 644 EXPECT_CALL(callbacks_, OnStart(_));
651 StartPipeline(); 645 StartPipeline();
652 message_loop_.RunUntilIdle(); 646 message_loop_.RunUntilIdle();
653 647
654 pipeline_->Stop(); 648 pipeline_->Stop();
655 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); 649 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5));
656 DestroyPipeline();
657 } 650 }
658 651
659 TEST_F(PipelineImplTest, EndedCallback) { 652 TEST_F(PipelineImplTest, EndedCallback) {
660 CreateAudioStream(); 653 CreateAudioStream();
661 CreateVideoStream(); 654 CreateVideoStream();
662 CreateTextStream(); 655 CreateTextStream();
663 MockDemuxerStreamVector streams; 656 MockDemuxerStreamVector streams;
664 streams.push_back(audio_stream()); 657 streams.push_back(audio_stream());
665 streams.push_back(video_stream()); 658 streams.push_back(video_stream());
666 659
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 EXPECT_CALL(*renderer_, Flush(_)) 943 EXPECT_CALL(*renderer_, Flush(_))
951 .WillOnce(DoAll( 944 .WillOnce(DoAll(
952 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 945 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
953 Stop(pipeline_.get()), RunClosure<0>())); 946 Stop(pipeline_.get()), RunClosure<0>()));
954 // Note: OnBufferingStateChange or OnSeek callbacks are not called 947 // Note: OnBufferingStateChange or OnSeek callbacks are not called
955 // after pipeline is stopped. 948 // after pipeline is stopped.
956 } else { 949 } else {
957 EXPECT_CALL(*renderer_, Flush(_)) 950 EXPECT_CALL(*renderer_, Flush(_))
958 .WillOnce(DoAll( 951 .WillOnce(DoAll(
959 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 952 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
960 SetError(pipeline_.get(), PIPELINE_ERROR_READ), 953 SetError(&renderer_client_, PIPELINE_ERROR_READ),
961 RunClosure<0>())); 954 RunClosure<0>()));
962 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 955 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
963 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 956 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
964 } 957 }
965 return; 958 return;
966 } 959 }
967 960
968 EXPECT_CALL(*renderer_, Flush(_)) 961 EXPECT_CALL(*renderer_, Flush(_))
969 .WillOnce( 962 .WillOnce(
970 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 963 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 EXPECT_CALL(*demuxer_, Seek(_, _)) 1018 EXPECT_CALL(*demuxer_, Seek(_, _))
1026 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 1019 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
1027 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); 1020 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ));
1028 } 1021 }
1029 } else if (state != kSuspended && state != kSuspending) { 1022 } else if (state != kSuspended && state != kSuspending) {
1030 NOTREACHED() << "State not supported: " << state; 1023 NOTREACHED() << "State not supported: " << state;
1031 } 1024 }
1032 } 1025 }
1033 1026
1034 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) { 1027 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) {
1035 InSequence s;
1036
1037 switch (stop_or_error) { 1028 switch (stop_or_error) {
1038 case kStop: 1029 case kStop:
1039 EXPECT_CALL(*demuxer_, Stop()); 1030 EXPECT_CALL(*demuxer_, Stop());
1040 pipeline_->Stop(); 1031 pipeline_->Stop();
1041 break; 1032 break;
1042 1033
1043 case kError: 1034 case kError:
1044 if (expect_errors) { 1035 if (expect_errors) {
1045 EXPECT_CALL(*demuxer_, Stop()); 1036 EXPECT_CALL(*demuxer_, Stop());
1046 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); 1037 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1047 } 1038 }
1048 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); 1039 renderer_client_->OnError(PIPELINE_ERROR_READ);
1049 break; 1040 break;
1050 1041
1051 case kErrorAndStop: 1042 case kErrorAndStop:
1052 EXPECT_CALL(*demuxer_, Stop()); 1043 EXPECT_CALL(*demuxer_, Stop());
1053 if (expect_errors) 1044 if (expect_errors)
1054 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); 1045 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1055 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); 1046 renderer_client_->OnError(PIPELINE_ERROR_READ);
1056 message_loop_.RunUntilIdle(); 1047 message_loop_.RunUntilIdle();
1057 pipeline_->Stop(); 1048 pipeline_->Stop();
1058 break; 1049 break;
1059 } 1050 }
1060 1051
1061 message_loop_.RunUntilIdle(); 1052 message_loop_.RunUntilIdle();
1062 } 1053 }
1063 1054
1064 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); 1055 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1065 }; 1056 };
(...skipping 18 matching lines...) Expand all
1084 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1075 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1085 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1076 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1086 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); 1077 INSTANTIATE_TEARDOWN_TEST(Error, Suspending);
1087 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); 1078 INSTANTIATE_TEARDOWN_TEST(Error, Suspended);
1088 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); 1079 INSTANTIATE_TEARDOWN_TEST(Error, Resuming);
1089 1080
1090 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1081 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1091 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); 1082 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended);
1092 1083
1093 } // namespace media 1084 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698