blob: 2e2b34476980389fba348fb6504f55d6eab50246 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/enterprise/reporting/extension_info.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "chrome/test/base/testing_profile.h"
#include "extensions/browser/extension_registrar.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/manifest_constants.h"
using extensions::mojom::ManifestLocation;
namespace em = enterprise_management;
namespace enterprise_reporting {
namespace {
const char kName[] = "extension";
const char kId[] = "abcdefghijklmnoabcdefghijklmnoab";
const char kId2[] = "abcdefghijklmnoabcdefghijklmnoac";
const char kVersion[] = "1.0.0";
const char kDescription[] = "an extension description.";
const char kHomepage[] = "https://foo.com/extension";
const char kAPIPermission1[] = "alarms";
const char kAPIPermission2[] = "idle";
const char kHostPermission[] = "*://*.example.com/*";
const char kAPIPermissionOptional[] = "storage";
const char kHostPermissionOptional[] = "https://www.example2.com/*";
const char kAppLaunchUrl[] = "https://www.example.com/";
const int kManifestVersion = 2;
} // namespace
class ExtensionInfoTest : public extensions::ExtensionServiceTestBase {
public:
void SetUp() override {
extensions::ExtensionServiceTestBase::SetUp();
InitializeEmptyExtensionService();
service()->Init();
}
scoped_refptr<const extensions::Extension> BuildExtension(
const std::string& id = kId,
ManifestLocation location = ManifestLocation::kUnpacked,
bool is_app = false,
bool from_webstore = false) {
extensions::ExtensionBuilder extensionBuilder(
kName, (is_app ? extensions::ExtensionBuilder::Type::PLATFORM_APP
: extensions::ExtensionBuilder::Type::EXTENSION));
extensionBuilder.SetID(id)
.SetVersion(kVersion)
.SetManifestVersion(kManifestVersion)
.SetManifestKey(extensions::manifest_keys::kDescription, kDescription)
.SetManifestKey(extensions::manifest_keys::kHomepageURL, kHomepage)
.SetLocation(location)
.AddAPIPermission(kAPIPermission1)
.AddAPIPermission(kAPIPermission2)
.AddHostPermission(kHostPermission)
.AddOptionalAPIPermission(kAPIPermissionOptional)
.AddOptionalHostPermission(kHostPermissionOptional);
if (is_app) {
extensionBuilder.SetManifestPath("app.launch.web_url", kAppLaunchUrl);
}
if (from_webstore) {
extensionBuilder.AddFlags(extensions::Extension::FROM_WEBSTORE);
}
auto extension = extensionBuilder.Build();
registrar()->AddExtension(extension);
return extension;
}
};
TEST_F(ExtensionInfoTest, ExtensionReport) {
auto extension = BuildExtension();
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(1, info.extensions_size());
const em::Extension actual_extension_report = info.extensions(0);
EXPECT_EQ(kId, actual_extension_report.id());
EXPECT_EQ(kName, actual_extension_report.name());
EXPECT_EQ(kVersion, actual_extension_report.version());
EXPECT_EQ(kDescription, actual_extension_report.description());
EXPECT_EQ(kManifestVersion, actual_extension_report.manifest_version());
EXPECT_EQ(em::Extension_ExtensionType_TYPE_EXTENSION,
actual_extension_report.app_type());
EXPECT_EQ(em::Extension_InstallType_TYPE_DEVELOPMENT,
actual_extension_report.install_type());
EXPECT_EQ(kHomepage, actual_extension_report.homepage_url());
EXPECT_TRUE(actual_extension_report.enabled());
EXPECT_FALSE(actual_extension_report.from_webstore());
EXPECT_EQ(3, actual_extension_report.permissions_size());
EXPECT_EQ(kAPIPermission1, actual_extension_report.permissions(0));
EXPECT_EQ(kAPIPermission2, actual_extension_report.permissions(1));
EXPECT_EQ(kAPIPermissionOptional, actual_extension_report.permissions(2));
EXPECT_EQ(2, actual_extension_report.host_permissions_size());
EXPECT_EQ(kHostPermission, actual_extension_report.host_permissions(0));
EXPECT_EQ(kHostPermissionOptional,
actual_extension_report.host_permissions(1));
}
TEST_F(ExtensionInfoTest, MultipleExtensions) {
auto extension1 = BuildExtension(kId);
auto extension2 = BuildExtension(kId2);
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(2, info.extensions_size());
EXPECT_EQ(kId, info.extensions(0).id());
EXPECT_EQ(kId2, info.extensions(1).id());
}
TEST_F(ExtensionInfoTest, ExtensionDisabled) {
auto extension = BuildExtension();
registrar()->DisableExtension(
kId, {extensions::disable_reason::DISABLE_USER_ACTION});
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(1, info.extensions_size());
EXPECT_FALSE(info.extensions(0).enabled());
}
TEST_F(ExtensionInfoTest, ExtensionTerminated) {
auto extension = BuildExtension();
registrar()->TerminateExtension(kId);
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(1, info.extensions_size());
EXPECT_FALSE(info.extensions(0).enabled());
}
TEST_F(ExtensionInfoTest, ExtensionBlocked) {
auto extension = BuildExtension();
registrar()->BlockAllExtensions();
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(0, info.extensions_size());
}
TEST_F(ExtensionInfoTest, ExtensionBlocklisted) {
auto extension = BuildExtension();
service()->BlocklistExtensionForTest(kId);
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(0, info.extensions_size());
}
TEST_F(ExtensionInfoTest, ComponentExtension) {
auto extension1 = BuildExtension(kId, ManifestLocation::kComponent);
auto extension2 = BuildExtension(kId2, ManifestLocation::kExternalComponent);
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(0, info.extensions_size());
}
TEST_F(ExtensionInfoTest, FromWebstoreFlag) {
auto extension1 = BuildExtension(kId, ManifestLocation::kUnpacked,
/*is_app=*/false, /*from_webstore=*/false);
auto extension2 = BuildExtension(kId2, ManifestLocation::kUnpacked,
/*is_app=*/false, /*from_webstore=*/true);
em::ChromeUserProfileInfo info;
AppendExtensionInfoIntoProfileReport(profile(), &info);
EXPECT_EQ(2, info.extensions_size());
EXPECT_FALSE(info.extensions(0).from_webstore());
EXPECT_TRUE(info.extensions(1).from_webstore());
}
} // namespace enterprise_reporting