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

Side by Side Diff: chrome/browser/ui/app_list/arc/arc_app_unittest.cc

Issue 2749973002: arc: Fix Default icon issue when cached icon file is corrupted. (Closed)
Patch Set: Nits fix. Created 3 years, 9 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <algorithm> 8 #include <algorithm>
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 EXPECT_TRUE(image.HasRepresentation(scale)); 366 EXPECT_TRUE(image.HasRepresentation(scale));
367 const gfx::ImageSkiaRep& representation = image.GetRepresentation(scale); 367 const gfx::ImageSkiaRep& representation = image.GetRepresentation(scale);
368 EXPECT_FALSE(representation.is_null()); 368 EXPECT_FALSE(representation.is_null());
369 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), 369 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale),
370 representation.pixel_width()); 370 representation.pixel_width());
371 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale), 371 EXPECT_EQ(gfx::ToCeiledInt(app_list::kGridIconDimension * scale),
372 representation.pixel_height()); 372 representation.pixel_height());
373 } 373 }
374 } 374 }
375 375
376 // Removes icon request record and allowd re-sending icon request.
377 void MaybeRemoveIconRequestRecord(const std::string& app_id) {
378 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get());
379 ASSERT_NE(nullptr, prefs);
380
381 prefs->MaybeRemoveIconRequestRecord(app_id);
382 }
383
376 void AddPackage(const arc::mojom::ArcPackageInfo& package) { 384 void AddPackage(const arc::mojom::ArcPackageInfo& package) {
377 arc_test_.AddPackage(package); 385 arc_test_.AddPackage(package);
378 } 386 }
379 387
380 void RemovePackage(const arc::mojom::ArcPackageInfo& package) { 388 void RemovePackage(const arc::mojom::ArcPackageInfo& package) {
381 arc_test_.RemovePackage(package); 389 arc_test_.RemovePackage(package);
382 } 390 }
383 391
384 AppListControllerDelegate* controller() { return controller_.get(); } 392 AppListControllerDelegate* controller() { return controller_.get(); }
385 393
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 ASSERT_NE(nullptr, prefs); 939 ASSERT_NE(nullptr, prefs);
932 940
933 const std::string app_id = ArcAppTest::GetAppId(app); 941 const std::string app_id = ArcAppTest::GetAppId(app);
934 const base::FilePath app_path = prefs->GetAppPath(app_id); 942 const base::FilePath app_path = prefs->GetAppPath(app_id);
935 const ui::ScaleFactor scale_factor = ui::GetSupportedScaleFactors()[0]; 943 const ui::ScaleFactor scale_factor = ui::GetSupportedScaleFactors()[0];
936 944
937 // No app folder by default. 945 // No app folder by default.
938 base::RunLoop().RunUntilIdle(); 946 base::RunLoop().RunUntilIdle();
939 EXPECT_FALSE(base::PathExists(app_path)); 947 EXPECT_FALSE(base::PathExists(app_path));
940 948
941 // Request icon, this will create app folder.
942 prefs->RequestIcon(app_id, scale_factor);
943 // Now send generated icon for the app. 949 // Now send generated icon for the app.
944 std::string png_data; 950 std::string png_data;
945 EXPECT_TRUE(app_instance()->GenerateAndSendIcon( 951 EXPECT_TRUE(app_instance()->GenerateAndSendIcon(
946 app, static_cast<arc::mojom::ScaleFactor>(scale_factor), &png_data)); 952 app, static_cast<arc::mojom::ScaleFactor>(scale_factor), &png_data));
947 WaitForIconReady(prefs, app_id, scale_factor); 953 WaitForIconReady(prefs, app_id, scale_factor);
948 EXPECT_TRUE(base::PathExists(app_path)); 954 EXPECT_TRUE(base::PathExists(app_path));
949 955
950 // Send empty app list. This will delete app and its folder. 956 // Send empty app list. This will delete app and its folder.
951 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>()); 957 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>());
952 // This cannot be WaitForIconReady since it needs to wait until the icon is 958 // This cannot be WaitForIconReady since it needs to wait until the icon is
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 1091
1086 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); 1092 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get());
1087 ASSERT_NE(nullptr, prefs); 1093 ASSERT_NE(nullptr, prefs);
1088 1094
1089 app_instance()->RefreshAppList(); 1095 app_instance()->RefreshAppList();
1090 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( 1096 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>(
1091 fake_apps().begin(), fake_apps().begin() + 1)); 1097 fake_apps().begin(), fake_apps().begin() + 1));
1092 content::BrowserThread::GetBlockingPool()->FlushForTesting(); 1098 content::BrowserThread::GetBlockingPool()->FlushForTesting();
1093 base::RunLoop().RunUntilIdle(); 1099 base::RunLoop().RunUntilIdle();
1094 1100
1095 // Store number of requests generated during the App List item creation. 1101 // Store number of requests generated during the App List item creation. Same
1102 // request will not be re-sent without clearing the request record in
1103 // ArcAppListPrefs.
1096 const size_t initial_icon_request_count = 1104 const size_t initial_icon_request_count =
1097 app_instance()->icon_requests().size(); 1105 app_instance()->icon_requests().size();
1098 1106
1099 std::vector<arc::mojom::ShortcutInfo> shortcuts = 1107 std::vector<arc::mojom::ShortcutInfo> shortcuts =
1100 arc_test()->fake_shortcuts(); 1108 arc_test()->fake_shortcuts();
1101 shortcuts.resize(1); 1109 shortcuts.resize(1);
1102 shortcuts[0].intent_uri += 1110 shortcuts[0].intent_uri +=
1103 ";S.org.chromium.arc.shelf_group_id=arc_test_shelf_group;end"; 1111 ";S.org.chromium.arc.shelf_group_id=arc_test_shelf_group;end";
1104 app_instance()->SendInstallShortcuts(shortcuts); 1112 app_instance()->SendInstallShortcuts(shortcuts);
1105 const std::string shortcut_id = ArcAppTest::GetAppId(shortcuts[0]); 1113 const std::string shortcut_id = ArcAppTest::GetAppId(shortcuts[0]);
(...skipping 17 matching lines...) Expand all
1123 base::RunLoop().RunUntilIdle(); 1131 base::RunLoop().RunUntilIdle();
1124 const size_t shortcut_request_cnt = 1132 const size_t shortcut_request_cnt =
1125 app_instance()->shortcut_icon_requests().size(); 1133 app_instance()->shortcut_icon_requests().size();
1126 EXPECT_NE(0U, shortcut_request_cnt); 1134 EXPECT_NE(0U, shortcut_request_cnt);
1127 EXPECT_EQ(initial_icon_request_count, app_instance()->icon_requests().size()); 1135 EXPECT_EQ(initial_icon_request_count, app_instance()->icon_requests().size());
1128 for (const auto& request : app_instance()->shortcut_icon_requests()) { 1136 for (const auto& request : app_instance()->shortcut_icon_requests()) {
1129 EXPECT_EQ(shortcuts[0].icon_resource_id, request->icon_resource_id()); 1137 EXPECT_EQ(shortcuts[0].icon_resource_id, request->icon_resource_id());
1130 } 1138 }
1131 1139
1132 // Fallback when shortcut is not found for shelf group id, use app id instead. 1140 // Fallback when shortcut is not found for shelf group id, use app id instead.
1141 // Remove the IconRequestRecord for |app_id| to observe the icon request for
1142 // |app_id| is re-sent.
1143 MaybeRemoveIconRequestRecord(app_id);
1133 icon_loader.FetchImage(id_shortcut_absent); 1144 icon_loader.FetchImage(id_shortcut_absent);
1134 EXPECT_EQ(2UL, delegate.update_image_cnt()); 1145 EXPECT_EQ(2UL, delegate.update_image_cnt());
1135 content::BrowserThread::GetBlockingPool()->FlushForTesting(); 1146 content::BrowserThread::GetBlockingPool()->FlushForTesting();
1136 base::RunLoop().RunUntilIdle(); 1147 base::RunLoop().RunUntilIdle();
1137 EXPECT_TRUE(app_instance()->icon_requests().size() > 1148 EXPECT_TRUE(app_instance()->icon_requests().size() >
1138 initial_icon_request_count); 1149 initial_icon_request_count);
1139 EXPECT_EQ(shortcut_request_cnt, 1150 EXPECT_EQ(shortcut_request_cnt,
1140 app_instance()->shortcut_icon_requests().size()); 1151 app_instance()->shortcut_icon_requests().size());
1141 for (size_t i = initial_icon_request_count; 1152 for (size_t i = initial_icon_request_count;
1142 i < app_instance()->icon_requests().size(); ++i) { 1153 i < app_instance()->icon_requests().size(); ++i) {
1143 const auto& request = app_instance()->icon_requests()[i]; 1154 const auto& request = app_instance()->icon_requests()[i];
1144 EXPECT_TRUE(request->IsForApp(app)); 1155 EXPECT_TRUE(request->IsForApp(app));
1145 } 1156 }
1146 } 1157 }
1147 1158
1159 // If the cached icon file is corrupted, we expect send request to ARC for a new
1160 // icon.
1161 TEST_P(ArcAppModelBuilderTest, IconLoaderWithBadIcon) {
1162 const arc::mojom::AppInfo& app = fake_apps()[0];
1163 const std::string app_id = ArcAppTest::GetAppId(app);
1164
1165 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get());
1166 ASSERT_NE(nullptr, prefs);
1167
1168 app_instance()->RefreshAppList();
1169 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>(
1170 fake_apps().begin(), fake_apps().begin() + 1));
1171 content::BrowserThread::GetBlockingPool()->FlushForTesting();
1172 base::RunLoop().RunUntilIdle();
1173
1174 // Store number of requests generated during the App List item creation. Same
1175 // request will not be re-sent without clearing the request record in
1176 // ArcAppListPrefs.
1177 const size_t initial_icon_request_count =
1178 app_instance()->icon_requests().size();
1179
1180 FakeAppIconLoaderDelegate delegate;
1181 ArcAppIconLoader icon_loader(profile(), app_list::kListIconSize, &delegate);
1182 icon_loader.FetchImage(app_id);
1183
1184 content::BrowserThread::GetBlockingPool()->FlushForTesting();
1185 base::RunLoop().RunUntilIdle();
1186 // Although icon file is still missing, expect no new request sent to ARC as
1187 // them are recorded in IconRequestRecord in ArcAppListPrefs.
1188 EXPECT_EQ(app_instance()->icon_requests().size(), initial_icon_request_count);
1189 // Validate default image.
1190 ValidateIcon(delegate.image());
1191
1192 MaybeRemoveIconRequestRecord(app_id);
1193
1194 // Install Bad image.
1195 const std::vector<ui::ScaleFactor>& scale_factors =
1196 ui::GetSupportedScaleFactors();
1197 ArcAppItem* app_item = FindArcItem(app_id);
1198 for (auto& scale_factor : scale_factors) {
1199 app_instance()->GenerateAndSendBadIcon(
1200 app, static_cast<arc::mojom::ScaleFactor>(scale_factor));
1201 const float scale = ui::GetScaleForScaleFactor(scale_factor);
1202 // Force the icon to be loaded.
1203 app_item->icon().GetRepresentation(scale);
1204 WaitForIconReady(prefs, app_id, scale_factor);
1205 }
1206 // After clear request record related to |app_id|, when bad icon is installed,
1207 // decoding failure will trigger re-sending new icon request to ARC.
1208 EXPECT_TRUE(app_instance()->icon_requests().size() >
1209 initial_icon_request_count);
1210 for (size_t i = initial_icon_request_count;
1211 i < app_instance()->icon_requests().size(); ++i) {
1212 const auto& request = app_instance()->icon_requests()[i];
1213 EXPECT_TRUE(request->IsForApp(app));
1214 }
1215 }
1216
1148 // TODO(crbug.com/628425) -- reenable once this test is less flaky. 1217 // TODO(crbug.com/628425) -- reenable once this test is less flaky.
1149 TEST_P(ArcAppModelBuilderTest, DISABLED_IconLoader) { 1218 TEST_P(ArcAppModelBuilderTest, DISABLED_IconLoader) {
1150 const arc::mojom::AppInfo& app = fake_apps()[0]; 1219 const arc::mojom::AppInfo& app = fake_apps()[0];
1151 const std::string app_id = ArcAppTest::GetAppId(app); 1220 const std::string app_id = ArcAppTest::GetAppId(app);
1152 1221
1153 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); 1222 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get());
1154 ASSERT_NE(nullptr, prefs); 1223 ASSERT_NE(nullptr, prefs);
1155 1224
1156 app_instance()->RefreshAppList(); 1225 app_instance()->RefreshAppList();
1157 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>( 1226 app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>(
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 ::testing::ValuesIn(kUnmanagedArcStates)); 1529 ::testing::ValuesIn(kUnmanagedArcStates));
1461 INSTANTIATE_TEST_CASE_P(, 1530 INSTANTIATE_TEST_CASE_P(,
1462 ArcDefaulAppForManagedUserTest, 1531 ArcDefaulAppForManagedUserTest,
1463 ::testing::ValuesIn(kManagedArcStates)); 1532 ::testing::ValuesIn(kManagedArcStates));
1464 INSTANTIATE_TEST_CASE_P(, 1533 INSTANTIATE_TEST_CASE_P(,
1465 ArcPlayStoreAppTest, 1534 ArcPlayStoreAppTest,
1466 ::testing::ValuesIn(kUnmanagedArcStates)); 1535 ::testing::ValuesIn(kUnmanagedArcStates));
1467 INSTANTIATE_TEST_CASE_P(, 1536 INSTANTIATE_TEST_CASE_P(,
1468 ArcAppModelBuilderRecreate, 1537 ArcAppModelBuilderRecreate,
1469 ::testing::ValuesIn(kUnmanagedArcStates)); 1538 ::testing::ValuesIn(kUnmanagedArcStates));
OLDNEW
« no previous file with comments | « chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc ('k') | components/arc/test/fake_app_instance.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698