blob: 976d777b664aa6c928847111eeeb0991f46040e8 [file] [log] [blame]
// 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/test_rules_registry.h"
// Here we test the TestRulesRegistry which is the simplest possible
// implementation of RulesRegistryWithCache as a proxy for
// RulesRegistryWithCache.
#include "base/message_loop.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char extension_id[] = "ext";
const char extension2_id[] = "ext2";
const char rule_id[] = "rule";
const char rule2_id[] = "rule2";
}
namespace extensions {
class RulesRegistryWithCacheTest : public testing::Test {
public:
RulesRegistryWithCacheTest()
: ui_(content::BrowserThread::UI, &message_loop_),
registry_(new TestRulesRegistry(content::BrowserThread::UI,
"" /*event_name*/)) {}
virtual ~RulesRegistryWithCacheTest() {}
virtual void TearDown() OVERRIDE {
// Make sure that deletion traits of all registries are executed.
registry_ = NULL;
message_loop_.RunUntilIdle();
}
std::string AddRule(const std::string& extension_id,
const std::string rule_id) {
std::vector<linked_ptr<extensions::RulesRegistry::Rule> > add_rules;
add_rules.push_back(make_linked_ptr(new extensions::RulesRegistry::Rule));
add_rules[0]->id.reset(new std::string(rule_id));
return registry_->AddRules(extension_id, add_rules);
}
std::string RemoveRule(const std::string& extension_id,
const std::string rule_id) {
std::vector<std::string> remove_rules;
remove_rules.push_back(rule_id);
return registry_->RemoveRules(extension_id, remove_rules);
}
int GetNumberOfRules(const std::string& extension_id) {
std::vector<linked_ptr<extensions::RulesRegistry::Rule> > get_rules;
std::string error = registry_->GetAllRules(extension_id, &get_rules);
EXPECT_EQ("", error);
return get_rules.size();
}
protected:
MessageLoop message_loop_;
content::TestBrowserThread ui_;
scoped_refptr<TestRulesRegistry> registry_;
};
TEST_F(RulesRegistryWithCacheTest, AddRules) {
// Check that nothing happens if the concrete RulesRegistry refuses to insert
// the rules.
registry_->SetResult("Error");
EXPECT_EQ("Error", AddRule(extension_id, rule_id));
EXPECT_EQ(0, GetNumberOfRules(extension_id));
registry_->SetResult(std::string());
// Check that rules can be inserted.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
// Check that rules cannot be inserted twice with the same rule_id.
EXPECT_NE("", AddRule(extension_id, rule_id));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
// Check that different extensions may use the same rule_id.
EXPECT_EQ("", AddRule(extension2_id, rule_id));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
}
TEST_F(RulesRegistryWithCacheTest, RemoveRules) {
// Prime registry.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ("", AddRule(extension2_id, rule_id));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
// Check that nothing happens if the concrete RuleRegistry refuses to remove
// the rules.
registry_->SetResult("Error");
EXPECT_EQ("Error", RemoveRule(extension_id, rule_id));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
registry_->SetResult(std::string());
// Check that nothing happens if a rule does not exist.
EXPECT_EQ("", RemoveRule(extension_id, "unknown_rule"));
EXPECT_EQ(1, GetNumberOfRules(extension_id));
// Check that rules may be removed and only for the correct extension.
EXPECT_EQ("", RemoveRule(extension_id, rule_id));
EXPECT_EQ(0, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
}
TEST_F(RulesRegistryWithCacheTest, RemoveAllRules) {
// Prime registry.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ("", AddRule(extension_id, rule2_id));
EXPECT_EQ("", AddRule(extension2_id, rule_id));
EXPECT_EQ(2, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
// Check that nothing happens if the concrete RuleRegistry refuses to remove
// the rules.
registry_->SetResult("Error");
EXPECT_EQ("Error", registry_->RemoveAllRules(extension_id));
EXPECT_EQ(2, GetNumberOfRules(extension_id));
registry_->SetResult(std::string());
// Check that rules may be removed and only for the correct extension.
EXPECT_EQ("", registry_->RemoveAllRules(extension_id));
EXPECT_EQ(0, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
}
TEST_F(RulesRegistryWithCacheTest, GetRules) {
// Prime registry.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ("", AddRule(extension_id, rule2_id));
EXPECT_EQ("", AddRule(extension2_id, rule_id));
// Check that we get the correct rule and unknown rules are ignored.
std::vector<std::string> rules_to_get;
rules_to_get.push_back(rule_id);
rules_to_get.push_back("unknown_rule");
std::vector<linked_ptr<extensions::RulesRegistry::Rule> > gotten_rules;
EXPECT_EQ("", registry_->GetRules(extension_id, rules_to_get, &gotten_rules));
ASSERT_EQ(1u, gotten_rules.size());
ASSERT_TRUE(gotten_rules[0]->id.get());
EXPECT_EQ(rule_id, *(gotten_rules[0]->id));
}
TEST_F(RulesRegistryWithCacheTest, GetAllRules) {
// Prime registry.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ("", AddRule(extension_id, rule2_id));
EXPECT_EQ("", AddRule(extension2_id, rule_id));
// Check that we get the correct rules.
std::vector<linked_ptr<extensions::RulesRegistry::Rule> > gotten_rules;
EXPECT_EQ("", registry_->GetAllRules(extension_id, &gotten_rules));
EXPECT_EQ(2u, gotten_rules.size());
ASSERT_TRUE(gotten_rules[0]->id.get());
ASSERT_TRUE(gotten_rules[1]->id.get());
EXPECT_TRUE( (rule_id == *(gotten_rules[0]->id) &&
rule2_id == *(gotten_rules[1]->id)) ||
(rule_id == *(gotten_rules[1]->id) &&
rule2_id == *(gotten_rules[0]->id)) );
}
TEST_F(RulesRegistryWithCacheTest, OnExtensionUnloaded) {
// Prime registry.
EXPECT_EQ("", AddRule(extension_id, rule_id));
EXPECT_EQ("", AddRule(extension2_id, rule_id));
// Check that the correct rules are removed.
registry_->OnExtensionUnloaded(extension_id);
EXPECT_EQ(0, GetNumberOfRules(extension_id));
EXPECT_EQ(1, GetNumberOfRules(extension2_id));
}
} // namespace extensions