blob: 3b68086d4912238f6ee11abb69a89a93ed16820b [file] [log] [blame]
// 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