| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/banners/app_banner_data_fetcher.h" |
| |
| #include "base/strings/utf_string_conversions.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace banners { |
| |
| class AppBannerDataFetcherUnitTest : public testing::Test { |
| public: |
| AppBannerDataFetcherUnitTest() { } |
| |
| protected: |
| static base::NullableString16 ToNullableUTF16(const std::string& str) { |
| return base::NullableString16(base::UTF8ToUTF16(str), false); |
| } |
| |
| static content::Manifest GetValidManifest() { |
| content::Manifest manifest; |
| manifest.name = ToNullableUTF16("foo"); |
| manifest.short_name = ToNullableUTF16("bar"); |
| manifest.start_url = GURL("http://example.com"); |
| |
| content::Manifest::Icon icon; |
| icon.type = ToNullableUTF16("image/png"); |
| icon.sizes.push_back(gfx::Size(144, 144)); |
| manifest.icons.push_back(icon); |
| |
| return manifest; |
| } |
| |
| static bool IsManifestValid(const content::Manifest& manifest) { |
| // The second argument is the web_contents pointer, which is used for |
| // developer debug logging to the console. The logging is skipped inside the |
| // method if a null web_contents pointer is provided, so this is safe. |
| return AppBannerDataFetcher::IsManifestValidForWebApp(manifest, nullptr); |
| } |
| }; |
| |
| TEST_F(AppBannerDataFetcherUnitTest, EmptyManifestIsInvalid) { |
| content::Manifest manifest; |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| } |
| |
| TEST_F(AppBannerDataFetcherUnitTest, CheckMinimalValidManifest) { |
| content::Manifest manifest = GetValidManifest(); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| } |
| |
| TEST_F(AppBannerDataFetcherUnitTest, ManifestRequiresNameORShortName) { |
| content::Manifest manifest = GetValidManifest(); |
| |
| manifest.name = base::NullableString16(); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| |
| manifest.name = ToNullableUTF16("foo"); |
| manifest.short_name = base::NullableString16(); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| |
| manifest.name = base::NullableString16(); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| } |
| |
| TEST_F(AppBannerDataFetcherUnitTest, ManifestRequiresValidStartURL) { |
| content::Manifest manifest = GetValidManifest(); |
| |
| manifest.start_url = GURL(); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| |
| manifest.start_url = GURL("/"); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| } |
| |
| TEST_F(AppBannerDataFetcherUnitTest, ManifestRequiresImagePNG) { |
| content::Manifest manifest = GetValidManifest(); |
| |
| manifest.icons[0].type = ToNullableUTF16("image/gif"); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| manifest.icons[0].type = base::NullableString16(); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| } |
| |
| TEST_F(AppBannerDataFetcherUnitTest, ManifestRequiresMinimalSize) { |
| content::Manifest manifest = GetValidManifest(); |
| |
| // The icon MUST be 144x144 size at least. |
| manifest.icons[0].sizes[0] = gfx::Size(1, 1); |
| EXPECT_FALSE(IsManifestValid(manifest)); |
| |
| // If one of the sizes match the requirement, it should be accepted. |
| manifest.icons[0].sizes.push_back(gfx::Size(144, 144)); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| |
| // Higher than the required size is okay. |
| manifest.icons[0].sizes[1] = gfx::Size(200, 200); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| |
| // Non-square is okay. |
| manifest.icons[0].sizes[1] = gfx::Size(144, 200); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| |
| // The representation of the keyword 'any' should be recognized. |
| manifest.icons[0].sizes[1] = gfx::Size(0, 0); |
| EXPECT_TRUE(IsManifestValid(manifest)); |
| } |
| |
| } // namespace banners |