blob: 949e7d640a0d7a3a7babd61c47f7e02b750a7177 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/image_fetcher/image_data_fetcher.h"
#include <memory>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_request_status.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kImageURL[] = "http://www.example.com/image";
const char kURLResponseData[] = "EncodedImageData";
} // namespace
namespace image_fetcher {
class ImageDataFetcherTest : public testing::Test {
public:
ImageDataFetcherTest()
: test_request_context_getter_(
new net::TestURLRequestContextGetter(message_loop_.task_runner())),
image_data_fetcher_(test_request_context_getter_.get()) {}
~ImageDataFetcherTest() override {}
MOCK_METHOD1(OnImageDataFetched, void(const std::string&));
MOCK_METHOD1(OnImageDataFetchedFailedRequest, void(const std::string&));
MOCK_METHOD1(OnImageDataFetchedMultipleRequests, void(const std::string&));
protected:
base::MessageLoop message_loop_;
scoped_refptr<net::URLRequestContextGetter> test_request_context_getter_;
ImageDataFetcher image_data_fetcher_;
net::TestURLFetcherFactory fetcher_factory_;
private:
DISALLOW_COPY_AND_ASSIGN(ImageDataFetcherTest);
};
TEST_F(ImageDataFetcherTest, FetchImageData) {
image_data_fetcher_.FetchImageData(
GURL(kImageURL),
base::Bind(&ImageDataFetcherTest::OnImageDataFetched,
base::Unretained(this)));
EXPECT_CALL(*this, OnImageDataFetched(std::string(kURLResponseData)));
// Get and configure the TestURLFetcher.
net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0);
ASSERT_NE(nullptr, test_url_fetcher);
test_url_fetcher->set_status(
net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
test_url_fetcher->SetResponseString(kURLResponseData);
// Call the URLFetcher delegate to continue the test.
test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher);
}
TEST_F(ImageDataFetcherTest, FetchImageData_FailedRequest) {
image_data_fetcher_.FetchImageData(
GURL(kImageURL),
base::Bind(&ImageDataFetcherTest::OnImageDataFetchedFailedRequest,
base::Unretained(this)));
EXPECT_CALL(*this, OnImageDataFetchedFailedRequest(std::string()));
// Get and configure the TestURLFetcher.
net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0);
ASSERT_NE(nullptr, test_url_fetcher);
test_url_fetcher->set_status(
net::URLRequestStatus(net::URLRequestStatus::FAILED,
net::ERR_INVALID_URL));
// Call the URLFetcher delegate to continue the test.
test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher);
}
TEST_F(ImageDataFetcherTest, FetchImageData_MultipleRequests) {
ImageDataFetcher::ImageDataFetcherCallback callback =
base::Bind(&ImageDataFetcherTest::OnImageDataFetchedMultipleRequests,
base::Unretained(this));
EXPECT_CALL(*this, OnImageDataFetchedMultipleRequests(testing::_)).Times(2);
image_data_fetcher_.FetchImageData(GURL(kImageURL), callback);
image_data_fetcher_.FetchImageData(GURL(kImageURL), callback);
// Multiple calls to FetchImageData for the same URL will result in
// multiple URLFetchers being created.
net::TestURLFetcher* test_url_fetcher = fetcher_factory_.GetFetcherByID(0);
ASSERT_NE(nullptr, test_url_fetcher);
test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher);
test_url_fetcher = fetcher_factory_.GetFetcherByID(1);
ASSERT_NE(nullptr, test_url_fetcher);
test_url_fetcher->delegate()->OnURLFetchComplete(test_url_fetcher);
}
} // namespace image_fetcher