blob: 4883d09d7f66efc74ee448b573bb5a557ae030bc [file] [log] [blame]
// Copyright 2017 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 "extensions/common/extension_builder.h"
#include "base/version.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/externally_connectable.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/common/value_builder.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
TEST(ExtensionBuilderTest, Basic) {
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("some name").Build();
ASSERT_TRUE(extension);
EXPECT_EQ("some name", extension->name());
EXPECT_TRUE(extension->is_extension());
EXPECT_EQ(2, extension->manifest_version());
}
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("some app", ExtensionBuilder::Type::PLATFORM_APP)
.Build();
ASSERT_TRUE(extension);
EXPECT_EQ("some app", extension->name());
EXPECT_TRUE(extension->is_platform_app());
EXPECT_EQ(2, extension->manifest_version());
}
}
TEST(ExtensionBuilderTest, Permissions) {
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("no permissions").Build();
EXPECT_TRUE(extension->permissions_data()->active_permissions().IsEmpty());
}
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("permissions")
.AddPermission("storage")
.AddPermissions({"alarms", "idle"})
.Build();
EXPECT_TRUE(extension->permissions_data()->HasAPIPermission("storage"));
EXPECT_TRUE(extension->permissions_data()->HasAPIPermission("alarms"));
EXPECT_TRUE(extension->permissions_data()->HasAPIPermission("idle"));
}
}
TEST(ExtensionBuilderTest, Actions) {
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("no action").Build();
EXPECT_FALSE(extension->manifest()->HasKey(manifest_keys::kPageAction));
EXPECT_FALSE(extension->manifest()->HasKey(manifest_keys::kBrowserAction));
}
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("page action")
.SetAction(ExtensionBuilder::ActionType::PAGE_ACTION)
.Build();
EXPECT_TRUE(extension->manifest()->HasKey(manifest_keys::kPageAction));
EXPECT_FALSE(extension->manifest()->HasKey(manifest_keys::kBrowserAction));
}
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("browser action")
.SetAction(ExtensionBuilder::ActionType::BROWSER_ACTION)
.Build();
EXPECT_FALSE(extension->manifest()->HasKey(manifest_keys::kPageAction));
EXPECT_TRUE(extension->manifest()->HasKey(manifest_keys::kBrowserAction));
}
}
TEST(ExtensionBuilderTest, MergeManifest) {
DictionaryBuilder connectable;
connectable.Set("matches", ListBuilder().Append("*://example.com/*").Build());
std::unique_ptr<base::DictionaryValue> connectable_value =
DictionaryBuilder()
.Set("externally_connectable", connectable.Build())
.Build();
scoped_refptr<const Extension> extension =
ExtensionBuilder("extra")
.MergeManifest(std::move(connectable_value))
.Build();
EXPECT_TRUE(ExternallyConnectableInfo::Get(extension.get()));
}
TEST(ExtensionBuilderTest, IDUniqueness) {
scoped_refptr<const Extension> a = ExtensionBuilder("a").Build();
scoped_refptr<const Extension> b = ExtensionBuilder("b").Build();
scoped_refptr<const Extension> c = ExtensionBuilder("c").Build();
std::set<ExtensionId> ids = {a->id(), b->id(), c->id()};
EXPECT_EQ(3u, ids.size());
}
TEST(ExtensionBuilderTest, SetManifestAndMergeManifest) {
DictionaryBuilder manifest;
manifest.Set("name", "some name")
.Set("manifest_version", 2)
.Set("description", "some description");
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(manifest.Build())
.MergeManifest(DictionaryBuilder().Set("version", "0.1").Build())
.Build();
EXPECT_EQ("some name", extension->name());
EXPECT_EQ(2, extension->manifest_version());
EXPECT_EQ("some description", extension->description());
EXPECT_EQ("0.1", extension->version().GetString());
}
TEST(ExtensionBuilderTest, MergeManifestOverridesValues) {
{
scoped_refptr<const Extension> extension =
ExtensionBuilder("foo")
.MergeManifest(DictionaryBuilder().Set("version", "52.0.9").Build())
.Build();
// MergeManifest() should have overwritten the default 0.1 value for
// version.
EXPECT_EQ("52.0.9", extension->version().GetString());
}
{
DictionaryBuilder manifest;
manifest.Set("name", "some name")
.Set("manifest_version", 2)
.Set("description", "some description")
.Set("version", "0.1");
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(manifest.Build())
.MergeManifest(DictionaryBuilder().Set("version", "42.1").Build())
.Build();
EXPECT_EQ("42.1", extension->version().GetString());
}
}
} // namespace extensions