Commit ae9df004 authored by Karandeep Bhatia's avatar Karandeep Bhatia Committed by Commit Bot

DNR: De-flake and re-enable some disabled tests.

This CL attempts to remove some possible sources of flakiness in the
declarative net request browsertests by removing all calls to
content::RunAllTasksUntilIdle() and replacing them with more
deterministic waiting logic. Also re-enable the tests disabled in
r758084.

Also, enforce that RulesetManager only has a single test observer at a
time.

BUG=1069665

Change-Id: I29c646d85322195894d2786fbf01fb7c10842cb1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2146335
Commit-Queue: Karan Bhatia <karandeepb@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759468}
parent 0686a44d
...@@ -925,9 +925,9 @@ TEST_P(MultipleRulesetsIndexingTest, EnabledRulesCount) { ...@@ -925,9 +925,9 @@ TEST_P(MultipleRulesetsIndexingTest, EnabledRulesCount) {
AddRuleset(CreateRuleset("2.json", 200, 20, false)); AddRuleset(CreateRuleset("2.json", 200, 20, false));
AddRuleset(CreateRuleset("3.json", 300, 30, true)); AddRuleset(CreateRuleset("3.json", 300, 30, true));
RulesetCountWaiter waiter(manager()); RulesetManagerObserver ruleset_waiter(manager());
LoadAndExpectSuccess(); LoadAndExpectSuccess();
waiter.WaitForRulesetCount(1); ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
// Only the first and third rulesets should be enabled. // Only the first and third rulesets should be enabled.
CompositeMatcher* composite_matcher = CompositeMatcher* composite_matcher =
...@@ -957,7 +957,7 @@ TEST_P(MultipleRulesetsIndexingTest, StaticRuleCountExceeded) { ...@@ -957,7 +957,7 @@ TEST_P(MultipleRulesetsIndexingTest, StaticRuleCountExceeded) {
// Enabled on load. // Enabled on load.
AddRuleset(CreateRuleset("4.json", 30, 0, true)); AddRuleset(CreateRuleset("4.json", 30, 0, true));
RulesetCountWaiter waiter(manager()); RulesetManagerObserver ruleset_waiter(manager());
extension_loader()->set_ignore_manifest_warnings(true); extension_loader()->set_ignore_manifest_warnings(true);
LoadAndExpectSuccess(); LoadAndExpectSuccess();
...@@ -978,7 +978,7 @@ TEST_P(MultipleRulesetsIndexingTest, StaticRuleCountExceeded) { ...@@ -978,7 +978,7 @@ TEST_P(MultipleRulesetsIndexingTest, StaticRuleCountExceeded) {
Field(&InstallWarning::message, kEnabledRuleCountExceeded))); Field(&InstallWarning::message, kEnabledRuleCountExceeded)));
} }
waiter.WaitForRulesetCount(1); ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
CompositeMatcher* composite_matcher = CompositeMatcher* composite_matcher =
manager()->GetMatcherForExtension(extension_id); manager()->GetMatcherForExtension(extension_id);
...@@ -1006,7 +1006,7 @@ TEST_P(MultipleRulesetsIndexingTest, RegexRuleCountExceeded) { ...@@ -1006,7 +1006,7 @@ TEST_P(MultipleRulesetsIndexingTest, RegexRuleCountExceeded) {
// Enabled on load. // Enabled on load.
AddRuleset(CreateRuleset("4.json", 20, 20, true)); AddRuleset(CreateRuleset("4.json", 20, 20, true));
RulesetCountWaiter waiter(manager()); RulesetManagerObserver ruleset_waiter(manager());
extension_loader()->set_ignore_manifest_warnings(true); extension_loader()->set_ignore_manifest_warnings(true);
LoadAndExpectSuccess(); LoadAndExpectSuccess();
...@@ -1019,7 +1019,7 @@ TEST_P(MultipleRulesetsIndexingTest, RegexRuleCountExceeded) { ...@@ -1019,7 +1019,7 @@ TEST_P(MultipleRulesetsIndexingTest, RegexRuleCountExceeded) {
kEnabledRegexRuleCountExceeded))); kEnabledRegexRuleCountExceeded)));
} }
waiter.WaitForRulesetCount(1); ruleset_waiter.WaitForExtensionsWithRulesetsCount(1);
CompositeMatcher* composite_matcher = CompositeMatcher* composite_matcher =
manager()->GetMatcherForExtension(extension()->id()); manager()->GetMatcherForExtension(extension()->id());
......
...@@ -218,6 +218,8 @@ void RulesetManager::OnDidFinishNavigation(content::RenderFrameHost* host) { ...@@ -218,6 +218,8 @@ void RulesetManager::OnDidFinishNavigation(content::RenderFrameHost* host) {
void RulesetManager::SetObserverForTest(TestObserver* observer) { void RulesetManager::SetObserverForTest(TestObserver* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!(test_observer_ && observer))
<< "Multiple test observers are not supported";
test_observer_ = observer; test_observer_ = observer;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "extensions/browser/api/declarative_net_request/indexed_rule.h" #include "extensions/browser/api/declarative_net_request/indexed_rule.h"
#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h" #include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
#include "extensions/browser/api/declarative_net_request/ruleset_source.h" #include "extensions/browser/api/declarative_net_request/ruleset_source.h"
#include "extensions/browser/api/web_request/web_request_info.h"
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/common/api/declarative_net_request/test_utils.h" #include "extensions/common/api/declarative_net_request/test_utils.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
...@@ -336,16 +337,23 @@ bool EqualsForTesting(const dnr_api::ModifyHeaderInfo& lhs, ...@@ -336,16 +337,23 @@ bool EqualsForTesting(const dnr_api::ModifyHeaderInfo& lhs,
return lhs.operation == rhs.operation && lhs.header == rhs.header; return lhs.operation == rhs.operation && lhs.header == rhs.header;
} }
RulesetCountWaiter::RulesetCountWaiter(RulesetManager* manager) RulesetManagerObserver::RulesetManagerObserver(RulesetManager* manager)
: manager_(manager), current_count_(manager_->GetMatcherCountForTest()) { : manager_(manager), current_count_(manager_->GetMatcherCountForTest()) {
manager_->SetObserverForTest(this); manager_->SetObserverForTest(this);
} }
RulesetCountWaiter::~RulesetCountWaiter() { RulesetManagerObserver::~RulesetManagerObserver() {
manager_->SetObserverForTest(nullptr); manager_->SetObserverForTest(nullptr);
} }
void RulesetCountWaiter::WaitForRulesetCount(size_t count) { std::vector<GURL> RulesetManagerObserver::GetAndResetRequestSeen() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
std::vector<GURL> seen_requests;
std::swap(seen_requests, observed_requests_);
return seen_requests;
}
void RulesetManagerObserver::WaitForExtensionsWithRulesetsCount(size_t count) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
ASSERT_FALSE(expected_count_); ASSERT_FALSE(expected_count_);
if (current_count_ == count) if (current_count_ == count)
...@@ -356,7 +364,7 @@ void RulesetCountWaiter::WaitForRulesetCount(size_t count) { ...@@ -356,7 +364,7 @@ void RulesetCountWaiter::WaitForRulesetCount(size_t count) {
run_loop_->Run(); run_loop_->Run();
} }
void RulesetCountWaiter::OnRulesetCountChanged(size_t count) { void RulesetManagerObserver::OnRulesetCountChanged(size_t count) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
current_count_ = count; current_count_ = count;
if (expected_count_ != count) if (expected_count_ != count)
...@@ -368,5 +376,11 @@ void RulesetCountWaiter::OnRulesetCountChanged(size_t count) { ...@@ -368,5 +376,11 @@ void RulesetCountWaiter::OnRulesetCountChanged(size_t count) {
expected_count_.reset(); expected_count_.reset();
} }
void RulesetManagerObserver::OnEvaluateRequest(const WebRequestInfo& request,
bool is_incognito_context) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
observed_requests_.push_back(request.url);
}
} // namespace declarative_net_request } // namespace declarative_net_request
} // namespace extensions } // namespace extensions
...@@ -86,30 +86,36 @@ bool EqualsForTesting( ...@@ -86,30 +86,36 @@ bool EqualsForTesting(
const api::declarative_net_request::ModifyHeaderInfo& lhs, const api::declarative_net_request::ModifyHeaderInfo& lhs,
const api::declarative_net_request::ModifyHeaderInfo& rhs); const api::declarative_net_request::ModifyHeaderInfo& rhs);
// Used to wait till the number of extension rulesets (CompositeMatchers) // Test observer for RulesetManager. This is a multi-use observer i.e.
// managed by the RulesetManager reach a certain count. This is a multi-use // WaitForExtensionsWithRulesetsCount can be called multiple times per lifetime
// observer i.e. WaitForRulesetCount can be called multiple times per lifetime
// of an observer. // of an observer.
class RulesetCountWaiter : public RulesetManager::TestObserver { class RulesetManagerObserver : public RulesetManager::TestObserver {
public: public:
explicit RulesetCountWaiter(RulesetManager* manager); explicit RulesetManagerObserver(RulesetManager* manager);
RulesetCountWaiter(const RulesetCountWaiter&) = delete; RulesetManagerObserver(const RulesetManagerObserver&) = delete;
RulesetCountWaiter& operator=(const RulesetCountWaiter&) = delete; RulesetManagerObserver& operator=(const RulesetManagerObserver&) = delete;
~RulesetCountWaiter() override; ~RulesetManagerObserver() override;
// Returns the requests seen by RulesetManager since the last call to this
// function.
std::vector<GURL> GetAndResetRequestSeen();
// Waits for the number of rulesets to change to |count|. Note |count| is the // Waits for the number of rulesets to change to |count|. Note |count| is the
// number of extensions with rulesets or the number of active // number of extensions with rulesets or the number of active
// CompositeMatchers. // CompositeMatchers.
void WaitForRulesetCount(size_t count); void WaitForExtensionsWithRulesetsCount(size_t count);
private: private:
// RulesetManager::TestObserver implementation. // RulesetManager::TestObserver implementation.
void OnRulesetCountChanged(size_t count) override; void OnRulesetCountChanged(size_t count) override;
void OnEvaluateRequest(const WebRequestInfo& request,
bool is_incognito_context) override;
RulesetManager* const manager_; RulesetManager* const manager_;
size_t current_count_ = 0; size_t current_count_ = 0;
base::Optional<size_t> expected_count_; base::Optional<size_t> expected_count_;
std::unique_ptr<base::RunLoop> run_loop_; std::unique_ptr<base::RunLoop> run_loop_;
std::vector<GURL> observed_requests_;
SEQUENCE_CHECKER(sequence_checker_); SEQUENCE_CHECKER(sequence_checker_);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment