Index: webkit/glue/media/buffered_data_source_unittest.cc |
=================================================================== |
--- webkit/glue/media/buffered_data_source_unittest.cc (revision 68125) |
+++ webkit/glue/media/buffered_data_source_unittest.cc (working copy) |
@@ -13,21 +13,13 @@ |
#include "media/base/mock_filter_host.h" |
#include "media/base/mock_filters.h" |
#include "net/base/net_errors.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebFrameClient.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebString.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebURLError.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebURLLoader.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebURLRequest.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebURLResponse.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebView.h" |
+#include "net/http/http_response_headers.h" |
#include "webkit/glue/media/buffered_data_source.h" |
-#include "webkit/glue/mock_webframe.h" |
-#include "webkit/glue/mock_weburlloader_impl.h" |
+#include "webkit/glue/media/mock_media_resource_loader_bridge_factory.h" |
+#include "webkit/glue/mock_resource_loader_bridge.h" |
using ::testing::_; |
using ::testing::Assign; |
-using ::testing::AtLeast; |
using ::testing::DeleteArg; |
using ::testing::DoAll; |
using ::testing::InSequence; |
@@ -41,22 +33,11 @@ |
using ::testing::NiceMock; |
using ::testing::WithArgs; |
-using WebKit::WebURLError; |
-using WebKit::WebFrame; |
-using WebKit::WebFrameClient; |
-using WebKit::WebString; |
-using WebKit::WebURLLoader; |
-using WebKit::WebURLRequest; |
-using WebKit::WebURLResponse; |
-using WebKit::WebView; |
- |
namespace { |
const char* kHttpUrl = "http://test"; |
const char* kFileUrl = "file://test"; |
const int kDataSize = 1024; |
-const int kHttpOK = 200; |
-const int kHttpPartialContent = 206; |
enum NetworkState { |
NONE, |
@@ -71,23 +52,25 @@ |
// Submit a request completed event to the resource loader due to request |
// being canceled. Pretending the event is from external. |
ACTION_P(RequestCanceled, loader) { |
- WebURLError error; |
- error.reason = net::ERR_ABORTED; |
- error.domain = WebString::fromUTF8(net::kErrorDomain); |
- loader->didFail(NULL, error); |
+ URLRequestStatus status; |
+ status.set_status(URLRequestStatus::CANCELED); |
+ status.set_os_error(net::ERR_ABORTED); |
+ loader->OnCompletedRequest(status, "", base::Time()); |
} |
class BufferedResourceLoaderTest : public testing::Test { |
public: |
BufferedResourceLoaderTest() { |
- url_loader_ = new NiceMock<MockWebURLLoader>(); |
+ bridge_.reset(new StrictMock<MockResourceLoaderBridge>()); |
for (int i = 0; i < kDataSize; ++i) |
data_[i] = i; |
} |
- virtual ~BufferedResourceLoaderTest() { |
- ignore_result(frame_.release()); |
+ ~BufferedResourceLoaderTest() { |
+ if (bridge_.get()) |
+ EXPECT_CALL(*bridge_, OnDestroy()); |
+ EXPECT_CALL(bridge_factory_, OnDestroy()); |
} |
void Initialize(const char* url, int first_position, int last_position) { |
@@ -95,11 +78,8 @@ |
first_position_ = first_position; |
last_position_ = last_position; |
- frame_.reset(new NiceMock<MockWebFrame>()); |
- |
- loader_ = new BufferedResourceLoader(gurl_, |
+ loader_ = new BufferedResourceLoader(&bridge_factory_, gurl_, |
first_position_, last_position_); |
- loader_->SetURLLoaderForTest(url_loader_); |
} |
void SetLoaderBuffer(size_t forward_capacity, size_t backward_capacity) { |
@@ -109,23 +89,25 @@ |
void Start() { |
InSequence s; |
- EXPECT_CALL(*url_loader_, loadAsynchronously(_, loader_.get())); |
+ EXPECT_CALL(bridge_factory_, |
+ CreateBridge(gurl_, _, first_position_, last_position_)) |
+ .WillOnce(Return(bridge_.get())); |
+ EXPECT_CALL(*bridge_, Start(loader_.get())); |
loader_->Start( |
NewCallback(this, &BufferedResourceLoaderTest::StartCallback), |
- NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback), |
- frame_.get()); |
+ NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback)); |
} |
void FullResponse(int64 instance_size) { |
EXPECT_CALL(*this, StartCallback(net::OK)); |
- |
- WebURLResponse response(gurl_); |
- response.setHTTPHeaderField(WebString::fromUTF8("Content-Length"), |
- WebString::fromUTF8(base::StringPrintf("%" |
- PRId64, instance_size))); |
- response.setExpectedContentLength(instance_size); |
- response.setHTTPStatusCode(kHttpOK); |
- loader_->didReceiveResponse(url_loader_, response); |
+ ResourceResponseInfo info; |
+ std::string header = base::StringPrintf("HTTP/1.1 200 OK\n" |
+ "Content-Length: %" PRId64, |
+ instance_size); |
+ replace(header.begin(), header.end(), '\n', '\0'); |
+ info.headers = new net::HttpResponseHeaders(header); |
+ info.content_length = instance_size; |
+ loader_->OnReceivedResponse(info, false); |
EXPECT_EQ(instance_size, loader_->content_length()); |
EXPECT_EQ(instance_size, loader_->instance_size()); |
EXPECT_FALSE(loader_->partial_response()); |
@@ -135,17 +117,17 @@ |
int64 instance_size) { |
EXPECT_CALL(*this, StartCallback(net::OK)); |
int64 content_length = last_position - first_position + 1; |
- |
- WebURLResponse response(gurl_); |
- response.setHTTPHeaderField(WebString::fromUTF8("Content-Range"), |
- WebString::fromUTF8(base::StringPrintf("bytes " |
+ ResourceResponseInfo info; |
+ std::string header = base::StringPrintf("HTTP/1.1 206 Partial Content\n" |
+ "Content-Range: bytes " |
"%" PRId64 "-%" PRId64 "/%" PRId64, |
first_position, |
last_position, |
- instance_size))); |
- response.setExpectedContentLength(content_length); |
- response.setHTTPStatusCode(kHttpPartialContent); |
- loader_->didReceiveResponse(url_loader_, response); |
+ instance_size); |
+ replace(header.begin(), header.end(), '\n', '\0'); |
+ info.headers = new net::HttpResponseHeaders(header); |
+ info.content_length = content_length; |
+ loader_->OnReceivedResponse(info, false); |
EXPECT_EQ(content_length, loader_->content_length()); |
EXPECT_EQ(instance_size, loader_->instance_size()); |
EXPECT_TRUE(loader_->partial_response()); |
@@ -153,17 +135,22 @@ |
void StopWhenLoad() { |
InSequence s; |
- EXPECT_CALL(*url_loader_, cancel()) |
+ EXPECT_CALL(*bridge_, Cancel()) |
.WillOnce(RequestCanceled(loader_)); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
loader_->Stop(); |
} |
+ void ReleaseBridge() { |
+ ignore_result(bridge_.release()); |
+ } |
+ |
// Helper method to write to |loader_| from |data_|. |
void WriteLoader(int position, int size) { |
EXPECT_CALL(*this, NetworkCallback()) |
.RetiresOnSaturation(); |
- loader_->didReceiveData(url_loader_, |
- reinterpret_cast<char*>(data_ + position), size); |
+ loader_->OnReceivedData(reinterpret_cast<char*>(data_ + position), size); |
} |
// Helper method to read from |loader_|. |
@@ -180,7 +167,7 @@ |
// Helper method to disallow deferring in |loader_|. |
void DisallowLoaderDefer() { |
if (loader_->deferred_) { |
- EXPECT_CALL(*url_loader_, setDefersLoading(false)); |
+ EXPECT_CALL(*bridge_, SetDefersLoading(false)); |
EXPECT_CALL(*this, NetworkCallback()); |
} |
loader_->SetAllowDefer(false); |
@@ -201,8 +188,8 @@ |
int64 last_position_; |
scoped_refptr<BufferedResourceLoader> loader_; |
- NiceMock<MockWebURLLoader>* url_loader_; |
- scoped_ptr<NiceMock<MockWebFrame> > frame_; |
+ StrictMock<MockMediaResourceLoaderBridgeFactory> bridge_factory_; |
+ scoped_ptr<StrictMock<MockResourceLoaderBridge> > bridge_; |
uint8 data_[kDataSize]; |
@@ -216,19 +203,35 @@ |
StopWhenLoad(); |
} |
+// Tests that HTTP header is missing in the response. |
+TEST_F(BufferedResourceLoaderTest, MissingHttpHeader) { |
+ Initialize(kHttpUrl, -1, -1); |
+ Start(); |
+ |
+ EXPECT_CALL(*this, StartCallback(net::ERR_INVALID_RESPONSE)); |
+ EXPECT_CALL(*bridge_, Cancel()) |
+ .WillOnce(RequestCanceled(loader_)); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
+ |
+ ResourceResponseInfo info; |
+ loader_->OnReceivedResponse(info, false); |
+} |
+ |
// Tests that a bad HTTP response is recived, e.g. file not found. |
TEST_F(BufferedResourceLoaderTest, BadHttpResponse) { |
Initialize(kHttpUrl, -1, -1); |
Start(); |
EXPECT_CALL(*this, StartCallback(net::ERR_FAILED)); |
- EXPECT_CALL(*url_loader_, cancel()) |
+ EXPECT_CALL(*bridge_, Cancel()) |
.WillOnce(RequestCanceled(loader_)); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
- WebURLResponse response(gurl_); |
- response.setHTTPStatusCode(404); |
- response.setHTTPStatusText("Not Found\n"); |
- loader_->didReceiveResponse(url_loader_, response); |
+ ResourceResponseInfo info; |
+ info.headers = new net::HttpResponseHeaders("HTTP/1.1 404 Not Found\n"); |
+ loader_->OnReceivedResponse(info, false); |
} |
// Tests that partial content is requested but not fulfilled. |
@@ -261,16 +264,19 @@ |
Start(); |
EXPECT_CALL(*this, StartCallback(net::ERR_INVALID_RESPONSE)); |
- EXPECT_CALL(*url_loader_, cancel()) |
+ EXPECT_CALL(*bridge_, Cancel()) |
.WillOnce(RequestCanceled(loader_)); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
- WebURLResponse response(gurl_); |
- response.setHTTPHeaderField(WebString::fromUTF8("Content-Range"), |
- WebString::fromUTF8(base::StringPrintf("bytes " |
- "%d-%d/%d", 1, 10, 1024))); |
- response.setExpectedContentLength(10); |
- response.setHTTPStatusCode(kHttpPartialContent); |
- loader_->didReceiveResponse(url_loader_, response); |
+ ResourceResponseInfo info; |
+ std::string header = base::StringPrintf("HTTP/1.1 206 Partial Content\n" |
+ "Content-Range: bytes %d-%d/%d", |
+ 1, 10, 1024); |
+ replace(header.begin(), header.end(), '\n', '\0'); |
+ info.headers = new net::HttpResponseHeaders(header); |
+ info.content_length = 10; |
+ loader_->OnReceivedResponse(info, false); |
} |
// Tests the logic of sliding window for data buffering and reading. |
@@ -308,7 +314,11 @@ |
// Response has completed. |
EXPECT_CALL(*this, NetworkCallback()); |
- loader_->didFinishLoading(url_loader_, 0); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
+ URLRequestStatus status; |
+ status.set_status(URLRequestStatus::SUCCESS); |
+ loader_->OnCompletedRequest(status, "", base::Time()); |
// Try to read 10 from position 25 will just return with 5 bytes. |
EXPECT_CALL(*this, ReadCallback(5)); |
@@ -350,7 +360,11 @@ |
EXPECT_CALL(*this, ReadCallback(5)); |
EXPECT_CALL(*this, NetworkCallback()); |
- loader_->didFinishLoading(url_loader_, 0); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
+ URLRequestStatus status; |
+ status.set_status(URLRequestStatus::SUCCESS); |
+ loader_->OnCompletedRequest(status, "", base::Time()); |
} |
TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) { |
@@ -364,9 +378,11 @@ |
ReadLoader(10, 10, buffer); |
EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); |
EXPECT_CALL(*this, NetworkCallback()); |
- WebURLError error; |
- error.reason = net::ERR_FAILED; |
- loader_->didFail(url_loader_, error); |
+ EXPECT_CALL(*bridge_, OnDestroy()) |
+ .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
+ URLRequestStatus status; |
+ status.set_status(URLRequestStatus::FAILED); |
+ loader_->OnCompletedRequest(status, "", base::Time()); |
} |
// Tests the logic of caching data to disk when media is paused. |
@@ -433,7 +449,7 @@ |
// Start in deferred state, then disallow defer, receive no data, and |
// allow defer and read. |
- EXPECT_CALL(*url_loader_, setDefersLoading(true)); |
+ EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
EXPECT_CALL(*this, NetworkCallback()); |
WriteLoader(10, 40); |
@@ -456,7 +472,7 @@ |
// Start in deferred state, disallow defer, receive data and shift buffer |
// window, allow defer, and read in a place that's still in the window. |
- EXPECT_CALL(*url_loader_, setDefersLoading(true)); |
+ EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
EXPECT_CALL(*this, NetworkCallback()); |
WriteLoader(10, 30); |
@@ -480,7 +496,7 @@ |
// Start in deferred state, disallow defer, receive data and shift buffer |
// window, allow defer, and read outside of the buffer window. |
- EXPECT_CALL(*url_loader_, setDefersLoading(true)); |
+ EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
EXPECT_CALL(*this, NetworkCallback()); |
WriteLoader(10, 40); |
@@ -493,16 +509,16 @@ |
ReadLoader(20, 5, buffer); |
StopWhenLoad(); |
} |
+ |
// TODO(hclam): add unit test for defer loading. |
class MockBufferedResourceLoader : public BufferedResourceLoader { |
public: |
- MockBufferedResourceLoader() : BufferedResourceLoader(GURL(), 0, 0) { |
+ MockBufferedResourceLoader() : BufferedResourceLoader(NULL, GURL(), 0, 0) { |
} |
- MOCK_METHOD3(Start, void(net::CompletionCallback* read_callback, |
- NetworkEventCallback* network_callback, |
- WebFrame* frame)); |
+ MOCK_METHOD2(Start, void(net::CompletionCallback* read_callback, |
+ NetworkEventCallback* network_callback)); |
MOCK_METHOD0(Stop, void()); |
MOCK_METHOD4(Read, void(int64 position, int read_size, uint8* buffer, |
net::CompletionCallback* callback)); |
@@ -525,8 +541,8 @@ |
class MockBufferedDataSource : public BufferedDataSource { |
public: |
MockBufferedDataSource( |
- MessageLoop* message_loop, WebFrame* frame) |
- : BufferedDataSource(message_loop, frame) { |
+ MessageLoop* message_loop, MediaResourceLoaderBridgeFactory* factory) |
+ : BufferedDataSource(message_loop, factory) { |
} |
virtual base::TimeDelta GetTimeoutMilliseconds() { |
@@ -545,6 +561,8 @@ |
public: |
BufferedDataSourceTest() { |
message_loop_ = MessageLoop::current(); |
+ bridge_factory_.reset( |
+ new StrictMock<MockMediaResourceLoaderBridgeFactory>()); |
// Prepare test data. |
for (size_t i = 0; i < sizeof(data_); ++i) { |
@@ -553,14 +571,20 @@ |
} |
virtual ~BufferedDataSourceTest() { |
- ignore_result(frame_.release()); |
+ if (data_source_) { |
+ // Release the bridge factory because we don't own it. |
+ // Expects bridge factory to be destroyed along with data source. |
+ EXPECT_CALL(*bridge_factory_, OnDestroy()) |
+ .WillOnce(Invoke(this, |
+ &BufferedDataSourceTest::ReleaseBridgeFactory)); |
+ } |
} |
void ExpectCreateAndStartResourceLoader(int start_error) { |
EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) |
.WillOnce(Return(loader_.get())); |
- EXPECT_CALL(*loader_, Start(NotNull(), NotNull(), NotNull())) |
+ EXPECT_CALL(*loader_, Start(NotNull(), NotNull())) |
.WillOnce( |
DoAll(Assign(&error_, start_error), |
Invoke(this, |
@@ -573,10 +597,15 @@ |
// Saves the url first. |
gurl_ = GURL(url); |
- frame_.reset(new NiceMock<MockWebFrame>()); |
+ media::MediaFormat url_format; |
+ url_format.SetAsString(media::MediaFormat::kMimeType, |
+ media::mime_type::kURL); |
+ url_format.SetAsString(media::MediaFormat::kURL, url); |
+ data_source_ = new MockBufferedDataSource(MessageLoop::current(), |
+ bridge_factory_.get()); |
+ CHECK(data_source_); |
- data_source_ = new MockBufferedDataSource(MessageLoop::current(), |
- frame_.get()); |
+ // There is no need to provide a message loop to data source. |
data_source_->set_host(&host_); |
scoped_refptr<NiceMock<MockBufferedResourceLoader> > first_loader( |
@@ -602,7 +631,7 @@ |
// Replace loader_ with a new instance. |
loader_ = new NiceMock<MockBufferedResourceLoader>(); |
- // Create and start. Make sure Start() is called on the new loader. |
+ // Create and start Make sure Start() is called the new loader. |
ExpectCreateAndStartResourceLoader(net::OK); |
// Update initialization variable since we know the second loader will |
@@ -676,10 +705,13 @@ |
message_loop_->RunAllPending(); |
} |
+ void ReleaseBridgeFactory() { |
+ ignore_result(bridge_factory_.release()); |
+ } |
+ |
void InvokeStartCallback( |
net::CompletionCallback* callback, |
- BufferedResourceLoader::NetworkEventCallback* network_callback, |
- WebFrame* frame) { |
+ BufferedResourceLoader::NetworkEventCallback* network_callback) { |
callback->RunWithParams(Tuple1<int>(error_)); |
delete callback; |
// TODO(hclam): Save this callback. |
@@ -758,7 +790,7 @@ |
.WillOnce(Return(new_loader)); |
// 3. Then the new loader will be started. |
- EXPECT_CALL(*new_loader, Start(NotNull(), NotNull(), NotNull())) |
+ EXPECT_CALL(*new_loader, Start(NotNull(), NotNull())) |
.WillOnce(DoAll(Assign(&error_, net::OK), |
Invoke(this, |
&BufferedDataSourceTest::InvokeStartCallback))); |
@@ -824,7 +856,7 @@ |
// 3. Then the new loader will be started and respond to queries about |
// whether this is a partial response using the value of the previous |
// loader. |
- EXPECT_CALL(*new_loader, Start(NotNull(), NotNull(), NotNull())) |
+ EXPECT_CALL(*new_loader, Start(NotNull(), NotNull())) |
.WillOnce(DoAll(Assign(&error_, net::OK), |
Invoke(this, |
&BufferedDataSourceTest::InvokeStartCallback))); |
@@ -857,9 +889,10 @@ |
MOCK_METHOD1(ReadCallback, void(size_t size)); |
+ scoped_ptr<StrictMock<MockMediaResourceLoaderBridgeFactory> > |
+ bridge_factory_; |
scoped_refptr<NiceMock<MockBufferedResourceLoader> > loader_; |
scoped_refptr<MockBufferedDataSource> data_source_; |
- scoped_ptr<NiceMock<MockWebFrame> > frame_; |
StrictMock<media::MockFilterHost> host_; |
GURL gurl_; |