| Index: chrome/browser/android/webapk/webapk_installer_unittest.cc
|
| diff --git a/chrome/browser/android/webapk/webapk_installer_unittest.cc b/chrome/browser/android/webapk/webapk_installer_unittest.cc
|
| index cad81032ce3cd2c39f8072b7e9f1b5f5d7b5dc58..bd885d498affcd39b4e5222b8af6d3dc4f2e686e 100644
|
| --- a/chrome/browser/android/webapk/webapk_installer_unittest.cc
|
| +++ b/chrome/browser/android/webapk/webapk_installer_unittest.cc
|
| @@ -28,6 +28,7 @@
|
| #include "net/test/embedded_test_server/http_request.h"
|
| #include "net/test/embedded_test_server/http_response.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| #include "url/gurl.h"
|
| @@ -40,10 +41,11 @@ const base::FilePath::CharType kTestDataDir[] =
|
| // URL of mock WebAPK server.
|
| const char* kServerUrl = "/webapkserver/";
|
|
|
| -// The best primary icon URL from Web Manifest. We use a random file in the test
|
| +// The URLs of best icons from Web Manifest. We use a random file in the test
|
| // data directory. Since WebApkInstaller does not try to decode the file as an
|
| // image it is OK that the file is not an image.
|
| const char* kBestPrimaryIconUrl = "/simple.html";
|
| +const char* kBestBadgeIconUrl = "/nostore.html";
|
|
|
| // URL of file to download from the WebAPK server. We use a random file in the
|
| // test data directory.
|
| @@ -61,9 +63,13 @@ class TestWebApkInstaller : public WebApkInstaller {
|
| public:
|
| TestWebApkInstaller(content::BrowserContext* browser_context,
|
| const ShortcutInfo& shortcut_info,
|
| - const SkBitmap& shortcut_icon,
|
| + const SkBitmap& primary_icon,
|
| + const SkBitmap& badge_icon,
|
| bool can_install_webapks)
|
| - : WebApkInstaller(browser_context, shortcut_info, shortcut_icon),
|
| + : WebApkInstaller(browser_context,
|
| + shortcut_info,
|
| + primary_icon,
|
| + badge_icon),
|
| can_install_webapks_(can_install_webapks) {}
|
|
|
| bool CanInstallWebApks() override { return can_install_webapks_; }
|
| @@ -93,9 +99,11 @@ class TestWebApkInstaller : public WebApkInstaller {
|
| class WebApkInstallerRunner {
|
| public:
|
| WebApkInstallerRunner(content::BrowserContext* browser_context,
|
| - const GURL& best_primary_icon_url)
|
| + const GURL& best_primary_icon_url,
|
| + const GURL& best_badge_icon_url)
|
| : browser_context_(browser_context),
|
| best_primary_icon_url_(best_primary_icon_url),
|
| + best_badge_icon_url_(best_badge_icon_url),
|
| can_install_webapks_(true) {}
|
|
|
| ~WebApkInstallerRunner() {}
|
| @@ -115,7 +123,8 @@ class WebApkInstallerRunner {
|
| const int kWebApkVersion = 1;
|
|
|
| std::map<std::string, std::string> icon_url_to_murmur2_hash{
|
| - {best_primary_icon_url_.spec(), "0"}};
|
| + {best_primary_icon_url_.spec(), "0"},
|
| + {best_badge_icon_url_.spec(), "0"}};
|
|
|
| WebApkInstaller::UpdateAsyncForTesting(
|
| CreateWebApkInstaller(), kDownloadedWebApkPackageName, kWebApkVersion,
|
| @@ -128,10 +137,11 @@ class WebApkInstallerRunner {
|
| WebApkInstaller* CreateWebApkInstaller() {
|
| ShortcutInfo info(GURL::EmptyGURL());
|
| info.best_primary_icon_url = best_primary_icon_url_;
|
| + info.best_badge_icon_url = best_badge_icon_url_;
|
|
|
| // WebApkInstaller owns itself.
|
| WebApkInstaller* installer = new TestWebApkInstaller(
|
| - browser_context_, info, SkBitmap(), can_install_webapks_);
|
| + browser_context_, info, SkBitmap(), SkBitmap(), can_install_webapks_);
|
| installer->SetTimeoutMs(100);
|
| return installer;
|
| }
|
| @@ -154,8 +164,9 @@ class WebApkInstallerRunner {
|
|
|
| content::BrowserContext* browser_context_;
|
|
|
| - // The Web Manifest's icon URL.
|
| + // The Web Manifest's icon URLs.
|
| const GURL best_primary_icon_url_;
|
| + const GURL best_badge_icon_url_;
|
|
|
| // Called after the installation process has succeeded or failed.
|
| base::Closure on_completed_callback_;
|
| @@ -197,14 +208,16 @@ class BuildProtoRunner {
|
|
|
| void BuildSync(
|
| const GURL& best_primary_icon_url,
|
| + const GURL& best_badge_icon_url,
|
| const std::map<std::string, std::string>& icon_url_to_murmur2_hash,
|
| bool is_manifest_stale) {
|
| ShortcutInfo info(GURL::EmptyGURL());
|
| info.best_primary_icon_url = best_primary_icon_url;
|
| + info.best_badge_icon_url = best_badge_icon_url;
|
|
|
| // WebApkInstaller owns itself.
|
| - WebApkInstaller* installer =
|
| - new TestWebApkInstaller(browser_context_, info, SkBitmap(), false);
|
| + WebApkInstaller* installer = new TestWebApkInstaller(
|
| + browser_context_, info, SkBitmap(), SkBitmap(), false);
|
| installer->BuildWebApkProtoInBackgroundForTesting(
|
| base::Bind(&BuildProtoRunner::OnBuiltWebApkProto,
|
| base::Unretained(this)),
|
| @@ -267,6 +280,11 @@ class WebApkInstallerTest : public ::testing::Test {
|
| best_primary_icon_url_ = best_primary_icon_url;
|
| }
|
|
|
| + // Sets the best Web Manifest's badge icon URL.
|
| + void SetBestBadgeIconUrl(const GURL& best_badge_icon_url) {
|
| + best_badge_icon_url_ = best_badge_icon_url;
|
| + }
|
| +
|
| // Sets the URL to send the webapk::CreateWebApkRequest to. WebApkInstaller
|
| // should fail if the URL is not |kServerUrl|.
|
| void SetWebApkServerUrl(const GURL& server_url) {
|
| @@ -281,8 +299,8 @@ class WebApkInstallerTest : public ::testing::Test {
|
| }
|
|
|
| std::unique_ptr<WebApkInstallerRunner> CreateWebApkInstallerRunner() {
|
| - return std::unique_ptr<WebApkInstallerRunner>(
|
| - new WebApkInstallerRunner(profile_.get(), best_primary_icon_url_));
|
| + return std::unique_ptr<WebApkInstallerRunner>(new WebApkInstallerRunner(
|
| + profile_.get(), best_primary_icon_url_, best_badge_icon_url_));
|
| }
|
|
|
| std::unique_ptr<BuildProtoRunner> CreateBuildProtoRunner() {
|
| @@ -295,13 +313,11 @@ class WebApkInstallerTest : public ::testing::Test {
|
| private:
|
| // Sets default configuration for running WebApkInstaller.
|
| void SetDefaults() {
|
| - GURL best_primary_icon_url = test_server_.GetURL(kBestPrimaryIconUrl);
|
| - SetBestPrimaryIconUrl(best_primary_icon_url);
|
| - GURL server_url = test_server_.GetURL(kServerUrl);
|
| - SetWebApkServerUrl(server_url);
|
| - GURL download_url = test_server_.GetURL(kDownloadUrl);
|
| - SetWebApkResponseBuilder(
|
| - base::Bind(&BuildValidWebApkResponse, download_url));
|
| + SetBestPrimaryIconUrl(test_server_.GetURL(kBestPrimaryIconUrl));
|
| + SetBestBadgeIconUrl(test_server_.GetURL(kBestBadgeIconUrl));
|
| + SetWebApkServerUrl(test_server_.GetURL(kServerUrl));
|
| + SetWebApkResponseBuilder(base::Bind(&BuildValidWebApkResponse,
|
| + test_server_.GetURL(kDownloadUrl)));
|
| }
|
|
|
| std::unique_ptr<net::test_server::HttpResponse> HandleWebApkRequest(
|
| @@ -315,8 +331,9 @@ class WebApkInstallerTest : public ::testing::Test {
|
| content::TestBrowserThreadBundle thread_bundle_;
|
| net::EmbeddedTestServer test_server_;
|
|
|
| - // Web Manifest's icon URL.
|
| + // Web Manifest's icon URLs.
|
| GURL best_primary_icon_url_;
|
| + GURL best_badge_icon_url_;
|
|
|
| // Builds response to the WebAPK creation request.
|
| WebApkResponseBuilder webapk_response_builder_;
|
| @@ -335,8 +352,18 @@ TEST_F(WebApkInstallerTest, Success) {
|
| // URL times out. In a perfect world the fetch would never time out because the
|
| // bitmap at the best primary icon URL should be in the HTTP cache.
|
| TEST_F(WebApkInstallerTest, BestPrimaryIconUrlDownloadTimesOut) {
|
| - GURL best_primary_icon_url = test_server()->GetURL("/slow?1000");
|
| - SetBestPrimaryIconUrl(best_primary_icon_url);
|
| + SetBestPrimaryIconUrl(test_server()->GetURL("/slow?1000"));
|
| +
|
| + std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
|
| + runner->RunInstallWebApk();
|
| + EXPECT_EQ(WebApkInstallResult::FAILURE, runner->result());
|
| +}
|
| +
|
| +// Test that installation fails if fetching the bitmap at the best badge icon
|
| +// URL times out. In a perfect world the fetch would never time out because the
|
| +// bitmap at the best badge icon URL should be in the HTTP cache.
|
| +TEST_F(WebApkInstallerTest, BestBadgeIconUrlDownloadTimesOut) {
|
| + SetBestBadgeIconUrl(test_server()->GetURL("/slow?1000"));
|
|
|
| std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
|
| runner->RunInstallWebApk();
|
| @@ -345,8 +372,7 @@ TEST_F(WebApkInstallerTest, BestPrimaryIconUrlDownloadTimesOut) {
|
|
|
| // Test that installation fails if the WebAPK creation request times out.
|
| TEST_F(WebApkInstallerTest, CreateWebApkRequestTimesOut) {
|
| - GURL server_url = test_server()->GetURL("/slow?1000");
|
| - SetWebApkServerUrl(server_url);
|
| + SetWebApkServerUrl(test_server()->GetURL("/slow?1000"));
|
|
|
| std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner();
|
| runner->RunInstallWebApk();
|
| @@ -403,16 +429,14 @@ TEST_F(WebApkInstallerTest, UpdateSuccessWithEmptyDownloadUrlInResponse) {
|
| // |best_primary_icon_url| is used to build a WebApk update request. Tests the
|
| // request can be built properly.
|
| TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsObsolete) {
|
| - GURL icon_url_1 = test_server()->GetURL("/icon1.png");
|
| - GURL icon_url_2 = test_server()->GetURL("/icon2.png");
|
| - std::string icon_murmur2_hash_1 = "1";
|
| - std::string icon_murmur2_hash_2 = "2";
|
| + std::string icon_url_1 = test_server()->GetURL("/icon1.png").spec();
|
| + std::string icon_url_2 = test_server()->GetURL("/icon2.png").spec();
|
| std::map<std::string, std::string> icon_url_to_murmur2_hash;
|
| - icon_url_to_murmur2_hash[icon_url_1.spec()] = icon_murmur2_hash_1;
|
| - icon_url_to_murmur2_hash[icon_url_2.spec()] = icon_murmur2_hash_2;
|
| + icon_url_to_murmur2_hash[icon_url_1] = "1";
|
| + icon_url_to_murmur2_hash[icon_url_2] = "2";
|
|
|
| std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
|
| - runner->BuildSync(GURL(""), icon_url_to_murmur2_hash,
|
| + runner->BuildSync(GURL(), GURL(), icon_url_to_murmur2_hash,
|
| true /* is_manifest_stale*/);
|
| webapk::WebApk* webapk_request = runner->GetWebApkRequest();
|
| ASSERT_NE(nullptr, webapk_request);
|
| @@ -428,30 +452,75 @@ TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsObsolete) {
|
| EXPECT_FALSE(icons[0].has_hash());
|
| EXPECT_TRUE(icons[0].has_image_data());
|
|
|
| - EXPECT_EQ(icon_url_1.spec(), icons[1].src());
|
| - EXPECT_EQ(icon_murmur2_hash_1, icons[1].hash());
|
| + EXPECT_EQ(icon_url_1, icons[1].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[icon_url_1], icons[1].hash());
|
| EXPECT_FALSE(icons[1].has_image_data());
|
|
|
| - EXPECT_EQ(icon_url_2.spec(), icons[2].src());
|
| - EXPECT_EQ(icon_murmur2_hash_2, icons[2].hash());
|
| + EXPECT_EQ(icon_url_2, icons[2].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[icon_url_2], icons[2].hash());
|
| EXPECT_FALSE(icons[2].has_image_data());
|
| }
|
|
|
| // Tests a WebApk install or update request is built properly when the Chrome
|
| // knows the best icon URL of a site after fetching its Web Manifest.
|
| TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsAvailable) {
|
| - GURL icon_url_1 = test_server()->GetURL("/icon.png");
|
| - GURL best_primary_icon_url = test_server()->GetURL(kBestPrimaryIconUrl);
|
| - std::string icon_murmur2_hash_1 = "1";
|
| - std::string best_primary_icon_murmur2_hash = "0";
|
| + std::string icon_url_1 = test_server()->GetURL("/icon.png").spec();
|
| + std::string best_primary_icon_url =
|
| + test_server()->GetURL(kBestPrimaryIconUrl).spec();
|
| + std::string best_badge_icon_url =
|
| + test_server()->GetURL(kBestBadgeIconUrl).spec();
|
| std::map<std::string, std::string> icon_url_to_murmur2_hash;
|
| - icon_url_to_murmur2_hash[icon_url_1.spec()] = icon_murmur2_hash_1;
|
| - icon_url_to_murmur2_hash[best_primary_icon_url.spec()] =
|
| - best_primary_icon_murmur2_hash;
|
| + icon_url_to_murmur2_hash[icon_url_1] = "0";
|
| + icon_url_to_murmur2_hash[best_primary_icon_url] = "1";
|
| + icon_url_to_murmur2_hash[best_badge_icon_url] = "2";
|
|
|
| std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
|
| - runner->BuildSync(best_primary_icon_url, icon_url_to_murmur2_hash,
|
| - false /* is_manifest_stale*/);
|
| + runner->BuildSync(GURL(best_primary_icon_url), GURL(best_badge_icon_url),
|
| + icon_url_to_murmur2_hash, false /* is_manifest_stale*/);
|
| + webapk::WebApk* webapk_request = runner->GetWebApkRequest();
|
| + ASSERT_NE(nullptr, webapk_request);
|
| +
|
| + webapk::WebAppManifest manifest = webapk_request->manifest();
|
| + ASSERT_EQ(3, manifest.icons_size());
|
| +
|
| + webapk::Image icons[3];
|
| + for (int i = 0; i < 3; ++i)
|
| + icons[i] = manifest.icons(i);
|
| +
|
| + // Check protobuf fields for /icon.png.
|
| + EXPECT_EQ(icon_url_1, icons[0].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[icon_url_1], icons[0].hash());
|
| + EXPECT_EQ(0, icons[0].usages_size());
|
| + EXPECT_FALSE(icons[0].has_image_data());
|
| +
|
| + // Check protobuf fields for kBestBadgeIconUrl.
|
| + EXPECT_EQ(best_badge_icon_url, icons[1].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[best_badge_icon_url], icons[1].hash());
|
| + EXPECT_THAT(icons[1].usages(),
|
| + testing::ElementsAre(webapk::Image::BADGE_ICON));
|
| + EXPECT_TRUE(icons[1].has_image_data());
|
| +
|
| + // Check protobuf fields for kBestPrimaryIconUrl.
|
| + EXPECT_EQ(best_primary_icon_url, icons[2].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[best_primary_icon_url], icons[2].hash());
|
| + EXPECT_THAT(icons[2].usages(),
|
| + testing::ElementsAre(webapk::Image::PRIMARY_ICON));
|
| + EXPECT_TRUE(icons[2].has_image_data());
|
| +}
|
| +
|
| +// Tests a WebApk install or update request is built properly when the Chrome
|
| +// knows the best icon URL of a site after fetching its Web Manifest, and
|
| +// primary icon and badge icon share the same URL.
|
| +TEST_F(WebApkInstallerTest, BuildWebApkProtoPrimaryIconAndBadgeIconSameUrl) {
|
| + std::string icon_url_1 = test_server()->GetURL("/icon.png").spec();
|
| + std::string best_icon_url = test_server()->GetURL(kBestPrimaryIconUrl).spec();
|
| + std::map<std::string, std::string> icon_url_to_murmur2_hash;
|
| + icon_url_to_murmur2_hash[icon_url_1] = "1";
|
| + icon_url_to_murmur2_hash[best_icon_url] = "0";
|
| +
|
| + std::unique_ptr<BuildProtoRunner> runner = CreateBuildProtoRunner();
|
| + runner->BuildSync(GURL(best_icon_url), GURL(best_icon_url),
|
| + icon_url_to_murmur2_hash, false /* is_manifest_stale*/);
|
| webapk::WebApk* webapk_request = runner->GetWebApkRequest();
|
| ASSERT_NE(nullptr, webapk_request);
|
|
|
| @@ -462,13 +531,19 @@ TEST_F(WebApkInstallerTest, BuildWebApkProtoWhenManifestIsAvailable) {
|
| for (int i = 0; i < 2; ++i)
|
| icons[i] = manifest.icons(i);
|
|
|
| - EXPECT_EQ(best_primary_icon_url.spec(), icons[0].src());
|
| - EXPECT_EQ(best_primary_icon_murmur2_hash, icons[0].hash());
|
| - EXPECT_TRUE(icons[0].has_image_data());
|
| -
|
| - EXPECT_EQ(icon_url_1.spec(), icons[1].src());
|
| - EXPECT_EQ(icon_murmur2_hash_1, icons[1].hash());
|
| - EXPECT_FALSE(icons[1].has_image_data());
|
| + // Check protobuf fields for /icon.png.
|
| + EXPECT_EQ(icon_url_1, icons[0].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[icon_url_1], icons[0].hash());
|
| + EXPECT_EQ(0, icons[0].usages_size());
|
| + EXPECT_FALSE(icons[0].has_image_data());
|
| +
|
| + // Check protobuf fields for kBestPrimaryIconUrl.
|
| + EXPECT_EQ(best_icon_url, icons[1].src());
|
| + EXPECT_EQ(icon_url_to_murmur2_hash[best_icon_url], icons[1].hash());
|
| + EXPECT_THAT(icons[1].usages(),
|
| + testing::ElementsAre(webapk::Image::PRIMARY_ICON,
|
| + webapk::Image::BADGE_ICON));
|
| + EXPECT_TRUE(icons[1].has_image_data());
|
| }
|
|
|
| TEST_F(WebApkInstallerTest, FailsWhenInstallDisabled) {
|
|
|