image_prefetcher_unittest.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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/image_prefetcher.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/callback_helpers.h"
  8. #include "base/memory/raw_ptr.h"
  9. #include "base/test/task_environment.h"
  10. #include "components/query_tiles/internal/image_loader.h"
  11. #include "components/query_tiles/internal/tile_group.h"
  12. #include "components/query_tiles/test/test_utils.h"
  13. #include "components/query_tiles/tile.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. #include "third_party/skia/include/core/SkBitmap.h"
  17. using testing::_;
  18. using testing::Invoke;
  19. using testing::StrictMock;
  20. namespace query_tiles {
  21. namespace {
  22. const char kImageUrl[] = "https://www.example.com/image";
  23. const char kOtherImageUrl[] = "https://www.example.com/image/other";
  24. const char kInvalidUrl[] = "Not a URL..";
  25. class MockImageLoader : public ImageLoader {
  26. public:
  27. MockImageLoader() = default;
  28. ~MockImageLoader() override = default;
  29. // ImageLoader implementation.
  30. MOCK_METHOD(void,
  31. FetchImage,
  32. (const GURL& url, BitmapCallback callback),
  33. (override));
  34. MOCK_METHOD(void,
  35. PrefetchImage,
  36. (const GURL& url, SuccessCallback callback),
  37. (override));
  38. // Callback stubs.
  39. MOCK_METHOD(void, DoneCallbackStub, (), ());
  40. };
  41. class ImagePrefetcherTest : public testing::Test {
  42. public:
  43. ImagePrefetcherTest() = default;
  44. ~ImagePrefetcherTest() override = default;
  45. protected:
  46. MockImageLoader* image_loader() { return image_loader_; }
  47. ImagePrefetcher* prefetcher() { return image_prefetcher_.get(); }
  48. void Init(ImagePrefetchMode mode) {
  49. auto image_loader = std::make_unique<StrictMock<MockImageLoader>>();
  50. image_loader_ = image_loader.get();
  51. image_prefetcher_ = ImagePrefetcher::Create(mode, std::move(image_loader));
  52. ON_CALL(*image_loader_, FetchImage(_, _))
  53. .WillByDefault(
  54. Invoke([](const GURL& url, ImageLoader::BitmapCallback callback) {
  55. std::move(callback).Run(SkBitmap());
  56. }));
  57. ON_CALL(*image_loader_, PrefetchImage(_, _))
  58. .WillByDefault(
  59. Invoke([](const GURL& url, ImageLoader::SuccessCallback callback) {
  60. std::move(callback).Run(true);
  61. }));
  62. }
  63. void ResetImageUrls(TileGroup* group) {
  64. // Make the group to have one valid URL at top level, one valid URL at
  65. // second level, and one invalid URL.
  66. test::ResetTestGroup(group);
  67. group->tiles[0]->image_metadatas.clear();
  68. group->tiles[0]->image_metadatas.emplace_back(
  69. ImageMetadata(GURL(kInvalidUrl)));
  70. group->tiles[0]->sub_tiles[0]->image_metadatas.emplace_back(
  71. ImageMetadata(GURL(kImageUrl)));
  72. group->tiles[1]->image_metadatas.emplace_back(
  73. ImageMetadata(GURL(kOtherImageUrl)));
  74. }
  75. void Prefetch(bool is_from_reduced_mode) {
  76. DCHECK(image_loader_);
  77. DCHECK(image_prefetcher_);
  78. TileGroup group;
  79. ResetImageUrls(&group);
  80. prefetcher()->Prefetch(std::move(group), is_from_reduced_mode,
  81. base::BindOnce(&MockImageLoader::DoneCallbackStub,
  82. base::Unretained(image_loader_)));
  83. }
  84. void RunUntilIdle() { task_environment_.RunUntilIdle(); }
  85. private:
  86. base::test::TaskEnvironment task_environment_;
  87. raw_ptr<MockImageLoader> image_loader_;
  88. std::unique_ptr<ImagePrefetcher> image_prefetcher_;
  89. };
  90. // All images should be fetched for ImagePrefetchMode::kAll.
  91. TEST_F(ImagePrefetcherTest, PrefetchAll) {
  92. Init(ImagePrefetchMode::kAll);
  93. EXPECT_CALL(*image_loader(), DoneCallbackStub());
  94. EXPECT_CALL(*image_loader(), FetchImage(GURL(kImageUrl), _));
  95. EXPECT_CALL(*image_loader(), FetchImage(GURL(kOtherImageUrl), _));
  96. Prefetch(false /*is_from_reduced_mode*/);
  97. RunUntilIdle();
  98. }
  99. // Top level images should be fetched for ImagePrefetchMode::kTopLevel.
  100. TEST_F(ImagePrefetcherTest, PrefetchTopLevel) {
  101. Init(ImagePrefetchMode::kTopLevel);
  102. EXPECT_CALL(*image_loader(), DoneCallbackStub());
  103. EXPECT_CALL(*image_loader(), FetchImage(GURL(kOtherImageUrl), _));
  104. Prefetch(false /*is_from_reduced_mode*/);
  105. RunUntilIdle();
  106. }
  107. // No image should be fetched for ImagePrefetchMode::kNone.
  108. TEST_F(ImagePrefetcherTest, PrefetchNone) {
  109. Init(ImagePrefetchMode::kNone);
  110. EXPECT_CALL(*image_loader(), DoneCallbackStub());
  111. EXPECT_CALL(*image_loader(), FetchImage(_, _)).Times(0);
  112. Prefetch(false /*is_from_reduced_mode*/);
  113. RunUntilIdle();
  114. }
  115. // Reduced mode API is called when fetching the images.
  116. TEST_F(ImagePrefetcherTest, PrefetchReducedMode) {
  117. Init(ImagePrefetchMode::kTopLevel);
  118. EXPECT_CALL(*image_loader(), DoneCallbackStub());
  119. EXPECT_CALL(*image_loader(), PrefetchImage(GURL(kOtherImageUrl), _));
  120. Prefetch(true /*is_from_reduced_mode*/);
  121. RunUntilIdle();
  122. }
  123. } // namespace
  124. } // namespace query_tiles