1 // Copyright 2013 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 "extensions/browser/extension_registry.h"
9 #include "base/memory/ref_counted.h"
10 #include "extensions/browser/extension_registry_observer.h"
11 #include "extensions/common/extension.h"
12 #include "extensions/common/test_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 namespace extensions
{
18 typedef testing::Test ExtensionRegistryTest
;
20 testing::AssertionResult
HasSingleExtension(
21 const ExtensionList
& list
,
22 const scoped_refptr
<const Extension
>& extension
) {
24 return testing::AssertionFailure() << "No extensions in list";
26 return testing::AssertionFailure() << list
.size()
27 << " extensions, expected 1";
28 const Extension
* did_load
= list
[0].get();
29 if (did_load
!= extension
)
30 return testing::AssertionFailure() << "Expected " << extension
->id()
31 << " found " << did_load
->id();
32 return testing::AssertionSuccess();
35 class TestObserver
: public ExtensionRegistryObserver
{
42 const ExtensionList
& loaded() { return loaded_
; }
43 const ExtensionList
& unloaded() { return unloaded_
; }
46 virtual void OnExtensionLoaded(content::BrowserContext
* browser_context
,
47 const Extension
* extension
) OVERRIDE
{
48 loaded_
.push_back(extension
);
51 virtual void OnExtensionUnloaded(content::BrowserContext
* browser_context
,
52 const Extension
* extension
) OVERRIDE
{
53 unloaded_
.push_back(extension
);
56 ExtensionList loaded_
;
57 ExtensionList unloaded_
;
60 TEST_F(ExtensionRegistryTest
, FillAndClearRegistry
) {
61 ExtensionRegistry
registry(NULL
);
62 scoped_refptr
<Extension
> extension1
= test_util::CreateExtensionWithID("id1");
63 scoped_refptr
<Extension
> extension2
= test_util::CreateExtensionWithID("id2");
64 scoped_refptr
<Extension
> extension3
= test_util::CreateExtensionWithID("id3");
65 scoped_refptr
<Extension
> extension4
= test_util::CreateExtensionWithID("id4");
67 // All the sets start empty.
68 EXPECT_EQ(0u, registry
.enabled_extensions().size());
69 EXPECT_EQ(0u, registry
.disabled_extensions().size());
70 EXPECT_EQ(0u, registry
.terminated_extensions().size());
71 EXPECT_EQ(0u, registry
.blacklisted_extensions().size());
73 // Extensions can be added to each set.
74 registry
.AddEnabled(extension1
);
75 registry
.AddDisabled(extension2
);
76 registry
.AddTerminated(extension3
);
77 registry
.AddBlacklisted(extension4
);
79 EXPECT_EQ(1u, registry
.enabled_extensions().size());
80 EXPECT_EQ(1u, registry
.disabled_extensions().size());
81 EXPECT_EQ(1u, registry
.terminated_extensions().size());
82 EXPECT_EQ(1u, registry
.blacklisted_extensions().size());
84 // Clearing the registry clears all sets.
87 EXPECT_EQ(0u, registry
.enabled_extensions().size());
88 EXPECT_EQ(0u, registry
.disabled_extensions().size());
89 EXPECT_EQ(0u, registry
.terminated_extensions().size());
90 EXPECT_EQ(0u, registry
.blacklisted_extensions().size());
93 // A simple test of adding and removing things from sets.
94 TEST_F(ExtensionRegistryTest
, AddAndRemoveExtensionFromRegistry
) {
95 ExtensionRegistry
registry(NULL
);
97 // Adding an extension works.
98 scoped_refptr
<Extension
> extension
= test_util::CreateExtensionWithID("id");
99 EXPECT_TRUE(registry
.AddEnabled(extension
));
100 EXPECT_EQ(1u, registry
.enabled_extensions().size());
102 // The extension was only added to one set.
103 EXPECT_EQ(0u, registry
.disabled_extensions().size());
104 EXPECT_EQ(0u, registry
.terminated_extensions().size());
105 EXPECT_EQ(0u, registry
.blacklisted_extensions().size());
107 // Removing an extension works.
108 EXPECT_TRUE(registry
.RemoveEnabled(extension
->id()));
109 EXPECT_EQ(0u, registry
.enabled_extensions().size());
111 // Trying to remove an extension that isn't in the set fails cleanly.
112 EXPECT_FALSE(registry
.RemoveEnabled(extension
->id()));
115 TEST_F(ExtensionRegistryTest
, AddExtensionToRegistryTwice
) {
116 ExtensionRegistry
registry(NULL
);
117 scoped_refptr
<Extension
> extension
= test_util::CreateExtensionWithID("id");
119 // An extension can exist in two sets at once. It would be nice to eliminate
120 // this functionality, but some users of ExtensionRegistry need it.
121 EXPECT_TRUE(registry
.AddEnabled(extension
));
122 EXPECT_TRUE(registry
.AddDisabled(extension
));
124 EXPECT_EQ(1u, registry
.enabled_extensions().size());
125 EXPECT_EQ(1u, registry
.disabled_extensions().size());
126 EXPECT_EQ(0u, registry
.terminated_extensions().size());
127 EXPECT_EQ(0u, registry
.blacklisted_extensions().size());
130 TEST_F(ExtensionRegistryTest
, GetExtensionById
) {
131 ExtensionRegistry
registry(NULL
);
133 // Trying to get an extension fails cleanly when the sets are empty.
135 registry
.GetExtensionById("id", ExtensionRegistry::EVERYTHING
));
137 scoped_refptr
<Extension
> enabled
=
138 test_util::CreateExtensionWithID("enabled");
139 scoped_refptr
<Extension
> disabled
=
140 test_util::CreateExtensionWithID("disabled");
141 scoped_refptr
<Extension
> terminated
=
142 test_util::CreateExtensionWithID("terminated");
143 scoped_refptr
<Extension
> blacklisted
=
144 test_util::CreateExtensionWithID("blacklisted");
146 // Add an extension to each set.
147 registry
.AddEnabled(enabled
);
148 registry
.AddDisabled(disabled
);
149 registry
.AddTerminated(terminated
);
150 registry
.AddBlacklisted(blacklisted
);
152 // Enabled is part of everything and the enabled list.
154 registry
.GetExtensionById("enabled", ExtensionRegistry::EVERYTHING
));
156 registry
.GetExtensionById("enabled", ExtensionRegistry::ENABLED
));
158 registry
.GetExtensionById("enabled", ExtensionRegistry::DISABLED
));
160 registry
.GetExtensionById("enabled", ExtensionRegistry::TERMINATED
));
162 registry
.GetExtensionById("enabled", ExtensionRegistry::BLACKLISTED
));
164 // Disabled is part of everything and the disabled list.
166 registry
.GetExtensionById("disabled", ExtensionRegistry::EVERYTHING
));
168 registry
.GetExtensionById("disabled", ExtensionRegistry::ENABLED
));
170 registry
.GetExtensionById("disabled", ExtensionRegistry::DISABLED
));
172 registry
.GetExtensionById("disabled", ExtensionRegistry::TERMINATED
));
174 registry
.GetExtensionById("disabled", ExtensionRegistry::BLACKLISTED
));
176 // Terminated is part of everything and the terminated list.
178 registry
.GetExtensionById("terminated", ExtensionRegistry::EVERYTHING
));
180 registry
.GetExtensionById("terminated", ExtensionRegistry::ENABLED
));
182 registry
.GetExtensionById("terminated", ExtensionRegistry::DISABLED
));
184 registry
.GetExtensionById("terminated", ExtensionRegistry::TERMINATED
));
186 registry
.GetExtensionById("terminated", ExtensionRegistry::BLACKLISTED
));
188 // Blacklisted is part of everything and the blacklisted list.
190 registry
.GetExtensionById("blacklisted", ExtensionRegistry::EVERYTHING
));
192 registry
.GetExtensionById("blacklisted", ExtensionRegistry::ENABLED
));
194 registry
.GetExtensionById("blacklisted", ExtensionRegistry::DISABLED
));
196 registry
.GetExtensionById("blacklisted", ExtensionRegistry::TERMINATED
));
198 registry
.GetExtensionById("blacklisted", ExtensionRegistry::BLACKLISTED
));
200 // Enabled can be found with multiple flags set.
201 EXPECT_TRUE(registry
.GetExtensionById(
202 "enabled", ExtensionRegistry::ENABLED
| ExtensionRegistry::TERMINATED
));
204 // Enabled isn't found if the wrong flags are set.
205 EXPECT_FALSE(registry
.GetExtensionById(
206 "enabled", ExtensionRegistry::DISABLED
| ExtensionRegistry::BLACKLISTED
));
209 TEST_F(ExtensionRegistryTest
, Observer
) {
210 ExtensionRegistry
registry(NULL
);
211 TestObserver observer
;
212 registry
.AddObserver(&observer
);
214 EXPECT_TRUE(observer
.loaded().empty());
215 EXPECT_TRUE(observer
.unloaded().empty());
217 scoped_refptr
<const Extension
> extension
=
218 test_util::CreateExtensionWithID("id");
220 registry
.AddEnabled(extension
);
221 registry
.TriggerOnLoaded(extension
);
223 EXPECT_TRUE(HasSingleExtension(observer
.loaded(), extension
.get()));
224 EXPECT_TRUE(observer
.unloaded().empty());
227 registry
.RemoveEnabled(extension
->id());
228 registry
.TriggerOnUnloaded(extension
);
230 EXPECT_TRUE(observer
.loaded().empty());
231 EXPECT_TRUE(HasSingleExtension(observer
.unloaded(), extension
.get()));
234 registry
.RemoveObserver(&observer
);
238 } // namespace extensions