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

Side by Side Diff: components/ntp_tiles/icon_cacher_impl_unittest.cc

Issue 2888393002: [Icon cacher] Add metrics for downloading favicons for NTP Tiles (Closed)
Patch Set: Comments of Chris Created 3 years, 7 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 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/icon_cacher_impl.h" 5 #include "components/ntp_tiles/icon_cacher_impl.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/path_service.h" 12 #include "base/path_service.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/test/histogram_tester.h"
14 #include "base/test/mock_callback.h" 15 #include "base/test/mock_callback.h"
15 #include "base/test/scoped_task_environment.h" 16 #include "base/test/scoped_task_environment.h"
16 #include "base/test/test_simple_task_runner.h" 17 #include "base/test/test_simple_task_runner.h"
17 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
18 #include "components/favicon/core/favicon_client.h" 19 #include "components/favicon/core/favicon_client.h"
19 #include "components/favicon/core/favicon_service_impl.h" 20 #include "components/favicon/core/favicon_service_impl.h"
20 #include "components/favicon/core/favicon_util.h" 21 #include "components/favicon/core/favicon_util.h"
21 #include "components/favicon/core/large_icon_service.h" 22 #include "components/favicon/core/large_icon_service.h"
22 #include "components/history/core/browser/history_database_params.h" 23 #include "components/history/core/browser/history_database_params.h"
23 #include "components/history/core/browser/history_service.h" 24 #include "components/history/core/browser/history_service.h"
24 #include "components/image_fetcher/core/image_decoder.h" 25 #include "components/image_fetcher/core/image_decoder.h"
25 #include "components/image_fetcher/core/image_fetcher.h" 26 #include "components/image_fetcher/core/image_fetcher.h"
26 #include "components/image_fetcher/core/request_metadata.h" 27 #include "components/image_fetcher/core/request_metadata.h"
27 #include "testing/gmock/include/gmock/gmock.h" 28 #include "testing/gmock/include/gmock/gmock.h"
28 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
29 #include "ui/base/resource/resource_bundle.h" 30 #include "ui/base/resource/resource_bundle.h"
30 #include "ui/base/ui_base_paths.h" 31 #include "ui/base/ui_base_paths.h"
31 #include "ui/gfx/image/image_unittest_util.h" 32 #include "ui/gfx/image/image_unittest_util.h"
32 33
34 using base::Bucket;
33 using ::testing::_; 35 using ::testing::_;
36 using ::testing::ElementsAre;
34 using ::testing::Eq; 37 using ::testing::Eq;
35 using ::testing::Invoke; 38 using ::testing::Invoke;
36 using ::testing::InSequence; 39 using ::testing::InSequence;
40 using ::testing::IsEmpty;
37 using ::testing::NiceMock; 41 using ::testing::NiceMock;
38 using ::testing::Return; 42 using ::testing::Return;
39 using ::testing::ReturnArg; 43 using ::testing::ReturnArg;
40 44
41 namespace ntp_tiles { 45 namespace ntp_tiles {
42 namespace { 46 namespace {
43 47
44 class MockImageFetcher : public image_fetcher::ImageFetcher { 48 class MockImageFetcher : public image_fetcher::ImageFetcher {
45 public: 49 public:
46 MOCK_METHOD1(SetImageFetcherDelegate, 50 MOCK_METHOD1(SetImageFetcherDelegate,
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 ui::SCALE_FACTOR_NONE); 227 ui::SCALE_FACTOR_NONE);
224 } 228 }
225 229
226 PopularSites::Site site_; 230 PopularSites::Site site_;
227 std::unique_ptr<MockImageFetcher> image_fetcher_; 231 std::unique_ptr<MockImageFetcher> image_fetcher_;
228 std::unique_ptr<MockImageDecoder> image_decoder_; 232 std::unique_ptr<MockImageDecoder> image_decoder_;
229 NiceMock<MockResourceDelegate> mock_resource_delegate_; 233 NiceMock<MockResourceDelegate> mock_resource_delegate_;
230 }; 234 };
231 235
232 TEST_F(IconCacherTestPopularSites, LargeCached) { 236 TEST_F(IconCacherTestPopularSites, LargeCached) {
237 base::HistogramTester histogram_tester;
233 base::MockCallback<base::Closure> done; 238 base::MockCallback<base::Closure> done;
234 EXPECT_CALL(done, Run()).Times(0); 239 EXPECT_CALL(done, Run()).Times(0);
235 base::RunLoop loop; 240 base::RunLoop loop;
236 { 241 {
237 InSequence s; 242 InSequence s;
238 EXPECT_CALL(*image_fetcher_, 243 EXPECT_CALL(*image_fetcher_,
239 SetDataUseServiceName( 244 SetDataUseServiceName(
240 data_use_measurement::DataUseUserData::NTP_TILES)); 245 data_use_measurement::DataUseUserData::NTP_TILES));
241 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); 246 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128)));
242 } 247 }
243 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128, 248 PreloadIcon(site_.url, site_.large_icon_url, favicon_base::TOUCH_ICON, 128,
244 128); 249 128);
245 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); 250 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_));
246 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); 251 cacher.StartFetchPopularSites(site_, done.Get(), done.Get());
247 WaitForMainThreadTasksToFinish(); 252 WaitForMainThreadTasksToFinish();
248 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); 253 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON));
249 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); 254 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
255 EXPECT_THAT(
256 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"),
257 IsEmpty());
250 } 258 }
251 259
252 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchSucceeded) { 260 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchSucceeded) {
261 base::HistogramTester histogram_tester;
253 base::MockCallback<base::Closure> done; 262 base::MockCallback<base::Closure> done;
254 base::RunLoop loop; 263 base::RunLoop loop;
255 { 264 {
256 InSequence s; 265 InSequence s;
257 EXPECT_CALL(*image_fetcher_, 266 EXPECT_CALL(*image_fetcher_,
258 SetDataUseServiceName( 267 SetDataUseServiceName(
259 data_use_measurement::DataUseUserData::NTP_TILES)); 268 data_use_measurement::DataUseUserData::NTP_TILES));
260 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); 269 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128)));
261 EXPECT_CALL(*image_fetcher_, 270 EXPECT_CALL(*image_fetcher_,
262 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) 271 StartOrQueueNetworkRequest(_, site_.large_icon_url, _))
263 .WillOnce(PassFetch(128, 128)); 272 .WillOnce(PassFetch(128, 128));
264 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); 273 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop));
265 } 274 }
266 275
267 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); 276 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_));
268 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); 277 cacher.StartFetchPopularSites(site_, done.Get(), done.Get());
269 loop.Run(); 278 loop.Run();
270 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); 279 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON));
271 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); 280 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
281 EXPECT_THAT(
282 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"),
283 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS.
272 } 284 }
273 285
274 TEST_F(IconCacherTestPopularSites, SmallNotCachedAndFetchSucceeded) { 286 TEST_F(IconCacherTestPopularSites, SmallNotCachedAndFetchSucceeded) {
275 site_.large_icon_url = GURL(); 287 site_.large_icon_url = GURL();
276 288
277 base::MockCallback<base::Closure> done; 289 base::MockCallback<base::Closure> done;
278 base::RunLoop loop; 290 base::RunLoop loop;
279 { 291 {
280 InSequence s; 292 InSequence s;
281 EXPECT_CALL(*image_fetcher_, 293 EXPECT_CALL(*image_fetcher_,
282 SetDataUseServiceName( 294 SetDataUseServiceName(
283 data_use_measurement::DataUseUserData::NTP_TILES)); 295 data_use_measurement::DataUseUserData::NTP_TILES));
284 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); 296 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128)));
285 EXPECT_CALL(*image_fetcher_, 297 EXPECT_CALL(*image_fetcher_,
286 StartOrQueueNetworkRequest(_, site_.favicon_url, _)) 298 StartOrQueueNetworkRequest(_, site_.favicon_url, _))
287 .WillOnce(PassFetch(128, 128)); 299 .WillOnce(PassFetch(128, 128));
288 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); 300 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop));
289 } 301 }
290 302
291 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); 303 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_));
292 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); 304 cacher.StartFetchPopularSites(site_, done.Get(), done.Get());
293 loop.Run(); 305 loop.Run();
294 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); 306 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::FAVICON));
295 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); 307 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
296 } 308 }
297 309
298 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchFailed) { 310 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchFailed) {
311 base::HistogramTester histogram_tester;
299 base::MockCallback<base::Closure> done; 312 base::MockCallback<base::Closure> done;
300 EXPECT_CALL(done, Run()).Times(0); 313 EXPECT_CALL(done, Run()).Times(0);
301 { 314 {
302 InSequence s; 315 InSequence s;
303 EXPECT_CALL(*image_fetcher_, 316 EXPECT_CALL(*image_fetcher_,
304 SetDataUseServiceName( 317 SetDataUseServiceName(
305 data_use_measurement::DataUseUserData::NTP_TILES)); 318 data_use_measurement::DataUseUserData::NTP_TILES));
306 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); 319 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128)));
307 EXPECT_CALL(*image_fetcher_, 320 EXPECT_CALL(*image_fetcher_,
308 StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) 321 StartOrQueueNetworkRequest(_, site_.large_icon_url, _))
309 .WillOnce(FailFetch()); 322 .WillOnce(FailFetch());
310 } 323 }
311 324
312 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); 325 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_));
313 cacher.StartFetchPopularSites(site_, done.Get(), done.Get()); 326 cacher.StartFetchPopularSites(site_, done.Get(), done.Get());
314 WaitForMainThreadTasksToFinish(); 327 WaitForMainThreadTasksToFinish();
315 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); 328 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON));
316 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); 329 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
330 EXPECT_THAT(
331 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"),
332 ElementsAre(Bucket(/*bucket=*/1, /*count=*/1))); // bucket 1 = FAILURE.
317 } 333 }
318 334
319 TEST_F(IconCacherTestPopularSites, HandlesEmptyCallbacksNicely) { 335 TEST_F(IconCacherTestPopularSites, HandlesEmptyCallbacksNicely) {
336 base::HistogramTester histogram_tester;
320 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_)); 337 EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_));
321 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_)); 338 EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_));
322 EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _)) 339 EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _))
323 .WillOnce(PassFetch(128, 128)); 340 .WillOnce(PassFetch(128, 128));
324 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_)); 341 IconCacherImpl cacher(&favicon_service_, nullptr, std::move(image_fetcher_));
325 cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure()); 342 cacher.StartFetchPopularSites(site_, base::Closure(), base::Closure());
326 WaitForHistoryThreadTasksToFinish(); // Writing the icon into the DB. 343 WaitForHistoryThreadTasksToFinish(); // Writing the icon into the DB.
327 WaitForMainThreadTasksToFinish(); // Finishing tasks after the DB write. 344 WaitForMainThreadTasksToFinish(); // Finishing tasks after the DB write.
328 // Even though the callbacks are not called, the icon gets written out. 345 // Even though the callbacks are not called, the icon gets written out.
329 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON)); 346 EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::FAVICON));
330 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON)); 347 EXPECT_TRUE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
348 // The histogram gets reported despite empty callbacks.
349 EXPECT_THAT(
350 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"),
351 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS.
331 } 352 }
332 353
333 TEST_F(IconCacherTestPopularSites, ProvidesDefaultIconAndSucceedsWithFetching) { 354 TEST_F(IconCacherTestPopularSites, ProvidesDefaultIconAndSucceedsWithFetching) {
355 base::HistogramTester histogram_tester;
334 // The returned data string is not used by the mocked decoder. 356 // The returned data string is not used by the mocked decoder.
335 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) 357 ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _))
336 .WillByDefault(Return("")); 358 .WillByDefault(Return(""));
337 // It's not important when the image_fetcher's decoder is used to decode the 359 // It's not important when the image_fetcher's decoder is used to decode the
338 // image but it must happen at some point. 360 // image but it must happen at some point.
339 EXPECT_CALL(*image_fetcher_, GetImageDecoder()) 361 EXPECT_CALL(*image_fetcher_, GetImageDecoder())
340 .WillOnce(Return(image_decoder_.get())); 362 .WillOnce(Return(image_decoder_.get()));
341 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) 363 EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _))
342 .WillOnce(DecodeSuccessfully(64, 64)); 364 .WillOnce(DecodeSuccessfully(64, 64));
343 base::MockCallback<base::Closure> preliminary_icon_available; 365 base::MockCallback<base::Closure> preliminary_icon_available;
(...skipping 23 matching lines...) Expand all
367 preliminary_icon_available.Get()); 389 preliminary_icon_available.Get());
368 390
369 default_loop.Run(); // Wait for the default image. 391 default_loop.Run(); // Wait for the default image.
370 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), 392 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(),
371 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects. 393 Eq(gfx::Size(64, 64))); // Compares dimensions, not objects.
372 394
373 // Let the fetcher continue and wait for the second call of the callback. 395 // Let the fetcher continue and wait for the second call of the callback.
374 fetch_loop.Run(); // Wait for the updated image. 396 fetch_loop.Run(); // Wait for the updated image.
375 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(), 397 EXPECT_THAT(GetCachedIconFor(site_.url, favicon_base::TOUCH_ICON).Size(),
376 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects. 398 Eq(gfx::Size(128, 128))); // Compares dimensions, not objects.
399 // The histogram gets reported only once (for the downloaded icon, not for the
400 // default one).
401 EXPECT_THAT(
402 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.popular"),
403 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS.
377 } 404 }
378 405
379 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchPerformedOnlyOnce) { 406 TEST_F(IconCacherTestPopularSites, LargeNotCachedAndFetchPerformedOnlyOnce) {
380 base::MockCallback<base::Closure> done; 407 base::MockCallback<base::Closure> done;
381 base::RunLoop loop; 408 base::RunLoop loop;
382 { 409 {
383 InSequence s; 410 InSequence s;
384 // Image fetcher is used only once. 411 // Image fetcher is used only once.
385 EXPECT_CALL(*image_fetcher_, 412 EXPECT_CALL(*image_fetcher_,
386 SetDataUseServiceName( 413 SetDataUseServiceName(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 } 448 }
422 449
423 scoped_refptr<base::TestSimpleTaskRunner> 450 scoped_refptr<base::TestSimpleTaskRunner>
424 large_icon_service_background_task_runner_; 451 large_icon_service_background_task_runner_;
425 std::unique_ptr<MockImageFetcher> fetcher_for_large_icon_service_; 452 std::unique_ptr<MockImageFetcher> fetcher_for_large_icon_service_;
426 std::unique_ptr<MockImageFetcher> fetcher_for_icon_cacher_; 453 std::unique_ptr<MockImageFetcher> fetcher_for_icon_cacher_;
427 }; 454 };
428 455
429 TEST_F(IconCacherTestMostLikely, Cached) { 456 TEST_F(IconCacherTestMostLikely, Cached) {
430 GURL page_url("http://www.site.com"); 457 GURL page_url("http://www.site.com");
458 base::HistogramTester histogram_tester;
459
431 GURL icon_url("http://www.site.com/favicon.png"); 460 GURL icon_url("http://www.site.com/favicon.png");
432 PreloadIcon(page_url, icon_url, favicon_base::TOUCH_ICON, 128, 128); 461 PreloadIcon(page_url, icon_url, favicon_base::TOUCH_ICON, 128, 128);
433 462
434 favicon::LargeIconService large_icon_service( 463 favicon::LargeIconService large_icon_service(
435 &favicon_service_, large_icon_service_background_task_runner_, 464 &favicon_service_, large_icon_service_background_task_runner_,
436 std::move(fetcher_for_large_icon_service_)); 465 std::move(fetcher_for_large_icon_service_));
437 IconCacherImpl cacher(&favicon_service_, &large_icon_service, 466 IconCacherImpl cacher(&favicon_service_, &large_icon_service,
438 std::move(fetcher_for_icon_cacher_)); 467 std::move(fetcher_for_icon_cacher_));
439 468
440 base::MockCallback<base::Closure> done; 469 base::MockCallback<base::Closure> done;
441 EXPECT_CALL(done, Run()).Times(0); 470 EXPECT_CALL(done, Run()).Times(0);
442 cacher.StartFetchMostLikely(page_url, done.Get()); 471 cacher.StartFetchMostLikely(page_url, done.Get());
443 WaitForMainThreadTasksToFinish(); 472 WaitForMainThreadTasksToFinish();
444 473
445 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); 474 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
446 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); 475 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
476 EXPECT_THAT(
477 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"),
478 IsEmpty());
447 } 479 }
448 480
449 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchSucceeded) { 481 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchSucceeded) {
450 GURL page_url("http://www.site.com"); 482 GURL page_url("http://www.site.com");
483 base::HistogramTester histogram_tester;
451 484
452 base::MockCallback<base::Closure> done; 485 base::MockCallback<base::Closure> done;
453 base::RunLoop loop; 486 base::RunLoop loop;
454 { 487 {
455 InSequence s; 488 InSequence s;
456 EXPECT_CALL(*fetcher_for_large_icon_service_, 489 EXPECT_CALL(*fetcher_for_large_icon_service_,
457 SetDataUseServiceName( 490 SetDataUseServiceName(
458 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); 491 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE));
459 EXPECT_CALL(*fetcher_for_large_icon_service_, 492 EXPECT_CALL(*fetcher_for_large_icon_service_,
460 StartOrQueueNetworkRequest(_, _, _)) 493 StartOrQueueNetworkRequest(_, _, _))
461 .WillOnce(PassFetch(128, 128)); 494 .WillOnce(PassFetch(128, 128));
462 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop)); 495 EXPECT_CALL(done, Run()).WillOnce(Quit(&loop));
463 } 496 }
464 497
465 favicon::LargeIconService large_icon_service( 498 favicon::LargeIconService large_icon_service(
466 &favicon_service_, large_icon_service_background_task_runner_, 499 &favicon_service_, large_icon_service_background_task_runner_,
467 std::move(fetcher_for_large_icon_service_)); 500 std::move(fetcher_for_large_icon_service_));
468 IconCacherImpl cacher(&favicon_service_, &large_icon_service, 501 IconCacherImpl cacher(&favicon_service_, &large_icon_service,
469 std::move(fetcher_for_icon_cacher_)); 502 std::move(fetcher_for_icon_cacher_));
470 503
471 cacher.StartFetchMostLikely(page_url, done.Get()); 504 cacher.StartFetchMostLikely(page_url, done.Get());
472 // Both these task runners need to be flushed in order to get |done| called by 505 // Both these task runners need to be flushed in order to get |done| called by
473 // running the main loop. 506 // running the main loop.
474 WaitForHistoryThreadTasksToFinish(); 507 WaitForHistoryThreadTasksToFinish();
475 large_icon_service_background_task_runner_->RunUntilIdle(); 508 large_icon_service_background_task_runner_->RunUntilIdle();
476 509
477 loop.Run(); 510 loop.Run();
478 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); 511 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
479 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); 512 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
513 EXPECT_THAT(
514 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"),
515 ElementsAre(Bucket(/*bucket=*/0, /*count=*/1))); // bucket 0 = SUCCESS.
480 } 516 }
481 517
482 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) { 518 TEST_F(IconCacherTestMostLikely, NotCachedAndFetchFailed) {
483 GURL page_url("http://www.site.com"); 519 GURL page_url("http://www.site.com");
520 base::HistogramTester histogram_tester;
484 521
485 base::MockCallback<base::Closure> done; 522 base::MockCallback<base::Closure> done;
486 { 523 {
487 InSequence s; 524 InSequence s;
488 EXPECT_CALL(*fetcher_for_large_icon_service_, 525 EXPECT_CALL(*fetcher_for_large_icon_service_,
489 SetDataUseServiceName( 526 SetDataUseServiceName(
490 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE)); 527 data_use_measurement::DataUseUserData::LARGE_ICON_SERVICE));
491 EXPECT_CALL(*fetcher_for_large_icon_service_, 528 EXPECT_CALL(*fetcher_for_large_icon_service_,
492 StartOrQueueNetworkRequest(_, _, _)) 529 StartOrQueueNetworkRequest(_, _, _))
493 .WillOnce(FailFetch()); 530 .WillOnce(FailFetch());
494 EXPECT_CALL(done, Run()).Times(0); 531 EXPECT_CALL(done, Run()).Times(0);
495 } 532 }
496 533
497 favicon::LargeIconService large_icon_service( 534 favicon::LargeIconService large_icon_service(
498 &favicon_service_, large_icon_service_background_task_runner_, 535 &favicon_service_, large_icon_service_background_task_runner_,
499 std::move(fetcher_for_large_icon_service_)); 536 std::move(fetcher_for_large_icon_service_));
500 IconCacherImpl cacher(&favicon_service_, &large_icon_service, 537 IconCacherImpl cacher(&favicon_service_, &large_icon_service,
501 std::move(fetcher_for_icon_cacher_)); 538 std::move(fetcher_for_icon_cacher_));
502 539
503 cacher.StartFetchMostLikely(page_url, done.Get()); 540 cacher.StartFetchMostLikely(page_url, done.Get());
504 // Both these task runners need to be flushed before flushing the main thread 541 // Both these task runners need to be flushed before flushing the main thread
505 // queue in order to finish the work. 542 // queue in order to finish the work.
506 WaitForHistoryThreadTasksToFinish(); 543 WaitForHistoryThreadTasksToFinish();
507 large_icon_service_background_task_runner_->RunUntilIdle(); 544 large_icon_service_background_task_runner_->RunUntilIdle();
508 WaitForMainThreadTasksToFinish(); 545 WaitForMainThreadTasksToFinish();
509 546
510 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); 547 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
511 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); 548 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
549 EXPECT_THAT(
550 histogram_tester.GetAllSamples("NewTabPage.TileFaviconFetched.server"),
551 ElementsAre(Bucket(/*bucket=*/1, /*count=*/1))); // bucket 1 = FAILURE.
512 } 552 }
513 553
514 TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) { 554 TEST_F(IconCacherTestMostLikely, HandlesEmptyCallbacksNicely) {
515 GURL page_url("http://www.site.com"); 555 GURL page_url("http://www.site.com");
516 556
517 EXPECT_CALL(*fetcher_for_large_icon_service_, SetDataUseServiceName(_)); 557 EXPECT_CALL(*fetcher_for_large_icon_service_, SetDataUseServiceName(_));
518 EXPECT_CALL(*fetcher_for_large_icon_service_, 558 EXPECT_CALL(*fetcher_for_large_icon_service_,
519 StartOrQueueNetworkRequest(_, _, _)) 559 StartOrQueueNetworkRequest(_, _, _))
520 .WillOnce(PassFetch(128, 128)); 560 .WillOnce(PassFetch(128, 128));
521 561
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 WaitForHistoryThreadTasksToFinish(); 608 WaitForHistoryThreadTasksToFinish();
569 large_icon_service_background_task_runner_->RunUntilIdle(); 609 large_icon_service_background_task_runner_->RunUntilIdle();
570 610
571 loop.Run(); 611 loop.Run();
572 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON)); 612 EXPECT_FALSE(IconIsCachedFor(page_url, favicon_base::FAVICON));
573 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON)); 613 EXPECT_TRUE(IconIsCachedFor(page_url, favicon_base::TOUCH_ICON));
574 } 614 }
575 615
576 } // namespace 616 } // namespace
577 } // namespace ntp_tiles 617 } // namespace ntp_tiles
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698