blob: 9ecca0c6f115241f04dbdbbeee273ecf6f198159 [file] [log] [blame]
Xinghui Lu259be4d2021-04-21 20:03:351// Copyright 2021 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/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"
Xinghui Lu574a0672021-07-15 19:54:4911#include "extensions/browser/blocklist_extension_prefs.h"
Xinghui Lubfcb30a2021-05-19 20:49:1612#include "extensions/browser/disable_reason.h"
Xinghui Lu778ea582021-05-18 23:47:3113#include "extensions/browser/extension_prefs.h"
Devlin Cronind025bf82021-05-20 19:42:2714#include "extensions/test/extension_state_tester.h"
Xinghui Lu259be4d2021-04-21 20:03:3515#include "testing/gtest/include/gtest/gtest.h"
16
17namespace extensions {
18
19namespace {
20
21// Extension ids used during testing.
22constexpr char kTestExtensionId[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
23
24} // namespace
25
26// Test suite to test Omaha attribute handler.
Xinghui Lue6ff51b2021-12-29 20:07:3827using OmahaAttributesHandlerUnitTest = ExtensionServiceTestBase;
Xinghui Lu259be4d2021-04-21 20:03:3528
29TEST_F(OmahaAttributesHandlerUnitTest, LogPolicyViolationUWSMetrics) {
30 base::HistogramTester histograms;
Xinghui Lua1be2c02021-11-03 07:50:3431 InitializeGoodInstalledExtensionService();
32 service()->Init();
Xinghui Lu259be4d2021-04-21 20:03:3533 base::Value attributes(base::Value::Type::DICTIONARY);
Xinghui Lu778ea582021-05-18 23:47:3134 attributes.SetBoolKey("_policy_violation", true);
35 attributes.SetBoolKey("_potentially_uws", true);
Xinghui Lu259be4d2021-04-21 20:03:3536
37 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
38
39 histograms.ExpectBucketCount(
Xinghui Lu09c221f2021-06-12 02:43:4140 "Extensions.ExtensionDisabledRemotely2",
41 /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS,
42 /*expected_count=*/1);
Xinghui Lu259be4d2021-04-21 20:03:3543 histograms.ExpectBucketCount(
Xinghui Lu09c221f2021-06-12 02:43:4144 "Extensions.ExtensionAddDisabledRemotelyReason2",
45 /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS,
46 /*expected_count=*/1);
47 histograms.ExpectBucketCount(
48 "Extensions.ExtensionDisabledRemotely2",
49 /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation,
50 /*expected_count=*/1);
51 histograms.ExpectBucketCount(
52 "Extensions.ExtensionAddDisabledRemotelyReason2",
53 /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation,
54 /*expected_count=*/1);
Xinghui Lu259be4d2021-04-21 20:03:3555}
56
Xinghui Lua1be2c02021-11-03 07:50:3457TEST_F(OmahaAttributesHandlerUnitTest, LogMalwareMetrics) {
58 base::HistogramTester histograms;
59 InitializeGoodInstalledExtensionService();
60 service()->Init();
61 base::Value attributes(base::Value::Type::DICTIONARY);
62
63 attributes.SetBoolKey("_malware", false);
64 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
65 // The re-enabled metric should not be logged if the extension is not disabled
66 // previously.
67 histograms.ExpectBucketCount("Extensions.ExtensionReenabledRemotely",
68 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
69 /*expected_count=*/0);
70 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
71 /*sample=*/ExtensionUpdateCheckDataKey::kNoKey,
72 /*expected_count=*/1);
73
74 attributes.SetBoolKey("_malware", true);
75 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
76 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
77 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
78 /*expected_count=*/1);
79 histograms.ExpectBucketCount("Extensions.ExtensionAddDisabledRemotelyReason2",
80 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
81 /*expected_count=*/1);
82
83 attributes.SetBoolKey("_malware", false);
84 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
85 histograms.ExpectBucketCount("Extensions.ExtensionReenabledRemotely",
86 /*sample=*/ExtensionUpdateCheckDataKey::kMalware,
87 /*expected_count=*/1);
88 histograms.ExpectBucketCount("Extensions.ExtensionDisabledRemotely2",
89 /*sample=*/ExtensionUpdateCheckDataKey::kNoKey,
90 /*expected_count=*/2);
91}
92
Xinghui Lu778ea582021-05-18 23:47:3193TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPolicyViolation) {
Xinghui Lu09c221f2021-06-12 02:43:4194 base::HistogramTester histograms;
Xinghui Lu778ea582021-05-18 23:47:3195 InitializeGoodInstalledExtensionService();
96 service()->Init();
97
Devlin Cronind025bf82021-05-20 19:42:2798 ExtensionStateTester state_tester(profile());
Xinghui Lu778ea582021-05-18 23:47:3199
Devlin Cronind025bf82021-05-20 19:42:27100 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31101
102 base::Value attributes(base::Value::Type::DICTIONARY);
103 attributes.SetBoolKey("_policy_violation", true);
104 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
105
Xinghui Lu778ea582021-05-18 23:47:31106 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27107 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
108 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lu778ea582021-05-18 23:47:31109 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
110 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
111 prefs));
Xinghui Lu778ea582021-05-18 23:47:31112
113 // Remove extensions from greylist.
114 attributes.SetBoolKey("_policy_violation", false);
115 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
Xinghui Lu778ea582021-05-18 23:47:31116
Devlin Cronind025bf82021-05-20 19:42:27117 // The extension is re-enabled.
118 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31119 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
120 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
121 prefs));
Xinghui Lu09c221f2021-06-12 02:43:41122 histograms.ExpectBucketCount(
123 "Extensions.ExtensionReenabledRemotelyForPolicyViolation",
124 /*sample=*/1,
125 /*expected_count=*/1);
126 histograms.ExpectBucketCount(
127 "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS",
128 /*sample=*/1,
129 /*expected_count=*/0);
Xinghui Lu778ea582021-05-18 23:47:31130}
131
Xinghui Lubfcb30a2021-05-19 20:49:16132TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPotentiallyUws) {
Xinghui Lu09c221f2021-06-12 02:43:41133 base::HistogramTester histograms;
Xinghui Lubfcb30a2021-05-19 20:49:16134 InitializeGoodInstalledExtensionService();
135 service()->Init();
136
Devlin Cronind025bf82021-05-20 19:42:27137 ExtensionStateTester state_tester(profile());
Xinghui Lubfcb30a2021-05-19 20:49:16138
Devlin Cronind025bf82021-05-20 19:42:27139 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16140
141 base::Value attributes(base::Value::Type::DICTIONARY);
142 attributes.SetBoolKey("_potentially_uws", true);
143 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
144
Xinghui Lubfcb30a2021-05-19 20:49:16145 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27146 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
147 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16148 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
149 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
150 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16151
152 // Remove extensions from greylist.
153 attributes.SetBoolKey("_potentially_uws", false);
154 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
Xinghui Lubfcb30a2021-05-19 20:49:16155
156 // The extension is re-enabled.
Devlin Cronind025bf82021-05-20 19:42:27157 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
158 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
159 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
160 prefs));
Xinghui Lu09c221f2021-06-12 02:43:41161 histograms.ExpectBucketCount(
162 "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS",
163 /*sample=*/1,
164 /*expected_count=*/1);
165 histograms.ExpectBucketCount(
166 "Extensions.ExtensionReenabledRemotelyForPolicyViolation",
167 /*sample=*/1,
168 /*expected_count=*/0);
Xinghui Lubfcb30a2021-05-19 20:49:16169}
170
171TEST_F(OmahaAttributesHandlerUnitTest, MultipleGreylistStates) {
172 InitializeGoodInstalledExtensionService();
173 service()->Init();
174
Devlin Cronind025bf82021-05-20 19:42:27175 ExtensionStateTester state_tester(profile());
Xinghui Lubfcb30a2021-05-19 20:49:16176
Devlin Cronind025bf82021-05-20 19:42:27177 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16178
179 base::Value attributes(base::Value::Type::DICTIONARY);
180 attributes.SetBoolKey("_policy_violation", true);
181 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
182
Devlin Cronind025bf82021-05-20 19:42:27183 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
184 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16185
186 // Now user enables kTestExtensionId.
187 service()->EnableExtension(kTestExtensionId);
Devlin Cronind025bf82021-05-20 19:42:27188 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16189
190 // Another greylist state is added to Omaha attribute.
191 attributes.SetBoolKey("_potentially_uws", true);
192 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
193
194 // The extension should be disabled again.
Devlin Cronind025bf82021-05-20 19:42:27195 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
196 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16197
198 // Remove extensions from the first greylist state.
199 attributes.SetBoolKey("_policy_violation", false);
200 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
201
202 // The extension should still be disabled, because it is still in the
203 // potentially unwanted state.
204 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27205 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
206 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lubfcb30a2021-05-19 20:49:16207 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
208 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
209 prefs));
210 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
211 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
212 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16213
214 // Remove the other greylist state.
215 attributes.SetBoolKey("_potentially_uws", false);
216 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
217
218 // The extension is re-enabled.
Devlin Cronind025bf82021-05-20 19:42:27219 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lubfcb30a2021-05-19 20:49:16220 EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState(
221 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
222 prefs));
Xinghui Lubfcb30a2021-05-19 20:49:16223}
224
Xinghui Lu778ea582021-05-18 23:47:31225TEST_F(OmahaAttributesHandlerUnitTest, KeepDisabledWhenMalwareRemoved) {
226 InitializeGoodInstalledExtensionService();
227 service()->Init();
228
Devlin Cronind025bf82021-05-20 19:42:27229 ExtensionStateTester state_tester(profile());
230 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
Xinghui Lu778ea582021-05-18 23:47:31231
232 base::Value attributes(base::Value::Type::DICTIONARY);
233 attributes.SetBoolKey("_malware", true);
234 attributes.SetBoolKey("_policy_violation", true);
235 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
236
237 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
Devlin Cronind025bf82021-05-20 19:42:27238 EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
Xinghui Lu7e277222021-10-12 20:25:10239 EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
240 kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE, prefs));
241 EXPECT_EQ(disable_reason::DISABLE_GREYLIST,
Xinghui Lu778ea582021-05-18 23:47:31242 prefs->GetDisableReasons(kTestExtensionId));
243
244 // Remove malware.
245 attributes.SetBoolKey("_malware", false);
246 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
247
248 // The extension is not enabled because the policy violation bit is not
Devlin Cronind025bf82021-05-20 19:42:27249 // cleared, but it is no longer blocklisted (instead just disabled).
250 EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
251 kTestExtensionId, disable_reason::DISABLE_GREYLIST));
Xinghui Lu778ea582021-05-18 23:47:31252}
253
Xinghui Lu48194312022-06-01 01:30:52254TEST_F(OmahaAttributesHandlerUnitTest, ExtensionUninstalledBeforeNotified) {
255 InitializeGoodInstalledExtensionService();
256 service()->Init();
257
258 ExtensionStateTester state_tester(profile());
259
260 EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
261
262 service()->UninstallExtension(kTestExtensionId, UNINSTALL_REASON_FOR_TESTING,
263 nullptr);
264
265 base::Value attributes(base::Value::Type::DICTIONARY);
266 attributes.SetBoolKey("_malware", true);
267 // kTestExtensionId is already uninstalled. Performing action on it should
268 // not crash. Regression test for https://crbug.com/1305490.
269 service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes);
270}
271
Xinghui Lu259be4d2021-04-21 20:03:35272} // namespace extensions