OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" |
| 6 |
| 7 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" |
| 8 #include "chrome/test/base/testing_profile.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 |
| 11 namespace { |
| 12 |
| 13 class TestObserver : public BitmapFetcherService::Observer { |
| 14 public: |
| 15 explicit TestObserver(BitmapFetcherService::Observer* target) |
| 16 : target_(target) {} |
| 17 virtual ~TestObserver() {} |
| 18 |
| 19 virtual void OnImageChanged(BitmapFetcherService::RequestId request_id, |
| 20 const SkBitmap& answers_image) OVERRIDE { |
| 21 target_->OnImageChanged(request_id, answers_image); |
| 22 } |
| 23 |
| 24 BitmapFetcherService::Observer* target_; |
| 25 }; |
| 26 |
| 27 class TestService : public BitmapFetcherService { |
| 28 public: |
| 29 explicit TestService(content::BrowserContext* context) |
| 30 : BitmapFetcherService(context) {} |
| 31 virtual ~TestService() {} |
| 32 |
| 33 // Create a fetcher, but don't start downloading. That allows side-stepping |
| 34 // the decode step, which requires a utility process. |
| 35 virtual chrome::BitmapFetcher* CreateFetcher(const GURL& url) OVERRIDE { |
| 36 return new chrome::BitmapFetcher(url, this); |
| 37 } |
| 38 }; |
| 39 |
| 40 } // namespace |
| 41 |
| 42 class BitmapFetcherServiceTest : public testing::Test, |
| 43 public BitmapFetcherService::Observer { |
| 44 public: |
| 45 virtual void SetUp() OVERRIDE { |
| 46 service_.reset(new TestService(&profile_)); |
| 47 requestsFinished_ = 0; |
| 48 imagesChanged_ = 0; |
| 49 url1_ = GURL("http://example.org/sample-image-1.png"); |
| 50 url2_ = GURL("http://example.org/sample-image-2.png"); |
| 51 } |
| 52 |
| 53 const ScopedVector<BitmapFetcherRequest>& requests() { |
| 54 return service_->requests_; |
| 55 } |
| 56 const ScopedVector<chrome::BitmapFetcher>& active_fetchers() { |
| 57 return service_->active_fetchers_; |
| 58 } |
| 59 size_t cache_size() { return service_->cache_.size(); } |
| 60 |
| 61 virtual void OnImageChanged(BitmapFetcherService::RequestId request_id, |
| 62 const SkBitmap& answers_image) OVERRIDE { |
| 63 if (answers_image.empty()) |
| 64 requestsFinished_++; |
| 65 else |
| 66 imagesChanged_++; |
| 67 } |
| 68 |
| 69 // Simulate finishing a URL fetch and decode for the given fetcher. |
| 70 void CompleteFetch(const GURL& url) { |
| 71 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url); |
| 72 ASSERT_TRUE(NULL != fetcher); |
| 73 |
| 74 // Create a non-empty bitmap. |
| 75 SkBitmap image; |
| 76 image.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); |
| 77 image.allocPixels(); |
| 78 image.eraseColor(SK_ColorGREEN); |
| 79 |
| 80 const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(NULL, image); |
| 81 } |
| 82 |
| 83 void FailFetch(const GURL& url) { |
| 84 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url); |
| 85 ASSERT_TRUE(NULL != fetcher); |
| 86 const_cast<chrome::BitmapFetcher*>(fetcher) |
| 87 ->OnImageDecoded(NULL, SkBitmap()); |
| 88 } |
| 89 |
| 90 protected: |
| 91 scoped_ptr<BitmapFetcherService> service_; |
| 92 |
| 93 int imagesChanged_; |
| 94 int requestsFinished_; |
| 95 |
| 96 GURL url1_; |
| 97 GURL url2_; |
| 98 |
| 99 private: |
| 100 TestingProfile profile_; |
| 101 }; |
| 102 |
| 103 TEST_F(BitmapFetcherServiceTest, CancelInvalidRequest) { |
| 104 service_->CancelRequest(BitmapFetcherService::REQUEST_ID_INVALID); |
| 105 service_->CancelRequest(23); |
| 106 } |
| 107 |
| 108 TEST_F(BitmapFetcherServiceTest, OnlyFirstRequestCreatesFetcher) { |
| 109 EXPECT_EQ(0U, active_fetchers().size()); |
| 110 |
| 111 service_->RequestImage(url1_, new TestObserver(this)); |
| 112 EXPECT_EQ(1U, active_fetchers().size()); |
| 113 |
| 114 service_->RequestImage(url1_, new TestObserver(this)); |
| 115 EXPECT_EQ(1U, active_fetchers().size()); |
| 116 } |
| 117 |
| 118 TEST_F(BitmapFetcherServiceTest, CompletedFetchNotifiesAllObservers) { |
| 119 service_->RequestImage(url1_, new TestObserver(this)); |
| 120 service_->RequestImage(url1_, new TestObserver(this)); |
| 121 service_->RequestImage(url1_, new TestObserver(this)); |
| 122 service_->RequestImage(url1_, new TestObserver(this)); |
| 123 EXPECT_EQ(1U, active_fetchers().size()); |
| 124 EXPECT_EQ(4U, requests().size()); |
| 125 |
| 126 CompleteFetch(url1_); |
| 127 EXPECT_EQ(4, imagesChanged_); |
| 128 EXPECT_EQ(4, requestsFinished_); |
| 129 } |
| 130 |
| 131 TEST_F(BitmapFetcherServiceTest, CancelRequest) { |
| 132 service_->RequestImage(url1_, new TestObserver(this)); |
| 133 service_->RequestImage(url1_, new TestObserver(this)); |
| 134 BitmapFetcherService::RequestId requestId = |
| 135 service_->RequestImage(url2_, new TestObserver(this)); |
| 136 service_->RequestImage(url1_, new TestObserver(this)); |
| 137 service_->RequestImage(url1_, new TestObserver(this)); |
| 138 EXPECT_EQ(5U, requests().size()); |
| 139 |
| 140 service_->CancelRequest(requestId); |
| 141 EXPECT_EQ(4U, requests().size()); |
| 142 |
| 143 CompleteFetch(url2_); |
| 144 EXPECT_EQ(0, imagesChanged_); |
| 145 |
| 146 CompleteFetch(url1_); |
| 147 EXPECT_EQ(4, imagesChanged_); |
| 148 } |
| 149 |
| 150 TEST_F(BitmapFetcherServiceTest, FailedRequestsDontEnterCache) { |
| 151 service_->RequestImage(url1_, new TestObserver(this)); |
| 152 service_->RequestImage(url2_, new TestObserver(this)); |
| 153 EXPECT_EQ(0U, cache_size()); |
| 154 |
| 155 CompleteFetch(url1_); |
| 156 EXPECT_EQ(1U, cache_size()); |
| 157 |
| 158 FailFetch(url2_); |
| 159 EXPECT_EQ(1U, cache_size()); |
| 160 } |
OLD | NEW |