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 BitmapFetcherObserver { |
| 14 public: |
| 15 explicit TestObserver(BitmapFetcherObserver* target) : target_(target) {} |
| 16 virtual ~TestObserver() {} |
| 17 |
| 18 virtual void OnImageChanged(const SkBitmap& answers_image) OVERRIDE { |
| 19 target_->OnImageChanged(answers_image); |
| 20 } |
| 21 virtual void OnRequestFinished(int request_id) OVERRIDE { |
| 22 target_->OnRequestFinished(request_id); |
| 23 } |
| 24 |
| 25 BitmapFetcherObserver* target_; |
| 26 }; |
| 27 |
| 28 class TestService : public BitmapFetcherService { |
| 29 public: |
| 30 explicit TestService(content::BrowserContext* context) |
| 31 : BitmapFetcherService(context) {} |
| 32 virtual ~TestService() {} |
| 33 |
| 34 // Create a fetcher, but don't start downloading. That allows side-stepping |
| 35 // the decode step, which requires a utility process. |
| 36 virtual chrome::BitmapFetcher* CreateFetcher(const GURL& url) OVERRIDE { |
| 37 return new chrome::BitmapFetcher(url, this); |
| 38 } |
| 39 }; |
| 40 |
| 41 } // namespace |
| 42 |
| 43 class BitmapFetcherServiceTest : public testing::Test, |
| 44 public BitmapFetcherObserver { |
| 45 public: |
| 46 virtual void SetUp() OVERRIDE { |
| 47 service_.reset(new TestService(&profile_)); |
| 48 requestsFinished_ = 0; |
| 49 imagesChanged_ = 0; |
| 50 url1_ = GURL("http://example.org/sample-image-1.png"); |
| 51 url2_ = GURL("http://example.org/sample-image-2.png"); |
| 52 } |
| 53 |
| 54 const ScopedVector<BitmapFetcherRequest>& requests() { |
| 55 return service_->requests_; |
| 56 } |
| 57 const ScopedVector<chrome::BitmapFetcher>& active_fetchers() { |
| 58 return service_->active_fetchers_; |
| 59 } |
| 60 size_t cache_size() { return service_->cache_.size(); } |
| 61 |
| 62 virtual void OnImageChanged(const SkBitmap& answers_image) OVERRIDE { |
| 63 imagesChanged_++; |
| 64 } |
| 65 virtual void OnRequestFinished(int request_id) OVERRIDE { |
| 66 requestsFinished_++; |
| 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(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 RequestId requestId = service_->RequestImage(url2_, new TestObserver(this)); |
| 135 service_->RequestImage(url1_, new TestObserver(this)); |
| 136 service_->RequestImage(url1_, new TestObserver(this)); |
| 137 EXPECT_EQ(5U, requests().size()); |
| 138 |
| 139 service_->CancelRequest(requestId); |
| 140 EXPECT_EQ(4U, requests().size()); |
| 141 |
| 142 CompleteFetch(url2_); |
| 143 EXPECT_EQ(0, imagesChanged_); |
| 144 |
| 145 CompleteFetch(url1_); |
| 146 EXPECT_EQ(4, imagesChanged_); |
| 147 } |
| 148 |
| 149 TEST_F(BitmapFetcherServiceTest, FailedRequestsDontEnterCache) { |
| 150 service_->RequestImage(url1_, new TestObserver(this)); |
| 151 service_->RequestImage(url2_, new TestObserver(this)); |
| 152 EXPECT_EQ(0U, cache_size()); |
| 153 |
| 154 CompleteFetch(url1_); |
| 155 EXPECT_EQ(1U, cache_size()); |
| 156 |
| 157 FailFetch(url2_); |
| 158 EXPECT_EQ(1U, cache_size()); |
| 159 } |
OLD | NEW |