OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/ntp_tiles/popular_sites_impl.h" | 5 #include "components/ntp_tiles/popular_sites_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
110 net::URLRequestStatus::SUCCESS); | 110 net::URLRequestStatus::SUCCESS); |
111 } | 111 } |
112 | 112 |
113 // Returns an optional bool representing whether the completion callback was | 113 // Returns an optional bool representing whether the completion callback was |
114 // called at all, and if yes which was the returned bool value. | 114 // called at all, and if yes which was the returned bool value. |
115 base::Optional<bool> FetchPopularSites(bool force_download, | 115 base::Optional<bool> FetchPopularSites(bool force_download, |
116 PopularSites::SitesVector* sites) { | 116 PopularSites::SitesVector* sites) { |
117 scoped_refptr<net::TestURLRequestContextGetter> url_request_context( | 117 scoped_refptr<net::TestURLRequestContextGetter> url_request_context( |
118 new net::TestURLRequestContextGetter( | 118 new net::TestURLRequestContextGetter( |
119 base::ThreadTaskRunnerHandle::Get())); | 119 base::ThreadTaskRunnerHandle::Get())); |
120 PopularSitesImpl popular_sites(worker_pool_owner_.pool().get(), &prefs_, | 120 std::unique_ptr<PopularSites> popular_sites = |
121 /*template_url_service=*/nullptr, | 121 CreatePopularSites(url_request_context.get()); |
122 /*variations_service=*/nullptr, | |
123 url_request_context.get(), cache_dir_, | |
124 base::Bind(JsonUnsafeParser::Parse)); | |
125 | 122 |
126 base::RunLoop loop; | 123 base::RunLoop loop; |
127 base::Optional<bool> save_success; | 124 base::Optional<bool> save_success; |
128 if (popular_sites.MaybeStartFetch( | 125 if (popular_sites->MaybeStartFetch( |
129 force_download, base::Bind( | 126 force_download, base::Bind( |
130 [](base::Optional<bool>* save_success, | 127 [](base::Optional<bool>* save_success, |
131 base::RunLoop* loop, bool success) { | 128 base::RunLoop* loop, bool success) { |
132 save_success->emplace(success); | 129 save_success->emplace(success); |
133 loop->Quit(); | 130 loop->Quit(); |
134 }, | 131 }, |
135 &save_success, &loop))) { | 132 &save_success, &loop))) { |
136 loop.Run(); | 133 loop.Run(); |
137 } | 134 } |
138 *sites = popular_sites.sites(); | 135 *sites = popular_sites->sites(); |
139 return save_success; | 136 return save_success; |
140 } | 137 } |
141 | 138 |
139 std::unique_ptr<PopularSites> CreatePopularSites( | |
140 net::URLRequestContextGetter* context) { | |
141 return base::MakeUnique<PopularSitesImpl>( | |
142 worker_pool_owner_.pool().get(), &prefs_, | |
143 /*template_url_service=*/nullptr, | |
144 /*variations_service=*/nullptr, context, cache_dir_, | |
145 base::Bind(JsonUnsafeParser::Parse)); | |
146 } | |
147 | |
142 const TestPopularSite kWikipedia; | 148 const TestPopularSite kWikipedia; |
143 const TestPopularSite kYouTube; | 149 const TestPopularSite kYouTube; |
144 const TestPopularSite kChromium; | 150 const TestPopularSite kChromium; |
145 | 151 |
146 base::MessageLoopForUI ui_loop_; | 152 base::MessageLoopForUI ui_loop_; |
147 base::SequencedWorkerPoolOwner worker_pool_owner_; | 153 base::SequencedWorkerPoolOwner worker_pool_owner_; |
148 base::ScopedTempDir scoped_cache_dir_; | 154 base::ScopedTempDir scoped_cache_dir_; |
149 base::FilePath cache_dir_; | 155 base::FilePath cache_dir_; |
150 sync_preferences::TestingPrefServiceSyncable prefs_; | 156 sync_preferences::TestingPrefServiceSyncable prefs_; |
151 net::FakeURLFetcherFactory url_fetcher_factory_; | 157 net::FakeURLFetcherFactory url_fetcher_factory_; |
(...skipping 10 matching lines...) Expand all Loading... | |
162 Eq(base::Optional<bool>(true))); | 168 Eq(base::Optional<bool>(true))); |
163 | 169 |
164 ASSERT_THAT(sites.size(), Eq(1u)); | 170 ASSERT_THAT(sites.size(), Eq(1u)); |
165 EXPECT_THAT(sites[0].title, Str16Eq("Wikipedia, fhta Ph'nglui mglw'nafh")); | 171 EXPECT_THAT(sites[0].title, Str16Eq("Wikipedia, fhta Ph'nglui mglw'nafh")); |
166 EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 172 EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); |
167 EXPECT_THAT(sites[0].large_icon_url, | 173 EXPECT_THAT(sites[0].large_icon_url, |
168 URLEq("https://zz.m.wikipedia.org/wikipedia.png")); | 174 URLEq("https://zz.m.wikipedia.org/wikipedia.png")); |
169 EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 175 EXPECT_THAT(sites[0].favicon_url, URLEq("")); |
170 } | 176 } |
171 | 177 |
178 TEST_F(PopularSitesTest, ContainsDefaultTilesRightAfterConstruction) { | |
179 scoped_refptr<net::TestURLRequestContextGetter> url_request_context( | |
180 new net::TestURLRequestContextGetter( | |
181 base::ThreadTaskRunnerHandle::Get())); | |
182 | |
183 EXPECT_THAT(CreatePopularSites(url_request_context.get())->sites().size(), | |
184 Eq(8ul)); | |
185 } | |
186 | |
172 TEST_F(PopularSitesTest, Fallback) { | 187 TEST_F(PopularSitesTest, Fallback) { |
173 SetCountryAndVersion("ZZ", "9"); | 188 SetCountryAndVersion("ZZ", "9"); |
174 RespondWith404( | 189 RespondWith404( |
175 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 190 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); |
176 RespondWithJSON( | 191 RespondWithJSON( |
177 "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 192 "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", |
178 {kYouTube, kChromium}); | 193 {kYouTube, kChromium}); |
179 | 194 |
180 PopularSites::SitesVector sites; | 195 PopularSites::SitesVector sites; |
181 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), | 196 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), |
182 Eq(base::Optional<bool>(true))); | 197 Eq(base::Optional<bool>(true))); |
183 | 198 |
184 ASSERT_THAT(sites.size(), Eq(2u)); | 199 ASSERT_THAT(sites.size(), Eq(2u)); |
185 EXPECT_THAT(sites[0].title, Str16Eq("YouTube")); | 200 EXPECT_THAT(sites[0].title, Str16Eq("YouTube")); |
186 EXPECT_THAT(sites[0].url, URLEq("https://m.youtube.com/")); | 201 EXPECT_THAT(sites[0].url, URLEq("https://m.youtube.com/")); |
187 EXPECT_THAT(sites[0].large_icon_url, | 202 EXPECT_THAT(sites[0].large_icon_url, |
188 URLEq("https://s.ytimg.com/apple-touch-icon.png")); | 203 URLEq("https://s.ytimg.com/apple-touch-icon.png")); |
189 EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 204 EXPECT_THAT(sites[0].favicon_url, URLEq("")); |
190 EXPECT_THAT(sites[1].title, Str16Eq("The Chromium Project")); | 205 EXPECT_THAT(sites[1].title, Str16Eq("The Chromium Project")); |
191 EXPECT_THAT(sites[1].url, URLEq("https://www.chromium.org/")); | 206 EXPECT_THAT(sites[1].url, URLEq("https://www.chromium.org/")); |
192 EXPECT_THAT(sites[1].large_icon_url, URLEq("")); | 207 EXPECT_THAT(sites[1].large_icon_url, URLEq("")); |
193 EXPECT_THAT(sites[1].favicon_url, | 208 EXPECT_THAT(sites[1].favicon_url, |
194 URLEq("https://www.chromium.org/favicon.ico")); | 209 URLEq("https://www.chromium.org/favicon.ico")); |
195 } | 210 } |
196 | 211 |
197 TEST_F(PopularSitesTest, Failure) { | 212 TEST_F(PopularSitesTest, PopulatesWithDefaultResoucesOnFailure) { |
198 SetCountryAndVersion("ZZ", "9"); | 213 SetCountryAndVersion("ZZ", "9"); |
199 RespondWith404( | 214 RespondWith404( |
200 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 215 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); |
201 RespondWith404( | 216 RespondWith404( |
202 "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); | 217 "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); |
203 | 218 |
204 PopularSites::SitesVector sites; | 219 PopularSites::SitesVector sites; |
205 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), | 220 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), |
206 Eq(base::Optional<bool>(false))); | 221 Eq(base::Optional<bool>(false))); |
207 ASSERT_THAT(sites, IsEmpty()); | 222 EXPECT_THAT(sites.size(), Eq(8ul)); |
223 } | |
224 | |
225 TEST_F(PopularSitesTest, ProvidesDefaultSitesUntilCallbackReturns) { | |
226 SetCountryAndVersion("ZZ", "9"); | |
227 RespondWithJSON( | |
228 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | |
229 {kWikipedia}); | |
230 scoped_refptr<net::TestURLRequestContextGetter> url_request_context( | |
231 new net::TestURLRequestContextGetter( | |
232 base::ThreadTaskRunnerHandle::Get())); | |
233 std::unique_ptr<PopularSites> popular_sites = | |
234 CreatePopularSites(url_request_context.get()); | |
235 | |
236 base::RunLoop loop; | |
237 base::Optional<bool> save_success; | |
238 | |
239 bool callback_was_scheduled = popular_sites->MaybeStartFetch( | |
240 /*force_download=*/true, base::Bind( | |
241 [](base::Optional<bool>* save_success, | |
242 base::RunLoop* loop, bool success) { | |
243 save_success->emplace(success); | |
244 loop->Quit(); | |
245 }, | |
246 &save_success, &loop)); | |
247 | |
248 // Assert that callback was scheduled so we can wait for its completion. | |
249 ASSERT_TRUE(callback_was_scheduled); | |
250 // There should be 8 default sites as nothing was fetched yet. | |
251 EXPECT_THAT(popular_sites->sites().size(), Eq(8ul)); | |
252 | |
253 loop.Run(); // Wait for the fetch to finish and the callback to return. | |
254 | |
255 ASSERT_TRUE(save_success.has_value()); | |
sfiera
2017/02/10 10:40:03
I would just start with "bool save_success = false
fhorschig
2017/02/13 10:34:13
Done.
| |
256 EXPECT_TRUE(save_success.value()); | |
257 // The 1 fetched site should replace the default sites. | |
258 EXPECT_THAT(popular_sites->sites().size(), Eq(1ul)); | |
208 } | 259 } |
209 | 260 |
210 TEST_F(PopularSitesTest, ClearsCacheFileFromOldVersions) { | 261 TEST_F(PopularSitesTest, ClearsCacheFileFromOldVersions) { |
211 SetCountryAndVersion("ZZ", "9"); | 262 SetCountryAndVersion("ZZ", "9"); |
212 RespondWithJSON( | 263 RespondWithJSON( |
213 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 264 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
214 {kWikipedia}); | 265 {kWikipedia}); |
215 | 266 |
216 PopularSites::SitesVector sites; | 267 PopularSites::SitesVector sites; |
217 const base::FilePath old_cache_path = | 268 const base::FilePath old_cache_path = |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
352 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 403 "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
353 {kChromium}); | 404 {kChromium}); |
354 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), | 405 EXPECT_THAT(FetchPopularSites(/*force_download=*/false, &sites), |
355 Eq(base::Optional<bool>(true))); | 406 Eq(base::Optional<bool>(true))); |
356 ASSERT_THAT(sites.size(), Eq(1u)); | 407 ASSERT_THAT(sites.size(), Eq(1u)); |
357 EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 408 EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); |
358 } | 409 } |
359 | 410 |
360 } // namespace | 411 } // namespace |
361 } // namespace ntp_tiles | 412 } // namespace ntp_tiles |
OLD | NEW |