forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
online_wallpaper_variant_info_fetcher_unittest.cc
252 lines (212 loc) · 9.8 KB
/
online_wallpaper_variant_info_fetcher_unittest.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/wallpaper/online_wallpaper_variant_info_fetcher.h"
#include "ash/public/cpp/wallpaper/wallpaper_info.h"
#include "ash/wallpaper/test_wallpaper_controller_client.h"
#include "base/functional/callback_forward.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/test/gtest_util.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "components/account_id/account_id.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
namespace {
// Convenience aliases for light and dark mode names.
using ColorMode = OnlineWallpaperVariantInfoFetcher::ColorMode;
constexpr char kUser1[] = "user1@test.com";
const AccountId kAccount1 = AccountId::FromUserEmailGaiaId(kUser1, kUser1);
constexpr char kDummyCollectionId[] = "testCollectionId";
// Returns a set of images with the given |type|.
std::vector<backdrop::Image> ImageSet(backdrop::Image_ImageType type,
size_t size) {
std::vector<backdrop::Image> images;
for (size_t i = 0; i < size; i++) {
images.emplace_back();
images.back().set_image_url(
base::StringPrintf("https://test_wallpaper/%zu", i));
// A "unique" asset id.
images.back().set_asset_id(42 + i);
// Images should all have a different unit id except in a light/dark pair.
images.back().set_unit_id(13 + i);
images.back().set_image_type(type);
}
return images;
}
class OnlineWallpaperVariantInfoFetcherTest : public testing::Test {
public:
OnlineWallpaperVariantInfoFetcherTest()
: task_environment_(base::test::TaskEnvironment::MainThreadType::UI) {}
void SetUp() override {
wallpaper_fetcher_ = std::make_unique<OnlineWallpaperVariantInfoFetcher>();
wallpaper_fetcher_->SetClient(&client_);
}
void TearDown() override {}
protected:
base::test::SingleThreadTaskEnvironment task_environment_;
TestWallpaperControllerClient client_;
std::unique_ptr<OnlineWallpaperVariantInfoFetcher> wallpaper_fetcher_;
};
// Verify that variants in params is populated.
TEST_F(OnlineWallpaperVariantInfoFetcherTest,
FetchDailyWallpaper_VariantsPopulated) {
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
WallpaperInfo info("", WallpaperLayout::WALLPAPER_LAYOUT_CENTER,
WallpaperType::kDaily, base::Time::Now());
info.collection_id = kDummyCollectionId;
wallpaper_fetcher_->FetchDailyWallpaper(
kAccount1, info, ColorMode::kLightMode, test_future.GetCallback());
ASSERT_TRUE(test_future.Wait()) << "Fetch Daily never ran callback";
auto result = test_future.Get();
ASSERT_TRUE(result);
EXPECT_FALSE(result->variants.empty());
}
// Verify that repeated requests for daily wallpaper changes the url.
TEST_F(OnlineWallpaperVariantInfoFetcherTest,
FetchDailyWallpaper_EveryRequestDifferent) {
// Add some images for a new collection id.
const std::string kCollectionId = "FetchDaily";
client_.AddCollection(kCollectionId,
ImageSet(backdrop::Image::IMAGE_TYPE_UNKNOWN, 6u));
// First fetch
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
WallpaperInfo info("", WallpaperLayout::WALLPAPER_LAYOUT_CENTER,
WallpaperType::kDaily, base::Time::Now());
info.collection_id = kCollectionId;
wallpaper_fetcher_->FetchDailyWallpaper(
kAccount1, info, ColorMode::kLightMode, test_future.GetCallback());
auto first_result = test_future.Get();
EXPECT_TRUE(first_result);
// Calling FetchDaily with the same arguments should yield a different params
// object if there is more than one wallpaper in the collection.
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future2;
wallpaper_fetcher_->FetchDailyWallpaper(
kAccount1, info, ColorMode::kLightMode, test_future2.GetCallback());
auto second_result = test_future2.Get();
EXPECT_TRUE(second_result);
EXPECT_NE(first_result->url, second_result->url)
<< "Urls for the two calls should be different";
}
// Verify that variants with matching unit id are selected and the asset of the
// appropriate type (dark/light).
TEST_F(OnlineWallpaperVariantInfoFetcherTest,
FetchOnlineWallpaper_DarkLightVariants) {
// Add some images for a new collection id.
const std::string kCollectionId = "FetchOnline";
const uint64_t kLightAssetId = 99;
const std::string kLightUrl = "https://preferred_wallpaper/images/99";
const uint64_t kDarkAssetId = 103;
const std::string kDarkUrl = "https://preferred_wallpaper/images/103";
const uint64_t kUnitId = 432;
// Initially populate the collection with images we won't use.
std::vector<backdrop::Image> images =
ImageSet(backdrop::Image::IMAGE_TYPE_UNKNOWN, 6u);
// Push a dark and light asset that share a unit id.
backdrop::Image light_image;
light_image.set_asset_id(kLightAssetId);
light_image.set_unit_id(kUnitId);
light_image.set_image_type(backdrop::Image::IMAGE_TYPE_LIGHT_MODE);
light_image.set_image_url(kLightUrl);
images.push_back(light_image);
backdrop::Image dark_image;
dark_image.set_asset_id(kDarkAssetId);
dark_image.set_unit_id(kUnitId);
dark_image.set_image_type(backdrop::Image::IMAGE_TYPE_DARK_MODE);
dark_image.set_image_url(kDarkUrl);
images.push_back(dark_image);
client_.AddCollection(kCollectionId, images);
WallpaperInfo info("", WallpaperLayout::WALLPAPER_LAYOUT_CENTER,
WallpaperType::kOnline, base::Time::Now());
info.collection_id = kCollectionId;
info.asset_id = kLightAssetId;
{
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
// Checking light mode where asset id matches.
wallpaper_fetcher_->FetchOnlineWallpaper(
kAccount1, info, ColorMode::kLightMode, test_future.GetCallback());
auto result = test_future.Get();
EXPECT_TRUE(result);
EXPECT_EQ(2u, result->variants.size());
EXPECT_EQ(kLightUrl, result->url.spec());
}
{
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
// Verify that we get a dark mode asset when in dark mode but our asset_id
// is for a light asset.
wallpaper_fetcher_->FetchOnlineWallpaper(
kAccount1, info, ColorMode::kDarkMode, test_future.GetCallback());
auto result = test_future.Get();
EXPECT_TRUE(result);
EXPECT_EQ(2u, result->variants.size());
EXPECT_EQ(kDarkUrl, result->url.spec());
}
}
// Verify that the request fails if there are no matching variants for dark
// mode.
TEST_F(OnlineWallpaperVariantInfoFetcherTest, FetchOnlineWallpaper_NoDarkMode) {
const std::string kCollectionId = "OnlyLightModeWallpaper";
std::vector<backdrop::Image> images =
ImageSet(backdrop::Image::IMAGE_TYPE_LIGHT_MODE, 4u);
client_.AddCollection(kCollectionId, images);
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
WallpaperInfo info("", WallpaperLayout::WALLPAPER_LAYOUT_CENTER,
WallpaperType::kOnline, base::Time::Now());
info.collection_id = kCollectionId;
// Pick an arbiratry asset in the set.
info.asset_id = images.front().asset_id();
// Initial request will pass because variants are not populated in |info|.
// Requesting dark mode when there are only light assets.
wallpaper_fetcher_->FetchOnlineWallpaper(
kAccount1, info, ColorMode::kDarkMode, test_future.GetCallback());
// Result should be missing if no suitable variants are found.
auto result = test_future.Get();
EXPECT_FALSE(result);
}
// When variants are already populated, params are returned.
TEST_F(OnlineWallpaperVariantInfoFetcherTest, FetchOnlineWallpaper_FromInfo) {
const uint64_t kAssetId = 14;
const GURL kUrl("https://populated_url/14");
const std::string kCollectionId = "PrePopulatedCollection";
const uint64_t kUnitId = 31;
const std::vector<OnlineWallpaperVariant> kVariants = {OnlineWallpaperVariant(
kAssetId, kUrl, backdrop::Image::IMAGE_TYPE_UNKNOWN)};
OnlineWallpaperParams params(
kAccount1, kAssetId, kUrl, kCollectionId,
WallpaperLayout::WALLPAPER_LAYOUT_CENTER, /*preview_mode=*/false,
/*from_user=*/true, /*daily_refresh_enabled=*/false, kUnitId, kVariants);
WallpaperInfo info(params);
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
wallpaper_fetcher_->FetchOnlineWallpaper(
kAccount1, info, ColorMode::kDarkMode, test_future.GetCallback());
// Callback is called
auto result = test_future.Get();
EXPECT_TRUE(result);
// WallpaperControllerClient is not used if OnlineWallpaperParams is fully
// populated.
EXPECT_EQ(0u, client_.fetch_images_for_collection_count());
}
// When variants are already populated but types don't match, returns false.
TEST_F(OnlineWallpaperVariantInfoFetcherTest,
FetchOnlineWallpaper_FromInfoLightDarkMismatch) {
const uint64_t kAssetId = 14;
const GURL kUrl("https://populated_url/14");
const std::string kCollectionId = "PrePopulatedCollection";
const uint64_t kUnitId = 31;
// Only one light mode wallpaper
const std::vector<OnlineWallpaperVariant> kVariants = {OnlineWallpaperVariant(
kAssetId, kUrl, backdrop::Image::IMAGE_TYPE_LIGHT_MODE)};
OnlineWallpaperParams params(
kAccount1, kAssetId, kUrl, kCollectionId,
WallpaperLayout::WALLPAPER_LAYOUT_CENTER, /*preview_mode=*/false,
/*from_user=*/true, /*daily_refresh_enabled=*/false, kUnitId, kVariants);
WallpaperInfo info(params);
// In dark mode, fetch will fail if the variant is missing.
base::test::TestFuture<absl::optional<OnlineWallpaperParams>> test_future;
EXPECT_DCHECK_DEATH(wallpaper_fetcher_->FetchOnlineWallpaper(
kAccount1, info, ColorMode::kDarkMode, test_future.GetCallback()));
}
} // namespace
} // namespace ash