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.
5 #include "chrome/browser/extensions/api/declarative/rules_registry_service.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"
16 const char kExtensionId
[] = "foo";
18 void 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());
27 void 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());
36 namespace extensions
{
38 class RulesRegistryServiceTest
: public testing::Test
{
40 RulesRegistryServiceTest()
41 : ui_(content::BrowserThread::UI
, &message_loop_
),
42 io_(content::BrowserThread::IO
, &message_loop_
) {}
44 virtual ~RulesRegistryServiceTest() {}
46 virtual void TearDown() OVERRIDE
{
47 // Make sure that deletion traits of all registries are executed.
48 message_loop_
.RunUntilIdle();
52 base::MessageLoop message_loop_
;
53 content::TestBrowserThread ui_
;
54 content::TestBrowserThread io_
;
57 TEST_F(RulesRegistryServiceTest
, TestConstructionAndMultiThreading
) {
58 const RulesRegistry::WebViewKey
key(0, 0);
59 TestRulesRegistry
* ui_registry
=
60 new TestRulesRegistry(content::BrowserThread::UI
, "ui", key
);
62 TestRulesRegistry
* io_registry
=
63 new TestRulesRegistry(content::BrowserThread::IO
, "io", key
);
67 RulesRegistryService
registry_service(NULL
);
68 registry_service
.RegisterRulesRegistry(make_scoped_refptr(ui_registry
));
69 registry_service
.RegisterRulesRegistry(make_scoped_refptr(io_registry
));
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());
75 content::BrowserThread::PostTask(
76 content::BrowserThread::UI
, FROM_HERE
,
77 base::Bind(&InsertRule
, registry_service
.GetRulesRegistry(key
, "ui"),
80 content::BrowserThread::PostTask(
81 content::BrowserThread::IO
, FROM_HERE
,
82 base::Bind(&InsertRule
, registry_service
.GetRulesRegistry(key
, "io"),
85 content::BrowserThread::PostTask(
86 content::BrowserThread::UI
, FROM_HERE
,
87 base::Bind(&VerifyNumberOfRules
,
88 registry_service
.GetRulesRegistry(key
, "ui"), 1));
90 content::BrowserThread::PostTask(
91 content::BrowserThread::IO
, FROM_HERE
,
92 base::Bind(&VerifyNumberOfRules
,
93 registry_service
.GetRulesRegistry(key
, "io"), 1));
95 message_loop_
.RunUntilIdle();
97 // Test extension uninstalling.
99 registry_service
.SimulateExtensionUninstalled(kExtensionId
);
101 content::BrowserThread::PostTask(
102 content::BrowserThread::UI
, FROM_HERE
,
103 base::Bind(&VerifyNumberOfRules
,
104 registry_service
.GetRulesRegistry(key
, "ui"), 0));
106 content::BrowserThread::PostTask(
107 content::BrowserThread::IO
, FROM_HERE
,
108 base::Bind(&VerifyNumberOfRules
,
109 registry_service
.GetRulesRegistry(key
, "io"), 0));
111 message_loop_
.RunUntilIdle();
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
118 TEST_F(RulesRegistryServiceTest
, TestWebViewKey
) {
119 const int kEmbedderProcessID1
= 1;
120 const int kEmbedderProcessID2
= 2;
121 const int kWebViewInstanceID
= 1;
123 const RulesRegistry::WebViewKey
key1(kEmbedderProcessID1
, kWebViewInstanceID
);
124 const RulesRegistry::WebViewKey
key2(kEmbedderProcessID2
, kWebViewInstanceID
);
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
);
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
));
135 content::BrowserThread::PostTask(
136 content::BrowserThread::UI
, FROM_HERE
,
137 base::Bind(&InsertRule
, registry_service
.GetRulesRegistry(key1
, "ui"),
139 content::BrowserThread::PostTask(
140 content::BrowserThread::UI
, FROM_HERE
,
141 base::Bind(&InsertRule
, registry_service
.GetRulesRegistry(key2
, "ui"),
143 message_loop_
.RunUntilIdle();
145 registry_service
.RemoveWebViewRulesRegistries(kEmbedderProcessID1
);
146 EXPECT_FALSE(registry_service
.GetRulesRegistry(key1
, "ui").get());
147 EXPECT_TRUE(registry_service
.GetRulesRegistry(key2
, "ui").get());
150 TEST_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(
159 declarative_webrequest_constants::kOnRequest
).get();
160 EXPECT_TRUE(registry
);
161 EXPECT_FALSE(registry
->rules_cache_delegate_for_testing());
164 } // namespace extensions