1 // Copyright 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.
6 #include "base/message_loop/message_loop.h"
7 #include "base/run_loop.h"
8 #include "chrome/browser/extensions/blacklist.h"
9 #include "chrome/browser/extensions/extension_prefs.h"
10 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
11 #include "chrome/browser/extensions/test_blacklist.h"
12 #include "chrome/browser/extensions/test_extension_prefs.h"
13 #include "content/public/test/test_browser_thread.h"
14 #include "testing/gtest/include/gtest/gtest.h"
16 namespace extensions
{
19 class BlacklistTest
: public testing::Test
{
22 : prefs_(message_loop_
.message_loop_proxy().get()),
23 ui_thread_(content::BrowserThread::UI
, &message_loop_
),
24 io_thread_(content::BrowserThread::IO
, &message_loop_
),
25 safe_browsing_database_manager_(new FakeSafeBrowsingDatabaseManager()),
26 scoped_blacklist_database_manager_(safe_browsing_database_manager_
),
27 blacklist_(prefs_
.prefs()) {}
29 bool IsBlacklisted(const Extension
* extension
) {
30 return TestBlacklist(&blacklist_
).IsBlacklisted(extension
->id());
34 base::MessageLoop message_loop_
;
36 TestExtensionPrefs prefs_
;
38 content::TestBrowserThread ui_thread_
;
39 content::TestBrowserThread io_thread_
;
41 scoped_refptr
<FakeSafeBrowsingDatabaseManager
>
42 safe_browsing_database_manager_
;
43 Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_database_manager_
;
48 TEST_F(BlacklistTest
, SetFromUpdater
) {
49 scoped_refptr
<const Extension
> extension_a
= prefs_
.AddExtension("a");
50 scoped_refptr
<const Extension
> extension_b
= prefs_
.AddExtension("b");
51 scoped_refptr
<const Extension
> extension_c
= prefs_
.AddExtension("c");
52 scoped_refptr
<const Extension
> extension_d
= prefs_
.AddExtension("d");
54 // c, d, start blacklisted.
55 prefs_
.prefs()->SetExtensionBlacklisted(extension_c
->id(), true);
56 prefs_
.prefs()->SetExtensionBlacklisted(extension_d
->id(), true);
58 EXPECT_FALSE(IsBlacklisted(extension_a
.get()));
59 EXPECT_FALSE(IsBlacklisted(extension_b
.get()));
60 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
61 EXPECT_TRUE(IsBlacklisted(extension_d
.get()));
63 // Mix up the blacklist.
65 std::vector
<std::string
> blacklist
;
66 blacklist
.push_back(extension_b
->id());
67 blacklist
.push_back(extension_c
->id());
68 blacklist_
.SetFromUpdater(blacklist
, "1");
70 EXPECT_FALSE(IsBlacklisted(extension_a
.get()));
71 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
72 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
73 EXPECT_FALSE(IsBlacklisted(extension_d
.get()));
75 // No-op, just in case.
77 std::vector
<std::string
> blacklist
;
78 blacklist
.push_back(extension_b
->id());
79 blacklist
.push_back(extension_c
->id());
80 blacklist_
.SetFromUpdater(blacklist
, "2");
82 EXPECT_FALSE(IsBlacklisted(extension_a
.get()));
83 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
84 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
85 EXPECT_FALSE(IsBlacklisted(extension_d
.get()));
87 // Strictly increase the blacklist.
89 std::vector
<std::string
> blacklist
;
90 blacklist
.push_back(extension_a
->id());
91 blacklist
.push_back(extension_b
->id());
92 blacklist
.push_back(extension_c
->id());
93 blacklist
.push_back(extension_d
->id());
94 blacklist_
.SetFromUpdater(blacklist
, "3");
96 EXPECT_TRUE(IsBlacklisted(extension_a
.get()));
97 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
98 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
99 EXPECT_TRUE(IsBlacklisted(extension_d
.get()));
101 // Strictly decrease the blacklist.
103 std::vector
<std::string
> blacklist
;
104 blacklist
.push_back(extension_a
->id());
105 blacklist
.push_back(extension_b
->id());
106 blacklist_
.SetFromUpdater(blacklist
, "4");
108 EXPECT_TRUE(IsBlacklisted(extension_a
.get()));
109 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
110 EXPECT_FALSE(IsBlacklisted(extension_c
.get()));
111 EXPECT_FALSE(IsBlacklisted(extension_d
.get()));
113 // Clear the blacklist.
115 std::vector
<std::string
> blacklist
;
116 blacklist_
.SetFromUpdater(blacklist
, "5");
118 EXPECT_FALSE(IsBlacklisted(extension_a
.get()));
119 EXPECT_FALSE(IsBlacklisted(extension_b
.get()));
120 EXPECT_FALSE(IsBlacklisted(extension_c
.get()));
121 EXPECT_FALSE(IsBlacklisted(extension_d
.get()));
124 void Assign(std::set
<std::string
> *to
, const std::set
<std::string
>& from
) {
128 TEST_F(BlacklistTest
, OnlyIncludesRequestedIDs
) {
129 scoped_refptr
<const Extension
> extension_a
= prefs_
.AddExtension("a");
130 scoped_refptr
<const Extension
> extension_b
= prefs_
.AddExtension("b");
131 scoped_refptr
<const Extension
> extension_c
= prefs_
.AddExtension("c");
134 std::vector
<std::string
> blacklist
;
135 blacklist
.push_back(extension_a
->id());
136 blacklist
.push_back(extension_b
->id());
137 blacklist_
.SetFromUpdater(blacklist
, "1");
138 base::RunLoop().RunUntilIdle();
141 std::set
<std::string
> blacklist_actual
;
143 std::set
<std::string
> blacklist_query
;
144 blacklist_query
.insert(extension_a
->id());
145 blacklist_query
.insert(extension_c
->id());
146 blacklist_
.GetBlacklistedIDs(blacklist_query
,
147 base::Bind(&Assign
, &blacklist_actual
));
148 base::RunLoop().RunUntilIdle();
151 std::set
<std::string
> blacklist_expected
;
152 blacklist_expected
.insert(extension_a
->id());
153 EXPECT_EQ(blacklist_expected
, blacklist_actual
);
156 TEST_F(BlacklistTest
, PrefsVsSafeBrowsing
) {
157 scoped_refptr
<const Extension
> extension_a
= prefs_
.AddExtension("a");
158 scoped_refptr
<const Extension
> extension_b
= prefs_
.AddExtension("b");
159 scoped_refptr
<const Extension
> extension_c
= prefs_
.AddExtension("c");
161 // Prefs have a and b blacklisted, safebrowsing has b and c.
162 prefs_
.prefs()->SetExtensionBlacklisted(extension_a
->id(), true);
163 prefs_
.prefs()->SetExtensionBlacklisted(extension_b
->id(), true);
165 std::set
<std::string
> bc
;
166 bc
.insert(extension_b
->id());
167 bc
.insert(extension_c
->id());
168 safe_browsing_database_manager_
->set_unsafe_ids(bc
);
171 // The manager is still disabled at this point, so c won't be blacklisted.
172 EXPECT_TRUE(IsBlacklisted(extension_a
.get()));
173 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
174 EXPECT_FALSE(IsBlacklisted(extension_c
.get()));
177 safe_browsing_database_manager_
->set_enabled(true);
178 EXPECT_TRUE(IsBlacklisted(extension_a
.get()));
179 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
180 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
182 // Corner case: nothing in safebrowsing (but still enabled).
183 safe_browsing_database_manager_
->set_unsafe_ids(std::set
<std::string
>());
184 EXPECT_TRUE(IsBlacklisted(extension_a
.get()));
185 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
186 EXPECT_FALSE(IsBlacklisted(extension_c
.get()));
188 // Corner case: nothing in prefs.
189 prefs_
.prefs()->SetExtensionBlacklisted(extension_a
->id(), false);
190 prefs_
.prefs()->SetExtensionBlacklisted(extension_b
->id(), false);
192 std::set
<std::string
> bc
;
193 bc
.insert(extension_b
->id());
194 bc
.insert(extension_c
->id());
195 safe_browsing_database_manager_
->set_unsafe_ids(bc
);
197 EXPECT_FALSE(IsBlacklisted(extension_a
.get()));
198 EXPECT_TRUE(IsBlacklisted(extension_b
.get()));
199 EXPECT_TRUE(IsBlacklisted(extension_c
.get()));
202 } // namespace extensions