cached_image_loader_unittest.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2020 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. #include "components/query_tiles/internal/cached_image_loader.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/memory/weak_ptr.h"
  8. #include "base/test/metrics/histogram_tester.h"
  9. #include "base/test/mock_callback.h"
  10. #include "base/test/task_environment.h"
  11. #include "components/image_fetcher/core/mock_image_fetcher.h"
  12. #include "components/image_fetcher/core/request_metadata.h"
  13. #include "net/base/net_errors.h"
  14. #include "net/http/http_status_code.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. #include "third_party/skia/include/core/SkBitmap.h"
  17. #include "ui/gfx/image/image.h"
  18. using image_fetcher::ImageDataFetcherCallback;
  19. using image_fetcher::ImageFetcherCallback;
  20. using image_fetcher::ImageFetcherParams;
  21. using image_fetcher::RequestMetadata;
  22. using ::testing::_;
  23. using ::testing::Invoke;
  24. namespace query_tiles {
  25. namespace {
  26. const char kImagePreloadingHistogram[] =
  27. "Search.QueryTiles.ImagePreloadingEvent";
  28. class CachedImageLoaderTest : public testing::Test {
  29. public:
  30. CachedImageLoaderTest() = default;
  31. ~CachedImageLoaderTest() override = default;
  32. void SetUp() override {
  33. image_loader_ = std::make_unique<CachedImageLoader>(
  34. &mock_fetcher_, &mock_reduced_mode_fetcher_);
  35. }
  36. protected:
  37. void FetchImage() {
  38. image_loader_->FetchImage(
  39. GURL("https://www.example.com/dummy_image"),
  40. base::BindOnce(&CachedImageLoaderTest::OnBitmapFetched,
  41. weak_ptr_factory_.GetWeakPtr()));
  42. }
  43. void PrefetchImage(int http_response_code, bool expected_success) {
  44. base::MockCallback<ImageLoader::SuccessCallback> mock_callback;
  45. EXPECT_CALL(mock_callback, Run(expected_success));
  46. EXPECT_CALL(*mock_reduced_mode_fetcher(), FetchImageAndData_(_, _, _, _))
  47. .WillRepeatedly(
  48. Invoke([http_response_code](
  49. const GURL&, ImageDataFetcherCallback* data_callback,
  50. ImageFetcherCallback*, ImageFetcherParams) {
  51. RequestMetadata request_metadata;
  52. request_metadata.http_response_code = http_response_code;
  53. std::move(*data_callback).Run("test_data", request_metadata);
  54. }));
  55. image_loader_->PrefetchImage(GURL("https://www.example.com/dummy_image"),
  56. mock_callback.Get());
  57. }
  58. image_fetcher::MockImageFetcher* mock_fetcher() { return &mock_fetcher_; }
  59. image_fetcher::MockImageFetcher* mock_reduced_mode_fetcher() {
  60. return &mock_reduced_mode_fetcher_;
  61. }
  62. const SkBitmap& result() const { return result_; }
  63. base::HistogramTester* histogram_tester() { return &histogram_tester_; }
  64. private:
  65. void OnBitmapFetched(SkBitmap bitmap) { result_ = bitmap; }
  66. base::test::TaskEnvironment task_environment_;
  67. image_fetcher::MockImageFetcher mock_fetcher_;
  68. image_fetcher::MockImageFetcher mock_reduced_mode_fetcher_;
  69. std::unique_ptr<ImageLoader> image_loader_;
  70. SkBitmap result_;
  71. base::HistogramTester histogram_tester_;
  72. base::WeakPtrFactory<CachedImageLoaderTest> weak_ptr_factory_{this};
  73. };
  74. TEST_F(CachedImageLoaderTest, FetchImage) {
  75. // Create a non-empty bitmap.
  76. SkBitmap bitmap;
  77. bitmap.allocN32Pixels(32, 16);
  78. EXPECT_FALSE(bitmap.empty());
  79. EXPECT_EQ(bitmap.width(), 32);
  80. auto image = gfx::Image::CreateFrom1xBitmap(bitmap);
  81. EXPECT_CALL(*mock_fetcher(), FetchImageAndData_(_, _, _, _))
  82. .WillRepeatedly(Invoke([&image](const GURL&, ImageDataFetcherCallback*,
  83. ImageFetcherCallback* fetch_callback,
  84. ImageFetcherParams) {
  85. image_fetcher::RequestMetadata request_metadata;
  86. request_metadata.http_response_code = net::OK;
  87. std::move(*fetch_callback).Run(image, request_metadata);
  88. }));
  89. FetchImage();
  90. EXPECT_FALSE(result().empty());
  91. EXPECT_EQ(result().width(), 32);
  92. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 0, 1);
  93. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 1, 1);
  94. }
  95. TEST_F(CachedImageLoaderTest, PrefetchImage) {
  96. PrefetchImage(net::OK, true /*expected_succes*/);
  97. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 3, 1);
  98. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 4, 1);
  99. PrefetchImage(net::HTTP_NOT_FOUND, false /*expected_succes*/);
  100. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 3, 2);
  101. histogram_tester()->ExpectBucketCount(kImagePreloadingHistogram, 5, 1);
  102. }
  103. } // namespace
  104. } // namespace query_tiles