OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 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 <memory> |
| 6 #include <string> |
| 7 #include <vector> |
| 8 |
| 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/memory/ref_counted.h" |
| 11 #include "base/message_loop/message_loop.h" |
| 12 #include "extensions/browser/preload_check.h" |
| 13 #include "extensions/browser/preload_check_group.h" |
| 14 #include "extensions/browser/preload_check_test_util.h" |
| 15 #include "extensions/common/extension.h" |
| 16 #include "testing/gmock/include/gmock/gmock.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 |
| 19 namespace extensions { |
| 20 |
| 21 namespace { |
| 22 |
| 23 using PreloadCheckStubs = std::vector<std::unique_ptr<PreloadCheckStub>>; |
| 24 |
| 25 // const char kDummyErrorMessage1[] = "Dummy error 1 ocurred"; |
| 26 // const char kDummyErrorMessage2[] = "Dummy error 2 ocurred"; |
| 27 |
| 28 PreloadCheck::Error kDummyError1 = PreloadCheck::DISALLOWED_BY_POLICY; |
| 29 PreloadCheck::Error kDummyError2 = PreloadCheck::BLACKLISTED_ID; |
| 30 PreloadCheck::Error kDummyError3 = PreloadCheck::BLACKLISTED_UNKNOWN; |
| 31 |
| 32 std::vector<PreloadCheck*> GetRawPointers(PreloadCheckStubs* checks) { |
| 33 std::vector<PreloadCheck*> check_ptrs; |
| 34 for (auto& check : *checks) |
| 35 check_ptrs.push_back(check.get()); |
| 36 return check_ptrs; |
| 37 } |
| 38 |
| 39 } // namespace |
| 40 |
| 41 class PreloadCheckGroupTest : public testing::Test { |
| 42 public: |
| 43 PreloadCheckGroupTest() {} |
| 44 ~PreloadCheckGroupTest() override {} |
| 45 |
| 46 void SetUp() override { |
| 47 base::DictionaryValue manifest_dict; |
| 48 manifest_dict.SetString("name", "dummy name"); |
| 49 manifest_dict.SetString("version", "1"); |
| 50 std::string error; |
| 51 |
| 52 extension_ = |
| 53 Extension::Create(base::FilePath(), extensions::Manifest::UNPACKED, |
| 54 manifest_dict, Extension::NO_FLAGS, &error); |
| 55 EXPECT_TRUE(extension_.get()) << error; |
| 56 } |
| 57 |
| 58 // was 216 lines, including these comments |
| 59 // now 209 lines, including these comments |
| 60 std::unique_ptr<PreloadCheckStub> MakeCheck( |
| 61 bool is_async = false, |
| 62 PreloadCheck::Error error1 = PreloadCheck::NONE, |
| 63 PreloadCheck::Error error2 = PreloadCheck::NONE) { |
| 64 PreloadCheck::Errors errors; |
| 65 if (error1 != PreloadCheck::NONE) |
| 66 errors.insert(error1); |
| 67 if (error2 != PreloadCheck::NONE) |
| 68 errors.insert(error2); |
| 69 return base::MakeUnique<PreloadCheckStub>(is_async, errors); |
| 70 } |
| 71 |
| 72 protected: |
| 73 // Verifies that all checks have started. |
| 74 void ExpectStarted(const PreloadCheckStubs& checks) { |
| 75 for (const auto& check : checks) |
| 76 EXPECT_TRUE(check->started()); |
| 77 } |
| 78 |
| 79 scoped_refptr<Extension> extension_; |
| 80 |
| 81 protected: |
| 82 PreloadCheckRunner runner_; |
| 83 |
| 84 private: |
| 85 // A message loop is required for the asynchronous tests. |
| 86 base::MessageLoop message_loop_; |
| 87 }; |
| 88 |
| 89 // Tests multiple succeeding checks. |
| 90 TEST_F(PreloadCheckGroupTest, Succeed) { |
| 91 PreloadCheckStubs checks; |
| 92 for (int i = 0; i < 3; i++) |
| 93 checks.emplace_back(MakeCheck()); |
| 94 |
| 95 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 96 /*fail_fast=*/false); |
| 97 runner_.Run(&check_group); |
| 98 ExpectStarted(checks); |
| 99 EXPECT_EQ(0u, runner_.errors().size()); |
| 100 } |
| 101 |
| 102 // Tests multiple succeeding sync and async checks. |
| 103 TEST_F(PreloadCheckGroupTest, SucceedAsync) { |
| 104 PreloadCheckStubs checks; |
| 105 for (int i = 0; i < 2; i++) { |
| 106 checks.emplace_back(MakeCheck(/*is_async=*/false)); |
| 107 checks.emplace_back(MakeCheck(/*is_async=*/true)); |
| 108 } |
| 109 |
| 110 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 111 /*fail_fast=*/false); |
| 112 runner_.RunUntilComplete(&check_group); |
| 113 ExpectStarted(checks); |
| 114 EXPECT_EQ(0u, runner_.errors().size()); |
| 115 } |
| 116 |
| 117 // Tests failing checks without fail_fast. |
| 118 TEST_F(PreloadCheckGroupTest, Fail) { |
| 119 PreloadCheckStubs checks; |
| 120 checks.emplace_back(MakeCheck()); |
| 121 // Add an async check that fails with 2 errors. |
| 122 checks.emplace_back(MakeCheck(/*is_async=*/true, kDummyError1, kDummyError2)); |
| 123 // Add an sync check that fails with one error. |
| 124 checks.emplace_back(MakeCheck(/*is_async=*/false, kDummyError3)); |
| 125 |
| 126 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 127 /*fail_fast=*/false); |
| 128 runner_.Run(&check_group); |
| 129 ExpectStarted(checks); |
| 130 EXPECT_FALSE(runner_.called()); |
| 131 |
| 132 // The runner is called with all errors. |
| 133 runner_.WaitForComplete(); |
| 134 EXPECT_TRUE(runner_.called()); |
| 135 EXPECT_EQ(3u, runner_.errors().size()); |
| 136 } |
| 137 |
| 138 // Tests failing synchronous checks with fail_fast. |
| 139 TEST_F(PreloadCheckGroupTest, FailFast) { |
| 140 PreloadCheckStubs checks; |
| 141 |
| 142 // Add a sync check that immediately fails with 2 errors. |
| 143 checks.emplace_back( |
| 144 MakeCheck(/*is_async=*/false, kDummyError1, kDummyError2)); |
| 145 // Add a sync check that would also fail, except it shouldn't be run. |
| 146 checks.emplace_back(MakeCheck(/*is_async=*/false, kDummyError3)); |
| 147 |
| 148 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 149 /*fail_fast=*/true); |
| 150 runner_.Run(&check_group); |
| 151 |
| 152 // After the first check fails, the remaining checks should not be started. |
| 153 EXPECT_TRUE(runner_.called()); |
| 154 EXPECT_TRUE(checks[0]->started()); |
| 155 EXPECT_FALSE(checks[1]->started()); |
| 156 |
| 157 // Only the errors from the first failure should have been counted. |
| 158 EXPECT_THAT(runner_.errors(), |
| 159 testing::UnorderedElementsAre(kDummyError1, kDummyError2)); |
| 160 |
| 161 // Nothing should change after running the message loop. |
| 162 runner_.WaitForIdle(); |
| 163 EXPECT_FALSE(checks[1]->started()); |
| 164 } |
| 165 |
| 166 // Tests failing asynchronous checks with fail_fast. |
| 167 TEST_F(PreloadCheckGroupTest, FailFastAsync) { |
| 168 PreloadCheckStubs checks; |
| 169 |
| 170 // Add a succeeding sync check. |
| 171 checks.emplace_back(MakeCheck(/*is_asnc=*/false)); |
| 172 |
| 173 // Add failing async checks. |
| 174 checks.emplace_back(MakeCheck(/*is_asnc=*/true, kDummyError1)); |
| 175 checks.emplace_back(MakeCheck(/*is_asnc=*/true, kDummyError2)); |
| 176 |
| 177 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 178 /*fail_fast=*/true); |
| 179 runner_.Run(&check_group); |
| 180 |
| 181 // All checks were started, because the sync checks pass. |
| 182 ExpectStarted(checks); |
| 183 EXPECT_FALSE(runner_.called()); |
| 184 |
| 185 runner_.WaitForComplete(); |
| 186 |
| 187 // The first async check should have failed, triggering fail fast. The |
| 188 // second async check's failure should be ignored. |
| 189 EXPECT_THAT(runner_.errors(), testing::UnorderedElementsAre(kDummyError1)); |
| 190 } |
| 191 |
| 192 // Tests we don't crash when the PreloadCheckGroup is destroyed prematurely. |
| 193 TEST_F(PreloadCheckGroupTest, DestroyPreloadCheckGroup) { |
| 194 PreloadCheckStubs checks; |
| 195 checks.emplace_back(MakeCheck(/*is_asnc=*/true, kDummyError1)); |
| 196 |
| 197 { |
| 198 PreloadCheckGroup check_group(extension_, GetRawPointers(&checks), |
| 199 /*fail_fast=*/true); |
| 200 runner_.Run(&check_group); |
| 201 } |
| 202 |
| 203 // Checks should have been started, but the runner is never called. |
| 204 ExpectStarted(checks); |
| 205 runner_.WaitForIdle(); |
| 206 EXPECT_FALSE(runner_.called()); |
| 207 } |
| 208 |
| 209 } // namespace extensions |
OLD | NEW |