910e62b5创建于 1月15日历史提交
// 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