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

Unified Diff: components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc

Issue 2683413003: Introduce AsyncDocumentSubresourceFilter. (Closed)
Patch Set: Rebase. 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 side-by-side diff with in-line comments
Download patch
Index: components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc
diff --git a/components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc b/components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a3cef1565cd9923fc7aa080645a7285b6967252f
--- /dev/null
+++ b/components/subresource_filter/content/browser/async_document_subresource_filter_unittest.cc
@@ -0,0 +1,267 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/subresource_filter/content/browser/async_document_subresource_filter.h"
+
+#include <memory>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "components/subresource_filter/core/common/proto/rules.pb.h"
+#include "components/subresource_filter/core/common/test_ruleset_creator.h"
+#include "components/subresource_filter/core/common/test_ruleset_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace subresource_filter {
+
+class AsyncDocumentSubresourceFilterTest : public ::testing::Test {
+ public:
+ AsyncDocumentSubresourceFilterTest()
+ : reply_task_runner_(new base::TestSimpleTaskRunner),
+ reply_task_runner_handle_(reply_task_runner_),
+ blocking_task_runner_(new base::TestSimpleTaskRunner) {}
+
+ protected:
+ void SetUp() override {
+ std::vector<proto::UrlRule> rules;
+ rules.push_back(testing::CreateWhitelistRuleForDocument(
+ "whitelisted.subframe.com", proto::ACTIVATION_TYPE_GENERICBLOCK,
+ {"example.com"}));
+ rules.push_back(testing::CreateSuffixRule("disallowed.html"));
+
+ ASSERT_NO_FATAL_FAILURE(test_ruleset_creator_.CreateRulesetWithRules(
+ rules, &test_ruleset_pair_));
+
+ dealer_handle_.reset(
+ new VerifiedRulesetDealer::Handle(blocking_task_runner_));
+ }
+
+ void TearDown() override {
+ dealer_handle_.reset(nullptr);
+ RunUntilIdle();
+ }
+
+ const testing::TestRuleset& ruleset() const {
+ return test_ruleset_pair_.indexed;
+ }
+
+ void RunUntilIdle() {
+ while (blocking_task_runner_->HasPendingTask() ||
+ reply_task_runner_->HasPendingTask()) {
+ blocking_task_runner_->RunUntilIdle();
+ reply_task_runner_->RunUntilIdle();
+ }
+ }
+
+ VerifiedRulesetDealer::Handle* dealer_handle() {
+ return dealer_handle_.get();
+ }
+
+ std::unique_ptr<VerifiedRuleset::Handle> CreateRulesetHandle() {
+ return base::MakeUnique<VerifiedRuleset::Handle>(dealer_handle());
+ }
+
+ private:
+ testing::TestRulesetCreator test_ruleset_creator_;
+ testing::TestRulesetPair test_ruleset_pair_;
+
+ // Note: ADSF assumes a task runner is associated with the current thread.
+ scoped_refptr<base::TestSimpleTaskRunner> reply_task_runner_;
+ base::SequencedTaskRunnerHandle reply_task_runner_handle_;
+ scoped_refptr<base::TestSimpleTaskRunner> blocking_task_runner_;
+
+ std::unique_ptr<VerifiedRulesetDealer::Handle> dealer_handle_;
+
+ DISALLOW_COPY_AND_ASSIGN(AsyncDocumentSubresourceFilterTest);
+};
+
+namespace {
+
+class TestActivationStateCallbackReceiver {
+ public:
+ TestActivationStateCallbackReceiver() = default;
+
+ base::Callback<void(ActivationState)> callback() {
+ return base::Bind(&TestActivationStateCallbackReceiver::Callback,
+ base::Unretained(this));
+ }
+ void ExpectReceivedOnce(ActivationState expected_state) const {
+ ASSERT_EQ(1, callback_count_);
+ EXPECT_EQ(expected_state, last_activation_state_);
+ }
+
+ private:
+ void Callback(ActivationState activation_state) {
+ ++callback_count_;
+ last_activation_state_ = activation_state;
+ }
+
+ ActivationState last_activation_state_;
+ int callback_count_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(TestActivationStateCallbackReceiver);
+};
+
+class TestCallbackReceiver {
+ public:
+ TestCallbackReceiver() = default;
+
+ base::Closure closure() {
+ return base::Bind(&TestCallbackReceiver::Callback, base::Unretained(this));
+ }
+ int callback_count() const { return callback_count_; }
+
+ private:
+ void Callback() { ++callback_count_; }
+
+ int callback_count_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(TestCallbackReceiver);
+};
+
+class LoadPolicyCallbackReceiver {
+ public:
+ LoadPolicyCallbackReceiver() = default;
+
+ AsyncDocumentSubresourceFilter::LoadPolicyCallback callback() {
+ return base::Bind(&LoadPolicyCallbackReceiver::Callback,
+ base::Unretained(this));
+ }
+ void ExpectReceivedOnce(LoadPolicy load_policy) const {
+ ASSERT_EQ(1, callback_count_);
+ EXPECT_EQ(load_policy, last_load_policy_);
+ }
+
+ private:
+ void Callback(LoadPolicy load_policy) {
+ ++callback_count_;
+ last_load_policy_ = load_policy;
+ }
+
+ int callback_count_ = 0;
+ LoadPolicy last_load_policy_;
+
+ DISALLOW_COPY_AND_ASSIGN(LoadPolicyCallbackReceiver);
+};
+
+} // namespace
+
+TEST_F(AsyncDocumentSubresourceFilterTest, ActivationStateIsReported) {
+ dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
+ auto ruleset_handle = CreateRulesetHandle();
+
+ AsyncDocumentSubresourceFilter::InitializationParams params(
+ GURL("http://example.com"), ActivationLevel::ENABLED, false);
+
+ TestActivationStateCallbackReceiver activation_state;
+ auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
+ ruleset_handle.get(), std::move(params), activation_state.callback(),
+ base::OnceClosure());
+
+ RunUntilIdle();
+ activation_state.ExpectReceivedOnce(
+ ActivationState(ActivationLevel::ENABLED));
+}
+
+TEST_F(AsyncDocumentSubresourceFilterTest, ActivationStateIsComputedCorrectly) {
+ dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
+ auto ruleset_handle = CreateRulesetHandle();
+
+ AsyncDocumentSubresourceFilter::InitializationParams params(
+ GURL("http://whitelisted.subframe.com"), ActivationLevel::ENABLED, false);
+ params.parent_document_origin = url::Origin(GURL("http://example.com"));
+
+ TestActivationStateCallbackReceiver activation_state;
+ auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
+ ruleset_handle.get(), std::move(params), activation_state.callback(),
+ base::OnceClosure());
+
+ RunUntilIdle();
+
+ ActivationState expected_activation_state(ActivationLevel::ENABLED);
+ expected_activation_state.generic_blocking_rules_disabled = true;
+ activation_state.ExpectReceivedOnce(expected_activation_state);
+}
+
+TEST_F(AsyncDocumentSubresourceFilterTest, DisabledForCorruptRuleset) {
+ testing::TestRuleset::CorruptByFilling(ruleset(), 0, 100, 0xFF);
+ dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
+
+ auto ruleset_handle = CreateRulesetHandle();
+
+ AsyncDocumentSubresourceFilter::InitializationParams params(
+ GURL("http://example.com"), ActivationLevel::ENABLED, false);
+
+ TestActivationStateCallbackReceiver activation_state;
+ auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
+ ruleset_handle.get(), std::move(params), activation_state.callback(),
+ base::OnceClosure());
+
+ RunUntilIdle();
+ activation_state.ExpectReceivedOnce(
+ ActivationState(ActivationLevel::DISABLED));
+}
+
+TEST_F(AsyncDocumentSubresourceFilterTest, GetLoadPolicyForSubdocument) {
+ dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
+ auto ruleset_handle = CreateRulesetHandle();
+
+ AsyncDocumentSubresourceFilter::InitializationParams params(
+ GURL("http://example.com"), ActivationLevel::ENABLED, false);
+
+ TestActivationStateCallbackReceiver activation_state;
+ auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
+ ruleset_handle.get(), std::move(params), activation_state.callback(),
+ base::OnceClosure());
+
+ LoadPolicyCallbackReceiver load_policy_1;
+ LoadPolicyCallbackReceiver load_policy_2;
+ filter->GetLoadPolicyForSubdocument(GURL("http://example.com/allowed.html"),
+ load_policy_1.callback());
+ filter->GetLoadPolicyForSubdocument(
+ GURL("http://example.com/disallowed.html"), load_policy_2.callback());
+
+ RunUntilIdle();
+ load_policy_1.ExpectReceivedOnce(LoadPolicy::ALLOW);
+ load_policy_2.ExpectReceivedOnce(LoadPolicy::DISALLOW);
+}
+
+TEST_F(AsyncDocumentSubresourceFilterTest, FirstDisallowedLoadIsReported) {
+ dealer_handle()->SetRulesetFile(testing::TestRuleset::Open(ruleset()));
+ auto ruleset_handle = CreateRulesetHandle();
+
+ TestCallbackReceiver first_disallowed_load_receiver;
+ AsyncDocumentSubresourceFilter::InitializationParams params(
+ GURL("http://example.com"), ActivationLevel::ENABLED, false);
+
+ TestActivationStateCallbackReceiver activation_state;
+ auto filter = base::MakeUnique<AsyncDocumentSubresourceFilter>(
+ ruleset_handle.get(), std::move(params), activation_state.callback(),
+ first_disallowed_load_receiver.closure());
+
+ LoadPolicyCallbackReceiver load_policy_1;
+ filter->GetLoadPolicyForSubdocument(GURL("http://example.com/allowed.html"),
+ load_policy_1.callback());
+ RunUntilIdle();
+ load_policy_1.ExpectReceivedOnce(LoadPolicy::ALLOW);
+ EXPECT_EQ(0, first_disallowed_load_receiver.callback_count());
+
+ LoadPolicyCallbackReceiver load_policy_2;
+ filter->GetLoadPolicyForSubdocument(
+ GURL("http://example.com/disallowed.html"), load_policy_2.callback());
+ RunUntilIdle();
+ load_policy_2.ExpectReceivedOnce(LoadPolicy::DISALLOW);
+ EXPECT_EQ(0, first_disallowed_load_receiver.callback_count());
+
+ filter->ReportDisallowedLoad();
+ EXPECT_EQ(1, first_disallowed_load_receiver.callback_count());
+ RunUntilIdle();
+}
+
+} // namespace subresource_filter

Powered by Google App Engine
This is Rietveld 408576698