Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / declarative / rules_registry_service_unittest.cc
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
15 namespace {
16 const char kExtensionId[] = "foo";
17
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());
25 }
26
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());
32 }
33
34 }  // namespace
35
36 namespace extensions {
37
38 class 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
57 TEST_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.
118 TEST_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
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(
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