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

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

Issue 2933783002: [Android WebAPK] Change WebAPK update into two phases (Closed)
Patch Set: Created 3 years, 6 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 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 // The package name of the downloaded WebAPK. 55 // The package name of the downloaded WebAPK.
56 const char* kDownloadedWebApkPackageName = "party.unicode"; 56 const char* kDownloadedWebApkPackageName = "party.unicode";
57 57
58 // WebApkInstaller subclass where 58 // WebApkInstaller subclass where
59 // WebApkInstaller::StartInstallingDownloadedWebApk() and 59 // WebApkInstaller::StartInstallingDownloadedWebApk() and
60 // WebApkInstaller::StartUpdateUsingDownloadedWebApk() and 60 // WebApkInstaller::StartUpdateUsingDownloadedWebApk() and
61 // WebApkInstaller::CanUseGooglePlayInstallService() and 61 // WebApkInstaller::CanUseGooglePlayInstallService() and
62 // WebApkInstaller::InstallOrUpdateWebApkFromGooglePlay() are stubbed out. 62 // WebApkInstaller::InstallOrUpdateWebApkFromGooglePlay() are stubbed out.
63 class TestWebApkInstaller : public WebApkInstaller { 63 class TestWebApkInstaller : public WebApkInstaller {
64 public: 64 public:
65 TestWebApkInstaller(content::BrowserContext* browser_context, 65 TestWebApkInstaller(content::BrowserContext* browser_context)
66 const ShortcutInfo& shortcut_info, 66 : WebApkInstaller(browser_context) {}
67 const SkBitmap& primary_icon,
68 const SkBitmap& badge_icon)
69 : WebApkInstaller(browser_context,
70 shortcut_info,
71 primary_icon,
72 badge_icon) {}
73 67
74 void InstallOrUpdateWebApk(const std::string& package_name, 68 void InstallOrUpdateWebApk(const std::string& package_name,
75 int version, 69 int version,
76 const std::string& token) override { 70 const std::string& token) override {
77 PostTaskToRunSuccessCallback(); 71 PostTaskToRunSuccessCallback();
78 } 72 }
79 73
80 void PostTaskToRunSuccessCallback() { 74 void PostTaskToRunSuccessCallback() {
81 base::ThreadTaskRunnerHandle::Get()->PostTask( 75 base::ThreadTaskRunnerHandle::Get()->PostTask(
82 FROM_HERE, 76 FROM_HERE,
(...skipping 11 matching lines...) Expand all
94 WebApkInstallerRunner(content::BrowserContext* browser_context, 88 WebApkInstallerRunner(content::BrowserContext* browser_context,
95 const GURL& best_primary_icon_url, 89 const GURL& best_primary_icon_url,
96 const GURL& best_badge_icon_url) 90 const GURL& best_badge_icon_url)
97 : browser_context_(browser_context), 91 : browser_context_(browser_context),
98 best_primary_icon_url_(best_primary_icon_url), 92 best_primary_icon_url_(best_primary_icon_url),
99 best_badge_icon_url_(best_badge_icon_url) {} 93 best_badge_icon_url_(best_badge_icon_url) {}
100 94
101 ~WebApkInstallerRunner() {} 95 ~WebApkInstallerRunner() {}
102 96
103 void RunInstallWebApk() { 97 void RunInstallWebApk() {
98 base::RunLoop run_loop;
99 on_completed_callback_ = run_loop.QuitClosure();
100
101 ShortcutInfo info(GURL::EmptyGURL());
dominickn 2017/06/14 00:14:23 Use GURL() (EmptyGURL() should only be used when y
pkotwicz 2017/06/15 02:25:20 Ok. This has to be ShortcutInfo info((GURL()));
102 info.best_primary_icon_url = best_primary_icon_url_;
103 info.best_badge_icon_url = best_badge_icon_url_;
104 WebApkInstaller::InstallAsyncForTesting( 104 WebApkInstaller::InstallAsyncForTesting(
105 CreateWebApkInstaller(), base::Bind(&WebApkInstallerRunner::OnCompleted, 105 CreateWebApkInstaller(), info, SkBitmap(), SkBitmap(),
106 base::Unretained(this))); 106 base::Bind(&WebApkInstallerRunner::OnCompleted,
107 Run(); 107 base::Unretained(this)));
108
109 run_loop.Run();
108 } 110 }
109 111
110 void RunUpdateWebApk() { 112 void RunUpdateWebApk(const std::string& serialized_proto) {
111 const int kWebApkVersion = 1; 113 base::RunLoop run_loop;
114 on_completed_callback_ = run_loop.QuitClosure();
112 115
113 std::map<std::string, std::string> icon_url_to_murmur2_hash{ 116 std::map<std::string, std::string> icon_url_to_murmur2_hash{
114 {best_primary_icon_url_.spec(), "0"}, 117 {best_primary_icon_url_.spec(), "0"},
115 {best_badge_icon_url_.spec(), "0"}}; 118 {best_badge_icon_url_.spec(), "0"}};
119 std::unique_ptr<std::vector<uint8_t>> serialized_proto_vector(
120 new std::vector<uint8_t>(serialized_proto.begin(),
dominickn 2017/06/14 00:14:23 base::MakeUnique
121 serialized_proto.end()));
116 122
117 WebApkInstaller::UpdateAsyncForTesting( 123 WebApkInstaller::UpdateAsyncForTesting(
118 CreateWebApkInstaller(), kDownloadedWebApkPackageName, kWebApkVersion, 124 CreateWebApkInstaller(), kDownloadedWebApkPackageName,
119 icon_url_to_murmur2_hash, false /* is_manifest_stale */, 125 GURL() /* start_url */, base::string16() /* short_name */,
126 std::move(serialized_proto_vector),
120 base::Bind(&WebApkInstallerRunner::OnCompleted, 127 base::Bind(&WebApkInstallerRunner::OnCompleted,
121 base::Unretained(this))); 128 base::Unretained(this)));
122 Run(); 129
130 run_loop.Run();
123 } 131 }
124 132
125 WebApkInstaller* CreateWebApkInstaller() { 133 WebApkInstaller* CreateWebApkInstaller() {
126 ShortcutInfo info(GURL::EmptyGURL());
127 info.best_primary_icon_url = best_primary_icon_url_;
128 info.best_badge_icon_url = best_badge_icon_url_;
129
130 // WebApkInstaller owns itself. 134 // WebApkInstaller owns itself.
131 WebApkInstaller* installer = 135 WebApkInstaller* installer = new TestWebApkInstaller(browser_context_);
132 new TestWebApkInstaller(browser_context_, info, SkBitmap(), SkBitmap());
133 installer->SetTimeoutMs(100); 136 installer->SetTimeoutMs(100);
134 return installer; 137 return installer;
135 } 138 }
136 139
137 void Run() {
138 base::RunLoop run_loop;
139 on_completed_callback_ = run_loop.QuitClosure();
140 run_loop.Run();
141 }
142
143 WebApkInstallResult result() { return result_; } 140 WebApkInstallResult result() { return result_; }
144 141
145 private: 142 private:
146 void OnCompleted(WebApkInstallResult result, 143 void OnCompleted(WebApkInstallResult result,
147 bool relax_updates, 144 bool relax_updates,
148 const std::string& webapk_package) { 145 const std::string& webapk_package) {
149 result_ = result; 146 result_ = result;
150 on_completed_callback_.Run(); 147 on_completed_callback_.Run();
151 } 148 }
152 149
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 205
209 base::RunLoop run_loop; 206 base::RunLoop run_loop;
210 on_completed_callback_ = run_loop.QuitClosure(); 207 on_completed_callback_ = run_loop.QuitClosure();
211 run_loop.Run(); 208 run_loop.Run();
212 } 209 }
213 210
214 webapk::WebApk* GetWebApkRequest() { return webapk_request_.get(); } 211 webapk::WebApk* GetWebApkRequest() { return webapk_request_.get(); }
215 212
216 private: 213 private:
217 // Called when the |webapk_request_| is populated. 214 // Called when the |webapk_request_| is populated.
218 void OnBuiltWebApkProto(std::unique_ptr<webapk::WebApk> webapk) { 215 void OnBuiltWebApkProto(
219 webapk_request_ = std::move(webapk); 216 std::unique_ptr<std::vector<uint8_t>> serialized_proto) {
217 webapk_request_.reset(new webapk::WebApk);
dominickn 2017/06/14 00:14:23 base::MakeUnique
218 webapk_request_->ParseFromArray(serialized_proto->data(),
219 serialized_proto->size());
220 on_completed_callback_.Run(); 220 on_completed_callback_.Run();
221 } 221 }
222 222
223 content::BrowserContext* browser_context_; 223 content::BrowserContext* browser_context_;
224 224
225 // The populated webapk::WebApk. 225 // The populated webapk::WebApk.
226 std::unique_ptr<webapk::WebApk> webapk_request_; 226 std::unique_ptr<webapk::WebApk> webapk_request_;
227 227
228 // Called after the |webapk_request_| is built. 228 // Called after the |webapk_request_| is built.
229 base::Closure on_completed_callback_; 229 base::Closure on_completed_callback_;
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 SetWebApkResponseBuilder(base::Bind(&BuildUnparsableWebApkResponse)); 381 SetWebApkResponseBuilder(base::Bind(&BuildUnparsableWebApkResponse));
382 382
383 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); 383 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
384 runner->RunInstallWebApk(); 384 runner->RunInstallWebApk();
385 EXPECT_EQ(WebApkInstallResult::FAILURE, runner->result()); 385 EXPECT_EQ(WebApkInstallResult::FAILURE, runner->result());
386 } 386 }
387 387
388 // Test update succeeding. 388 // Test update succeeding.
389 TEST_F(WebApkInstallerTest, UpdateSuccess) { 389 TEST_F(WebApkInstallerTest, UpdateSuccess) {
390 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); 390 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
391 runner->RunUpdateWebApk(); 391 runner->RunUpdateWebApk("non-empty");
392 EXPECT_EQ(WebApkInstallResult::SUCCESS, runner->result()); 392 EXPECT_EQ(WebApkInstallResult::SUCCESS, runner->result());
393 } 393 }
394 394
395 // Test that an update suceeds if the WebAPK server returns a HTTP response with 395 // Test that an update suceeds if the WebAPK server returns a HTTP response with
396 // an empty token. The WebAPK server sends an empty download URL when: 396 // an empty token. The WebAPK server sends an empty download URL when:
397 // - The server is unable to update the WebAPK in the way that the client 397 // - The server is unable to update the WebAPK in the way that the client
398 // requested. 398 // requested.
399 // AND 399 // AND
400 // - The most up to date version of the WebAPK on the server is identical to the 400 // - The most up to date version of the WebAPK on the server is identical to the
401 // one installed on the client. 401 // one installed on the client.
402 TEST_F(WebApkInstallerTest, UpdateSuccessWithEmptyDownloadUrlInResponse) { 402 TEST_F(WebApkInstallerTest, UpdateSuccessWithEmptyDownloadUrlInResponse) {
403 SetWebApkResponseBuilder(base::Bind(&BuildValidWebApkResponse, "")); 403 SetWebApkResponseBuilder(base::Bind(&BuildValidWebApkResponse, ""));
404 404
405 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); 405 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
406 runner->RunUpdateWebApk(); 406 runner->RunUpdateWebApk("non-empty");
407 EXPECT_EQ(WebApkInstallResult::SUCCESS, runner->result()); 407 EXPECT_EQ(WebApkInstallResult::SUCCESS, runner->result());
408 } 408 }
409 409
410 // Test that an update fails if an empty proto is passed to UpdateAsync().
411 TEST_F(WebApkInstallerTest, UpdateFailsEmptyProto) {
412 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
413 runner->RunUpdateWebApk("");
414 EXPECT_EQ(WebApkInstallResult::FAILURE, runner->result());
415 }
416
410 // When there is no Web Manifest available for a site, an empty 417 // When there is no Web Manifest available for a site, an empty
411 // |best_primary_icon_url| is used to build a WebApk update request. Tests the 418 // |best_primary_icon_url| is used to build a WebApk update request. Tests the
412 // request can be built properly. 419 // request can be built properly.
413 TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsObsolete) { 420 TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsObsolete) {
414 std::string icon_url_1 = test_server()->GetURL("/icon1.png").spec(); 421 std::string icon_url_1 = test_server()->GetURL("/icon1.png").spec();
415 std::string icon_url_2 = test_server()->GetURL("/icon2.png").spec(); 422 std::string icon_url_2 = test_server()->GetURL("/icon2.png").spec();
416 std::map<std::string, std::string> icon_url_to_murmur2_hash; 423 std::map<std::string, std::string> icon_url_to_murmur2_hash;
417 icon_url_to_murmur2_hash[icon_url_1] = "1"; 424 icon_url_to_murmur2_hash[icon_url_1] = "1";
418 icon_url_to_murmur2_hash[icon_url_2] = "2"; 425 icon_url_to_murmur2_hash[icon_url_2] = "2";
419 426
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 EXPECT_FALSE(icons[0].has_image_data()); 527 EXPECT_FALSE(icons[0].has_image_data());
521 528
522 // Check protobuf fields for kBestPrimaryIconUrl. 529 // Check protobuf fields for kBestPrimaryIconUrl.
523 EXPECT_EQ(best_icon_url, icons[1].src()); 530 EXPECT_EQ(best_icon_url, icons[1].src());
524 EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url], icons[1].hash()); 531 EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url], icons[1].hash());
525 EXPECT_THAT(icons[1].usages(), 532 EXPECT_THAT(icons[1].usages(),
526 testing::ElementsAre(webapk::Image::PRIMARY_ICON, 533 testing::ElementsAre(webapk::Image::PRIMARY_ICON,
527 webapk::Image::BADGE_ICON)); 534 webapk::Image::BADGE_ICON));
528 EXPECT_TRUE(icons[1].has_image_data()); 535 EXPECT_TRUE(icons[1].has_image_data());
529 } 536 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698