OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/extension_install_checker.h" | 5 #include "chrome/browser/extensions/extension_install_checker.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
12 #include "base/threading/thread_task_runner_handle.h" | 12 #include "base/threading/thread_task_runner_handle.h" |
13 #include "extensions/browser/preload_check_test_util.h" | 13 #include "extensions/browser/preload_check_test_util.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 | 15 |
16 namespace extensions { | 16 namespace extensions { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
| 20 const PreloadCheck::Error kRequirementsError = |
| 21 PreloadCheck::WEBGL_NOT_SUPPORTED; |
| 22 const base::string16 kDummyRequirementsError = |
| 23 base::ASCIIToUTF16("Requirements error"); |
| 24 const PreloadCheck::Error kRequirementsError2 = |
| 25 PreloadCheck::WINDOW_SHAPE_NOT_SUPPORTED; |
| 26 const base::string16 kDummyRequirementsError2 = |
| 27 base::ASCIIToUTF16("Another requirements error"); |
| 28 |
20 const PreloadCheck::Error kBlacklistError = PreloadCheck::BLACKLISTED_ID; | 29 const PreloadCheck::Error kBlacklistError = PreloadCheck::BLACKLISTED_ID; |
21 const char kDummyRequirementsError[] = "Requirements error"; | 30 const PreloadCheck::Error kBlacklistError2 = PreloadCheck::BLACKLISTED_UNKNOWN; |
22 const char kDummyPolicyError[] = "Cannot install extension"; | |
23 | 31 |
24 const char kDummyPolicyError2[] = "Another policy error"; | 32 const base::string16 kDummyPolicyError = |
25 const char kDummyRequirementsError2[] = "Another requirements error"; | 33 base::ASCIIToUTF16("Cannot install extension"); |
26 const PreloadCheck::Error kBlacklistError2 = PreloadCheck::NONE; | 34 const base::string16 kDummyPolicyError2 = |
| 35 base::ASCIIToUTF16("Another policy error"); |
27 | 36 |
28 } // namespace | 37 } // namespace |
29 | 38 |
30 // Stubs most of the checks since we are interested in validating the logic in | 39 class ExtensionInstallCheckerObserver : public PreloadCheckObserver { |
31 // the install checker. This class implements a synchronous version of all | |
32 // checks. | |
33 class ExtensionInstallCheckerForTest : public ExtensionInstallChecker { | |
34 public: | 40 public: |
35 explicit ExtensionInstallCheckerForTest(bool is_async) | 41 ~ExtensionInstallCheckerObserver() override {} |
36 : ExtensionInstallChecker(NULL), | |
37 requirements_check_called_(false), | |
38 blacklist_check_called_(false), | |
39 policy_check_called_(false), | |
40 is_async_(is_async) {} | |
41 | 42 |
42 ~ExtensionInstallCheckerForTest() override {} | 43 int result() { return result_; } |
43 | 44 |
44 void set_requirements_error(const std::string& error) { | 45 void OnChecksComplete(int result) { |
45 requirements_error_ = error; | 46 result_ = result; |
46 } | 47 // We're tracking errors separately, but still want to update called_. |
47 | 48 OnCheckComplete(PreloadCheck::Errors()); |
48 bool requirements_check_called() const { return requirements_check_called_; } | |
49 bool blacklist_check_called() const { return blacklist_check_called_; } | |
50 bool policy_check_called() const { return policy_check_called_; } | |
51 | |
52 bool is_async() { return is_async_; } | |
53 | |
54 void MockCheckRequirements(int sequence_number) { | |
55 std::vector<std::string> errors; | |
56 if (!requirements_error_.empty()) | |
57 errors.push_back(requirements_error_); | |
58 OnRequirementsCheckDone(sequence_number, errors); | |
59 } | |
60 | |
61 protected: | |
62 void CheckRequirements() override { | |
63 requirements_check_called_ = true; | |
64 if (is_async_) { | |
65 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
66 FROM_HERE, | |
67 base::Bind(&ExtensionInstallCheckerForTest::MockCheckRequirements, | |
68 base::Unretained(this), current_sequence_number())); | |
69 } else { | |
70 MockCheckRequirements(current_sequence_number()); | |
71 } | |
72 } | |
73 | |
74 void CheckManagementPolicy() override { | |
75 policy_check_called_ = true; | |
76 ExtensionInstallChecker::CheckManagementPolicy(); | |
77 } | |
78 | |
79 void CheckBlacklistState() override { | |
80 blacklist_check_called_ = true; | |
81 ExtensionInstallChecker::CheckBlacklistState(); | |
82 } | |
83 | |
84 void ResetResults() override { | |
85 ExtensionInstallChecker::ResetResults(); | |
86 | |
87 requirements_check_called_ = false; | |
88 blacklist_check_called_ = false; | |
89 policy_check_called_ = false; | |
90 } | |
91 | |
92 bool requirements_check_called_; | |
93 bool blacklist_check_called_; | |
94 bool policy_check_called_; | |
95 | |
96 // Dummy errors for testing. | |
97 std::string requirements_error_; | |
98 | |
99 // Whether the checks that can run asynchronously should do so. | |
100 bool is_async_; | |
101 }; | |
102 | |
103 class CheckObserver { | |
104 public: | |
105 CheckObserver() : result_(0), call_count_(0) {} | |
106 | |
107 int result() const { return result_; } | |
108 int call_count() const { return call_count_; } | |
109 | |
110 void OnChecksComplete(int checks_failed) { | |
111 result_ = checks_failed; | |
112 ++call_count_; | |
113 } | |
114 | |
115 void Wait() { | |
116 if (call_count_) | |
117 return; | |
118 | |
119 base::RunLoop().RunUntilIdle(); | |
120 } | 49 } |
121 | 50 |
122 private: | 51 private: |
123 int result_; | 52 int result_; |
124 int call_count_; | |
125 }; | 53 }; |
126 | 54 |
127 class ExtensionInstallCheckerTest : public testing::Test { | 55 class ExtensionInstallCheckerTest : public testing::Test { |
128 public: | 56 public: |
129 ExtensionInstallCheckerTest() {} | 57 ExtensionInstallCheckerTest() : |
| 58 requirements_checker_stub_(nullptr), |
| 59 blacklist_check_stub_(nullptr), |
| 60 policy_check_stub_(nullptr), |
| 61 is_async_(false) {} |
130 ~ExtensionInstallCheckerTest() override {} | 62 ~ExtensionInstallCheckerTest() override {} |
131 | 63 |
132 void SetBlacklistError(ExtensionInstallCheckerForTest* checker, | 64 void SetRequirementsError(ExtensionInstallChecker* checker, |
| 65 PreloadCheck::Error error, |
| 66 base::string16 message) { |
| 67 std::unique_ptr<PreloadCheckStub> requirements_checker = |
| 68 base::MakeUnique<PreloadCheckStub>(is_async_); |
| 69 if (error != PreloadCheck::NONE) { |
| 70 requirements_checker->AddError(error); |
| 71 requirements_checker->set_error_message(message); |
| 72 } |
| 73 requirements_checker_stub_ = requirements_checker.get(); |
| 74 checker->SetRequirementsCheckerForTesting(std::move(requirements_checker)); |
| 75 } |
| 76 |
| 77 void SetBlacklistError(ExtensionInstallChecker* checker, |
133 PreloadCheck::Error error) { | 78 PreloadCheck::Error error) { |
134 std::unique_ptr<PreloadCheckStub> blacklist_check = | 79 std::unique_ptr<PreloadCheckStub> blacklist_check = |
135 base::MakeUnique<PreloadCheckStub>(checker->is_async()); | 80 base::MakeUnique<PreloadCheckStub>(is_async_); |
136 if (error != PreloadCheck::NONE) | 81 if (error != PreloadCheck::NONE) |
137 blacklist_check->AddError(error); | 82 blacklist_check->AddError(error); |
| 83 blacklist_check_stub_ = blacklist_check.get(); |
138 checker->SetBlacklistCheckForTesting(std::move(blacklist_check)); | 84 checker->SetBlacklistCheckForTesting(std::move(blacklist_check)); |
139 } | 85 } |
140 | 86 |
141 void SetPolicyError(ExtensionInstallCheckerForTest* checker, | 87 void SetPolicyError(ExtensionInstallChecker* checker, |
142 PreloadCheck::Error error, | 88 PreloadCheck::Error error, |
143 std::string message) { | 89 base::string16 message) { |
144 // The policy check always runs synchronously. | 90 // The policy check always runs synchronously. |
145 std::unique_ptr<PreloadCheckStub> policy_check = | 91 std::unique_ptr<PreloadCheckStub> policy_check = |
146 base::MakeUnique<PreloadCheckStub>(); | 92 base::MakeUnique<PreloadCheckStub>(); |
147 if (error != PreloadCheck::NONE) { | 93 if (error != PreloadCheck::NONE) { |
148 policy_check->AddError(error); | 94 policy_check->AddError(error); |
149 policy_check->set_error_message(base::UTF8ToUTF16(message)); | 95 policy_check->set_error_message(message); |
150 } | 96 } |
| 97 policy_check_stub_ = policy_check.get(); |
151 checker->SetPolicyCheckForTesting(std::move(policy_check)); | 98 checker->SetPolicyCheckForTesting(std::move(policy_check)); |
152 } | 99 } |
153 | 100 |
154 void RunSecondInvocation(ExtensionInstallCheckerForTest* checker, | 101 void RunSecondInvocation(ExtensionInstallChecker* checker, |
155 int checks_failed) { | 102 int checks_failed) { |
156 EXPECT_GT(checks_failed, 0); | 103 EXPECT_GT(checks_failed, 0); |
157 EXPECT_FALSE(checker->is_running()); | 104 EXPECT_FALSE(checker->is_running()); |
158 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL, *checker); | 105 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL); |
159 | 106 |
160 // Set up different return values. | 107 // Set up different return values. |
161 checker->set_requirements_error(kDummyRequirementsError2); | 108 SetRequirementsError( |
162 | 109 checker, kRequirementsError2, kDummyRequirementsError2); |
163 SetBlacklistError(checker, PreloadCheck::NONE); | 110 SetBlacklistError(checker, PreloadCheck::NONE); |
164 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, | 111 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, |
165 kDummyPolicyError2); | 112 kDummyPolicyError2); |
166 | 113 |
167 // Run the install checker again and ensure the second set of return values | 114 // Run the install checker again and ensure the second set of return values |
168 // is received. | 115 // is received. |
169 checker->Start( | 116 checker->Start( |
| 117 nullptr, |
170 ExtensionInstallChecker::CHECK_ALL, | 118 ExtensionInstallChecker::CHECK_ALL, |
171 false /* fail fast */, | 119 false /* fail fast */, |
172 base::Bind(&ExtensionInstallCheckerTest::ValidateSecondInvocation, | 120 base::Bind(&ExtensionInstallCheckerTest::ValidateSecondInvocation, |
173 base::Unretained(this), | 121 base::Unretained(this), |
174 checker)); | 122 checker)); |
175 } | 123 } |
176 | 124 |
177 void ValidateSecondInvocation(ExtensionInstallCheckerForTest* checker, | 125 void ValidateSecondInvocation(ExtensionInstallChecker* checker, |
178 int checks_failed) { | 126 int checks_failed) { |
179 EXPECT_FALSE(checker->is_running()); | 127 EXPECT_FALSE(checker->is_running()); |
180 EXPECT_EQ(ExtensionInstallChecker::CHECK_REQUIREMENTS | | 128 EXPECT_EQ(ExtensionInstallChecker::CHECK_REQUIREMENTS | |
181 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, | 129 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, |
182 checks_failed); | 130 checks_failed); |
183 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL, *checker); | 131 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL); |
184 | 132 |
185 EXPECT_EQ(kBlacklistError2, checker->blacklist_error()); | 133 EXPECT_EQ(kBlacklistError2, checker->blacklist_error()); |
186 ExpectPolicyError(kDummyPolicyError2, *checker); | 134 ExpectPolicyError(kDummyPolicyError2, *checker); |
187 ExpectRequirementsError(kDummyRequirementsError2, *checker); | 135 ExpectRequirementsError(kDummyRequirementsError2, *checker); |
188 } | 136 } |
189 | 137 |
190 protected: | 138 protected: |
191 void SetAllPass(ExtensionInstallCheckerForTest* checker) { | 139 void SetAllPass(ExtensionInstallChecker* checker) { |
| 140 SetRequirementsError(checker, PreloadCheck::NONE, base::string16()); |
192 SetBlacklistError(checker, PreloadCheck::NONE); | 141 SetBlacklistError(checker, PreloadCheck::NONE); |
193 SetPolicyError(checker, PreloadCheck::NONE, ""); | 142 SetPolicyError(checker, PreloadCheck::NONE, base::string16()); |
194 checker->set_requirements_error(""); | |
195 } | 143 } |
196 | 144 |
197 void SetAllErrors(ExtensionInstallCheckerForTest* checker) { | 145 void SetAllErrors(ExtensionInstallChecker* checker) { |
| 146 SetRequirementsError(checker, kRequirementsError, kDummyRequirementsError); |
198 SetBlacklistError(checker, kBlacklistError); | 147 SetBlacklistError(checker, kBlacklistError); |
199 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, | 148 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, |
200 kDummyPolicyError); | 149 kDummyPolicyError); |
201 checker->set_requirements_error(kDummyRequirementsError); | |
202 } | 150 } |
203 | 151 |
204 void ValidateExpectedCalls(int call_mask, | 152 void ValidateExpectedCalls(int call_mask) { |
205 const ExtensionInstallCheckerForTest& checker) { | |
206 bool expect_blacklist_checked = | 153 bool expect_blacklist_checked = |
207 (call_mask & ExtensionInstallChecker::CHECK_BLACKLIST) != 0; | 154 (call_mask & ExtensionInstallChecker::CHECK_BLACKLIST) != 0; |
208 bool expect_requirements_checked = | 155 bool expect_requirements_checked = |
209 (call_mask & ExtensionInstallChecker::CHECK_REQUIREMENTS) != 0; | 156 (call_mask & ExtensionInstallChecker::CHECK_REQUIREMENTS) != 0; |
210 bool expect_policy_checked = | 157 bool expect_policy_checked = |
211 (call_mask & ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY) != 0; | 158 (call_mask & ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY) != 0; |
212 EXPECT_EQ(expect_blacklist_checked, checker.blacklist_check_called()); | 159 EXPECT_EQ(expect_blacklist_checked, |
213 EXPECT_EQ(expect_policy_checked, checker.policy_check_called()); | 160 blacklist_check_stub_ && blacklist_check_stub_->started()); |
214 EXPECT_EQ(expect_requirements_checked, checker.requirements_check_called()); | 161 EXPECT_EQ(expect_policy_checked, |
| 162 policy_check_stub_ && policy_check_stub_->started()); |
| 163 EXPECT_EQ(expect_requirements_checked, |
| 164 requirements_checker_stub_ && requirements_checker_stub_->started()); |
215 } | 165 } |
216 | 166 |
217 void ExpectRequirementsPass(const ExtensionInstallCheckerForTest& checker) { | 167 void ExpectRequirementsPass(const ExtensionInstallChecker& checker) { |
218 EXPECT_TRUE(checker.requirement_errors().empty()); | 168 EXPECT_TRUE(checker.requirement_error_message().empty()); |
219 } | 169 } |
220 | 170 |
221 void ExpectRequirementsError(const char* expected_error, | 171 void ExpectRequirementsError(base::string16 expected_error, |
222 const ExtensionInstallCheckerForTest& checker) { | 172 const ExtensionInstallChecker& checker) { |
223 EXPECT_FALSE(checker.requirement_errors().empty()); | 173 EXPECT_FALSE(checker.requirement_error_message().empty()); |
224 EXPECT_EQ(std::string(expected_error), | 174 EXPECT_EQ(expected_error, |
225 checker.requirement_errors().front()); | 175 checker.requirement_error_message()); |
226 } | 176 } |
227 | 177 |
228 void ExpectRequirementsError(const ExtensionInstallCheckerForTest& checker) { | 178 void ExpectRequirementsError(const ExtensionInstallChecker& checker) { |
229 ExpectRequirementsError(kDummyRequirementsError, checker); | 179 ExpectRequirementsError(kDummyRequirementsError, checker); |
230 } | 180 } |
231 | 181 |
232 void ExpectBlacklistPass(const ExtensionInstallCheckerForTest& checker) { | 182 void ExpectBlacklistPass(const ExtensionInstallChecker& checker) { |
233 EXPECT_EQ(PreloadCheck::NONE, checker.blacklist_error()); | 183 EXPECT_EQ(PreloadCheck::NONE, checker.blacklist_error()); |
234 } | 184 } |
235 | 185 |
236 void ExpectBlacklistError(const ExtensionInstallCheckerForTest& checker) { | 186 void ExpectBlacklistError(const ExtensionInstallChecker& checker) { |
237 EXPECT_EQ(kBlacklistError, checker.blacklist_error()); | 187 EXPECT_EQ(kBlacklistError, checker.blacklist_error()); |
238 } | 188 } |
239 | 189 |
240 void ExpectPolicyPass(const ExtensionInstallCheckerForTest& checker) { | 190 void ExpectPolicyPass(const ExtensionInstallChecker& checker) { |
241 EXPECT_TRUE(checker.policy_error().empty()); | 191 EXPECT_TRUE(checker.policy_error().empty()); |
242 } | 192 } |
243 | 193 |
244 void ExpectPolicyError(const char* expected_error, | 194 void ExpectPolicyError(base::string16 expected_error, |
245 const ExtensionInstallCheckerForTest& checker) { | 195 const ExtensionInstallChecker& checker) { |
246 EXPECT_FALSE(checker.policy_error().empty()); | 196 EXPECT_FALSE(checker.policy_error().empty()); |
247 EXPECT_EQ(std::string(expected_error), checker.policy_error()); | 197 EXPECT_EQ(expected_error, checker.policy_error()); |
248 } | 198 } |
249 | 199 |
250 void ExpectPolicyError(const ExtensionInstallCheckerForTest& checker) { | 200 void ExpectPolicyError(const ExtensionInstallChecker& checker) { |
251 ExpectPolicyError(kDummyPolicyError, checker); | 201 ExpectPolicyError(kDummyPolicyError, checker); |
252 } | 202 } |
253 | 203 |
254 void RunChecker(ExtensionInstallCheckerForTest* checker, | 204 void RunChecker(ExtensionInstallChecker* checker, |
255 bool fail_fast, | 205 bool fail_fast, |
256 int checks_to_run, | 206 int checks_to_run, |
257 int expected_checks_run, | 207 int expected_checks_run, |
258 int expected_result) { | 208 int expected_result) { |
259 CheckObserver observer; | 209 ExtensionInstallCheckerObserver observer; |
260 checker->Start(checks_to_run, | 210 checker->Start(nullptr, |
| 211 checks_to_run, |
261 fail_fast, | 212 fail_fast, |
262 base::Bind(&CheckObserver::OnChecksComplete, | 213 base::Bind( |
263 base::Unretained(&observer))); | 214 &ExtensionInstallCheckerObserver::OnChecksComplete, |
| 215 base::Unretained(&observer))); |
264 observer.Wait(); | 216 observer.Wait(); |
265 | 217 |
266 EXPECT_FALSE(checker->is_running()); | 218 EXPECT_FALSE(checker->is_running()); |
267 EXPECT_EQ(expected_result, observer.result()); | 219 EXPECT_EQ(expected_result, observer.result()); |
268 EXPECT_EQ(1, observer.call_count()); | 220 EXPECT_TRUE(observer.called()); |
269 ValidateExpectedCalls(expected_checks_run, *checker); | 221 ValidateExpectedCalls(expected_checks_run); |
270 } | 222 } |
271 | 223 |
272 void DoRunAllChecksPass(ExtensionInstallCheckerForTest* checker) { | 224 void DoRunAllChecksPass(ExtensionInstallChecker* checker) { |
273 SetAllPass(checker); | 225 SetAllPass(checker); |
274 RunChecker(checker, | 226 RunChecker(checker, |
275 false /* fail fast */, | 227 false /* fail fast */, |
276 ExtensionInstallChecker::CHECK_ALL, | 228 ExtensionInstallChecker::CHECK_ALL, |
277 ExtensionInstallChecker::CHECK_ALL, | 229 ExtensionInstallChecker::CHECK_ALL, |
278 0); | 230 0); |
279 | 231 |
280 ExpectRequirementsPass(*checker); | 232 ExpectRequirementsPass(*checker); |
281 ExpectPolicyPass(*checker); | 233 ExpectPolicyPass(*checker); |
282 ExpectBlacklistPass(*checker); | 234 ExpectBlacklistPass(*checker); |
283 } | 235 } |
284 | 236 |
285 void DoRunAllChecksFail(ExtensionInstallCheckerForTest* checker) { | 237 void DoRunAllChecksFail(ExtensionInstallChecker* checker) { |
286 SetAllErrors(checker); | 238 SetAllErrors(checker); |
287 RunChecker(checker, | 239 RunChecker(checker, |
288 false /* fail fast */, | 240 false /* fail fast */, |
289 ExtensionInstallChecker::CHECK_ALL, | 241 ExtensionInstallChecker::CHECK_ALL, |
290 ExtensionInstallChecker::CHECK_ALL, | 242 ExtensionInstallChecker::CHECK_ALL, |
291 ExtensionInstallChecker::CHECK_ALL); | 243 ExtensionInstallChecker::CHECK_ALL); |
292 | 244 |
293 ExpectRequirementsError(*checker); | 245 ExpectRequirementsError(*checker); |
294 ExpectPolicyError(*checker); | 246 ExpectPolicyError(*checker); |
295 ExpectBlacklistError(*checker); | 247 ExpectBlacklistError(*checker); |
296 } | 248 } |
297 | 249 |
298 void DoRunSubsetOfChecks(ExtensionInstallCheckerForTest* checker) { | 250 void DoRunSubsetOfChecks(ExtensionInstallChecker* checker) { |
299 // Test check set 1. | 251 // Test check set 1. |
300 int tests_to_run = ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY | | 252 int tests_to_run = ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY | |
301 ExtensionInstallChecker::CHECK_REQUIREMENTS; | 253 ExtensionInstallChecker::CHECK_REQUIREMENTS; |
302 SetAllErrors(checker); | 254 SetAllErrors(checker); |
303 RunChecker(checker, false, tests_to_run, tests_to_run, tests_to_run); | 255 RunChecker(checker, false, tests_to_run, tests_to_run, tests_to_run); |
304 | 256 |
305 ExpectRequirementsError(*checker); | 257 ExpectRequirementsError(*checker); |
306 ExpectPolicyError(*checker); | 258 ExpectPolicyError(*checker); |
307 ExpectBlacklistPass(*checker); | 259 ExpectBlacklistPass(*checker); |
308 | 260 |
(...skipping 10 matching lines...) Expand all Loading... |
319 // Test a single check. | 271 // Test a single check. |
320 tests_to_run = ExtensionInstallChecker::CHECK_BLACKLIST; | 272 tests_to_run = ExtensionInstallChecker::CHECK_BLACKLIST; |
321 SetAllErrors(checker); | 273 SetAllErrors(checker); |
322 RunChecker(checker, false, tests_to_run, tests_to_run, tests_to_run); | 274 RunChecker(checker, false, tests_to_run, tests_to_run, tests_to_run); |
323 | 275 |
324 ExpectRequirementsPass(*checker); | 276 ExpectRequirementsPass(*checker); |
325 ExpectPolicyPass(*checker); | 277 ExpectPolicyPass(*checker); |
326 ExpectBlacklistError(*checker); | 278 ExpectBlacklistError(*checker); |
327 } | 279 } |
328 | 280 |
| 281 // Call to specify whether the checks should simulate running asynchronously. |
| 282 void set_is_async(bool is_async) { is_async_ = is_async; } |
| 283 |
329 private: | 284 private: |
330 // A message loop is required for the asynchronous tests. | 285 // A message loop is required for the asynchronous tests. |
331 base::MessageLoop message_loop; | 286 base::MessageLoop message_loop; |
| 287 |
| 288 PreloadCheckStub* requirements_checker_stub_; |
| 289 PreloadCheckStub* blacklist_check_stub_; |
| 290 PreloadCheckStub* policy_check_stub_; |
| 291 bool is_async_; |
332 }; | 292 }; |
333 | 293 |
334 class ExtensionInstallCheckerMultipleInvocationTest | 294 class ExtensionInstallCheckerMultipleInvocationTest |
335 : public ExtensionInstallCheckerTest { | 295 : public ExtensionInstallCheckerTest { |
336 public: | 296 public: |
337 ExtensionInstallCheckerMultipleInvocationTest() : callback_count_(0) {} | 297 ExtensionInstallCheckerMultipleInvocationTest() : callback_count_(0) {} |
338 ~ExtensionInstallCheckerMultipleInvocationTest() override {} | 298 ~ExtensionInstallCheckerMultipleInvocationTest() override {} |
339 | 299 |
340 void RunSecondInvocation(ExtensionInstallCheckerForTest* checker, | 300 void RunSecondInvocation(ExtensionInstallChecker* checker, |
341 int checks_failed) { | 301 int checks_failed) { |
342 ASSERT_EQ(0, callback_count_); | 302 ASSERT_EQ(0, callback_count_); |
343 ++callback_count_; | 303 ++callback_count_; |
344 EXPECT_FALSE(checker->is_running()); | 304 EXPECT_FALSE(checker->is_running()); |
345 EXPECT_GT(checks_failed, 0); | 305 EXPECT_GT(checks_failed, 0); |
346 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL, *checker); | 306 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL); |
347 | 307 |
348 // Set up different return values. | 308 // Set up different return values. |
| 309 SetRequirementsError( |
| 310 checker, kRequirementsError2, kDummyRequirementsError2); |
349 SetBlacklistError(checker, kBlacklistError2); | 311 SetBlacklistError(checker, kBlacklistError2); |
350 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, | 312 SetPolicyError(checker, PreloadCheck::DISALLOWED_BY_POLICY, |
351 kDummyPolicyError2); | 313 kDummyPolicyError2); |
352 checker->set_requirements_error(kDummyRequirementsError2); | |
353 | 314 |
354 // Run the install checker again and ensure the second set of return values | 315 // Run the install checker again and ensure the second set of return values |
355 // is received. | 316 // is received. |
356 checker->Start(ExtensionInstallChecker::CHECK_ALL, | 317 checker->Start(nullptr, |
| 318 ExtensionInstallChecker::CHECK_ALL, |
357 false /* fail fast */, | 319 false /* fail fast */, |
358 base::Bind(&ExtensionInstallCheckerMultipleInvocationTest:: | 320 base::Bind(&ExtensionInstallCheckerMultipleInvocationTest:: |
359 ValidateSecondInvocation, | 321 ValidateSecondInvocation, |
360 base::Unretained(this), | 322 base::Unretained(this), |
361 checker)); | 323 checker)); |
362 } | 324 } |
363 | 325 |
364 void ValidateSecondInvocation(ExtensionInstallCheckerForTest* checker, | 326 void ValidateSecondInvocation(ExtensionInstallChecker* checker, |
365 int checks_failed) { | 327 int checks_failed) { |
366 ASSERT_EQ(1, callback_count_); | 328 ASSERT_EQ(1, callback_count_); |
367 EXPECT_FALSE(checker->is_running()); | 329 EXPECT_FALSE(checker->is_running()); |
368 EXPECT_EQ(ExtensionInstallChecker::CHECK_REQUIREMENTS | | 330 EXPECT_EQ(ExtensionInstallChecker::CHECK_REQUIREMENTS | |
369 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, | 331 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, |
370 checks_failed); | 332 checks_failed); |
371 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL, *checker); | 333 ValidateExpectedCalls(ExtensionInstallChecker::CHECK_ALL); |
372 | 334 |
373 EXPECT_EQ(kBlacklistError2, checker->blacklist_error()); | 335 EXPECT_EQ(kBlacklistError2, checker->blacklist_error()); |
374 ExpectPolicyError(kDummyPolicyError2, *checker); | 336 ExpectPolicyError(kDummyPolicyError2, *checker); |
375 ExpectRequirementsError(kDummyRequirementsError2, *checker); | 337 ExpectRequirementsError(kDummyRequirementsError2, *checker); |
376 } | 338 } |
377 | 339 |
378 private: | 340 private: |
379 int callback_count_; | 341 int callback_count_; |
380 }; | 342 }; |
381 | 343 |
382 // Test the case where all tests pass. | 344 // Test the case where all tests pass. |
383 TEST_F(ExtensionInstallCheckerTest, AllSucceeded) { | 345 TEST_F(ExtensionInstallCheckerTest, AllSucceeded) { |
384 ExtensionInstallCheckerForTest sync_checker(false); | 346 ExtensionInstallChecker sync_checker(nullptr); |
385 DoRunAllChecksPass(&sync_checker); | 347 DoRunAllChecksPass(&sync_checker); |
386 | 348 |
387 ExtensionInstallCheckerForTest async_checker(true); | 349 set_is_async(true); |
| 350 ExtensionInstallChecker async_checker(nullptr); |
388 DoRunAllChecksPass(&async_checker); | 351 DoRunAllChecksPass(&async_checker); |
389 } | 352 } |
390 | 353 |
391 // Test the case where all tests fail. | 354 // Test the case where all tests fail. |
392 TEST_F(ExtensionInstallCheckerTest, AllFailed) { | 355 TEST_F(ExtensionInstallCheckerTest, AllFailed) { |
393 ExtensionInstallCheckerForTest sync_checker(false); | 356 ExtensionInstallChecker sync_checker(nullptr); |
394 DoRunAllChecksFail(&sync_checker); | 357 DoRunAllChecksFail(&sync_checker); |
395 | 358 |
396 ExtensionInstallCheckerForTest async_checker(true); | 359 set_is_async(true); |
| 360 ExtensionInstallChecker async_checker(nullptr); |
397 DoRunAllChecksFail(&async_checker); | 361 DoRunAllChecksFail(&async_checker); |
398 } | 362 } |
399 | 363 |
400 // Test running only a subset of tests. | 364 // Test running only a subset of tests. |
401 TEST_F(ExtensionInstallCheckerTest, RunSubsetOfChecks) { | 365 TEST_F(ExtensionInstallCheckerTest, RunSubsetOfChecks) { |
402 ExtensionInstallCheckerForTest sync_checker(false); | 366 ExtensionInstallChecker sync_checker(nullptr); |
403 DoRunSubsetOfChecks(&sync_checker); | 367 DoRunSubsetOfChecks(&sync_checker); |
404 | 368 |
405 ExtensionInstallCheckerForTest async_checker(true); | 369 set_is_async(true); |
| 370 ExtensionInstallChecker async_checker(nullptr); |
406 DoRunSubsetOfChecks(&async_checker); | 371 DoRunSubsetOfChecks(&async_checker); |
407 } | 372 } |
408 | 373 |
409 // Test fail fast with synchronous callbacks. | 374 // Test fail fast with synchronous callbacks. |
410 TEST_F(ExtensionInstallCheckerTest, FailFastSync) { | 375 TEST_F(ExtensionInstallCheckerTest, FailFastSync) { |
411 // This test assumes some internal knowledge of the implementation - that | 376 // This test assumes some internal knowledge of the implementation - that |
412 // the policy check runs first. | 377 // the policy check runs first. |
413 ExtensionInstallCheckerForTest checker(false); | 378 ExtensionInstallChecker checker(nullptr); |
414 SetAllErrors(&checker); | 379 SetAllErrors(&checker); |
415 RunChecker(&checker, | 380 RunChecker(&checker, |
416 true /* fail fast */, | 381 true /* fail fast */, |
417 ExtensionInstallChecker::CHECK_ALL, | 382 ExtensionInstallChecker::CHECK_ALL, |
418 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, | 383 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY, |
419 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY); | 384 ExtensionInstallChecker::CHECK_MANAGEMENT_POLICY); |
420 | 385 |
421 ExpectRequirementsPass(checker); | 386 ExpectRequirementsPass(checker); |
422 ExpectPolicyError(checker); | 387 ExpectPolicyError(checker); |
423 ExpectBlacklistPass(checker); | 388 ExpectBlacklistPass(checker); |
(...skipping 12 matching lines...) Expand all Loading... |
436 ExpectPolicyPass(checker); | 401 ExpectPolicyPass(checker); |
437 ExpectBlacklistPass(checker); | 402 ExpectBlacklistPass(checker); |
438 } | 403 } |
439 | 404 |
440 // Test fail fast with asynchronous callbacks. | 405 // Test fail fast with asynchronous callbacks. |
441 TEST_F(ExtensionInstallCheckerTest, FailFastAsync) { | 406 TEST_F(ExtensionInstallCheckerTest, FailFastAsync) { |
442 // This test assumes some internal knowledge of the implementation - that | 407 // This test assumes some internal knowledge of the implementation - that |
443 // the requirements check runs before the blacklist check. Both checks should | 408 // the requirements check runs before the blacklist check. Both checks should |
444 // be called, but the requirements check callback arrives first and the | 409 // be called, but the requirements check callback arrives first and the |
445 // blacklist result will be discarded. | 410 // blacklist result will be discarded. |
446 ExtensionInstallCheckerForTest checker(true); | 411 set_is_async(true); |
| 412 ExtensionInstallChecker checker(nullptr); |
447 SetAllErrors(&checker); | 413 SetAllErrors(&checker); |
448 | 414 |
449 // The policy check is synchronous and needs to pass for the other tests to | 415 // The policy check is synchronous and needs to pass for the other tests to |
450 // run. | 416 // run. |
451 SetPolicyError(&checker, PreloadCheck::NONE, ""); | 417 SetPolicyError(&checker, PreloadCheck::NONE, base::string16()); |
452 | 418 |
453 RunChecker(&checker, | 419 RunChecker(&checker, |
454 true /* fail fast */, | 420 true /* fail fast */, |
455 ExtensionInstallChecker::CHECK_ALL, | 421 ExtensionInstallChecker::CHECK_ALL, |
456 ExtensionInstallChecker::CHECK_ALL, | 422 ExtensionInstallChecker::CHECK_ALL, |
457 ExtensionInstallChecker::CHECK_REQUIREMENTS); | 423 ExtensionInstallChecker::CHECK_REQUIREMENTS); |
458 | 424 |
459 ExpectRequirementsError(checker); | 425 ExpectRequirementsError(checker); |
460 ExpectPolicyPass(checker); | 426 ExpectPolicyPass(checker); |
461 ExpectBlacklistPass(checker); | 427 ExpectBlacklistPass(checker); |
462 } | 428 } |
463 | 429 |
464 // Test multiple invocations of the install checker. Wait for all checks to | 430 // Test multiple invocations of the install checker. Wait for all checks to |
465 // complete. | 431 // complete. |
466 TEST_F(ExtensionInstallCheckerMultipleInvocationTest, CompleteAll) { | 432 TEST_F(ExtensionInstallCheckerMultipleInvocationTest, CompleteAll) { |
467 ExtensionInstallCheckerForTest checker(true); | 433 set_is_async(true); |
| 434 ExtensionInstallChecker checker(nullptr); |
468 SetAllErrors(&checker); | 435 SetAllErrors(&checker); |
469 | 436 |
470 // Start the second check as soon as the callback of the first run is invoked. | 437 // Start the second check as soon as the callback of the first run is invoked. |
471 checker.Start( | 438 checker.Start( |
| 439 nullptr, |
472 ExtensionInstallChecker::CHECK_ALL, | 440 ExtensionInstallChecker::CHECK_ALL, |
473 false /* fail fast */, | 441 false /* fail fast */, |
474 base::Bind( | 442 base::Bind( |
475 &ExtensionInstallCheckerMultipleInvocationTest::RunSecondInvocation, | 443 &ExtensionInstallCheckerMultipleInvocationTest::RunSecondInvocation, |
476 base::Unretained(this), | 444 base::Unretained(this), |
477 &checker)); | 445 &checker)); |
478 base::RunLoop().RunUntilIdle(); | 446 base::RunLoop().RunUntilIdle(); |
479 } | 447 } |
480 | 448 |
481 // Test multiple invocations of the install checker and fail fast. | 449 // Test multiple invocations of the install checker and fail fast. |
482 TEST_F(ExtensionInstallCheckerMultipleInvocationTest, FailFast) { | 450 TEST_F(ExtensionInstallCheckerMultipleInvocationTest, FailFast) { |
483 ExtensionInstallCheckerForTest checker(true); | 451 set_is_async(true); |
| 452 ExtensionInstallChecker checker(nullptr); |
484 SetAllErrors(&checker); | 453 SetAllErrors(&checker); |
485 | 454 |
486 // The policy check is synchronous and needs to pass for the other tests to | 455 // The policy check is synchronous and needs to pass for the other tests to |
487 // run. | 456 // run. |
488 SetPolicyError(&checker, PreloadCheck::NONE, ""); | 457 SetPolicyError(&checker, PreloadCheck::NONE, base::string16()); |
489 | 458 |
490 // Start the second check as soon as the callback of the first run is invoked. | 459 // Start the second check as soon as the callback of the first run is invoked. |
491 checker.Start( | 460 checker.Start( |
| 461 nullptr, |
492 ExtensionInstallChecker::CHECK_ALL, | 462 ExtensionInstallChecker::CHECK_ALL, |
493 true /* fail fast */, | 463 true /* fail fast */, |
494 base::Bind( | 464 base::Bind( |
495 &ExtensionInstallCheckerMultipleInvocationTest::RunSecondInvocation, | 465 &ExtensionInstallCheckerMultipleInvocationTest::RunSecondInvocation, |
496 base::Unretained(this), | 466 base::Unretained(this), |
497 &checker)); | 467 &checker)); |
498 base::RunLoop().RunUntilIdle(); | 468 base::RunLoop().RunUntilIdle(); |
499 } | 469 } |
500 | 470 |
501 } // namespace extensions | 471 } // namespace extensions |
OLD | NEW |