Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc |
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8819a320a2df3c14ea7beecce15c3d9ec2fbedd7 |
--- /dev/null |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc |
@@ -0,0 +1,143 @@ |
+// Copyright (c) 2012 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 "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h" |
+ |
+#include <vector> |
+ |
+#include "base/memory/linked_ptr.h" |
+#include "base/message_loop.h" |
+#include "base/values.h" |
+#include "content/test/test_browser_thread.h" |
+#include "net/url_request/url_request_test_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+const char kExtensionId[] = "ext1"; |
+const char kRuleId1[] = "rule1"; |
+const char kRuleId2[] = "rule2"; |
+ |
+const char kCancelRequestType[] = "experimental.webRequest.CancelRequest"; |
+const char kRequestMatcher[] = "experimental.webRequest.RequestMatcher"; |
+const char kInstanceType[] = "instanceType"; |
+} |
+ |
+namespace extensions { |
+ |
+class WebRequestRulesRegistryTest : public testing::Test { |
+ public: |
+ public: |
+ WebRequestRulesRegistryTest() |
+ : message_loop(MessageLoop::TYPE_IO), |
+ ui(content::BrowserThread::UI, &message_loop), |
+ io(content::BrowserThread::IO, &message_loop) {} |
+ |
+ virtual ~WebRequestRulesRegistryTest() {} |
+ |
+ virtual void TearDown() OVERRIDE { |
+ // Make sure that deletion traits of all registries are executed. |
+ message_loop.RunAllPending(); |
+ } |
+ |
+ // Returns a rule that roughly matches http://*.example.com and |
+ // https://www.example.com and cancels it |
+ linked_ptr<RulesRegistry::Rule> CreateRule1() { |
+ DictionaryValue http_condition_dict; |
+ http_condition_dict.SetString("scheme", "http"); |
+ http_condition_dict.SetString("host_suffix", "example.com"); |
+ http_condition_dict.SetString(kInstanceType, kRequestMatcher); |
+ |
+ DictionaryValue https_condition_dict; |
+ https_condition_dict.SetString("scheme", "https"); |
+ https_condition_dict.SetString("host_suffix", "example.com"); |
+ https_condition_dict.SetString("host_prefix", "www"); |
+ https_condition_dict.SetString(kInstanceType, kRequestMatcher); |
+ |
+ linked_ptr<json_schema_compiler::any::Any> condition1 = make_linked_ptr( |
+ new json_schema_compiler::any::Any); |
+ condition1->Init(http_condition_dict); |
+ |
+ linked_ptr<json_schema_compiler::any::Any> condition2 = make_linked_ptr( |
+ new json_schema_compiler::any::Any); |
+ condition2->Init(https_condition_dict); |
+ |
+ DictionaryValue action_dict; |
+ action_dict.SetString(kInstanceType, kCancelRequestType); |
+ |
+ linked_ptr<json_schema_compiler::any::Any> action1 = make_linked_ptr( |
+ new json_schema_compiler::any::Any); |
+ action1->Init(action_dict); |
+ |
+ linked_ptr<RulesRegistry::Rule> rule = |
+ make_linked_ptr(new RulesRegistry::Rule); |
+ rule->id.reset(new std::string(kRuleId1)); |
+ rule->priority.reset(new int(100)); |
+ rule->actions.push_back(action1); |
+ rule->conditions.push_back(condition1); |
+ rule->conditions.push_back(condition2); |
+ return rule; |
+ } |
+ |
+ // Returns a rule that matches anything and cancels it. |
+ linked_ptr<RulesRegistry::Rule> CreateRule2() { |
+ DictionaryValue condition_dict; |
+ condition_dict.SetString(kInstanceType, kRequestMatcher); |
+ |
+ linked_ptr<json_schema_compiler::any::Any> condition = make_linked_ptr( |
+ new json_schema_compiler::any::Any); |
+ condition->Init(condition_dict); |
+ |
+ DictionaryValue action_dict; |
+ action_dict.SetString(kInstanceType, kCancelRequestType); |
+ |
+ linked_ptr<json_schema_compiler::any::Any> action = make_linked_ptr( |
+ new json_schema_compiler::any::Any); |
+ action->Init(action_dict); |
+ |
+ linked_ptr<RulesRegistry::Rule> rule = |
+ make_linked_ptr(new RulesRegistry::Rule); |
+ rule->id.reset(new std::string(kRuleId2)); |
+ rule->priority.reset(new int(100)); |
+ rule->actions.push_back(action); |
+ rule->conditions.push_back(condition); |
+ return rule; |
+ } |
+ |
+ protected: |
+ MessageLoop message_loop; |
+ content::TestBrowserThread ui; |
+ content::TestBrowserThread io; |
+}; |
+ |
+TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { |
+ scoped_refptr<WebRequestRulesRegistry> registry(new WebRequestRulesRegistry); |
+ std::string error; |
+ |
+ std::vector<linked_ptr<RulesRegistry::Rule> > rules; |
+ rules.push_back(CreateRule1()); |
+ rules.push_back(CreateRule2()); |
+ |
+ error = registry->AddRules(kExtensionId, rules); |
+ EXPECT_TRUE(error.empty()); |
+ |
+ std::set<WebRequestRule::GlobalRuleId> matches; |
+ |
+ GURL http_url("http://www.example.com"); |
+ TestURLRequest http_request(http_url, NULL); |
+ matches = registry->GetMatches(&http_request); |
+ EXPECT_EQ(2u, matches.size()); |
+ EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId1)) != |
+ matches.end()); |
+ EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != |
+ matches.end()); |
+ |
+ GURL foobar_url("http://www.foobar.com"); |
+ TestURLRequest foobar_request(foobar_url, NULL); |
+ matches = registry->GetMatches(&foobar_request); |
+ EXPECT_EQ(1u, matches.size()); |
+ EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != |
+ matches.end()); |
+} |
+ |
+} // namespace extensions |