Index: chrome/browser/extensions/api/declarative/declarative_rule_unittest.cc |
diff --git a/chrome/browser/extensions/api/declarative/declarative_rule_unittest.cc b/chrome/browser/extensions/api/declarative/declarative_rule_unittest.cc |
deleted file mode 100644 |
index 8eeda274725a92be345286eeb1e82b9cf5403edc..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/declarative/declarative_rule_unittest.cc |
+++ /dev/null |
@@ -1,442 +0,0 @@ |
-// Copyright (c) 2013 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/declarative_rule.h" |
- |
-#include "base/bind.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/test/values_test_util.h" |
-#include "base/values.h" |
-#include "components/url_matcher/url_matcher_constants.h" |
-#include "extensions/common/extension_builder.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::test::ParseJson; |
-using url_matcher::URLMatcher; |
-using url_matcher::URLMatcherConditionFactory; |
-using url_matcher::URLMatcherConditionSet; |
- |
-namespace extensions { |
- |
-namespace { |
- |
-template<typename T> |
-linked_ptr<T> ScopedToLinkedPtr(scoped_ptr<T> ptr) { |
- return linked_ptr<T>(ptr.release()); |
-} |
- |
-scoped_ptr<base::DictionaryValue> SimpleManifest() { |
- return DictionaryBuilder() |
- .Set("name", "extension") |
- .Set("manifest_version", 2) |
- .Set("version", "1.0") |
- .Build(); |
-} |
- |
-} // namespace |
- |
-struct RecordingCondition { |
- typedef int MatchData; |
- |
- URLMatcherConditionFactory* factory; |
- scoped_ptr<base::Value> value; |
- |
- void GetURLMatcherConditionSets( |
- URLMatcherConditionSet::Vector* condition_sets) const { |
- // No condition sets. |
- } |
- |
- static scoped_ptr<RecordingCondition> Create( |
- const Extension* extension, |
- URLMatcherConditionFactory* url_matcher_condition_factory, |
- const base::Value& condition, |
- std::string* error) { |
- const base::DictionaryValue* dict = NULL; |
- if (condition.GetAsDictionary(&dict) && dict->HasKey("bad_key")) { |
- *error = "Found error key"; |
- return scoped_ptr<RecordingCondition>(); |
- } |
- |
- scoped_ptr<RecordingCondition> result(new RecordingCondition()); |
- result->factory = url_matcher_condition_factory; |
- result->value.reset(condition.DeepCopy()); |
- return result.Pass(); |
- } |
-}; |
-typedef DeclarativeConditionSet<RecordingCondition> RecordingConditionSet; |
- |
-TEST(DeclarativeConditionTest, ErrorConditionSet) { |
- URLMatcher matcher; |
- RecordingConditionSet::AnyVector conditions; |
- conditions.push_back(ScopedToLinkedPtr(ParseJson("{\"key\": 1}"))); |
- conditions.push_back(ScopedToLinkedPtr(ParseJson("{\"bad_key\": 2}"))); |
- |
- std::string error; |
- scoped_ptr<RecordingConditionSet> result = RecordingConditionSet::Create( |
- NULL, matcher.condition_factory(), conditions, &error); |
- EXPECT_EQ("Found error key", error); |
- ASSERT_FALSE(result); |
-} |
- |
-TEST(DeclarativeConditionTest, CreateConditionSet) { |
- URLMatcher matcher; |
- RecordingConditionSet::AnyVector conditions; |
- conditions.push_back(ScopedToLinkedPtr(ParseJson("{\"key\": 1}"))); |
- conditions.push_back(ScopedToLinkedPtr(ParseJson("[\"val1\", 2]"))); |
- |
- // Test insertion |
- std::string error; |
- scoped_ptr<RecordingConditionSet> result = RecordingConditionSet::Create( |
- NULL, matcher.condition_factory(), conditions, &error); |
- EXPECT_EQ("", error); |
- ASSERT_TRUE(result); |
- EXPECT_EQ(2u, result->conditions().size()); |
- |
- EXPECT_EQ(matcher.condition_factory(), result->conditions()[0]->factory); |
- EXPECT_TRUE(ParseJson("{\"key\": 1}")->Equals( |
- result->conditions()[0]->value.get())); |
-} |
- |
-struct FulfillableCondition { |
- struct MatchData { |
- int value; |
- const std::set<URLMatcherConditionSet::ID>& url_matches; |
- }; |
- |
- scoped_refptr<URLMatcherConditionSet> condition_set; |
- int condition_set_id; |
- int max_value; |
- |
- URLMatcherConditionSet::ID url_matcher_condition_set_id() const { |
- return condition_set_id; |
- } |
- |
- scoped_refptr<URLMatcherConditionSet> url_matcher_condition_set() const { |
- return condition_set; |
- } |
- |
- void GetURLMatcherConditionSets( |
- URLMatcherConditionSet::Vector* condition_sets) const { |
- if (condition_set.get()) |
- condition_sets->push_back(condition_set); |
- } |
- |
- bool IsFulfilled(const MatchData& match_data) const { |
- if (condition_set_id != -1 && |
- !ContainsKey(match_data.url_matches, condition_set_id)) |
- return false; |
- return match_data.value <= max_value; |
- } |
- |
- static scoped_ptr<FulfillableCondition> Create( |
- const Extension* extension, |
- URLMatcherConditionFactory* url_matcher_condition_factory, |
- const base::Value& condition, |
- std::string* error) { |
- scoped_ptr<FulfillableCondition> result(new FulfillableCondition()); |
- const base::DictionaryValue* dict; |
- if (!condition.GetAsDictionary(&dict)) { |
- *error = "Expected dict"; |
- return result.Pass(); |
- } |
- if (!dict->GetInteger("url_id", &result->condition_set_id)) |
- result->condition_set_id = -1; |
- if (!dict->GetInteger("max", &result->max_value)) |
- *error = "Expected integer at ['max']"; |
- if (result->condition_set_id != -1) { |
- result->condition_set = new URLMatcherConditionSet( |
- result->condition_set_id, |
- URLMatcherConditionSet::Conditions()); |
- } |
- return result.Pass(); |
- } |
-}; |
- |
-TEST(DeclarativeConditionTest, FulfillConditionSet) { |
- typedef DeclarativeConditionSet<FulfillableCondition> FulfillableConditionSet; |
- FulfillableConditionSet::AnyVector conditions; |
- conditions.push_back(ScopedToLinkedPtr(ParseJson( |
- "{\"url_id\": 1, \"max\": 3}"))); |
- conditions.push_back(ScopedToLinkedPtr(ParseJson( |
- "{\"url_id\": 2, \"max\": 5}"))); |
- conditions.push_back(ScopedToLinkedPtr(ParseJson( |
- "{\"url_id\": 3, \"max\": 1}"))); |
- conditions.push_back(ScopedToLinkedPtr(ParseJson( |
- "{\"max\": -5}"))); // No url. |
- |
- // Test insertion |
- std::string error; |
- scoped_ptr<FulfillableConditionSet> result = |
- FulfillableConditionSet::Create(NULL, NULL, conditions, &error); |
- ASSERT_EQ("", error); |
- ASSERT_TRUE(result); |
- EXPECT_EQ(4u, result->conditions().size()); |
- |
- std::set<URLMatcherConditionSet::ID> url_matches; |
- FulfillableCondition::MatchData match_data = { 0, url_matches }; |
- EXPECT_FALSE(result->IsFulfilled(1, match_data)) |
- << "Testing an ID that's not in url_matches forwards to the Condition, " |
- << "which doesn't match."; |
- EXPECT_FALSE(result->IsFulfilled(-1, match_data)) |
- << "Testing the 'no ID' value tries to match the 4th condition, but " |
- << "its max is too low."; |
- match_data.value = -5; |
- EXPECT_TRUE(result->IsFulfilled(-1, match_data)) |
- << "Testing the 'no ID' value tries to match the 4th condition, and " |
- << "this value is low enough."; |
- |
- url_matches.insert(1); |
- match_data.value = 3; |
- EXPECT_TRUE(result->IsFulfilled(1, match_data)) |
- << "Tests a condition with a url matcher, for a matching value."; |
- match_data.value = 4; |
- EXPECT_FALSE(result->IsFulfilled(1, match_data)) |
- << "Tests a condition with a url matcher, for a non-matching value " |
- << "that would match a different condition."; |
- url_matches.insert(2); |
- EXPECT_TRUE(result->IsFulfilled(2, match_data)) |
- << "Tests with 2 elements in the match set."; |
- |
- // Check the condition sets: |
- URLMatcherConditionSet::Vector condition_sets; |
- result->GetURLMatcherConditionSets(&condition_sets); |
- ASSERT_EQ(3U, condition_sets.size()); |
- EXPECT_EQ(1, condition_sets[0]->id()); |
- EXPECT_EQ(2, condition_sets[1]->id()); |
- EXPECT_EQ(3, condition_sets[2]->id()); |
-} |
- |
-// DeclarativeAction |
- |
-class SummingAction : public base::RefCounted<SummingAction> { |
- public: |
- typedef int ApplyInfo; |
- |
- SummingAction(int increment, int min_priority) |
- : increment_(increment), min_priority_(min_priority) {} |
- |
- static scoped_refptr<const SummingAction> Create( |
- content::BrowserContext* browser_context, |
- const Extension* extension, |
- const base::Value& action, |
- std::string* error, |
- bool* bad_message) { |
- int increment = 0; |
- int min_priority = 0; |
- const base::DictionaryValue* dict = NULL; |
- EXPECT_TRUE(action.GetAsDictionary(&dict)); |
- if (dict->HasKey("error")) { |
- EXPECT_TRUE(dict->GetString("error", error)); |
- return scoped_refptr<const SummingAction>(NULL); |
- } |
- if (dict->HasKey("bad")) { |
- *bad_message = true; |
- return scoped_refptr<const SummingAction>(NULL); |
- } |
- |
- EXPECT_TRUE(dict->GetInteger("value", &increment)); |
- dict->GetInteger("priority", &min_priority); |
- return scoped_refptr<const SummingAction>( |
- new SummingAction(increment, min_priority)); |
- } |
- |
- void Apply(const std::string& extension_id, |
- const base::Time& install_time, |
- int* sum) const { |
- *sum += increment_; |
- } |
- |
- int increment() const { return increment_; } |
- int minimum_priority() const { |
- return min_priority_; |
- } |
- |
- private: |
- friend class base::RefCounted<SummingAction>; |
- virtual ~SummingAction() {} |
- |
- int increment_; |
- int min_priority_; |
-}; |
-typedef DeclarativeActionSet<SummingAction> SummingActionSet; |
- |
-TEST(DeclarativeActionTest, ErrorActionSet) { |
- SummingActionSet::AnyVector actions; |
- actions.push_back(ScopedToLinkedPtr(ParseJson("{\"value\": 1}"))); |
- actions.push_back(ScopedToLinkedPtr(ParseJson("{\"error\": \"the error\"}"))); |
- |
- std::string error; |
- bool bad = false; |
- scoped_ptr<SummingActionSet> result = |
- SummingActionSet::Create(NULL, NULL, actions, &error, &bad); |
- EXPECT_EQ("the error", error); |
- EXPECT_FALSE(bad); |
- EXPECT_FALSE(result); |
- |
- actions.clear(); |
- actions.push_back(ScopedToLinkedPtr(ParseJson("{\"value\": 1}"))); |
- actions.push_back(ScopedToLinkedPtr(ParseJson("{\"bad\": 3}"))); |
- result = SummingActionSet::Create(NULL, NULL, actions, &error, &bad); |
- EXPECT_EQ("", error); |
- EXPECT_TRUE(bad); |
- EXPECT_FALSE(result); |
-} |
- |
-TEST(DeclarativeActionTest, ApplyActionSet) { |
- SummingActionSet::AnyVector actions; |
- actions.push_back(ScopedToLinkedPtr(ParseJson( |
- "{\"value\": 1," |
- " \"priority\": 5}"))); |
- actions.push_back(ScopedToLinkedPtr(ParseJson("{\"value\": 2}"))); |
- |
- // Test insertion |
- std::string error; |
- bool bad = false; |
- scoped_ptr<SummingActionSet> result = |
- SummingActionSet::Create(NULL, NULL, actions, &error, &bad); |
- EXPECT_EQ("", error); |
- EXPECT_FALSE(bad); |
- ASSERT_TRUE(result); |
- EXPECT_EQ(2u, result->actions().size()); |
- |
- int sum = 0; |
- result->Apply("ext_id", base::Time(), &sum); |
- EXPECT_EQ(3, sum); |
- EXPECT_EQ(5, result->GetMinimumPriority()); |
-} |
- |
-TEST(DeclarativeRuleTest, Create) { |
- typedef DeclarativeRule<FulfillableCondition, SummingAction> Rule; |
- linked_ptr<Rule::JsonRule> json_rule(new Rule::JsonRule); |
- ASSERT_TRUE(Rule::JsonRule::Populate( |
- *ParseJson("{ \n" |
- " \"id\": \"rule1\", \n" |
- " \"conditions\": [ \n" |
- " {\"url_id\": 1, \"max\": 3}, \n" |
- " {\"url_id\": 2, \"max\": 5}, \n" |
- " ], \n" |
- " \"actions\": [ \n" |
- " { \n" |
- " \"value\": 2 \n" |
- " } \n" |
- " ], \n" |
- " \"priority\": 200 \n" |
- "}"), |
- json_rule.get())); |
- |
- const char kExtensionId[] = "ext1"; |
- scoped_refptr<Extension> extension = ExtensionBuilder() |
- .SetManifest(SimpleManifest()) |
- .SetID(kExtensionId) |
- .Build(); |
- |
- base::Time install_time = base::Time::Now(); |
- |
- URLMatcher matcher; |
- std::string error; |
- scoped_ptr<Rule> rule(Rule::Create(matcher.condition_factory(), |
- NULL, |
- extension.get(), |
- install_time, |
- json_rule, |
- Rule::ConsistencyChecker(), |
- &error)); |
- EXPECT_EQ("", error); |
- ASSERT_TRUE(rule.get()); |
- |
- EXPECT_EQ(kExtensionId, rule->id().first); |
- EXPECT_EQ("rule1", rule->id().second); |
- |
- EXPECT_EQ(200, rule->priority()); |
- |
- const Rule::ConditionSet& condition_set = rule->conditions(); |
- const Rule::ConditionSet::Conditions& conditions = |
- condition_set.conditions(); |
- ASSERT_EQ(2u, conditions.size()); |
- EXPECT_EQ(3, conditions[0]->max_value); |
- EXPECT_EQ(5, conditions[1]->max_value); |
- |
- const Rule::ActionSet& action_set = rule->actions(); |
- const Rule::ActionSet::Actions& actions = action_set.actions(); |
- ASSERT_EQ(1u, actions.size()); |
- EXPECT_EQ(2, actions[0]->increment()); |
- |
- int sum = 0; |
- rule->Apply(&sum); |
- EXPECT_EQ(2, sum); |
-} |
- |
-bool AtLeastOneCondition( |
- const DeclarativeConditionSet<FulfillableCondition>* conditions, |
- const DeclarativeActionSet<SummingAction>* actions, |
- std::string* error) { |
- if (conditions->conditions().empty()) { |
- *error = "No conditions"; |
- return false; |
- } |
- return true; |
-} |
- |
-TEST(DeclarativeRuleTest, CheckConsistency) { |
- typedef DeclarativeRule<FulfillableCondition, SummingAction> Rule; |
- URLMatcher matcher; |
- std::string error; |
- linked_ptr<Rule::JsonRule> json_rule(new Rule::JsonRule); |
- const char kExtensionId[] = "ext1"; |
- scoped_refptr<Extension> extension = ExtensionBuilder() |
- .SetManifest(SimpleManifest()) |
- .SetID(kExtensionId) |
- .Build(); |
- |
- ASSERT_TRUE(Rule::JsonRule::Populate( |
- *ParseJson("{ \n" |
- " \"id\": \"rule1\", \n" |
- " \"conditions\": [ \n" |
- " {\"url_id\": 1, \"max\": 3}, \n" |
- " {\"url_id\": 2, \"max\": 5}, \n" |
- " ], \n" |
- " \"actions\": [ \n" |
- " { \n" |
- " \"value\": 2 \n" |
- " } \n" |
- " ], \n" |
- " \"priority\": 200 \n" |
- "}"), |
- json_rule.get())); |
- scoped_ptr<Rule> rule(Rule::Create(matcher.condition_factory(), |
- NULL, |
- extension.get(), |
- base::Time(), |
- json_rule, |
- base::Bind(AtLeastOneCondition), |
- &error)); |
- EXPECT_TRUE(rule); |
- EXPECT_EQ("", error); |
- |
- ASSERT_TRUE(Rule::JsonRule::Populate( |
- *ParseJson("{ \n" |
- " \"id\": \"rule1\", \n" |
- " \"conditions\": [ \n" |
- " ], \n" |
- " \"actions\": [ \n" |
- " { \n" |
- " \"value\": 2 \n" |
- " } \n" |
- " ], \n" |
- " \"priority\": 200 \n" |
- "}"), |
- json_rule.get())); |
- rule = Rule::Create(matcher.condition_factory(), |
- NULL, |
- extension.get(), |
- base::Time(), |
- json_rule, |
- base::Bind(AtLeastOneCondition), |
- &error); |
- EXPECT_FALSE(rule); |
- EXPECT_EQ("No conditions", error); |
-} |
- |
-} // namespace extensions |