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 "extensions/browser/api/declarative/rules_registry_service.h"
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "chrome/test/base/testing_profile.h"
10#include "content/public/test/test_browser_thread.h"
11#include "extensions/browser/api/declarative/test_rules_registry.h"
12#include "extensions/browser/api/declarative_webrequest/webrequest_constants.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