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