15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative/rules_registry_with_cache.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here we test the TestRulesRegistry which is the simplest possible
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation of RulesRegistryWithCache as a proxy for
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RulesRegistryWithCache.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/command_line.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative/test_rules_registry.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/value_store/testing_value_store.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// The |extension_id| needs to pass the Extension::IdIsValid test.
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char extension_id[] = "abcdefghijklmnopabcdefghijklmnop";
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char extension2_id[] = "ponmlkjihgfedcbaponmlkjihgfedcba";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char rule_id[] = "rule";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char rule2_id[] = "rule2";
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RulesRegistryWithCacheTest : public testing::Test {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RulesRegistryWithCacheTest()
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : ui_thread_(content::BrowserThread::UI, &message_loop_),
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        file_thread_(content::BrowserThread::FILE, &message_loop_),
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        registry_(new TestRulesRegistry(content::BrowserThread::UI,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        "" /*event_name*/)) {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RulesRegistryWithCacheTest() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure that deletion traits of all registries are executed.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_ = NULL;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string AddRule(const std::string& extension_id,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string rule_id) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<linked_ptr<extensions::RulesRegistry::Rule> > add_rules;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_rules.push_back(make_linked_ptr(new extensions::RulesRegistry::Rule));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_rules[0]->id.reset(new std::string(rule_id));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return registry_->AddRules(extension_id, add_rules);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string RemoveRule(const std::string& extension_id,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string rule_id) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> remove_rules;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remove_rules.push_back(rule_id);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return registry_->RemoveRules(extension_id, remove_rules);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetNumberOfRules(const std::string& extension_id) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<linked_ptr<extensions::RulesRegistry::Rule> > get_rules;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error = registry_->GetAllRules(extension_id, &get_rules);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", error);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return get_rules.size();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::TestBrowserThread ui_thread_;
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::TestBrowserThread file_thread_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestRulesRegistry> registry_;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined OS_CHROMEOS
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, AddRules) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing happens if the concrete RulesRegistry refuses to insert
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the rules.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->SetResult("Error");
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Error", AddRule(extension_id, rule_id));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetNumberOfRules(extension_id));
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry_->SetResult(std::string());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that rules can be inserted.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that rules cannot be inserted twice with the same rule_id.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE("", AddRule(extension_id, rule_id));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that different extensions may use the same rule_id.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, RemoveRules) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prime registry.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing happens if the concrete RuleRegistry refuses to remove
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the rules.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->SetResult("Error");
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Error", RemoveRule(extension_id, rule_id));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry_->SetResult(std::string());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing happens if a rule does not exist.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", RemoveRule(extension_id, "unknown_rule"));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension_id));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that rules may be removed and only for the correct extension.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", RemoveRule(extension_id, rule_id));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetNumberOfRules(extension_id));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, RemoveAllRules) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prime registry.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule2_id));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, GetNumberOfRules(extension_id));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing happens if the concrete RuleRegistry refuses to remove
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the rules.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->SetResult("Error");
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Error", registry_->RemoveAllRules(extension_id));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, GetNumberOfRules(extension_id));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry_->SetResult(std::string());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that rules may be removed and only for the correct extension.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", registry_->RemoveAllRules(extension_id));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetNumberOfRules(extension_id));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, GetRules) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prime registry.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule2_id));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we get the correct rule and unknown rules are ignored.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> rules_to_get;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rules_to_get.push_back(rule_id);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rules_to_get.push_back("unknown_rule");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<linked_ptr<extensions::RulesRegistry::Rule> > gotten_rules;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", registry_->GetRules(extension_id, rules_to_get, &gotten_rules));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, gotten_rules.size());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gotten_rules[0]->id.get());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rule_id, *(gotten_rules[0]->id));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, GetAllRules) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prime registry.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule2_id));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we get the correct rules.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<linked_ptr<extensions::RulesRegistry::Rule> > gotten_rules;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", registry_->GetAllRules(extension_id, &gotten_rules));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, gotten_rules.size());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gotten_rules[0]->id.get());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gotten_rules[1]->id.get());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE( (rule_id == *(gotten_rules[0]->id) &&
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                rule2_id == *(gotten_rules[1]->id)) ||
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (rule_id == *(gotten_rules[1]->id) &&
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                rule2_id == *(gotten_rules[0]->id)) );
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, OnExtensionUnloaded) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prime registry.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension_id, rule_id));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", AddRule(extension2_id, rule_id));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the correct rules are removed.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnExtensionUnloaded(extension_id);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, GetNumberOfRules(extension_id));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetNumberOfRules(extension2_id));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(RulesRegistryWithCacheTest, DeclarativeRulesStored) {
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestingProfile profile;
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TestingProfile::Init makes sure that the factory method for a corresponding
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // extension system creates a TestExtensionSystem.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  extensions::TestExtensionSystem* system =
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      static_cast<extensions::TestExtensionSystem*>(
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          extensions::ExtensionSystem::Get(&profile));
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExtensionPrefs* extension_prefs = system->CreateExtensionPrefs(
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      CommandLine::ForCurrentProcess(), base::FilePath());
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  system->CreateExtensionService(
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      CommandLine::ForCurrentProcess(), base::FilePath(), false);
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The value store is first created during CreateExtensionService.
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestingValueStore* store = system->value_store();
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<RulesRegistryWithCache::RuleStorageOnUI> ui_part;
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<RulesRegistryWithCache> registry(new TestRulesRegistry(
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      &profile, "testEvent", content::BrowserThread::UI, &ui_part));
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // 1. Test the handling of preferences.
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Default value is always true.
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ui_part->GetDeclarativeRulesStored(extension_id));
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  extension_prefs->UpdateExtensionPref(
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      extension_id,
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      RulesRegistryWithCache::RuleStorageOnUI::kRulesStoredKey,
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new base::FundamentalValue(false));
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ui_part->GetDeclarativeRulesStored(extension_id));
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  extension_prefs->UpdateExtensionPref(
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      extension_id,
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      RulesRegistryWithCache::RuleStorageOnUI::kRulesStoredKey,
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new base::FundamentalValue(true));
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ui_part->GetDeclarativeRulesStored(extension_id));
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // 2. Test writing behavior.
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int write_count = store->write_count();
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::ListValue> value(new base::ListValue);
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  value->AppendBoolean(true);
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->WriteToStorage(extension_id, value.PassAs<base::Value>());
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ui_part->GetDeclarativeRulesStored(extension_id));
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  message_loop_.RunUntilIdle();
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(write_count + 1, store->write_count());
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  write_count = store->write_count();
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  value.reset(new base::ListValue);
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->WriteToStorage(extension_id, value.PassAs<base::Value>());
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ui_part->GetDeclarativeRulesStored(extension_id));
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  message_loop_.RunUntilIdle();
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // No rules currently, but previously there were, so we expect a write.
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(write_count + 1, store->write_count());
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  write_count = store->write_count();
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  value.reset(new base::ListValue);
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->WriteToStorage(extension_id, value.PassAs<base::Value>());
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ui_part->GetDeclarativeRulesStored(extension_id));
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  message_loop_.RunUntilIdle();
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(write_count, store->write_count());
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // 3. Test reading behavior.
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int read_count = store->read_count();
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->SetDeclarativeRulesStored(extension_id, false);
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->ReadFromStorage(extension_id);
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  message_loop_.RunUntilIdle();
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(read_count, store->read_count());
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  read_count = store->read_count();
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->SetDeclarativeRulesStored(extension_id, true);
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_part->ReadFromStorage(extension_id);
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  message_loop_.RunUntilIdle();
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(read_count + 1, store->read_count());
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  //  namespace extensions
275