blob: fcfbf8f1b83504d8cc6298bb36006c1d7b0cbacf [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2021 The Chromium Authors
Xinghui Lu259be4d2021-04-21 20:03:352// 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/omaha_attributes_handler.h"
6
7#include "base/test/metrics/histogram_tester.h"
8#include "base/values.h"
9#include "chrome/browser/extensions/extension_service.h"
10#include "chrome/browser/extensions/extension_service_test_base.h"
Lei Zhang75451bac2023-01-27 18:47:2811#include "chrome/browser/profiles/profile.h"
Xinghui Lu574a0672021-07-15 19:54:4912#include "extensions/browser/blocklist_extension_prefs.h"
Xinghui Lubfcb30a2021-05-19 20:49:1613#include "extensions/browser/disable_reason.h"
Xinghui Lu778ea582021-05-18 23:47:3114#include "extensions/browser/extension_prefs.h"
Devlin Cronind025bf82021-05-20 19:42:2715#include "extensions/test/extension_state_tester.h"
Xinghui Lu259be4d2021-04-21 20:03:3516#include "testing/gtest/include/gtest/gtest.h"
17
18namespace extensions {
19
20namespace {
21
22// Extension ids used during testing.
23constexpr char kTestExtensionId[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
24
25} // namespace
26
27// Test suite to test Omaha attribute handler.
Xinghui Lue6ff51b2021-12-29 20:07:3828using OmahaAttributesHandlerUnitTest = ExtensionServiceTestBase;
Xinghui Lu259be4d2021-04-21 20:03:3529
30TEST_F(OmahaAttributesHandlerUnitTest, LogPolicyViolationUWSMetrics) {
31 base::HistogramTester histograms;
Xinghui Lua1be2c02021-11-03 07:50:3432 InitializeGoodInstalledExtensionService();
33 service()->Init();
Avi Drissmand2a736f2023-01-28 02:31:2634 base::Value attributes(base::Value::Type::DICT);
Xinghui Lu778ea582021-05-18 23:47:3135 attributes.SetBoolKey("_policy_violation", true);
36 attributes.SetBoolKey("_potentially_uws", true);
Xinghui Lu259be4d2021-04-21 20:03:3537
38 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
39
40 histograms.ExpectBucketCount(
Xinghui Lu09c221f2021-06-12 02:43:4141 "Extensions.ExtensionDisabledRemotely2",
42 /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS,
43 /*expected_count=*/1);
Xinghui Lu259be4d2021-04-21 20:03:3544 histograms.ExpectBucketCount(
Xinghui Lu09c221f2021-06-12 02:43:4145 "Extensions.ExtensionAddDisabledRemotelyReason2",
46 /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS,
47 /*expected_count=*/1);
48 histograms.ExpectBucketCount(
49 "Extensions.ExtensionDisabledRemotely2",
50 /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation,
51 /*expected_count=*/1);
52 histograms.ExpectBucketCount(
53 "Extensions.ExtensionAddDisabledRemotelyReason2",
54 /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation,
55 /*expected_count=*/1);
Xinghui Lu259be4d2021-04-21 20:03:3556}
57
Xinghui Lua1be2c02021-11-03 07:50:3458TEST_F(OmahaAttributesHandlerUnitTest, LogMalwareMetrics) {
59 base::HistogramTester histograms;
60 InitializeGoodInstalledExtensionService();
61 service()->Init();
Avi Drissmand2a736f2023-01-28 02:31:2662 base::Value attributes(base::Value::Type::DICT);
Xinghui Lua1be2c02021-11-03 07:50:3463
64 attributes.SetBoolKey("_malware", false);
65 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
66 // The re-enabled metric should not be logged if the extension is not disabled
67 // previously.
68 histograms.ExpectBucketCount("Extensions.ExtensionReenabledRemotely",
69 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
70 /*expected_count=*/0);
71 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
72 /*sample=*/ExtensionUpdateCheckDataKey::kNoKey,
73 /*expected_count=*/1);
74
75 attributes.SetBoolKey("_malware", true);
76 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
77 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
78 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
79 /*expected_count=*/1);
80 histograms.ExpectBucketCount("Extensions.ExtensionAddDisabledRemotelyReason2",
81 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
82 /*expected_count=*/1);
83
84 attributes.SetBoolKey("_malware", false);
85 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
86 histograms.ExpectBucketCount("Extensions.ExtensionReenabledRemotely",
87 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
88 /*expected_count=*/1);
89 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
90 /*sample=*/ExtensionUpdateCheckDataKey::kNoKey,
91 /*expected_count=*/2);
92}
93
Xinghui Lu778ea582021-05-18 23:47:3194TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPolicyViolation) {
Xinghui Lu09c221f2021-06-12 02:43:4195 base::HistogramTester histograms;
Xinghui Lu778ea582021-05-18 23:47:3196 InitializeGoodInstalledExtensionService();
97 service()->Init();
98
Devlin Cronind025bf82021-05-20 19:42:2799 ExtensionStateTester state_tester(profile());
Xinghui Lu778ea582021-05-18 23:47:31100
Devlin Cronind025bf82021-05-20 19:42:27101 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31102
Avi Drissmand2a736f2023-01-28 02:31:26103 base::Value attributes(base::Value::Type::DICT);
Xinghui Lu778ea582021-05-18 23:47:31104 attributes.SetBoolKey("_policy_violation", true);
105 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
106
Xinghui Lu778ea582021-05-18 23:47:31107 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27108 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
109 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lu778ea582021-05-18 23:47:31110 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
111 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
112 prefs));
Xinghui Lu778ea582021-05-18 23:47:31113
114 // Remove extensions from greylist.
115 attributes.SetBoolKey("_policy_violation", false);
116 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
Xinghui Lu778ea582021-05-18 23:47:31117
Devlin Cronind025bf82021-05-20 19:42:27118 // The extension is re-enabled.
119 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31120 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
121 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
122 prefs));
Xinghui Lu09c221f2021-06-12 02:43:41123 histograms.ExpectBucketCount(
124 "Extensions.ExtensionReenabledRemotelyForPolicyViolation",
125 /*sample=*/1,
126 /*expected_count=*/1);
127 histograms.ExpectBucketCount(
128 "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS",
129 /*sample=*/1,
130 /*expected_count=*/0);
Xinghui Lu778ea582021-05-18 23:47:31131}
132
Xinghui Lubfcb30a2021-05-19 20:49:16133TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPotentiallyUws) {
Xinghui Lu09c221f2021-06-12 02:43:41134 base::HistogramTester histograms;
Xinghui Lubfcb30a2021-05-19 20:49:16135 InitializeGoodInstalledExtensionService();
136 service()->Init();
137
Devlin Cronind025bf82021-05-20 19:42:27138 ExtensionStateTester state_tester(profile());
Xinghui Lubfcb30a2021-05-19 20:49:16139
Devlin Cronind025bf82021-05-20 19:42:27140 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16141
Avi Drissmand2a736f2023-01-28 02:31:26142 base::Value attributes(base::Value::Type::DICT);
Xinghui Lubfcb30a2021-05-19 20:49:16143 attributes.SetBoolKey("_potentially_uws", true);
144 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
145
Xinghui Lubfcb30a2021-05-19 20:49:16146 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27147 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
148 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16149 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
150 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
151 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16152
153 // Remove extensions from greylist.
154 attributes.SetBoolKey("_potentially_uws", false);
155 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
Xinghui Lubfcb30a2021-05-19 20:49:16156
157 // The extension is re-enabled.
Devlin Cronind025bf82021-05-20 19:42:27158 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
159 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
160 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
161 prefs));
Xinghui Lu09c221f2021-06-12 02:43:41162 histograms.ExpectBucketCount(
163 "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS",
164 /*sample=*/1,
165 /*expected_count=*/1);
166 histograms.ExpectBucketCount(
167 "Extensions.ExtensionReenabledRemotelyForPolicyViolation",
168 /*sample=*/1,
169 /*expected_count=*/0);
Xinghui Lubfcb30a2021-05-19 20:49:16170}
171
172TEST_F(OmahaAttributesHandlerUnitTest, MultipleGreylistStates) {
173 InitializeGoodInstalledExtensionService();
174 service()->Init();
175
Devlin Cronind025bf82021-05-20 19:42:27176 ExtensionStateTester state_tester(profile());
Xinghui Lubfcb30a2021-05-19 20:49:16177
Devlin Cronind025bf82021-05-20 19:42:27178 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16179
Avi Drissmand2a736f2023-01-28 02:31:26180 base::Value attributes(base::Value::Type::DICT);
Xinghui Lubfcb30a2021-05-19 20:49:16181 attributes.SetBoolKey("_policy_violation", true);
182 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
183
Devlin Cronind025bf82021-05-20 19:42:27184 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
185 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16186
187 // Now user enables kTestExtensionId.
188 service()->EnableExtension(kTestExtensionId);
Devlin Cronind025bf82021-05-20 19:42:27189 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16190
191 // Another greylist state is added to Omaha attribute.
192 attributes.SetBoolKey("_potentially_uws", true);
193 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
194
195 // The extension should be disabled again.
Devlin Cronind025bf82021-05-20 19:42:27196 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
197 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16198
199 // Remove extensions from the first greylist state.
200 attributes.SetBoolKey("_policy_violation", false);
201 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
202
203 // The extension should still be disabled, because it is still in the
204 // potentially unwanted state.
205 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27206 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
207 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16208 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
209 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
210 prefs));
211 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
212 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
213 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16214
215 // Remove the other greylist state.
216 attributes.SetBoolKey("_potentially_uws", false);
217 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
218
219 // The extension is re-enabled.
Devlin Cronind025bf82021-05-20 19:42:27220 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16221 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
222 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
223 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16224}
225
Xinghui Lu778ea582021-05-18 23:47:31226TEST_F(OmahaAttributesHandlerUnitTest, KeepDisabledWhenMalwareRemoved) {
227 InitializeGoodInstalledExtensionService();
228 service()->Init();
229
Devlin Cronind025bf82021-05-20 19:42:27230 ExtensionStateTester state_tester(profile());
231 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31232
Avi Drissmand2a736f2023-01-28 02:31:26233 base::Value attributes(base::Value::Type::DICT);
Xinghui Lu778ea582021-05-18 23:47:31234 attributes.SetBoolKey("_malware", true);
235 attributes.SetBoolKey("_policy_violation", true);
236 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
237
238 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27239 EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
Xinghui Lu7e277222021-10-12 20:25:10240 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
241 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE, prefs));
242 EXPECT_EQ(disable_reason::DISABLE_GREYLIST,
Xinghui Lu778ea582021-05-18 23:47:31243 prefs->GetDisableReasons(kTestExtensionId));
244
245 // Remove malware.
246 attributes.SetBoolKey("_malware", false);
247 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
248
249 // The extension is not enabled because the policy violation bit is not
Devlin Cronind025bf82021-05-20 19:42:27250 // cleared, but it is no longer blocklisted (instead just disabled).
251 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
252 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lu778ea582021-05-18 23:47:31253}
254
Xinghui Lu48194312022-06-01 01:30:52255TEST_F(OmahaAttributesHandlerUnitTest, ExtensionUninstalledBeforeNotified) {
256 InitializeGoodInstalledExtensionService();
257 service()->Init();
258
259 ExtensionStateTester state_tester(profile());
260
261 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
262
263 service()->UninstallExtension(kTestExtensionId, UNINSTALL_REASON_FOR_TESTING,
264 nullptr);
265
Avi Drissmand2a736f2023-01-28 02:31:26266 base::Value attributes(base::Value::Type::DICT);
Xinghui Lu48194312022-06-01 01:30:52267 attributes.SetBoolKey("_malware", true);
268 // kTestExtensionId is already uninstalled. Performing action on it should
269 // not crash. Regression test for https://crbug.com/1305490.
270 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
271}
272
Xinghui Lu259be4d2021-04-21 20:03:35273} // namespace extensions