1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/api/declarative/rules_registry_service.h" 6 7#include "base/bind.h" 8#include "base/message_loop/message_loop.h" 9#include "chrome/browser/extensions/api/declarative/test_rules_registry.h" 10#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h" 11#include "chrome/test/base/testing_profile.h" 12#include "content/public/test/test_browser_thread.h" 13#include "testing/gtest/include/gtest/gtest.h" 14 15namespace { 16const char kExtensionId[] = "foo"; 17 18void InsertRule(scoped_refptr<extensions::RulesRegistry> registry, 19 const std::string& id) { 20 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > add_rules; 21 add_rules.push_back(make_linked_ptr(new extensions::RulesRegistry::Rule)); 22 add_rules[0]->id.reset(new std::string(id)); 23 std::string error = registry->AddRules(kExtensionId, add_rules); 24 EXPECT_TRUE(error.empty()); 25} 26 27void VerifyNumberOfRules(scoped_refptr<extensions::RulesRegistry> registry, 28 size_t expected_number_of_rules) { 29 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > get_rules; 30 registry->GetAllRules(kExtensionId, &get_rules); 31 EXPECT_EQ(expected_number_of_rules, get_rules.size()); 32} 33 34} // namespace 35 36namespace extensions { 37 38class RulesRegistryServiceTest : public testing::Test { 39 public: 40 RulesRegistryServiceTest() 41 : ui_(content::BrowserThread::UI, &message_loop_), 42 io_(content::BrowserThread::IO, &message_loop_) {} 43 44 virtual ~RulesRegistryServiceTest() {} 45 46 virtual void TearDown() OVERRIDE { 47 // Make sure that deletion traits of all registries are executed. 48 message_loop_.RunUntilIdle(); 49 } 50 51 protected: 52 base::MessageLoop message_loop_; 53 content::TestBrowserThread ui_; 54 content::TestBrowserThread io_; 55}; 56 57TEST_F(RulesRegistryServiceTest, TestConstructionAndMultiThreading) { 58 const RulesRegistry::WebViewKey key(0, 0); 59 TestRulesRegistry* ui_registry = 60 new TestRulesRegistry(content::BrowserThread::UI, "ui", key); 61 62 TestRulesRegistry* io_registry = 63 new TestRulesRegistry(content::BrowserThread::IO, "io", key); 64 65 // Test registration. 66 67 RulesRegistryService registry_service(NULL); 68 registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry)); 69 registry_service.RegisterRulesRegistry(make_scoped_refptr(io_registry)); 70 71 EXPECT_TRUE(registry_service.GetRulesRegistry(key, "ui").get()); 72 EXPECT_TRUE(registry_service.GetRulesRegistry(key, "io").get()); 73 EXPECT_FALSE(registry_service.GetRulesRegistry(key, "foo").get()); 74 75 content::BrowserThread::PostTask( 76 content::BrowserThread::UI, FROM_HERE, 77 base::Bind(&InsertRule, registry_service.GetRulesRegistry(key, "ui"), 78 "ui_task")); 79 80 content::BrowserThread::PostTask( 81 content::BrowserThread::IO, FROM_HERE, 82 base::Bind(&InsertRule, registry_service.GetRulesRegistry(key, "io"), 83 "io_task")); 84 85 content::BrowserThread::PostTask( 86 content::BrowserThread::UI, FROM_HERE, 87 base::Bind(&VerifyNumberOfRules, 88 registry_service.GetRulesRegistry(key, "ui"), 1)); 89 90 content::BrowserThread::PostTask( 91 content::BrowserThread::IO, FROM_HERE, 92 base::Bind(&VerifyNumberOfRules, 93 registry_service.GetRulesRegistry(key, "io"), 1)); 94 95 message_loop_.RunUntilIdle(); 96 97 // Test extension uninstalling. 98 99 registry_service.SimulateExtensionUninstalled(kExtensionId); 100 101 content::BrowserThread::PostTask( 102 content::BrowserThread::UI, FROM_HERE, 103 base::Bind(&VerifyNumberOfRules, 104 registry_service.GetRulesRegistry(key, "ui"), 0)); 105 106 content::BrowserThread::PostTask( 107 content::BrowserThread::IO, FROM_HERE, 108 base::Bind(&VerifyNumberOfRules, 109 registry_service.GetRulesRegistry(key, "io"), 0)); 110 111 message_loop_.RunUntilIdle(); 112} 113 114// This test verifies that removing rules registries by process ID works as 115// intended. This test ensures that removing registries associated with one 116// Webview embedder process does not remove registries associated with the 117// other. 118TEST_F(RulesRegistryServiceTest, TestWebViewKey) { 119 const int kEmbedderProcessID1 = 1; 120 const int kEmbedderProcessID2 = 2; 121 const int kWebViewInstanceID = 1; 122 123 const RulesRegistry::WebViewKey key1(kEmbedderProcessID1, kWebViewInstanceID); 124 const RulesRegistry::WebViewKey key2(kEmbedderProcessID2, kWebViewInstanceID); 125 126 TestRulesRegistry* ui_registry_key1 = 127 new TestRulesRegistry(content::BrowserThread::UI, "ui", key1); 128 TestRulesRegistry* ui_registry_key2 = 129 new TestRulesRegistry(content::BrowserThread::UI, "ui", key2); 130 131 RulesRegistryService registry_service(NULL); 132 registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry_key1)); 133 registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry_key2)); 134 135 content::BrowserThread::PostTask( 136 content::BrowserThread::UI, FROM_HERE, 137 base::Bind(&InsertRule, registry_service.GetRulesRegistry(key1, "ui"), 138 "ui_task")); 139 content::BrowserThread::PostTask( 140 content::BrowserThread::UI, FROM_HERE, 141 base::Bind(&InsertRule, registry_service.GetRulesRegistry(key2, "ui"), 142 "ui_task")); 143 message_loop_.RunUntilIdle(); 144 145 registry_service.RemoveWebViewRulesRegistries(kEmbedderProcessID1); 146 EXPECT_FALSE(registry_service.GetRulesRegistry(key1, "ui").get()); 147 EXPECT_TRUE(registry_service.GetRulesRegistry(key2, "ui").get()); 148} 149 150TEST_F(RulesRegistryServiceTest, TestWebViewWebRequestRegistryHasNoCache) { 151 const int kEmbedderProcessID = 1; 152 const int kWebViewInstanceID = 1; 153 const RulesRegistry::WebViewKey key(kEmbedderProcessID, kWebViewInstanceID); 154 TestingProfile profile; 155 RulesRegistryService registry_service(&profile); 156 RulesRegistry* registry = 157 registry_service.GetRulesRegistry( 158 key, 159 declarative_webrequest_constants::kOnRequest).get(); 160 EXPECT_TRUE(registry); 161 EXPECT_FALSE(registry->rules_cache_delegate_for_testing()); 162} 163 164} // namespace extensions 165