1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/files/file_path.h"
10 #include "base/functional/bind.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "media/base/test_data_util.h"
13 #include "media/ffmpeg/ffmpeg_common.h"
14 #include "media/filters/blocking_url_protocol.h"
15 #include "media/filters/file_data_source.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
21 class BlockingUrlProtocolTest : public testing::Test {
23 BlockingUrlProtocolTest()
24 : url_protocol_(std::make_unique<BlockingUrlProtocol>(
26 base::BindRepeating(&BlockingUrlProtocolTest::OnDataSourceError,
27 base::Unretained(this)))) {
28 CHECK(data_source_.Initialize(GetTestDataFilePath("bear-320x240.webm")));
31 BlockingUrlProtocolTest(const BlockingUrlProtocolTest&) = delete;
32 BlockingUrlProtocolTest& operator=(const BlockingUrlProtocolTest&) = delete;
34 ~BlockingUrlProtocolTest() override { data_source_.Stop(); }
36 MOCK_METHOD0(OnDataSourceError, void());
38 FileDataSource data_source_;
39 std::unique_ptr<BlockingUrlProtocol> url_protocol_;
43 TEST_F(BlockingUrlProtocolTest, Read) {
44 // Set read head to zero as Initialize() will have parsed a bit of the file.
46 EXPECT_TRUE(url_protocol_->SetPosition(0));
47 EXPECT_TRUE(url_protocol_->GetPosition(&position));
48 EXPECT_EQ(0, position);
50 // Read 32 bytes from offset zero and verify position.
52 EXPECT_EQ(32, url_protocol_->Read(32, buffer));
53 EXPECT_TRUE(url_protocol_->GetPosition(&position));
54 EXPECT_EQ(32, position);
56 // Read an additional 32 bytes and verify position.
57 EXPECT_EQ(32, url_protocol_->Read(32, buffer));
58 EXPECT_TRUE(url_protocol_->GetPosition(&position));
59 EXPECT_EQ(64, position);
61 // Seek to end and read until EOF.
63 EXPECT_TRUE(url_protocol_->GetSize(&size));
64 EXPECT_TRUE(url_protocol_->SetPosition(size - 48));
65 EXPECT_EQ(32, url_protocol_->Read(32, buffer));
66 EXPECT_TRUE(url_protocol_->GetPosition(&position));
67 EXPECT_EQ(size - 16, position);
69 EXPECT_EQ(16, url_protocol_->Read(32, buffer));
70 EXPECT_TRUE(url_protocol_->GetPosition(&position));
71 EXPECT_EQ(size, position);
73 EXPECT_EQ(AVERROR_EOF, url_protocol_->Read(32, buffer));
74 EXPECT_TRUE(url_protocol_->GetPosition(&position));
75 EXPECT_EQ(size, position);
78 TEST_F(BlockingUrlProtocolTest, ReadError) {
79 data_source_.force_read_errors_for_testing();
82 EXPECT_CALL(*this, OnDataSourceError());
83 EXPECT_EQ(AVERROR(EIO), url_protocol_->Read(32, buffer));
86 TEST_F(BlockingUrlProtocolTest, GetSetPosition) {
89 EXPECT_TRUE(url_protocol_->GetSize(&size));
90 EXPECT_TRUE(url_protocol_->GetPosition(&position));
92 EXPECT_TRUE(url_protocol_->SetPosition(512));
93 EXPECT_FALSE(url_protocol_->SetPosition(size + 1));
94 EXPECT_FALSE(url_protocol_->SetPosition(-1));
95 EXPECT_TRUE(url_protocol_->GetPosition(&position));
96 EXPECT_EQ(512, position);
98 EXPECT_TRUE(url_protocol_->SetPosition(size));
99 EXPECT_TRUE(url_protocol_->GetPosition(&position));
100 EXPECT_EQ(size, position);
103 TEST_F(BlockingUrlProtocolTest, GetSize) {
104 int64_t data_source_size = 0;
105 int64_t url_protocol_size = 0;
106 EXPECT_TRUE(data_source_.GetSize(&data_source_size));
107 EXPECT_TRUE(url_protocol_->GetSize(&url_protocol_size));
108 EXPECT_NE(0, data_source_size);
109 EXPECT_EQ(data_source_size, url_protocol_size);
112 TEST_F(BlockingUrlProtocolTest, IsStreaming) {
113 EXPECT_FALSE(data_source_.IsStreaming());
114 EXPECT_FALSE(url_protocol_->IsStreaming());
116 data_source_.force_streaming_for_testing();
117 url_protocol_ = std::make_unique<BlockingUrlProtocol>(
119 base::BindRepeating(&BlockingUrlProtocolTest::OnDataSourceError,
120 base::Unretained(this)));
121 EXPECT_TRUE(data_source_.IsStreaming());
122 EXPECT_TRUE(url_protocol_->IsStreaming());