OLD | NEW |
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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/threading/simple_thread.h" | 10 #include "base/threading/simple_thread.h" |
11 #include "media/base/clock.h" | 11 #include "media/base/clock.h" |
12 #include "media/base/filter_host.h" | 12 #include "media/base/filter_host.h" |
13 #include "media/base/filters.h" | 13 #include "media/base/filters.h" |
14 #include "media/base/media_log.h" | 14 #include "media/base/media_log.h" |
15 #include "media/base/pipeline.h" | 15 #include "media/base/pipeline.h" |
16 #include "media/base/mock_callback.h" | 16 #include "media/base/mock_callback.h" |
17 #include "media/base/mock_filters.h" | 17 #include "media/base/mock_filters.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "ui/gfx/size.h" | 19 #include "ui/gfx/size.h" |
20 | 20 |
21 using ::testing::_; | 21 using ::testing::_; |
22 using ::testing::DeleteArg; | 22 using ::testing::DeleteArg; |
| 23 using ::testing::DoAll; |
23 using ::testing::InSequence; | 24 using ::testing::InSequence; |
24 using ::testing::Invoke; | 25 using ::testing::Invoke; |
25 using ::testing::InvokeArgument; | |
26 using ::testing::Mock; | 26 using ::testing::Mock; |
27 using ::testing::NotNull; | 27 using ::testing::NotNull; |
28 using ::testing::Return; | 28 using ::testing::Return; |
29 using ::testing::ReturnRef; | 29 using ::testing::ReturnRef; |
30 using ::testing::StrictMock; | 30 using ::testing::StrictMock; |
31 using ::testing::WithArg; | 31 using ::testing::WithArg; |
32 | 32 |
33 namespace media { | 33 namespace media { |
34 | 34 |
35 // Total bytes of the data source. | 35 // Total bytes of the data source. |
36 static const int kTotalBytes = 1024; | 36 static const int kTotalBytes = 1024; |
37 | 37 |
38 // Buffered bytes of the data source. | 38 // Buffered bytes of the data source. |
39 static const int kBufferedBytes = 1024; | 39 static const int kBufferedBytes = 1024; |
40 | 40 |
| 41 ACTION_P(InitializeDemuxerWithError, error) { |
| 42 arg1.Run(error); |
| 43 } |
| 44 |
| 45 ACTION_P(SetDemuxerProperties, duration) { |
| 46 arg0->SetTotalBytes(kTotalBytes); |
| 47 arg0->SetBufferedBytes(kBufferedBytes); |
| 48 arg0->SetDuration(duration); |
| 49 } |
| 50 |
41 // Used for setting expectations on pipeline callbacks. Using a StrictMock | 51 // Used for setting expectations on pipeline callbacks. Using a StrictMock |
42 // also lets us test for missing callbacks. | 52 // also lets us test for missing callbacks. |
43 class CallbackHelper { | 53 class CallbackHelper { |
44 public: | 54 public: |
45 CallbackHelper() {} | 55 CallbackHelper() {} |
46 virtual ~CallbackHelper() {} | 56 virtual ~CallbackHelper() {} |
47 | 57 |
48 MOCK_METHOD1(OnStart, void(PipelineStatus)); | 58 MOCK_METHOD1(OnStart, void(PipelineStatus)); |
49 MOCK_METHOD1(OnSeek, void(PipelineStatus)); | 59 MOCK_METHOD1(OnSeek, void(PipelineStatus)); |
50 MOCK_METHOD0(OnStop, void()); | 60 MOCK_METHOD0(OnStop, void()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 100 |
91 pipeline_ = NULL; | 101 pipeline_ = NULL; |
92 mocks_.reset(); | 102 mocks_.reset(); |
93 } | 103 } |
94 | 104 |
95 protected: | 105 protected: |
96 // Sets up expectations to allow the demuxer to initialize. | 106 // Sets up expectations to allow the demuxer to initialize. |
97 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; | 107 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; |
98 void InitializeDemuxer(MockDemuxerStreamVector* streams, | 108 void InitializeDemuxer(MockDemuxerStreamVector* streams, |
99 const base::TimeDelta& duration) { | 109 const base::TimeDelta& duration) { |
100 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) | 110 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) |
101 .WillOnce(Invoke(&RunPipelineStatusCB)); | 111 .WillOnce(DoAll(SetDemuxerProperties(duration), |
102 mocks_->demuxer()->SetTotalAndBufferedBytesAndDuration( | 112 Invoke(&RunPipelineStatusCB2))); |
103 kTotalBytes, kBufferedBytes, duration); | |
104 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); | 113 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); |
105 EXPECT_CALL(*mocks_->demuxer(), Seek(mocks_->demuxer()->GetStartTime(), _)) | 114 EXPECT_CALL(*mocks_->demuxer(), Seek(mocks_->demuxer()->GetStartTime(), _)) |
106 .WillOnce(Invoke(&RunPipelineStatusCB2)); | 115 .WillOnce(Invoke(&RunPipelineStatusCB2)); |
107 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) | 116 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
108 .WillOnce(Invoke(&RunStopFilterCallback)); | 117 .WillOnce(Invoke(&RunStopFilterCallback)); |
109 | 118 |
110 // Configure the demuxer to return the streams. | 119 // Configure the demuxer to return the streams. |
111 for (size_t i = 0; i < streams->size(); ++i) { | 120 for (size_t i = 0; i < streams->size(); ++i) { |
112 scoped_refptr<DemuxerStream> stream((*streams)[i]); | 121 scoped_refptr<DemuxerStream> stream((*streams)[i]); |
113 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type())) | 122 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type())) |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 | 283 |
275 // Should always get set to zero. | 284 // Should always get set to zero. |
276 gfx::Size size(1, 1); | 285 gfx::Size size(1, 1); |
277 pipeline_->GetNaturalVideoSize(&size); | 286 pipeline_->GetNaturalVideoSize(&size); |
278 EXPECT_EQ(0, size.width()); | 287 EXPECT_EQ(0, size.width()); |
279 EXPECT_EQ(0, size.height()); | 288 EXPECT_EQ(0, size.height()); |
280 } | 289 } |
281 | 290 |
282 TEST_F(PipelineTest, NeverInitializes) { | 291 TEST_F(PipelineTest, NeverInitializes) { |
283 // Don't execute the callback passed into Initialize(). | 292 // Don't execute the callback passed into Initialize(). |
284 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)); | 293 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)); |
285 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) | 294 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
286 .WillOnce(Invoke(&RunStopFilterCallback)); | 295 .WillOnce(Invoke(&RunStopFilterCallback)); |
287 | 296 |
288 // This test hangs during initialization by never calling | 297 // This test hangs during initialization by never calling |
289 // InitializationComplete(). StrictMock<> will ensure that the callback is | 298 // InitializationComplete(). StrictMock<> will ensure that the callback is |
290 // never executed. | 299 // never executed. |
291 pipeline_->Start( | 300 pipeline_->Start( |
292 mocks_->Create().Pass(), | 301 mocks_->Create().Pass(), |
293 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), | 302 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
294 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), | 303 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
(...skipping 20 matching lines...) Expand all Loading... |
315 collection.Pass(), | 324 collection.Pass(), |
316 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), | 325 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
317 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), | 326 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
318 NetworkEventCB(), | 327 NetworkEventCB(), |
319 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); | 328 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); |
320 message_loop_.RunAllPending(); | 329 message_loop_.RunAllPending(); |
321 EXPECT_FALSE(pipeline_->IsInitialized()); | 330 EXPECT_FALSE(pipeline_->IsInitialized()); |
322 } | 331 } |
323 | 332 |
324 TEST_F(PipelineTest, URLNotFound) { | 333 TEST_F(PipelineTest, URLNotFound) { |
325 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) | 334 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) |
326 .WillOnce(RunPipelineStatusCBWithError( | 335 .WillOnce(InitializeDemuxerWithError(PIPELINE_ERROR_URL_NOT_FOUND)); |
327 PIPELINE_ERROR_URL_NOT_FOUND)); | |
328 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) | 336 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
329 .WillOnce(Invoke(&RunStopFilterCallback)); | 337 .WillOnce(Invoke(&RunStopFilterCallback)); |
330 | 338 |
331 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); | 339 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); |
332 EXPECT_FALSE(pipeline_->IsInitialized()); | 340 EXPECT_FALSE(pipeline_->IsInitialized()); |
333 } | 341 } |
334 | 342 |
335 TEST_F(PipelineTest, NoStreams) { | 343 TEST_F(PipelineTest, NoStreams) { |
336 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) | 344 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) |
337 .WillOnce(Invoke(&RunPipelineStatusCB)); | 345 .WillOnce(Invoke(&RunPipelineStatusCB2)); |
338 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) | 346 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) |
339 .WillOnce(Invoke(&RunStopFilterCallback)); | 347 .WillOnce(Invoke(&RunStopFilterCallback)); |
340 | 348 |
341 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); | 349 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); |
342 EXPECT_FALSE(pipeline_->IsInitialized()); | 350 EXPECT_FALSE(pipeline_->IsInitialized()); |
343 } | 351 } |
344 | 352 |
345 TEST_F(PipelineTest, AudioStream) { | 353 TEST_F(PipelineTest, AudioStream) { |
346 CreateAudioStream(); | 354 CreateAudioStream(); |
347 MockDemuxerStreamVector streams; | 355 MockDemuxerStreamVector streams; |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); | 869 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); |
862 } | 870 } |
863 | 871 |
864 // Test that different-thread, some-delay callback (the expected common case) | 872 // Test that different-thread, some-delay callback (the expected common case) |
865 // works correctly. | 873 // works correctly. |
866 TEST(PipelineStatusNotificationTest, DelayedCallback) { | 874 TEST(PipelineStatusNotificationTest, DelayedCallback) { |
867 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); | 875 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); |
868 } | 876 } |
869 | 877 |
870 } // namespace media | 878 } // namespace media |
OLD | NEW |