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 "content/public/test/test_browser_thread.h"
11 #include "testing/gtest/include/gtest/gtest.h"
14 const char kExtensionId[] = "foo";
16 void InsertRule(scoped_refptr<extensions::RulesRegistry> registry,
17 const std::string& id) {
18 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > add_rules;
19 add_rules.push_back(make_linked_ptr(new extensions::RulesRegistry::Rule));
20 add_rules[0]->id.reset(new std::string(id));
21 std::string error = registry->AddRules(kExtensionId, add_rules);
22 EXPECT_TRUE(error.empty());
25 void VerifyNumberOfRules(scoped_refptr<extensions::RulesRegistry> registry,
26 size_t expected_number_of_rules) {
27 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > get_rules;
28 std::string error = registry->GetAllRules(kExtensionId, &get_rules);
29 EXPECT_EQ(expected_number_of_rules, get_rules.size());
34 namespace extensions {
36 class RulesRegistryServiceTest : public testing::Test {
38 RulesRegistryServiceTest()
39 : ui_(content::BrowserThread::UI, &message_loop_),
40 io_(content::BrowserThread::IO, &message_loop_) {}
42 virtual ~RulesRegistryServiceTest() {}
44 virtual void TearDown() OVERRIDE {
45 // Make sure that deletion traits of all registries are executed.
46 message_loop_.RunUntilIdle();
50 base::MessageLoop message_loop_;
51 content::TestBrowserThread ui_;
52 content::TestBrowserThread io_;
55 TEST_F(RulesRegistryServiceTest, TestConstructionAndMultiThreading) {
56 TestRulesRegistry* ui_registry =
57 new TestRulesRegistry(content::BrowserThread::UI, "ui");
59 TestRulesRegistry* io_registry =
60 new TestRulesRegistry(content::BrowserThread::IO, "io");
64 RulesRegistryService registry_service(NULL);
65 registry_service.RegisterRulesRegistry(make_scoped_refptr(ui_registry));
66 registry_service.RegisterRulesRegistry(make_scoped_refptr(io_registry));
68 EXPECT_TRUE(registry_service.GetRulesRegistry("ui").get());
69 EXPECT_TRUE(registry_service.GetRulesRegistry("io").get());
70 EXPECT_FALSE(registry_service.GetRulesRegistry("foo").get());
72 content::BrowserThread::PostTask(
73 content::BrowserThread::UI, FROM_HERE,
74 base::Bind(&InsertRule, registry_service.GetRulesRegistry("ui"),
77 content::BrowserThread::PostTask(
78 content::BrowserThread::IO, FROM_HERE,
79 base::Bind(&InsertRule, registry_service.GetRulesRegistry("io"),
82 content::BrowserThread::PostTask(
83 content::BrowserThread::UI, FROM_HERE,
84 base::Bind(&VerifyNumberOfRules,
85 registry_service.GetRulesRegistry("ui"), 1));
87 content::BrowserThread::PostTask(
88 content::BrowserThread::IO, FROM_HERE,
89 base::Bind(&VerifyNumberOfRules,
90 registry_service.GetRulesRegistry("io"), 1));
92 message_loop_.RunUntilIdle();
94 // Test extension unloading.
96 registry_service.SimulateExtensionUnloaded(kExtensionId);
98 content::BrowserThread::PostTask(
99 content::BrowserThread::UI, FROM_HERE,
100 base::Bind(&VerifyNumberOfRules,
101 registry_service.GetRulesRegistry("ui"), 0));
103 content::BrowserThread::PostTask(
104 content::BrowserThread::IO, FROM_HERE,
105 base::Bind(&VerifyNumberOfRules,
106 registry_service.GetRulesRegistry("io"), 0));
108 message_loop_.RunUntilIdle();
111 } // namespace extensions