OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "chrome/browser/extensions/blacklist.h" | 9 #include "chrome/browser/extensions/blacklist.h" |
10 #include "chrome/browser/extensions/blacklist_state_fetcher.h" | 10 #include "chrome/browser/extensions/blacklist_state_fetcher.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 const std::string& c, | 41 const std::string& c, |
42 const std::string& d) { | 42 const std::string& d) { |
43 std::set<std::string> set = Set(a, b, c); | 43 std::set<std::string> set = Set(a, b, c); |
44 set.insert(d); | 44 set.insert(d); |
45 return set; | 45 return set; |
46 } | 46 } |
47 | 47 |
48 class BlacklistTest : public testing::Test { | 48 class BlacklistTest : public testing::Test { |
49 public: | 49 public: |
50 BlacklistTest() | 50 BlacklistTest() |
51 : test_prefs_(base::MessageLoopProxy::current()), | 51 : test_prefs_(base::MessageLoopProxy::current()) {} |
52 blacklist_db_(new FakeSafeBrowsingDatabaseManager(false)), | |
53 scoped_blacklist_db_(blacklist_db_) {} | |
54 | 52 |
55 protected: | 53 protected: |
56 ExtensionPrefs* prefs() { | 54 ExtensionPrefs* prefs() { |
57 return test_prefs_.prefs(); | 55 return test_prefs_.prefs(); |
58 } | 56 } |
59 | 57 |
60 FakeSafeBrowsingDatabaseManager* blacklist_db() { | |
61 return blacklist_db_.get(); | |
62 } | |
63 | |
64 std::string AddExtension(const std::string& id) { | 58 std::string AddExtension(const std::string& id) { |
65 return test_prefs_.AddExtension(id)->id(); | 59 return test_prefs_.AddExtension(id)->id(); |
66 } | 60 } |
67 | 61 |
68 private: | 62 private: |
69 content::TestBrowserThreadBundle browser_thread_bundle_; | 63 content::TestBrowserThreadBundle browser_thread_bundle_; |
70 | 64 |
71 TestExtensionPrefs test_prefs_; | 65 TestExtensionPrefs test_prefs_; |
72 | |
73 scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db_; | |
74 | |
75 Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db_; | |
76 }; | |
77 | |
78 class BlacklistStateFetcherMock : public BlacklistStateFetcher { | |
79 public: | |
80 virtual void Request(const std::string& id, | |
81 const RequestCallback& callback) OVERRIDE { | |
82 request_count_++; | |
83 | |
84 BlacklistState result = NOT_BLACKLISTED; | |
85 if (ContainsKey(states_, id)) | |
86 result = states_[id]; | |
87 | |
88 base::MessageLoopProxy::current()->PostTask(FROM_HERE, | |
89 base::Bind(callback, result)); | |
90 } | |
91 | |
92 void SetState(const std::string& id, BlacklistState state) { | |
93 states_[id] = state; | |
94 } | |
95 | |
96 int request_count() const { | |
97 return request_count_; | |
98 } | |
99 | |
100 private: | |
101 std::map<std::string, BlacklistState> states_; | |
102 int request_count_; | |
103 }; | 66 }; |
104 | 67 |
105 template<typename T> | 68 template<typename T> |
106 void Assign(T *to, const T& from) { | 69 void Assign(T *to, const T& from) { |
107 *to = from; | 70 *to = from; |
108 } | 71 } |
109 | 72 |
110 } // namespace | 73 } // namespace |
111 | 74 |
112 TEST_F(BlacklistTest, OnlyIncludesRequestedIDs) { | 75 TEST_F(BlacklistTest, OnlyIncludesRequestedIDs) { |
113 std::string a = AddExtension("a"); | 76 std::string a = AddExtension("a"); |
114 std::string b = AddExtension("b"); | 77 std::string b = AddExtension("b"); |
115 std::string c = AddExtension("c"); | 78 std::string c = AddExtension("c"); |
116 | 79 |
117 Blacklist blacklist(prefs()); | 80 Blacklist blacklist(prefs()); |
118 TestBlacklist tester(&blacklist); | 81 TestBlacklist tester(&blacklist); |
119 BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); | 82 tester.SetBlacklistState(a, BLACKLISTED_MALWARE, false); |
120 fetcher->SetState(a, BLACKLISTED_MALWARE); | 83 tester.SetBlacklistState(b, BLACKLISTED_MALWARE, false); |
121 fetcher->SetState(b, BLACKLISTED_MALWARE); | |
122 blacklist.SetBlacklistStateFetcherForTest(fetcher); | |
123 | |
124 blacklist_db()->Enable(); | |
125 blacklist_db()->SetUnsafe(a, b); | |
126 | 84 |
127 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); | 85 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
128 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(b)); | 86 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(b)); |
129 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(c)); | 87 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(c)); |
130 | 88 |
131 std::set<std::string> blacklisted_ids; | 89 std::set<std::string> blacklisted_ids; |
132 blacklist.GetMalwareIDs( | 90 blacklist.GetMalwareIDs( |
133 Set(a, c), base::Bind(&Assign<std::set<std::string> >, &blacklisted_ids)); | 91 Set(a, c), base::Bind(&Assign<std::set<std::string> >, &blacklisted_ids)); |
134 base::RunLoop().RunUntilIdle(); | 92 base::RunLoop().RunUntilIdle(); |
135 | 93 |
136 EXPECT_EQ(Set(a), blacklisted_ids); | 94 EXPECT_EQ(Set(a), blacklisted_ids); |
137 } | 95 } |
138 | 96 |
139 TEST_F(BlacklistTest, SafeBrowsing) { | 97 TEST_F(BlacklistTest, SafeBrowsing) { |
140 std::string a = AddExtension("a"); | 98 std::string a = AddExtension("a"); |
141 | 99 |
142 Blacklist blacklist(prefs()); | 100 Blacklist blacklist(prefs()); |
143 TestBlacklist tester(&blacklist); | 101 TestBlacklist tester(&blacklist); |
144 BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); | 102 tester.DisableSafeBrowsing(); |
145 fetcher->SetState(a, BLACKLISTED_MALWARE); | |
146 blacklist.SetBlacklistStateFetcherForTest(fetcher); | |
147 | 103 |
148 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); | 104 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
149 | 105 |
150 blacklist_db()->SetUnsafe(a); | 106 tester.SetBlacklistState(a, BLACKLISTED_MALWARE, false); |
151 // The manager is still disabled at this point, so it won't be blacklisted. | 107 // The manager is still disabled at this point, so it won't be blacklisted. |
152 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); | 108 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
153 | 109 |
154 blacklist_db()->Enable().NotifyUpdate(); | 110 tester.EnableSafeBrowsing(); |
| 111 tester.NotifyUpdate(); |
155 base::RunLoop().RunUntilIdle(); | 112 base::RunLoop().RunUntilIdle(); |
156 // Now it should be. | 113 // Now it should be. |
157 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); | 114 EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
158 | 115 |
159 blacklist_db()->ClearUnsafe().NotifyUpdate(); | 116 tester.Clear(true); |
160 // Safe browsing blacklist empty, now enabled. | 117 // Safe browsing blacklist empty, now enabled. |
161 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); | 118 EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
162 } | 119 } |
163 | 120 |
164 // Tests that Blacklist clears the old prefs blacklist on startup. | 121 // Tests that Blacklist clears the old prefs blacklist on startup. |
165 TEST_F(BlacklistTest, ClearsPreferencesBlacklist) { | 122 TEST_F(BlacklistTest, ClearsPreferencesBlacklist) { |
166 std::string a = AddExtension("a"); | 123 std::string a = AddExtension("a"); |
167 std::string b = AddExtension("b"); | 124 std::string b = AddExtension("b"); |
168 | 125 |
169 // Blacklist an installed extension. | 126 // Blacklist an installed extension. |
170 prefs()->SetExtensionBlacklisted(a, true); | 127 prefs()->SetExtensionBlacklisted(a, true); |
171 | 128 |
172 // Blacklist some non-installed extensions. This is what the old preferences | 129 // Blacklist some non-installed extensions. This is what the old preferences |
173 // blacklist looked like. | 130 // blacklist looked like. |
174 std::string c = "cccccccccccccccccccccccccccccccc"; | 131 std::string c = "cccccccccccccccccccccccccccccccc"; |
175 std::string d = "dddddddddddddddddddddddddddddddd"; | 132 std::string d = "dddddddddddddddddddddddddddddddd"; |
176 prefs()->SetExtensionBlacklisted(c, true); | 133 prefs()->SetExtensionBlacklisted(c, true); |
177 prefs()->SetExtensionBlacklisted(d, true); | 134 prefs()->SetExtensionBlacklisted(d, true); |
178 | 135 |
179 EXPECT_EQ(Set(a, c, d), prefs()->GetBlacklistedExtensions()); | 136 EXPECT_EQ(Set(a, c, d), prefs()->GetBlacklistedExtensions()); |
180 | 137 |
181 Blacklist blacklist(prefs()); | 138 Blacklist blacklist(prefs()); |
182 blacklist.SetBlacklistStateFetcherForTest(new BlacklistStateFetcherMock()); | 139 TestBlacklist tester(&blacklist); |
183 | 140 |
184 // Blacklist has been cleared. Only the installed extension "a" left. | 141 // Blacklist has been cleared. Only the installed extension "a" left. |
185 EXPECT_EQ(Set(a), prefs()->GetBlacklistedExtensions()); | 142 EXPECT_EQ(Set(a), prefs()->GetBlacklistedExtensions()); |
186 EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(a).get()); | 143 EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(a).get()); |
187 EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(b).get()); | 144 EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(b).get()); |
188 | 145 |
189 // "a" won't actually be *blacklisted* since it doesn't appear in | 146 // "a" won't actually be *blacklisted* since it doesn't appear in |
190 // safebrowsing. Blacklist no longer reads from prefs. This is purely a | 147 // safebrowsing. Blacklist no longer reads from prefs. This is purely a |
191 // concern of somebody else (currently, ExtensionService). | 148 // concern of somebody else (currently, ExtensionService). |
192 std::set<std::string> blacklisted_ids; | 149 std::set<std::string> blacklisted_ids; |
193 blacklist.GetMalwareIDs(Set(a, b, c, d), | 150 blacklist.GetMalwareIDs(Set(a, b, c, d), |
194 base::Bind(&Assign<std::set<std::string> >, | 151 base::Bind(&Assign<std::set<std::string> >, |
195 &blacklisted_ids)); | 152 &blacklisted_ids)); |
196 base::RunLoop().RunUntilIdle(); | 153 base::RunLoop().RunUntilIdle(); |
197 EXPECT_EQ(std::set<std::string>(), blacklisted_ids); | 154 EXPECT_EQ(std::set<std::string>(), blacklisted_ids); |
198 | 155 |
199 // Prefs are still unaffected for installed extensions, though. | 156 // Prefs are still unaffected for installed extensions, though. |
200 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(a)); | 157 EXPECT_TRUE(prefs()->IsExtensionBlacklisted(a)); |
201 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(b)); | 158 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(b)); |
202 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(c)); | 159 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(c)); |
203 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(d)); | 160 EXPECT_FALSE(prefs()->IsExtensionBlacklisted(d)); |
204 } | 161 } |
205 | 162 |
206 // Test getting different blacklist states from Blacklist. | 163 // Test getting different blacklist states from Blacklist. |
207 TEST_F(BlacklistTest, GetBlacklistStates) { | 164 TEST_F(BlacklistTest, GetBlacklistStates) { |
208 Blacklist blacklist(prefs()); | 165 Blacklist blacklist(prefs()); |
| 166 TestBlacklist tester(&blacklist); |
209 | 167 |
210 std::string a = AddExtension("a"); | 168 std::string a = AddExtension("a"); |
211 std::string b = AddExtension("b"); | 169 std::string b = AddExtension("b"); |
212 std::string c = AddExtension("c"); | 170 std::string c = AddExtension("c"); |
213 std::string d = AddExtension("d"); | 171 std::string d = AddExtension("d"); |
214 std::string e = AddExtension("e"); | 172 std::string e = AddExtension("e"); |
215 | 173 |
216 blacklist_db()->Enable(); | 174 tester.SetBlacklistState(a, BLACKLISTED_MALWARE, false); |
217 blacklist_db()->SetUnsafe(a, b, c, d); | 175 tester.SetBlacklistState(b, BLACKLISTED_SECURITY_VULNERABILITY, false); |
218 | 176 tester.SetBlacklistState(c, BLACKLISTED_CWS_POLICY_VIOLATION, false); |
219 // Will be deleted by blacklist destructor. | 177 tester.SetBlacklistState(d, BLACKLISTED_POTENTIALLY_UNWANTED, false); |
220 BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); | |
221 fetcher->SetState(a, BLACKLISTED_MALWARE); | |
222 fetcher->SetState(b, BLACKLISTED_SECURITY_VULNERABILITY); | |
223 fetcher->SetState(c, BLACKLISTED_CWS_POLICY_VIOLATION); | |
224 fetcher->SetState(d, BLACKLISTED_POTENTIALLY_UNWANTED); | |
225 blacklist.SetBlacklistStateFetcherForTest(fetcher); | |
226 | 178 |
227 Blacklist::BlacklistStateMap states_abc; | 179 Blacklist::BlacklistStateMap states_abc; |
228 Blacklist::BlacklistStateMap states_bcd; | 180 Blacklist::BlacklistStateMap states_bcd; |
229 blacklist.GetBlacklistedIDs(Set(a, b, c, e), | 181 blacklist.GetBlacklistedIDs(Set(a, b, c, e), |
230 base::Bind(&Assign<Blacklist::BlacklistStateMap>, | 182 base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
231 &states_abc)); | 183 &states_abc)); |
232 blacklist.GetBlacklistedIDs(Set(b, c, d, e), | 184 blacklist.GetBlacklistedIDs(Set(b, c, d, e), |
233 base::Bind(&Assign<Blacklist::BlacklistStateMap>, | 185 base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
234 &states_bcd)); | 186 &states_bcd)); |
235 base::RunLoop().RunUntilIdle(); | 187 base::RunLoop().RunUntilIdle(); |
236 | 188 |
237 EXPECT_EQ(BLACKLISTED_MALWARE, states_abc[a]); | 189 EXPECT_EQ(BLACKLISTED_MALWARE, states_abc[a]); |
238 EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_abc[b]); | 190 EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_abc[b]); |
239 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_abc[c]); | 191 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_abc[c]); |
240 EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_bcd[b]); | 192 EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_bcd[b]); |
241 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_bcd[c]); | 193 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_bcd[c]); |
242 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_bcd[d]); | 194 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_bcd[d]); |
243 EXPECT_EQ(states_abc.end(), states_abc.find(e)); | 195 EXPECT_EQ(states_abc.end(), states_abc.find(e)); |
244 EXPECT_EQ(states_bcd.end(), states_bcd.find(e)); | 196 EXPECT_EQ(states_bcd.end(), states_bcd.find(e)); |
245 | 197 |
246 int old_request_count = fetcher->request_count(); | 198 int old_request_count = tester.fetcher()->request_count(); |
247 Blacklist::BlacklistStateMap states_ad; | 199 Blacklist::BlacklistStateMap states_ad; |
248 blacklist.GetBlacklistedIDs(Set(a, d, e), | 200 blacklist.GetBlacklistedIDs(Set(a, d, e), |
249 base::Bind(&Assign<Blacklist::BlacklistStateMap>, | 201 base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
250 &states_ad)); | 202 &states_ad)); |
251 base::RunLoop().RunUntilIdle(); | 203 base::RunLoop().RunUntilIdle(); |
252 EXPECT_EQ(BLACKLISTED_MALWARE, states_ad[a]); | 204 EXPECT_EQ(BLACKLISTED_MALWARE, states_ad[a]); |
253 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_ad[d]); | 205 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_ad[d]); |
254 EXPECT_EQ(states_ad.end(), states_ad.find(e)); | 206 EXPECT_EQ(states_ad.end(), states_ad.find(e)); |
255 EXPECT_EQ(old_request_count, fetcher->request_count()); | 207 EXPECT_EQ(old_request_count, tester.fetcher()->request_count()); |
256 } | 208 } |
257 | 209 |
258 // Test both Blacklist and BlacklistStateFetcher by requesting the blacklist | 210 // Test both Blacklist and BlacklistStateFetcher by requesting the blacklist |
259 // states, sending fake requests and parsing the responses. | 211 // states, sending fake requests and parsing the responses. |
260 TEST_F(BlacklistTest, FetchBlacklistStates) { | 212 TEST_F(BlacklistTest, FetchBlacklistStates) { |
261 Blacklist blacklist(prefs()); | 213 Blacklist blacklist(prefs()); |
| 214 scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db( |
| 215 new FakeSafeBrowsingDatabaseManager(true)); |
| 216 Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db); |
262 | 217 |
263 std::string a = AddExtension("a"); | 218 std::string a = AddExtension("a"); |
264 std::string b = AddExtension("b"); | 219 std::string b = AddExtension("b"); |
265 std::string c = AddExtension("c"); | 220 std::string c = AddExtension("c"); |
266 | 221 |
267 blacklist_db()->Enable(); | 222 blacklist_db->Enable(); |
268 blacklist_db()->SetUnsafe(a, b); | 223 blacklist_db->SetUnsafe(a, b); |
269 | 224 |
270 // Prepare real fetcher. | 225 // Prepare real fetcher. |
271 BlacklistStateFetcher* fetcher = new BlacklistStateFetcher(); | 226 BlacklistStateFetcher* fetcher = new BlacklistStateFetcher(); |
272 TestBlacklistStateFetcher fetcher_tester(fetcher); | 227 TestBlacklistStateFetcher fetcher_tester(fetcher); |
273 blacklist.SetBlacklistStateFetcherForTest(fetcher); | 228 blacklist.SetBlacklistStateFetcherForTest(fetcher); |
274 | 229 |
275 fetcher_tester.SetBlacklistVerdict( | 230 fetcher_tester.SetBlacklistVerdict( |
276 a, ClientCRXListInfoResponse_Verdict_CWS_POLICY_VIOLATION); | 231 a, ClientCRXListInfoResponse_Verdict_CWS_POLICY_VIOLATION); |
277 fetcher_tester.SetBlacklistVerdict( | 232 fetcher_tester.SetBlacklistVerdict( |
278 b, ClientCRXListInfoResponse_Verdict_POTENTIALLY_UNWANTED); | 233 b, ClientCRXListInfoResponse_Verdict_POTENTIALLY_UNWANTED); |
(...skipping 19 matching lines...) Expand all Loading... |
298 base::RunLoop().RunUntilIdle(); | 253 base::RunLoop().RunUntilIdle(); |
299 | 254 |
300 // No new fetchers. | 255 // No new fetchers. |
301 EXPECT_FALSE(fetcher_tester.HandleFetcher(2)); | 256 EXPECT_FALSE(fetcher_tester.HandleFetcher(2)); |
302 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, cached_states[a]); | 257 EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, cached_states[a]); |
303 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, cached_states[b]); | 258 EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, cached_states[b]); |
304 EXPECT_EQ(cached_states.end(), cached_states.find(c)); | 259 EXPECT_EQ(cached_states.end(), cached_states.find(c)); |
305 } | 260 } |
306 | 261 |
307 } // namespace extensions | 262 } // namespace extensions |
OLD | NEW |