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

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: cleanup 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 namespace media { 45 namespace media {
46 46
47 ACTION_P(SetDemuxerProperties, duration) { 47 ACTION_P(SetDemuxerProperties, duration) {
48 arg0->SetDuration(duration); 48 arg0->SetDuration(duration);
49 } 49 }
50 50
51 ACTION_P(Stop, pipeline) { 51 ACTION_P(Stop, pipeline) {
52 pipeline->Stop(); 52 pipeline->Stop();
53 } 53 }
54 54
55 ACTION_P2(SetError, pipeline, status) { 55 ACTION_P2(SetError, renderer_client, status) {
56 pipeline->SetErrorForTesting(status); 56 (*renderer_client)->OnError(status);
57 } 57 }
58 58
59 ACTION_P2(SetBufferingState, renderer_client, buffering_state) { 59 ACTION_P2(SetBufferingState, renderer_client, buffering_state) {
60 (*renderer_client)->OnBufferingStateChange(buffering_state); 60 (*renderer_client)->OnBufferingStateChange(buffering_state);
61 } 61 }
62 62
63 ACTION_TEMPLATE(PostCallback, 63 ACTION_TEMPLATE(PostCallback,
64 HAS_1_TEMPLATE_PARAMS(int, k), 64 HAS_1_TEMPLATE_PARAMS(int, k),
65 AND_1_VALUE_PARAMS(p0)) { 65 AND_1_VALUE_PARAMS(p0)) {
66 return base::MessageLoop::current()->PostTask( 66 return base::MessageLoop::current()->PostTask(
(...skipping 21 matching lines...) Expand all
88 MOCK_METHOD1(OnResume, void(PipelineStatus)); 88 MOCK_METHOD1(OnResume, void(PipelineStatus));
89 89
90 private: 90 private:
91 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 91 DISALLOW_COPY_AND_ASSIGN(CallbackHelper);
92 }; 92 };
93 93
94 PipelineImplTest() 94 PipelineImplTest()
95 : pipeline_( 95 : pipeline_(
96 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), 96 new PipelineImpl(message_loop_.task_runner(), new MediaLog())),
97 demuxer_(new StrictMock<MockDemuxer>()), 97 demuxer_(new StrictMock<MockDemuxer>()),
98 demuxer_host_(nullptr),
98 scoped_renderer_(new StrictMock<MockRenderer>()), 99 scoped_renderer_(new StrictMock<MockRenderer>()),
99 renderer_(scoped_renderer_.get()), 100 renderer_(scoped_renderer_.get()),
100 renderer_client_(nullptr) { 101 renderer_client_(nullptr) {
101 // SetDemuxerExpectations() adds overriding expectations for expected 102 // SetDemuxerExpectations() adds overriding expectations for expected
102 // non-NULL streams. 103 // non-NULL streams.
103 DemuxerStream* null_pointer = NULL; 104 DemuxerStream* null_pointer = NULL;
104 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer)); 105 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer));
105 106
106 EXPECT_CALL(*demuxer_, GetTimelineOffset()) 107 EXPECT_CALL(*demuxer_, GetTimelineOffset())
107 .WillRepeatedly(Return(base::Time())); 108 .WillRepeatedly(Return(base::Time()));
108 109
109 EXPECT_CALL(*renderer_, GetMediaTime()) 110 EXPECT_CALL(*renderer_, GetMediaTime())
110 .WillRepeatedly(Return(base::TimeDelta())); 111 .WillRepeatedly(Return(base::TimeDelta()));
111 112
112 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); 113 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_));
113 } 114 }
114 115
115 virtual ~PipelineImplTest() { 116 virtual ~PipelineImplTest() {
116 if (!pipeline_ || !pipeline_->IsRunning()) 117 if (pipeline_->IsRunning()) {
117 return; 118 ExpectDemuxerStop();
118 119
119 ExpectDemuxerStop(); 120 // The mock demuxer doesn't stop the fake text track stream,
121 // so just stop it manually.
122 if (text_stream_)
123 text_stream_->Stop();
120 124
121 // The mock demuxer doesn't stop the fake text track stream, 125 pipeline_->Stop();
122 // so just stop it manually.
123 if (text_stream_) {
124 text_stream_->Stop();
125 message_loop_.RunUntilIdle();
126 } 126 }
127 127
128 pipeline_.reset();
128 message_loop_.RunUntilIdle(); 129 message_loop_.RunUntilIdle();
129 pipeline_->Stop();
130 DestroyPipeline();
131 } 130 }
132 131
133 void OnDemuxerError() { 132 void OnDemuxerError() { demuxer_host_->OnDemuxerError(PIPELINE_ERROR_ABORT); }
134 // Cast because OnDemuxerError is private in Pipeline.
135 static_cast<DemuxerHost*>(pipeline_.get())
136 ->OnDemuxerError(PIPELINE_ERROR_ABORT);
137 }
138 133
139 protected: 134 protected:
140 // Sets up expectations to allow the demuxer to initialize. 135 // Sets up expectations to allow the demuxer to initialize.
141 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 136 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
142 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, 137 void SetDemuxerExpectations(MockDemuxerStreamVector* streams,
143 const base::TimeDelta& duration) { 138 const base::TimeDelta& duration) {
144 EXPECT_CALL(callbacks_, OnDurationChange()); 139 EXPECT_CALL(callbacks_, OnDurationChange());
145 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 140 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
146 .WillOnce(DoAll(SetDemuxerProperties(duration), 141 .WillOnce(DoAll(SaveArg<0>(&demuxer_host_),
142 SetDemuxerProperties(duration),
147 PostCallback<1>(PIPELINE_OK))); 143 PostCallback<1>(PIPELINE_OK)));
148 144
149 // Configure the demuxer to return the streams. 145 // Configure the demuxer to return the streams.
150 for (size_t i = 0; i < streams->size(); ++i) { 146 for (size_t i = 0; i < streams->size(); ++i) {
151 DemuxerStream* stream = (*streams)[i]; 147 DemuxerStream* stream = (*streams)[i];
152 EXPECT_CALL(*demuxer_, GetStream(stream->type())) 148 EXPECT_CALL(*demuxer_, GetStream(stream->type()))
153 .WillRepeatedly(Return(stream)); 149 .WillRepeatedly(Return(stream));
154 } 150 }
155 } 151 }
156 152
(...skipping 14 matching lines...) Expand all
171 EXPECT_CALL(*renderer_, Initialize(_, _, _)) 167 EXPECT_CALL(*renderer_, Initialize(_, _, _))
172 .WillOnce( 168 .WillOnce(
173 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); 169 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK)));
174 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); 170 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream()));
175 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); 171 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream()));
176 } 172 }
177 173
178 void AddTextStream() { 174 void AddTextStream() {
179 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) 175 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _))
180 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); 176 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack));
181 static_cast<DemuxerHost*>(pipeline_.get()) 177 demuxer_host_->AddTextStream(text_stream(),
182 ->AddTextStream(text_stream(), 178 TextTrackConfig(kTextSubtitles, "", "", ""));
183 TextTrackConfig(kTextSubtitles, "", "", ""));
184 message_loop_.RunUntilIdle(); 179 message_loop_.RunUntilIdle();
185 } 180 }
186 181
187 void StartPipeline() { 182 void StartPipeline() {
188 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); 183 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0);
189 pipeline_->Start( 184 pipeline_->Start(
190 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, 185 demuxer_.get(), std::move(scoped_renderer_), &callbacks_,
191 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 186 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
192 } 187 }
193 188
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); 283 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK));
289 } 284 }
290 285
291 void DoResume(const base::TimeDelta& seek_time) { 286 void DoResume(const base::TimeDelta& seek_time) {
292 pipeline_->Resume( 287 pipeline_->Resume(
293 std::move(scoped_renderer_), seek_time, 288 std::move(scoped_renderer_), seek_time,
294 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); 289 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_)));
295 message_loop_.RunUntilIdle(); 290 message_loop_.RunUntilIdle();
296 } 291 }
297 292
298 void DestroyPipeline() {
299 // In real code Pipeline could be destroyed on a different thread. All weak
300 // pointers must have been invalidated before the stop callback returns.
301 DCHECK(!pipeline_->HasWeakPtrsForTesting());
302 pipeline_.reset();
303 }
304
305 void ExpectDemuxerStop() { 293 void ExpectDemuxerStop() {
306 if (demuxer_) 294 if (demuxer_)
307 EXPECT_CALL(*demuxer_, Stop()); 295 EXPECT_CALL(*demuxer_, Stop());
308 } 296 }
309 297
310 void DoOnAddTextTrack(const TextTrackConfig& config, 298 void DoOnAddTextTrack(const TextTrackConfig& config,
311 const AddTextTrackDoneCB& done_cb) { 299 const AddTextTrackDoneCB& done_cb) {
312 std::unique_ptr<TextTrack> text_track(new MockTextTrack); 300 std::unique_ptr<TextTrack> text_track(new MockTextTrack);
313 done_cb.Run(std::move(text_track)); 301 done_cb.Run(std::move(text_track));
314 } 302 }
315 303
316 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { 304 void RunBufferedTimeRangesTest(const base::TimeDelta duration) {
317 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); 305 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size());
318 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 306 EXPECT_FALSE(pipeline_->DidLoadingProgress());
307
319 Ranges<base::TimeDelta> ranges; 308 Ranges<base::TimeDelta> ranges;
320 ranges.Add(base::TimeDelta(), duration); 309 ranges.Add(base::TimeDelta(), duration);
321 pipeline_->OnBufferedTimeRangesChanged(ranges); 310 demuxer_host_->OnBufferedTimeRangesChanged(ranges);
311 message_loop_.RunUntilIdle();
312
322 EXPECT_TRUE(pipeline_->DidLoadingProgress()); 313 EXPECT_TRUE(pipeline_->DidLoadingProgress());
323 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 314 EXPECT_FALSE(pipeline_->DidLoadingProgress());
324 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 315 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size());
325 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); 316 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0));
326 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); 317 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0));
327 } 318 }
328 319
329 // Fixture members. 320 // Fixture members.
330 StrictMock<CallbackHelper> callbacks_; 321 StrictMock<CallbackHelper> callbacks_;
331 base::SimpleTestTickClock test_tick_clock_; 322 base::SimpleTestTickClock test_tick_clock_;
332 base::MessageLoop message_loop_; 323 base::MessageLoop message_loop_;
333 std::unique_ptr<PipelineImpl> pipeline_; 324 std::unique_ptr<PipelineImpl> pipeline_;
334 325
335 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_; 326 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_;
327 DemuxerHost* demuxer_host_;
336 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_; 328 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_;
337 StrictMock<MockRenderer>* renderer_; 329 StrictMock<MockRenderer>* renderer_;
338 StrictMock<CallbackHelper> text_renderer_callbacks_; 330 StrictMock<CallbackHelper> text_renderer_callbacks_;
339 TextRenderer* text_renderer_; 331 TextRenderer* text_renderer_;
340 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; 332 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_;
341 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; 333 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_;
342 std::unique_ptr<FakeTextTrackStream> text_stream_; 334 std::unique_ptr<FakeTextTrackStream> text_stream_;
343 RendererClient* renderer_client_; 335 RendererClient* renderer_client_;
344 VideoDecoderConfig video_decoder_config_; 336 VideoDecoderConfig video_decoder_config_;
345 PipelineMetadata metadata_; 337 PipelineMetadata metadata_;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 408
417 SetDemuxerExpectations(&streams); 409 SetDemuxerExpectations(&streams);
418 SetRendererExpectations(); 410 SetRendererExpectations();
419 411
420 StartPipelineAndExpect(PIPELINE_OK); 412 StartPipelineAndExpect(PIPELINE_OK);
421 message_loop_.RunUntilIdle(); 413 message_loop_.RunUntilIdle();
422 414
423 EXPECT_CALL(*demuxer_, Stop()) 415 EXPECT_CALL(*demuxer_, Stop())
424 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); 416 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError));
425 pipeline_->Stop(); 417 pipeline_->Stop();
418 message_loop_.RunUntilIdle();
426 } 419 }
427 420
428 TEST_F(PipelineImplTest, NoStreams) { 421 TEST_F(PipelineImplTest, NoStreams) {
429 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 422 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
430 .WillOnce(PostCallback<1>(PIPELINE_OK)); 423 .WillOnce(PostCallback<1>(PIPELINE_OK));
431 EXPECT_CALL(*demuxer_, Stop()); 424 EXPECT_CALL(*demuxer_, Stop());
432 EXPECT_CALL(callbacks_, OnMetadata(_)); 425 EXPECT_CALL(callbacks_, OnMetadata(_));
433 426
434 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); 427 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER);
435 } 428 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 streams.push_back(audio_stream()); 528 streams.push_back(audio_stream());
536 529
537 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 530 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
538 SetRendererExpectations(); 531 SetRendererExpectations();
539 532
540 // Initialize then seek! 533 // Initialize then seek!
541 StartPipelineAndExpect(PIPELINE_OK); 534 StartPipelineAndExpect(PIPELINE_OK);
542 535
543 EXPECT_CALL(*demuxer_, Stop()); 536 EXPECT_CALL(*demuxer_, Stop());
544 EXPECT_CALL(callbacks_, OnError(_)); 537 EXPECT_CALL(callbacks_, OnError(_));
545 538 OnDemuxerError();
546 static_cast<DemuxerHost*>(pipeline_.get())
547 ->OnDemuxerError(PIPELINE_ERROR_ABORT);
548 message_loop_.RunUntilIdle(); 539 message_loop_.RunUntilIdle();
549 540
550 pipeline_->Seek( 541 pipeline_->Seek(
551 base::TimeDelta::FromMilliseconds(100), 542 base::TimeDelta::FromMilliseconds(100),
552 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); 543 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
553 message_loop_.RunUntilIdle(); 544 message_loop_.RunUntilIdle();
554 } 545 }
555 546
556 TEST_F(PipelineImplTest, SuspendResume) { 547 TEST_F(PipelineImplTest, SuspendResume) {
557 CreateAudioStream(); 548 CreateAudioStream();
558 CreateVideoStream(); 549 CreateVideoStream();
559 CreateTextStream(); 550 CreateTextStream();
560 MockDemuxerStreamVector streams; 551 MockDemuxerStreamVector streams;
561 streams.push_back(audio_stream()); 552 streams.push_back(audio_stream());
562 streams.push_back(video_stream()); 553 streams.push_back(video_stream());
563 554
564 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 555 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
565 SetRendererExpectations(); 556 SetRendererExpectations();
566 557
567 StartPipelineAndExpect(PIPELINE_OK); 558 StartPipelineAndExpect(PIPELINE_OK);
568 559
569 // Inject some fake memory usage to verify its cleared after suspend. 560 // Inject some fake memory usage to verify its cleared after suspend.
570 PipelineStatistics stats; 561 PipelineStatistics stats;
571 stats.audio_memory_usage = 12345; 562 stats.audio_memory_usage = 12345;
572 stats.video_memory_usage = 67890; 563 stats.video_memory_usage = 67890;
573 renderer_client_->OnStatisticsUpdate(stats); 564 renderer_client_->OnStatisticsUpdate(stats);
565 message_loop_.RunUntilIdle();
566
574 EXPECT_EQ(stats.audio_memory_usage, 567 EXPECT_EQ(stats.audio_memory_usage,
575 pipeline_->GetStatistics().audio_memory_usage); 568 pipeline_->GetStatistics().audio_memory_usage);
576 EXPECT_EQ(stats.video_memory_usage, 569 EXPECT_EQ(stats.video_memory_usage,
577 pipeline_->GetStatistics().video_memory_usage); 570 pipeline_->GetStatistics().video_memory_usage);
578 571
579 ExpectSuspend(); 572 ExpectSuspend();
580 DoSuspend(); 573 DoSuspend();
581 574
582 EXPECT_EQ(pipeline_->GetStatistics().audio_memory_usage, 0); 575 EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage);
583 EXPECT_EQ(pipeline_->GetStatistics().video_memory_usage, 0); 576 EXPECT_EQ(0, pipeline_->GetStatistics().video_memory_usage);
584 577
585 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 578 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
586 ExpectResume(expected); 579 ExpectResume(expected);
587 DoResume(expected); 580 DoResume(expected);
588 } 581 }
589 582
590 TEST_F(PipelineImplTest, SetVolume) { 583 TEST_F(PipelineImplTest, SetVolume) {
591 CreateAudioStream(); 584 CreateAudioStream();
592 MockDemuxerStreamVector streams; 585 MockDemuxerStreamVector streams;
593 streams.push_back(audio_stream()); 586 streams.push_back(audio_stream());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 627
635 base::TimeDelta kSeekTime = kDuration / 2; 628 base::TimeDelta kSeekTime = kDuration / 2;
636 ExpectSeek(kSeekTime, false); 629 ExpectSeek(kSeekTime, false);
637 DoSeek(kSeekTime); 630 DoSeek(kSeekTime);
638 631
639 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 632 EXPECT_FALSE(pipeline_->DidLoadingProgress());
640 } 633 }
641 634
642 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { 635 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) {
643 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) 636 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
644 .WillOnce(PostCallback<1>(PIPELINE_OK)); 637 .WillOnce(
638 DoAll(SaveArg<0>(&demuxer_host_), PostCallback<1>(PIPELINE_OK)));
645 EXPECT_CALL(*demuxer_, Stop()); 639 EXPECT_CALL(*demuxer_, Stop());
646 EXPECT_CALL(callbacks_, OnMetadata(_)); 640 EXPECT_CALL(callbacks_, OnMetadata(_));
647 EXPECT_CALL(callbacks_, OnStart(_)); 641 EXPECT_CALL(callbacks_, OnStart(_));
648 StartPipeline(); 642 StartPipeline();
649 message_loop_.RunUntilIdle(); 643 message_loop_.RunUntilIdle();
650 644
651 pipeline_->Stop(); 645 pipeline_->Stop();
652 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); 646 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5));
653 DestroyPipeline();
654 } 647 }
655 648
656 TEST_F(PipelineImplTest, EndedCallback) { 649 TEST_F(PipelineImplTest, EndedCallback) {
657 CreateAudioStream(); 650 CreateAudioStream();
658 CreateVideoStream(); 651 CreateVideoStream();
659 CreateTextStream(); 652 CreateTextStream();
660 MockDemuxerStreamVector streams; 653 MockDemuxerStreamVector streams;
661 streams.push_back(audio_stream()); 654 streams.push_back(audio_stream());
662 streams.push_back(video_stream()); 655 streams.push_back(video_stream());
663 656
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 888 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
896 889
897 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true)); 890 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true));
898 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true)); 891 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true));
899 892
900 if (state == kInitRenderer) { 893 if (state == kInitRenderer) {
901 if (stop_or_error == kStop) { 894 if (stop_or_error == kStop) {
902 EXPECT_CALL(*renderer_, Initialize(_, _, _)) 895 EXPECT_CALL(*renderer_, Initialize(_, _, _))
903 .WillOnce( 896 .WillOnce(
904 DoAll(Stop(pipeline_.get()), PostCallback<2>(PIPELINE_OK))); 897 DoAll(Stop(pipeline_.get()), PostCallback<2>(PIPELINE_OK)));
905 // Note: OnStart or OnMetadata callback are not called 898 // Note: OnStart callback is not called after pipeline is stopped.
906 // after pipeline is stopped.
907 } else { 899 } else {
908 EXPECT_CALL(*renderer_, Initialize(_, _, _)) 900 EXPECT_CALL(*renderer_, Initialize(_, _, _))
909 .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED)); 901 .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED));
910 EXPECT_CALL(callbacks_, OnMetadata(_));
911 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)); 902 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED));
912 } 903 }
913 904
905 EXPECT_CALL(callbacks_, OnMetadata(_));
914 EXPECT_CALL(*demuxer_, Stop()); 906 EXPECT_CALL(*demuxer_, Stop());
915 return; 907 return;
916 } 908 }
917 909
918 EXPECT_CALL(*renderer_, Initialize(_, _, _)) 910 EXPECT_CALL(*renderer_, Initialize(_, _, _))
919 .WillOnce( 911 .WillOnce(
920 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); 912 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK)));
921 913
922 // If we get here it's a successful initialization. 914 // If we get here it's a successful initialization.
923 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); 915 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK));
(...skipping 23 matching lines...) Expand all
947 EXPECT_CALL(*renderer_, Flush(_)) 939 EXPECT_CALL(*renderer_, Flush(_))
948 .WillOnce(DoAll( 940 .WillOnce(DoAll(
949 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 941 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
950 Stop(pipeline_.get()), RunClosure<0>())); 942 Stop(pipeline_.get()), RunClosure<0>()));
951 // Note: OnBufferingStateChange or OnSeek callbacks are not called 943 // Note: OnBufferingStateChange or OnSeek callbacks are not called
952 // after pipeline is stopped. 944 // after pipeline is stopped.
953 } else { 945 } else {
954 EXPECT_CALL(*renderer_, Flush(_)) 946 EXPECT_CALL(*renderer_, Flush(_))
955 .WillOnce(DoAll( 947 .WillOnce(DoAll(
956 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 948 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
957 SetError(pipeline_.get(), PIPELINE_ERROR_READ), 949 SetError(&renderer_client_, PIPELINE_ERROR_READ),
958 RunClosure<0>())); 950 RunClosure<0>()));
959 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 951 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
960 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 952 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
961 } 953 }
962 return; 954 return;
963 } 955 }
964 956
965 EXPECT_CALL(*renderer_, Flush(_)) 957 EXPECT_CALL(*renderer_, Flush(_))
966 .WillOnce( 958 .WillOnce(
967 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 959 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 EXPECT_CALL(*demuxer_, Seek(_, _)) 1014 EXPECT_CALL(*demuxer_, Seek(_, _))
1023 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 1015 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
1024 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); 1016 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ));
1025 } 1017 }
1026 } else if (state != kSuspended && state != kSuspending) { 1018 } else if (state != kSuspended && state != kSuspending) {
1027 NOTREACHED() << "State not supported: " << state; 1019 NOTREACHED() << "State not supported: " << state;
1028 } 1020 }
1029 } 1021 }
1030 1022
1031 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) { 1023 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) {
1032 InSequence s;
1033
1034 switch (stop_or_error) { 1024 switch (stop_or_error) {
1035 case kStop: 1025 case kStop:
1036 EXPECT_CALL(*demuxer_, Stop()); 1026 EXPECT_CALL(*demuxer_, Stop());
1037 pipeline_->Stop(); 1027 pipeline_->Stop();
1038 break; 1028 break;
1039 1029
1040 case kError: 1030 case kError:
1041 if (expect_errors) { 1031 if (expect_errors) {
1042 EXPECT_CALL(*demuxer_, Stop()); 1032 EXPECT_CALL(*demuxer_, Stop());
1043 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); 1033 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1044 } 1034 }
1045 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); 1035 renderer_client_->OnError(PIPELINE_ERROR_READ);
1046 break; 1036 break;
1047 1037
1048 case kErrorAndStop: 1038 case kErrorAndStop:
1049 EXPECT_CALL(*demuxer_, Stop()); 1039 EXPECT_CALL(*demuxer_, Stop());
1050 if (expect_errors) 1040 if (expect_errors)
1051 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); 1041 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
1052 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); 1042 renderer_client_->OnError(PIPELINE_ERROR_READ);
1053 message_loop_.RunUntilIdle(); 1043 message_loop_.RunUntilIdle();
1054 pipeline_->Stop(); 1044 pipeline_->Stop();
1055 break; 1045 break;
1056 } 1046 }
1057 1047
1058 message_loop_.RunUntilIdle(); 1048 message_loop_.RunUntilIdle();
1059 } 1049 }
1060 1050
1061 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); 1051 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest);
1062 }; 1052 };
(...skipping 18 matching lines...) Expand all
1081 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1071 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1082 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1072 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1083 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); 1073 INSTANTIATE_TEARDOWN_TEST(Error, Suspending);
1084 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); 1074 INSTANTIATE_TEARDOWN_TEST(Error, Suspended);
1085 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); 1075 INSTANTIATE_TEARDOWN_TEST(Error, Resuming);
1086 1076
1087 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1077 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1088 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); 1078 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended);
1089 1079
1090 } // namespace media 1080 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698