Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: extensions/browser/preload_check_group_unittest.cc

Issue 2745433002: PreloadCheckGroup for managing multiple extension PreloadChecks (Closed)
Patch Set: rebase & updates Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/browser/preload_check_group.cc ('k') | extensions/browser/preload_check_test_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « extensions/browser/preload_check_group.cc ('k') | extensions/browser/preload_check_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698