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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative/rules_registry_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative/test_rules_registry.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionId[] = "foo"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InsertRule(scoped_refptr<extensions::RulesRegistry> registry, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<extensions::RulesRegistry::Rule> > add_rules; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_rules.push_back(make_linked_ptr(new extensions::RulesRegistry::Rule)); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_rules[0]->id.reset(new std::string(id)); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error = registry->AddRules(kExtensionId, add_rules); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VerifyNumberOfRules(scoped_refptr<extensions::RulesRegistry> registry, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_number_of_rules) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<extensions::RulesRegistry::Rule> > get_rules; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry->GetAllRules(kExtensionId, &get_rules); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_number_of_rules, get_rules.size()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RulesRegistryServiceTest : public testing::Test { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RulesRegistryServiceTest() 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : ui_(content::BrowserThread::UI, &message_loop_), 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) io_(content::BrowserThread::IO, &message_loop_) {} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RulesRegistryServiceTest() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that deletion traits of all registries are executed. 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_loop_.RunUntilIdle(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop message_loop_; 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThread ui_; 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThread io_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RulesRegistryServiceTest, TestConstructionAndMultiThreading) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const RulesRegistry::WebViewKey key(0, 0); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestRulesRegistry* ui_registry = 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new TestRulesRegistry(content::BrowserThread::UI, "ui", key); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestRulesRegistry* io_registry = 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new TestRulesRegistry(content::BrowserThread::IO, "io", key); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test registration. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RulesRegistryService registry_service(NULL); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry)); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry_service.RegisterRulesRegistry(make_scoped_refptr(io_registry)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(registry_service.GetRulesRegistry(key, "ui").get()); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(registry_service.GetRulesRegistry(key, "io").get()); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(registry_service.GetRulesRegistry(key, "foo").get()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&InsertRule, registry_service.GetRulesRegistry(key, "ui"), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ui_task")); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&InsertRule, registry_service.GetRulesRegistry(key, "io"), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "io_task")); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&VerifyNumberOfRules, 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.GetRulesRegistry(key, "ui"), 1)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&VerifyNumberOfRules, 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.GetRulesRegistry(key, "io"), 1)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_loop_.RunUntilIdle(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Test extension uninstalling. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.SimulateExtensionUninstalled(kExtensionId); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&VerifyNumberOfRules, 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.GetRulesRegistry(key, "ui"), 0)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&VerifyNumberOfRules, 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.GetRulesRegistry(key, "io"), 0)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_loop_.RunUntilIdle(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This test verifies that removing rules registries by process ID works as 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// intended. This test ensures that removing registries associated with one 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Webview embedder process does not remove registries associated with the 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// other. 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(RulesRegistryServiceTest, TestWebViewKey) { 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kEmbedderProcessID1 = 1; 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kEmbedderProcessID2 = 2; 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kWebViewInstanceID = 1; 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const RulesRegistry::WebViewKey key1(kEmbedderProcessID1, kWebViewInstanceID); 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const RulesRegistry::WebViewKey key2(kEmbedderProcessID2, kWebViewInstanceID); 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestRulesRegistry* ui_registry_key1 = 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new TestRulesRegistry(content::BrowserThread::UI, "ui", key1); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestRulesRegistry* ui_registry_key2 = 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new TestRulesRegistry(content::BrowserThread::UI, "ui", key2); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RulesRegistryService registry_service(NULL); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry_key1)); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry_key2)); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::PostTask( 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&InsertRule, registry_service.GetRulesRegistry(key1, "ui"), 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ui_task")); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::PostTask( 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&InsertRule, registry_service.GetRulesRegistry(key2, "ui"), 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ui_task")); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_loop_.RunUntilIdle(); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.RemoveWebViewRulesRegistries(kEmbedderProcessID1); 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(registry_service.GetRulesRegistry(key1, "ui").get()); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(registry_service.GetRulesRegistry(key2, "ui").get()); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(RulesRegistryServiceTest, TestWebViewWebRequestRegistryHasNoCache) { 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kEmbedderProcessID = 1; 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kWebViewInstanceID = 1; 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const RulesRegistry::WebViewKey key(kEmbedderProcessID, kWebViewInstanceID); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile profile; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RulesRegistryService registry_service(&profile); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RulesRegistry* registry = 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) registry_service.GetRulesRegistry( 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) key, 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) declarative_webrequest_constants::kOnRequest).get(); 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(registry); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(registry->rules_cache_delegate_for_testing()); 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 165