blob: c4a31d88eb21c6b0fa8a7d96c9db6a5de7b432de [file] [log] [blame]
Devlin Cronin9a9206e2018-09-28 23:39:511// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/installed_loader.h"
6
7#include "base/macros.h"
8#include "base/test/metrics/histogram_tester.h"
9#include "base/test/scoped_feature_list.h"
10#include "chrome/browser/extensions/extension_service.h"
11#include "chrome/browser/extensions/extension_service_test_base.h"
12#include "chrome/browser/extensions/permissions_updater.h"
13#include "chrome/browser/extensions/scripting_permissions_modifier.h"
14#include "chrome/browser/profiles/profile.h"
15#include "extensions/common/extension_builder.h"
16#include "extensions/common/extension_features.h"
17
18namespace extensions {
19
20namespace {
21
22constexpr const char kHasWithheldHostsHistogram[] =
23 "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts";
24constexpr const char kGrantedHostCountHistogram[] =
25 "Extensions.RuntimeHostPermissions.GrantedHostCount";
26
27} // namespace
28
29class InstalledLoaderUnitTest : public ExtensionServiceTestBase {
30 public:
31 InstalledLoaderUnitTest() {}
32 ~InstalledLoaderUnitTest() override = default;
33
34 void SetUp() override {
35 ExtensionServiceTestBase::SetUp();
36 InitializeEmptyExtensionService();
37 }
38
39 const Extension* AddExtension();
40
41 private:
42 DISALLOW_COPY_AND_ASSIGN(InstalledLoaderUnitTest);
43};
44
45const Extension* InstalledLoaderUnitTest::AddExtension() {
46 // Metrics aren't recorded for unpacked extensions, so we need to make sure
47 // the extension has an INTERNAL location.
48 constexpr Manifest::Location kManifestLocation = Manifest::INTERNAL;
49 scoped_refptr<const Extension> extension = ExtensionBuilder("test")
50 .AddPermissions({"<all_urls>"})
51 .SetLocation(kManifestLocation)
52 .Build();
53 PermissionsUpdater updater(profile());
54 updater.InitializePermissions(extension.get());
55 updater.GrantActivePermissions(extension.get());
56 service()->AddExtension(extension.get());
57
58 return extension.get();
59}
60
61TEST_F(InstalledLoaderUnitTest,
62 RuntimeHostPermissions_Metrics_FeatureDisabled) {
63 base::test::ScopedFeatureList feature_list;
64 feature_list.InitAndDisableFeature(
65 extensions_features::kRuntimeHostPermissions);
66
67 AddExtension();
68
69 base::HistogramTester histograms;
70 InstalledLoader loader(service());
71 loader.RecordExtensionsMetricsForTesting();
72
73 // No metrics should be recorded when the feature is disabled.
74 histograms.ExpectTotalCount(kHasWithheldHostsHistogram, 0);
75 histograms.ExpectTotalCount(kGrantedHostCountHistogram, 0);
76}
77
78TEST_F(InstalledLoaderUnitTest,
79 RuntimeHostPermissions_Metrics_HasWithheldHosts_False) {
80 base::test::ScopedFeatureList feature_list;
81 feature_list.InitAndEnableFeature(
82 extensions_features::kRuntimeHostPermissions);
83
84 AddExtension();
85
86 base::HistogramTester histograms;
87 InstalledLoader loader(service());
88 loader.RecordExtensionsMetricsForTesting();
89
90 // The extension didn't have withheld hosts, so a single `false` record
91 // should be present.
92 histograms.ExpectUniqueSample(kHasWithheldHostsHistogram, false, 1);
93 // Granted host counts should only be recorded if the extension had withheld
94 // hosts.
95 histograms.ExpectTotalCount(kGrantedHostCountHistogram, 0);
96}
97
98TEST_F(InstalledLoaderUnitTest,
99 RuntimeHostPermissions_Metrics_HasWithheldHosts_True) {
100 base::test::ScopedFeatureList feature_list;
101 feature_list.InitAndEnableFeature(
102 extensions_features::kRuntimeHostPermissions);
103
104 const Extension* extension = AddExtension();
105 ScriptingPermissionsModifier(profile(), extension)
106 .SetWithholdHostPermissions(true);
107
108 base::HistogramTester histograms;
109 InstalledLoader loader(service());
110 loader.RecordExtensionsMetricsForTesting();
111
112 // The extension had withheld hosts, so a single `true` record should be
113 // present.
114 histograms.ExpectUniqueSample(kHasWithheldHostsHistogram, true, 1);
115 // There were no granted hosts, so a single `0` record should be present.
116 constexpr int kGrantedHostCount = 0;
117 constexpr int kEmitCount = 1;
118 histograms.ExpectUniqueSample(kGrantedHostCountHistogram, kGrantedHostCount,
119 kEmitCount);
120}
121
122TEST_F(InstalledLoaderUnitTest,
123 RuntimeHostPermissions_Metrics_GrantedHostCount) {
124 base::test::ScopedFeatureList feature_list;
125 feature_list.InitAndEnableFeature(
126 extensions_features::kRuntimeHostPermissions);
127
128 const Extension* extension = AddExtension();
129 ScriptingPermissionsModifier modifier(profile(), extension);
130 modifier.SetWithholdHostPermissions(true);
131 modifier.GrantHostPermission(GURL("https://example.com/"));
132 modifier.GrantHostPermission(GURL("https://chromium.org/"));
133
134 base::HistogramTester histograms;
135 InstalledLoader loader(service());
136 loader.RecordExtensionsMetricsForTesting();
137
138 histograms.ExpectUniqueSample(kHasWithheldHostsHistogram, true, 1);
139 // The extension had granted hosts, so a single `2` record should be present.
140 constexpr int kGrantedHostCount = 2;
141 constexpr int kEmitCount = 1;
142 histograms.ExpectUniqueSample(kGrantedHostCountHistogram, kGrantedHostCount,
143 kEmitCount);
144}
145
146} // namespace extensions