Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc

Issue 1067593005: Fix race conditions in ImageDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use TestBrowserThreadBundle, cleanup tests Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h" 5 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher_service.h"
6 6
7 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" 7 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
8 #include "chrome/test/base/testing_profile.h" 8 #include "chrome/test/base/testing_profile.h"
9 #include "content/public/test/test_browser_thread_bundle.h"
9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
10 11
11 namespace { 12 namespace {
12 13
13 class TestNotificationInterface { 14 class TestNotificationInterface {
14 public: 15 public:
15 virtual ~TestNotificationInterface() {} 16 virtual ~TestNotificationInterface() {}
16 virtual void OnImageChanged() = 0; 17 virtual void OnImageChanged() = 0;
17 virtual void OnRequestFinished() = 0; 18 virtual void OnRequestFinished() = 0;
18 }; 19 };
19 20
20 class TestObserver : public BitmapFetcherService::Observer { 21 class TestObserver : public BitmapFetcherService::Observer {
21 public: 22 public:
22 explicit TestObserver(TestNotificationInterface* target) : target_(target) {} 23 explicit TestObserver(TestNotificationInterface* target) : target_(target) {}
23 ~TestObserver() override { target_->OnRequestFinished(); } 24 ~TestObserver() override { target_->OnRequestFinished(); }
24 25
25 void OnImageChanged(BitmapFetcherService::RequestId request_id, 26 void OnImageChanged(BitmapFetcherService::RequestId request_id,
26 const SkBitmap& answers_image) override { 27 const SkBitmap& answers_image) override {
27 target_->OnImageChanged(); 28 target_->OnImageChanged();
28 } 29 }
29 30
31 private:
30 TestNotificationInterface* target_; 32 TestNotificationInterface* target_;
33
34 DISALLOW_COPY_AND_ASSIGN(TestObserver);
31 }; 35 };
32 36
33 class TestService : public BitmapFetcherService { 37 class TestService : public BitmapFetcherService {
34 public: 38 public:
35 explicit TestService(content::BrowserContext* context) 39 explicit TestService(content::BrowserContext* context)
36 : BitmapFetcherService(context) {} 40 : BitmapFetcherService(context) {}
37 ~TestService() override {} 41 ~TestService() override {}
38 42
39 // Create a fetcher, but don't start downloading. That allows side-stepping 43 // Create a fetcher, but don't start downloading. That allows side-stepping
40 // the decode step, which requires a utility process. 44 // the decode step, which requires a utility process.
41 chrome::BitmapFetcher* CreateFetcher(const GURL& url) override { 45 chrome::BitmapFetcher* CreateFetcher(const GURL& url) override {
42 return new chrome::BitmapFetcher(url, this); 46 return new chrome::BitmapFetcher(url, this);
43 } 47 }
44 }; 48 };
45 49
46 } // namespace 50 } // namespace
47 51
48 class BitmapFetcherServiceTest : public testing::Test, 52 class BitmapFetcherServiceTest : public testing::Test,
49 public TestNotificationInterface { 53 public TestNotificationInterface {
50 public: 54 public:
55 BitmapFetcherServiceTest()
56 : url1_(GURL("http://example.org/sample-image-1.png")),
57 url2_(GURL("http://example.org/sample-image-2.png")) {
58 }
59
51 void SetUp() override { 60 void SetUp() override {
52 service_.reset(new TestService(&profile_)); 61 service_.reset(new TestService(&profile_));
53 requestsFinished_ = 0; 62 requests_finished_ = 0;
54 imagesChanged_ = 0; 63 images_changed_ = 0;
55 url1_ = GURL("http://example.org/sample-image-1.png");
56 url2_ = GURL("http://example.org/sample-image-2.png");
57 } 64 }
58 65
59 const ScopedVector<BitmapFetcherRequest>& requests() { 66 const ScopedVector<BitmapFetcherRequest>& requests() const {
60 return service_->requests_; 67 return service_->requests_;
61 } 68 }
62 const ScopedVector<chrome::BitmapFetcher>& active_fetchers() { 69 const ScopedVector<chrome::BitmapFetcher>& active_fetchers() const {
63 return service_->active_fetchers_; 70 return service_->active_fetchers_;
64 } 71 }
65 size_t cache_size() { return service_->cache_.size(); } 72 size_t cache_size() const { return service_->cache_.size(); }
66 73
67 void OnImageChanged() override { imagesChanged_++; } 74 void OnImageChanged() override { images_changed_++; }
68 75
69 void OnRequestFinished() override { requestsFinished_++; } 76 void OnRequestFinished() override { requests_finished_++; }
70 77
71 // Simulate finishing a URL fetch and decode for the given fetcher. 78 // Simulate finishing a URL fetch and decode for the given fetcher.
72 void CompleteFetch(const GURL& url) { 79 void CompleteFetch(const GURL& url) {
73 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url); 80 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url);
74 ASSERT_TRUE(NULL != fetcher); 81 ASSERT_TRUE(fetcher);
75 82
76 // Create a non-empty bitmap. 83 // Create a non-empty bitmap.
77 SkBitmap image; 84 SkBitmap image;
78 image.allocN32Pixels(2, 2); 85 image.allocN32Pixels(2, 2);
79 image.eraseColor(SK_ColorGREEN); 86 image.eraseColor(SK_ColorGREEN);
80 87
81 const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(image); 88 const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(image);
82 } 89 }
83 90
84 void FailFetch(const GURL& url) { 91 void FailFetch(const GURL& url) {
85 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url); 92 const chrome::BitmapFetcher* fetcher = service_->FindFetcherForUrl(url);
86 ASSERT_TRUE(NULL != fetcher); 93 ASSERT_TRUE(fetcher);
87 const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(SkBitmap()); 94 const_cast<chrome::BitmapFetcher*>(fetcher)->OnImageDecoded(SkBitmap());
88 } 95 }
89 96
90 protected: 97 protected:
91 scoped_ptr<BitmapFetcherService> service_; 98 scoped_ptr<BitmapFetcherService> service_;
92 99
93 int imagesChanged_; 100 int images_changed_;
94 int requestsFinished_; 101 int requests_finished_;
95 102
96 GURL url1_; 103 const GURL url1_;
97 GURL url2_; 104 const GURL url2_;
98 105
99 private: 106 private:
107 content::TestBrowserThreadBundle thread_bundle_;
100 TestingProfile profile_; 108 TestingProfile profile_;
101 }; 109 };
102 110
103 TEST_F(BitmapFetcherServiceTest, RequestInvalidUrl) { 111 TEST_F(BitmapFetcherServiceTest, RequestInvalidUrl) {
104 const BitmapFetcherService::RequestId invalid_request_id = 112 const BitmapFetcherService::RequestId invalid_request_id =
105 BitmapFetcherService::REQUEST_ID_INVALID; 113 BitmapFetcherService::REQUEST_ID_INVALID;
106 GURL invalid_url; 114 GURL invalid_url;
107 ASSERT_FALSE(invalid_url.is_valid()); 115 ASSERT_FALSE(invalid_url.is_valid());
108 116
109 BitmapFetcherService::RequestId request_id = 117 BitmapFetcherService::RequestId request_id =
(...skipping 18 matching lines...) Expand all
128 136
129 TEST_F(BitmapFetcherServiceTest, CompletedFetchNotifiesAllObservers) { 137 TEST_F(BitmapFetcherServiceTest, CompletedFetchNotifiesAllObservers) {
130 service_->RequestImage(url1_, new TestObserver(this)); 138 service_->RequestImage(url1_, new TestObserver(this));
131 service_->RequestImage(url1_, new TestObserver(this)); 139 service_->RequestImage(url1_, new TestObserver(this));
132 service_->RequestImage(url1_, new TestObserver(this)); 140 service_->RequestImage(url1_, new TestObserver(this));
133 service_->RequestImage(url1_, new TestObserver(this)); 141 service_->RequestImage(url1_, new TestObserver(this));
134 EXPECT_EQ(1U, active_fetchers().size()); 142 EXPECT_EQ(1U, active_fetchers().size());
135 EXPECT_EQ(4U, requests().size()); 143 EXPECT_EQ(4U, requests().size());
136 144
137 CompleteFetch(url1_); 145 CompleteFetch(url1_);
138 EXPECT_EQ(4, imagesChanged_); 146 EXPECT_EQ(4, images_changed_);
139 EXPECT_EQ(4, requestsFinished_); 147 EXPECT_EQ(4, requests_finished_);
140 } 148 }
141 149
142 TEST_F(BitmapFetcherServiceTest, CancelRequest) { 150 TEST_F(BitmapFetcherServiceTest, CancelRequest) {
143 service_->RequestImage(url1_, new TestObserver(this)); 151 service_->RequestImage(url1_, new TestObserver(this));
144 service_->RequestImage(url1_, new TestObserver(this)); 152 service_->RequestImage(url1_, new TestObserver(this));
145 BitmapFetcherService::RequestId requestId = 153 BitmapFetcherService::RequestId requestId =
146 service_->RequestImage(url2_, new TestObserver(this)); 154 service_->RequestImage(url2_, new TestObserver(this));
147 service_->RequestImage(url1_, new TestObserver(this)); 155 service_->RequestImage(url1_, new TestObserver(this));
148 service_->RequestImage(url1_, new TestObserver(this)); 156 service_->RequestImage(url1_, new TestObserver(this));
149 EXPECT_EQ(5U, requests().size()); 157 EXPECT_EQ(5U, requests().size());
150 158
151 service_->CancelRequest(requestId); 159 service_->CancelRequest(requestId);
152 EXPECT_EQ(4U, requests().size()); 160 EXPECT_EQ(4U, requests().size());
153 161
154 CompleteFetch(url2_); 162 CompleteFetch(url2_);
155 EXPECT_EQ(0, imagesChanged_); 163 EXPECT_EQ(0, images_changed_);
156 164
157 CompleteFetch(url1_); 165 CompleteFetch(url1_);
158 EXPECT_EQ(4, imagesChanged_); 166 EXPECT_EQ(4, images_changed_);
159 } 167 }
160 168
161 TEST_F(BitmapFetcherServiceTest, FailedRequestsDontEnterCache) { 169 TEST_F(BitmapFetcherServiceTest, FailedRequestsDontEnterCache) {
162 service_->RequestImage(url1_, new TestObserver(this)); 170 service_->RequestImage(url1_, new TestObserver(this));
163 service_->RequestImage(url2_, new TestObserver(this)); 171 service_->RequestImage(url2_, new TestObserver(this));
164 EXPECT_EQ(0U, cache_size()); 172 EXPECT_EQ(0U, cache_size());
165 173
166 CompleteFetch(url1_); 174 CompleteFetch(url1_);
167 EXPECT_EQ(1U, cache_size()); 175 EXPECT_EQ(1U, cache_size());
168 176
169 FailFetch(url2_); 177 FailFetch(url2_);
170 EXPECT_EQ(1U, cache_size()); 178 EXPECT_EQ(1U, cache_size());
171 } 179 }
OLDNEW
« no previous file with comments | « chrome/browser/bitmap_fetcher/bitmap_fetcher.cc ('k') | chrome/browser/chromeos/extensions/wallpaper_function_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698