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

Side by Side Diff: components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc

Issue 2683413003: Introduce AsyncDocumentSubresourceFilter. (Closed)
Patch Set: Address comments from csharrison@. Created 3 years, 10 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
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 "components/subresource_filter/content/browser/async_document_subresour ce_filter.h"
6
7 #include <memory>
8 #include <vector>
9
10 #include "base/bind.h"
engedy 2017/02/14 15:13:14 nit: #include "base/bind_helpers.h"
pkalinnikov 2017/02/14 18:47:14 Done.
11 #include "base/macros.h"
12 #include "base/memory/ptr_util.h"
13 #include "base/test/test_simple_task_runner.h"
14 #include "base/threading/sequenced_task_runner_handle.h"
15 #include "components/subresource_filter/core/common/proto/rules.pb.h"
16 #include "components/subresource_filter/core/common/test_ruleset_creator.h"
17 #include "components/subresource_filter/core/common/test_ruleset_utils.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace subresource_filter {
21
22 class AsyncDocumentSubresourceFilterTest : public ::testing::Test {
23 public:
24 AsyncDocumentSubresourceFilterTest()
25 : blocking_task_runner_(new base::TestSimpleTaskRunner),
26 reply_task_runner_(new base::TestSimpleTaskRunner),
27 reply_task_runner_handle_(reply_task_runner_) {}
28
29 protected:
30 void SetUp() override {
31 std::vector<proto::UrlRule> rules;
32 rules.push_back(testing::CreateWhitelistRuleForDocument(
33 "child2.com", proto::ACTIVATION_TYPE_GENERICBLOCK,
engedy 2017/02/14 15:13:14 nit: How about whilelisted.subframe.com and exampl
pkalinnikov 2017/02/14 18:47:14 Done.
34 {"parent1.com", "parent2.com"}));
35 rules.push_back(testing::CreateSuffixRule("block-this.html"));
engedy 2017/02/14 15:13:14 nit: disallowed.html
pkalinnikov 2017/02/14 18:47:14 Done.
36
37 ASSERT_NO_FATAL_FAILURE(test_ruleset_creator_.CreateRulesetWithRules(
38 rules, &test_ruleset_pair_));
39
40 dealer_handle_.reset(
41 new VerifiedRulesetDealer::Handle(blocking_task_runner_));
42 }
43
44 void TearDown() override {
45 dealer_handle_.reset(nullptr);
46 RunUntilIdle();
47 }
48
49 const testing::TestRuleset& ruleset() const {
50 return test_ruleset_pair_.indexed;
51 }
52
53 void RunUntilIdle() {
54 while (blocking_task_runner_->HasPendingTask() ||
55 reply_task_runner_->HasPendingTask()) {
56 blocking_task_runner_->RunUntilIdle();
57 reply_task_runner_->RunUntilIdle();
58 }
59 }
60
61 VerifiedRulesetDealer::Handle* dealer_handle() {
62 return dealer_handle_.get();
63 }
64
65 std::unique_ptr<VerifiedRuleset::Handle> CreateRulesetHandle() {
66 return std::unique_ptr<VerifiedRuleset::Handle>(
engedy 2017/02/14 15:13:14 nit: Can we use MakeUnique for this?
pkalinnikov 2017/02/14 18:47:14 Done.
67 new VerifiedRuleset::Handle(dealer_handle()));
68 }
69
70 private:
71 scoped_refptr<base::TestSimpleTaskRunner> blocking_task_runner_;
72 scoped_refptr<base::TestSimpleTaskRunner> reply_task_runner_;
73 // Note: ADSF assumes a task runner is associated with the current thread.
74 base::SequencedTaskRunnerHandle reply_task_runner_handle_;
75
76 testing::TestRulesetCreator test_ruleset_creator_;
engedy 2017/02/14 15:13:14 nit: Can there be any tasks left in these task run
pkalinnikov 2017/02/14 18:47:14 We have RunUntilIdle() in TearDown(), but still le
77 testing::TestRulesetPair test_ruleset_pair_;
78
79 std::unique_ptr<VerifiedRulesetDealer::Handle> dealer_handle_;
80
81 DISALLOW_COPY_AND_ASSIGN(AsyncDocumentSubresourceFilterTest);
82 };
83
84 namespace {
85
86 class TestActivationStateCallbackReceiver {
87 public:
88 TestActivationStateCallbackReceiver() = default;
89
90 base::Callback<void(ActivationState)> callback() {
91 return base::Bind(&TestActivationStateCallbackReceiver::Callback,
92 base::Unretained(this));
93 }
94 void Expect(ActivationState expected_state) const {
engedy 2017/02/14 15:13:14 nit: How about making the expectations in the test
pkalinnikov 2017/02/14 18:47:14 Done.
95 ASSERT_EQ(1, callback_count_);
96 EXPECT_EQ(expected_state, activation_state_);
97 }
98
99 private:
100 void Callback(ActivationState activation_state) {
101 ++callback_count_;
102 activation_state_ = activation_state;
103 }
104
105 ActivationState activation_state_;
engedy 2017/02/14 15:13:14 nit: last_activation_state_;
pkalinnikov 2017/02/14 18:47:14 Done.
106 int callback_count_ = 0;
107
108 DISALLOW_COPY_AND_ASSIGN(TestActivationStateCallbackReceiver);
109 };
110
111 class TestCallbackReceiver {
112 public:
113 TestCallbackReceiver() = default;
114
115 base::Closure closure() {
116 return base::Bind(&TestCallbackReceiver::Callback, base::Unretained(this));
117 }
118 int callback_count() const { return callback_count_; }
119
120 private:
121 void Callback() { ++callback_count_; }
122
123 int callback_count_ = 0;
124
125 DISALLOW_COPY_AND_ASSIGN(TestCallbackReceiver);
126 };
127
128 class LoadPolicyCallbackReceiver {
129 public:
130 LoadPolicyCallbackReceiver() = default;
131
132 AsyncDocumentSubresourceFilter::LoadPolicyCallback callback() {
133 return base::Bind(&LoadPolicyCallbackReceiver::Callback,
134 base::Unretained(this));
135 }
136 void Expect(AsyncDocumentSubresourceFilter::LoadPolicy load_policy) const {
137 ASSERT_EQ(1, callback_count_);
138 EXPECT_EQ(load_policy, load_policy_);
139 }
140
141 private:
142 void Callback(AsyncDocumentSubresourceFilter::LoadPolicy load_policy) {
143 ++callback_count_;
144 load_policy_ = load_policy;
145 }
146
147 int callback_count_ = 0;
148 AsyncDocumentSubresourceFilter::LoadPolicy load_policy_;
engedy 2017/02/14 15:13:14 nit: last_load_policy_;
pkalinnikov 2017/02/14 18:47:14 Done.
149
150 DISALLOW_COPY_AND_ASSIGN(LoadPolicyCallbackReceiver);
151 };
152
153 } // namespace
154
155 TEST_F(AsyncDocumentSubresourceFilterTest, ActivationStateIsReported) {
156 dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
157 auto ruleset_handle = CreateRulesetHandle();
158
159 AsyncDocumentSubresourceFilter::InitializationParams params(
160 GURL("http://example.com"), ActivationLevel::ENABLED, false);
161
162 TestActivationStateCallbackReceiver activation_state;
163 auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
164 ruleset_handle.get(), std::move(params), activation_state.callback(),
165 base::OnceClosure());
166
167 RunUntilIdle();
168 activation_state.Expect(ActivationState(ActivationLevel::ENABLED));
169 }
170
171 TEST_F(AsyncDocumentSubresourceFilterTest, ActivationStateIsComputedCorrectly) {
172 dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
173 auto ruleset_handle = CreateRulesetHandle();
174
175 AsyncDocumentSubresourceFilter::InitializationParams params(
176 GURL("http://child2.com"), ActivationLevel::ENABLED, false);
177 params.parent_document_origin = url::Origin(GURL("http://parent2.com"));
178
179 TestActivationStateCallbackReceiver activation_state;
180 auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
181 ruleset_handle.get(), std::move(params), activation_state.callback(),
182 base::OnceClosure());
183
184 RunUntilIdle();
185
186 ActivationState expected_activation_state(ActivationLevel::ENABLED);
187 expected_activation_state.generic_blocking_rules_disabled = true;
188 activation_state.Expect(expected_activation_state);
189 }
190
191 TEST_F(AsyncDocumentSubresourceFilterTest, DisabledForCorruptRuleset) {
192 testing::TestRuleset::CorruptByFilling(ruleset(), 0, 100, 0xFF);
193 dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
194
195 auto ruleset_handle = CreateRulesetHandle();
196
197 AsyncDocumentSubresourceFilter::InitializationParams params(
198 GURL("http://example.com"), ActivationLevel::ENABLED, false);
199
200 TestActivationStateCallbackReceiver activation_state;
201 auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
202 ruleset_handle.get(), std::move(params), activation_state.callback(),
203 base::OnceClosure());
204
205 RunUntilIdle();
206 activation_state.Expect(ActivationState(ActivationLevel::DISABLED));
207 }
208
209 TEST_F(AsyncDocumentSubresourceFilterTest, GetLoadPolicyForSubdocument) {
210 dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
211 auto ruleset_handle = CreateRulesetHandle();
212
213 AsyncDocumentSubresourceFilter::InitializationParams params(
214 GURL("http://example.com"), ActivationLevel::ENABLED, false);
215
216 TestActivationStateCallbackReceiver activation_state;
217 auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
218 ruleset_handle.get(), std::move(params), activation_state.callback(),
219 base::OnceClosure());
220
221 LoadPolicyCallbackReceiver load_policy_1;
222 LoadPolicyCallbackReceiver load_policy_2;
223 filter->GetLoadPolicyForSubdocument(
224 GURL("http://example.com/allow-this.html"), load_policy_1.callback());
225 filter->GetLoadPolicyForSubdocument(
226 GURL("http://example.com/block-this.html"), load_policy_2.callback());
227
228 RunUntilIdle();
229 load_policy_1.Expect(AsyncDocumentSubresourceFilter::LoadPolicy::Allow);
230 load_policy_2.Expect(AsyncDocumentSubresourceFilter::LoadPolicy::Disallow);
231 }
232
233 TEST_F(AsyncDocumentSubresourceFilterTest, FirstDisallowedLoadIsReported) {
234 dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
235 auto ruleset_handle = CreateRulesetHandle();
236
237 TestCallbackReceiver first_disallowed_load_receiver;
238 AsyncDocumentSubresourceFilter::InitializationParams params(
239 GURL("http://example.com"), ActivationLevel::ENABLED, false);
240
241 TestActivationStateCallbackReceiver activation_state;
242 auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
243 ruleset_handle.get(), std::move(params), activation_state.callback(),
244 first_disallowed_load_receiver.closure());
245
246 LoadPolicyCallbackReceiver load_policy_1;
247 filter->GetLoadPolicyForSubdocument(
248 GURL("http://example.com/allow-this.html"), load_policy_1.callback());
249 RunUntilIdle();
250 load_policy_1.Expect(AsyncDocumentSubresourceFilter::LoadPolicy::Allow);
251 EXPECT_EQ(0, first_disallowed_load_receiver.callback_count());
252
253 LoadPolicyCallbackReceiver load_policy_2;
254 filter->GetLoadPolicyForSubdocument(
255 GURL("http://example.com/block-this.html"), load_policy_2.callback());
256 RunUntilIdle();
257 load_policy_2.Expect(AsyncDocumentSubresourceFilter::LoadPolicy::Disallow);
258 EXPECT_EQ(0, first_disallowed_load_receiver.callback_count());
259
260 filter->ReportDisallowedLoad();
261 EXPECT_EQ(1, first_disallowed_load_receiver.callback_count());
262 RunUntilIdle();
263 }
264
265 } // namespace subresource_filter
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698