| Index: chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
|
| diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d843b233e03743d3126fbfcfd8c42d6ab70f8026
|
| --- /dev/null
|
| +++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
|
| @@ -0,0 +1,159 @@
|
| +// Copyright 2014 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 "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h"
|
| +
|
| +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
|
| +#include "chrome/test/base/testing_profile.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace {
|
| +
|
| +class TestObserver : public BitmapFetcherObserver {
|
| + public:
|
| + explicit TestObserver(BitmapFetcherObserver* target) : target_(target) {}
|
| + virtual ~TestObserver() {}
|
| +
|
| + virtual void OnImageChanged(const SkBitmap& answers_image) OVERRIDE {
|
| + target_->OnImageChanged(answers_image);
|
| + }
|
| + virtual void OnRequestFinished(int request_id) OVERRIDE {
|
| + target_->OnRequestFinished(request_id);
|
| + }
|
| +
|
| + BitmapFetcherObserver* target_;
|
| +};
|
| +
|
| +class TestService : public BitmapFetcherService {
|
| + public:
|
| + explicit TestService(content::BrowserContext* context)
|
| + : BitmapFetcherService(context) {}
|
| + virtual ~TestService() {}
|
| +
|
| + // Create a fetcher, but don't start downloading. That allows side-stepping
|
| + // the decode step, which requires a utility process.
|
| + virtual chrome::BitmapFetcher* CreateFetcher(const GURL& url) OVERRIDE {
|
| + return new chrome::BitmapFetcher(url, this);
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class BitmapFetcherServiceTest : public testing::Test,
|
| + public BitmapFetcherObserver {
|
| + public:
|
| + virtual void SetUp() OVERRIDE {
|
| + service_.reset(new TestService(&profile_));
|
| + requestsFinished_ = 0;
|
| + imagesChanged_ = 0;
|
| + url1_ = GURL("http://example.org/sample-image-1.png");
|
| + url2_ = GURL("http://example.org/sample-image-2.png");
|
| + }
|
| +
|
| + const ScopedVector<BitmapFetcherRequest>& requests() {
|
| + return service_->requests_;
|
| + }
|
| + const ScopedVector<chrome::BitmapFetcher>& active_fetchers() {
|
| + return service_->active_fetchers_;
|
| + }
|
| + size_t cache_size() { return service_->cache_.size(); }
|
| +
|
| + virtual void OnImageChanged(const SkBitmap& answers_image) OVERRIDE {
|
| + imagesChanged_++;
|
| + }
|
| + virtual void OnRequestFinished(int request_id) OVERRIDE {
|
| + requestsFinished_++;
|
| + }
|
| +
|
| + // Simulate finishing a URL fetch and decode for the given fetcher.
|
| + void CompleteFetch(const GURL& url) {
|
| + const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url);
|
| + ASSERT_TRUE(NULL != fetcher);
|
| +
|
| + // Create a non-empty bitmap.
|
| + SkBitmap image;
|
| + image.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
|
| + image.allocPixels();
|
| + image.eraseColor(SK_ColorGREEN);
|
| +
|
| + const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(NULL, image);
|
| + }
|
| +
|
| + void FailFetch(const GURL& url) {
|
| + const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url);
|
| + ASSERT_TRUE(NULL != fetcher);
|
| + const_cast<chrome::BitmapFetcher*>(fetcher)
|
| + ->OnImageDecoded(NULL, SkBitmap());
|
| + }
|
| +
|
| + protected:
|
| + scoped_ptr<BitmapFetcherService> service_;
|
| +
|
| + int imagesChanged_;
|
| + int requestsFinished_;
|
| +
|
| + GURL url1_;
|
| + GURL url2_;
|
| +
|
| + private:
|
| + TestingProfile profile_;
|
| +};
|
| +
|
| +TEST_F(BitmapFetcherServiceTest, CancelInvalidRequest) {
|
| + service_->CancelRequest(REQUEST_ID_INVALID);
|
| + service_->CancelRequest(23);
|
| +}
|
| +
|
| +TEST_F(BitmapFetcherServiceTest, OnlyFirstRequestCreatesFetcher) {
|
| + EXPECT_EQ(0U, active_fetchers().size());
|
| +
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + EXPECT_EQ(1U, active_fetchers().size());
|
| +
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + EXPECT_EQ(1U, active_fetchers().size());
|
| +}
|
| +
|
| +TEST_F(BitmapFetcherServiceTest, CompletedFetchNotifiesAllObservers) {
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + EXPECT_EQ(1U, active_fetchers().size());
|
| + EXPECT_EQ(4U, requests().size());
|
| +
|
| + CompleteFetch(url1_);
|
| + EXPECT_EQ(4, imagesChanged_);
|
| + EXPECT_EQ(4, requestsFinished_);
|
| +}
|
| +
|
| +TEST_F(BitmapFetcherServiceTest, CancelRequest) {
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + RequestId requestId = service_->RequestImage(url2_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + EXPECT_EQ(5U, requests().size());
|
| +
|
| + service_->CancelRequest(requestId);
|
| + EXPECT_EQ(4U, requests().size());
|
| +
|
| + CompleteFetch(url2_);
|
| + EXPECT_EQ(0, imagesChanged_);
|
| +
|
| + CompleteFetch(url1_);
|
| + EXPECT_EQ(4, imagesChanged_);
|
| +}
|
| +
|
| +TEST_F(BitmapFetcherServiceTest, FailedRequestsDontEnterCache) {
|
| + service_->RequestImage(url1_, new TestObserver(this));
|
| + service_->RequestImage(url2_, new TestObserver(this));
|
| + EXPECT_EQ(0U, cache_size());
|
| +
|
| + CompleteFetch(url1_);
|
| + EXPECT_EQ(1U, cache_size());
|
| +
|
| + FailFetch(url2_);
|
| + EXPECT_EQ(1U, cache_size());
|
| +}
|
|
|