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

Side by Side Diff: chrome/browser/android/webapk/webapk_installer_unittest.cc

Issue 2528073002: Add a flag in WebAPK's proto when the Web App Manifest is no longer available. (Closed)
Patch Set: Nits. Created 4 years 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 "chrome/browser/android/webapk/webapk_installer.h" 5 #include "chrome/browser/android/webapk/webapk_installer.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 #include <memory> 8 #include <memory>
9 #include <string> 9 #include <string>
10 10
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 url_request_context_getter_.get(), 124 url_request_context_getter_.get(),
125 base::Bind(&WebApkInstallerRunner::OnCompleted, 125 base::Bind(&WebApkInstallerRunner::OnCompleted,
126 base::Unretained(this))); 126 base::Unretained(this)));
127 Run(); 127 Run();
128 } 128 }
129 129
130 void RunUpdateWebApk() { 130 void RunUpdateWebApk() {
131 const std::string kIconMurmur2Hash = "0"; 131 const std::string kIconMurmur2Hash = "0";
132 const int kWebApkVersion = 1; 132 const int kWebApkVersion = 1;
133 133
134 WebApkInstaller* installer = CreateWebApkInstaller(); 134 WebApkInstaller* installer = CreateWebApkInstaller();
dominickn 2016/12/20 05:05:49 Minor nit: remove this line, and just do CreateWeb
Xi Han 2016/12/20 20:25:10 Done.
135 std::map<std::string, std::string> icon_url_to_murmur2_hash_map;
dominickn 2016/12/20 05:05:49 icon_url_to_murmur2_map (std::map is not a hash ma
Xi Han 2016/12/20 20:25:10 same.
136 icon_url_to_murmur2_hash_map[best_icon_url_.spec()] = kIconMurmur2Hash;
dominickn 2016/12/20 05:05:49 can this be std::map<std::string, std::string> ic
Xi Han 2016/12/20 20:25:10 Done.
135 137
136 installer->UpdateAsyncWithURLRequestContextGetter( 138 installer->UpdateAsyncWithURLRequestContextGetter(
137 url_request_context_getter_.get(), 139 url_request_context_getter_.get(),
138 base::Bind(&WebApkInstallerRunner::OnCompleted, base::Unretained(this)), 140 base::Bind(&WebApkInstallerRunner::OnCompleted, base::Unretained(this)),
139 kIconMurmur2Hash,
140 kDownloadedWebApkPackageName, 141 kDownloadedWebApkPackageName,
141 kWebApkVersion); 142 kWebApkVersion,
143 false /* stale_manifest */,
dominickn 2016/12/20 05:05:49 is_manifest_stale
Xi Han 2016/12/20 20:25:09 Done.
144 icon_url_to_murmur2_hash_map);
142 145
143 Run(); 146 Run();
144 } 147 }
145 148
146 WebApkInstaller* CreateWebApkInstaller() { 149 WebApkInstaller* CreateWebApkInstaller() {
147 ShortcutInfo info(GURL::EmptyGURL()); 150 ShortcutInfo info(GURL::EmptyGURL());
148 info.best_icon_url = best_icon_url_; 151 info.best_icon_url = best_icon_url_;
149 152
150 // WebApkInstaller owns itself. 153 // WebApkInstaller owns itself.
151 WebApkInstaller* installer = new TestWebApkInstaller( 154 WebApkInstaller* installer = new TestWebApkInstaller(
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 std::string response_content; 200 std::string response_content;
198 response_proto->SerializeToString(&response_content); 201 response_proto->SerializeToString(&response_content);
199 202
200 std::unique_ptr<net::test_server::BasicHttpResponse> response( 203 std::unique_ptr<net::test_server::BasicHttpResponse> response(
201 new net::test_server::BasicHttpResponse()); 204 new net::test_server::BasicHttpResponse());
202 response->set_code(net::HTTP_OK); 205 response->set_code(net::HTTP_OK);
203 response->set_content(response_content); 206 response->set_content(response_content);
204 return std::move(response); 207 return std::move(response);
205 } 208 }
206 209
210 // Builds WebApk proto and blocks till done.
211 class BuildProtoRunner {
212 public:
213 BuildProtoRunner() {}
214
215 ~BuildProtoRunner() {}
216
217 void BuildSync(
218 const GURL& best_icon_url,
219 bool stale_manifest,
220 const std::map<std::string, std::string>& icon_url_to_murmur2_hash_map) {
221 ShortcutInfo info(GURL::EmptyGURL());
222 info.best_icon_url = best_icon_url;
223
224 // WebApkInstaller owns itself.
225 WebApkInstaller* installer =
226 new TestWebApkInstaller(info, SkBitmap(), false);
227 installer->SetTimeoutMs(100);
pkotwicz 2016/12/19 23:04:31 Nit: You don't need to set a timeout
Xi Han 2016/12/20 20:25:09 Done.
228 installer->BuildWebApkProtoInBackgroundForTesting(
229 base::Bind(&BuildProtoRunner::OnBuiltWebApkProto,
230 base::Unretained(this)),
231 stale_manifest,
232 icon_url_to_murmur2_hash_map);
233
234 base::RunLoop run_loop;
235 on_completed_callback_ = run_loop.QuitClosure();
236 run_loop.Run();
237 }
238
239 webapk::WebApk* GetWebApkRequest() { return webapk_request_.get(); }
240
241 private:
242 // Called when the |webapk| request is populated.
pkotwicz 2016/12/19 23:04:31 |webapk| request -> |webapk_request_| We use '||'
Xi Han 2016/12/20 20:25:10 Done.
243 void OnBuiltWebApkProto(std::unique_ptr<webapk::WebApk> webapk) {
244 webapk_request_ = std::move(webapk);
245 on_completed_callback_.Run();
246 }
247
248 // The populated webapk::WebApk.
249 std::unique_ptr<webapk::WebApk> webapk_request_;
250
251 // Called after the installation process has succeeded or failed.
pkotwicz 2016/12/19 23:04:31 Please update this comment :)
Xi Han 2016/12/20 20:25:10 Done.
252 base::Closure on_completed_callback_;
253
254 DISALLOW_COPY_AND_ASSIGN(BuildProtoRunner);
255 };
256
207 } // anonymous namespace 257 } // anonymous namespace
208 258
209 class WebApkInstallerTest : public ::testing::Test { 259 class WebApkInstallerTest : public ::testing::Test {
210 public: 260 public:
211 typedef base::Callback<std::unique_ptr<net::test_server::HttpResponse>(void)> 261 typedef base::Callback<std::unique_ptr<net::test_server::HttpResponse>(void)>
212 WebApkResponseBuilder; 262 WebApkResponseBuilder;
213 263
214 WebApkInstallerTest() 264 WebApkInstallerTest()
215 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} 265 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
216 ~WebApkInstallerTest() override {} 266 ~WebApkInstallerTest() override {}
(...skipping 24 matching lines...) Expand all
241 // WebAPK creation request. 291 // WebAPK creation request.
242 void SetWebApkResponseBuilder(const WebApkResponseBuilder& builder) { 292 void SetWebApkResponseBuilder(const WebApkResponseBuilder& builder) {
243 webapk_response_builder_ = builder; 293 webapk_response_builder_ = builder;
244 } 294 }
245 295
246 std::unique_ptr<WebApkInstallerRunner> CreateWebApkInstallerRunner() { 296 std::unique_ptr<WebApkInstallerRunner> CreateWebApkInstallerRunner() {
247 return std::unique_ptr<WebApkInstallerRunner>( 297 return std::unique_ptr<WebApkInstallerRunner>(
248 new WebApkInstallerRunner(best_icon_url_)); 298 new WebApkInstallerRunner(best_icon_url_));
249 } 299 }
250 300
301 std::unique_ptr<BuildProtoRunner> CreateBuildProtoRunner() {
302 return std::unique_ptr<BuildProtoRunner>(new BuildProtoRunner());
303 }
304
251 net::test_server::EmbeddedTestServer* test_server() { return &test_server_; } 305 net::test_server::EmbeddedTestServer* test_server() { return &test_server_; }
252 306
253 private: 307 private:
254 // Sets default configuration for running WebApkInstaller. 308 // Sets default configuration for running WebApkInstaller.
255 void SetDefaults() { 309 void SetDefaults() {
256 GURL best_icon_url = test_server_.GetURL(kBestIconUrl); 310 GURL best_icon_url = test_server_.GetURL(kBestIconUrl);
257 SetBestIconUrl(best_icon_url); 311 SetBestIconUrl(best_icon_url);
258 GURL server_url = test_server_.GetURL(kServerUrl); 312 GURL server_url = test_server_.GetURL(kServerUrl);
259 SetWebApkServerUrl(server_url); 313 SetWebApkServerUrl(server_url);
260 GURL download_url = test_server_.GetURL(kDownloadUrl); 314 GURL download_url = test_server_.GetURL(kDownloadUrl);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 EXPECT_TRUE(runner->success()); 415 EXPECT_TRUE(runner->success());
362 } 416 }
363 417
364 // Test installation succeeds using Google Play. 418 // Test installation succeeds using Google Play.
365 TEST_F(WebApkInstallerTest, InstallFromGooglePlaySuccess) { 419 TEST_F(WebApkInstallerTest, InstallFromGooglePlaySuccess) {
366 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); 420 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
367 runner->SetHasGooglePlayWebApkInstallDelegate(true); 421 runner->SetHasGooglePlayWebApkInstallDelegate(true);
368 runner->RunInstallWebApk(); 422 runner->RunInstallWebApk();
369 EXPECT_TRUE(runner->success()); 423 EXPECT_TRUE(runner->success());
370 } 424 }
425
426 // When there is no Web Manifest available for a site, an empty |best_icon_url|
427 // is used to build a WebApk update request. Tests the request can be built
428 // properly.
429 TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsObsolete) {
430 GURL icon_url_1 = test_server()->GetURL("/icon1.png");
431 GURL icon_url_2 = test_server()->GetURL("/icon2.png");
432 std::string icon_murmur2_hash_1 = "1";
433 std::string icon_murmur2_hash_2 = "2";
434 std::map<std::string, std::string> icon_url_to_murmur2_hash_map;
435 icon_url_to_murmur2_hash_map[icon_url_1.spec()] = icon_murmur2_hash_1;
436 icon_url_to_murmur2_hash_map[icon_url_2.spec()] = icon_murmur2_hash_2;
437
438 std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
439 runner->BuildSync(GURL(""), true, icon_url_to_murmur2_hash_map);
440 webapk::WebApk* webapk_request = runner->GetWebApkRequest();
441 ASSERT_NE(nullptr, webapk_request);
442
443 webapk::WebAppManifest manifest = webapk_request->manifest();
444 ASSERT_EQ(3, manifest.icons_size());
445
446 webapk::Image icons[3];
447 for (int i = 0; i < 3; ++i)
448 icons[i] = manifest.icons(i);
449
450 EXPECT_EQ("", icons[0].src());
451 EXPECT_FALSE(icons[0].has_hash());
452 EXPECT_TRUE(icons[0].has_image_data());
453
454 EXPECT_EQ(icon_url_1.spec(), icons[1].src());
455 EXPECT_EQ(icon_murmur2_hash_1, icons[1].hash());
456 EXPECT_FALSE(icons[1].has_image_data());
457
458 EXPECT_EQ(icon_url_2.spec(), icons[2].src());
459 EXPECT_EQ(icon_murmur2_hash_2, icons[2].hash());
460 EXPECT_FALSE(icons[2].has_image_data());
461 }
462
463 // Tests a WebApk install or update request is built properly when the Chrome
464 // knows the best icon URL of a site after fetching its Web Manifest.
465 TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsAvailable) {
466 GURL icon_url_1 = test_server()->GetURL("/icon.png");
467 GURL best_icon_url = test_server()->GetURL(kBestIconUrl);
468 std::string icon_murmur2_hash_1 = "1";
469 std::string best_icon_murmur2_hash = "0";
470 std::map<std::string, std::string> icon_url_to_murmur2_hash_map;
471 icon_url_to_murmur2_hash_map[icon_url_1.spec()] = icon_murmur2_hash_1;
472 icon_url_to_murmur2_hash_map[best_icon_url.spec()] =
473 best_icon_murmur2_hash;
474
475 std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
476 runner->BuildSync(best_icon_url, false, icon_url_to_murmur2_hash_map);
477 webapk::WebApk* webapk_request = runner->GetWebApkRequest();
478 ASSERT_NE(nullptr, webapk_request);
479
480 webapk::WebAppManifest manifest = webapk_request->manifest();
481 ASSERT_EQ(2, manifest.icons_size());
482
483 webapk::Image icons[2];
484 for (int i = 0; i < 2; ++i)
485 icons[i] = manifest.icons(i);
486
487 EXPECT_EQ(best_icon_url.spec(), icons[0].src());
488 EXPECT_EQ(best_icon_murmur2_hash, icons[0].hash());
489 EXPECT_TRUE(icons[0].has_image_data());
490
491 EXPECT_EQ(icon_url_1.spec(), icons[1].src());
492 EXPECT_EQ(icon_murmur2_hash_1, icons[1].hash());
493 EXPECT_FALSE(icons[1].has_image_data());
494 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698