| 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 |