Index: chrome/browser/extensions/blacklist_unittest.cc |
diff --git a/chrome/browser/extensions/blacklist_unittest.cc b/chrome/browser/extensions/blacklist_unittest.cc |
index 18d4bb83680ebfd66bc4d48e9d676f557caef2aa..caf18f0f8dc0314da14013ab663686db98e1519b 100644 |
--- a/chrome/browser/extensions/blacklist_unittest.cc |
+++ b/chrome/browser/extensions/blacklist_unittest.cc |
@@ -5,10 +5,13 @@ |
#include "base/bind.h" |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
+#include "base/stl_util.h" |
#include "chrome/browser/extensions/blacklist.h" |
+#include "chrome/browser/extensions/blacklist_state_fetcher.h" |
#include "chrome/browser/extensions/extension_prefs.h" |
#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" |
#include "chrome/browser/extensions/test_blacklist.h" |
+#include "chrome/browser/extensions/test_blacklist_state_fetcher.h" |
#include "chrome/browser/extensions/test_extension_prefs.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -35,8 +38,8 @@ std::set<std::string> Set(const std::string& a, |
} |
std::set<std::string> Set(const std::string& a, |
const std::string& b, |
- const std::string& d, |
- const std::string& c) { |
+ const std::string& c, |
+ const std::string& d) { |
std::set<std::string> set = Set(a, b, c); |
set.insert(d); |
return set; |
@@ -72,10 +75,40 @@ class BlacklistTest : public testing::Test { |
Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db_; |
}; |
-void Assign(std::set<std::string> *to, const std::set<std::string>& from) { |
+class BlacklistStateFetcherMock : public BlacklistStateFetcher { |
+ public: |
+ virtual void Request(const std::string& id, |
+ const RequestCallback& callback) OVERRIDE { |
+ request_count_++; |
+ |
+ BlacklistState result = NOT_BLACKLISTED; |
+ if (ContainsKey(states_, id)) |
+ result = states_[id]; |
+ |
+ base::MessageLoopProxy::current()->PostTask(FROM_HERE, |
+ base::Bind(callback, result)); |
+ } |
+ |
+ void SetState(const std::string& id, BlacklistState state) { |
+ states_[id] = state; |
+ } |
+ |
+ int request_count() const { |
+ return request_count_; |
+ } |
+ |
+ private: |
+ std::map<std::string, BlacklistState> states_; |
+ int request_count_; |
+}; |
+ |
+template<typename T> |
+void Assign(T *to, const T& from) { |
*to = from; |
} |
+} // namespace |
+ |
TEST_F(BlacklistTest, OnlyIncludesRequestedIDs) { |
std::string a = AddExtension("a"); |
std::string b = AddExtension("b"); |
@@ -83,16 +116,21 @@ TEST_F(BlacklistTest, OnlyIncludesRequestedIDs) { |
Blacklist blacklist(prefs()); |
TestBlacklist tester(&blacklist); |
+ BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); |
+ fetcher->SetState(a, BLACKLISTED_MALWARE); |
+ fetcher->SetState(b, BLACKLISTED_MALWARE); |
+ blacklist.SetBlacklistStateFetcherForTest(fetcher); |
blacklist_db()->Enable(); |
blacklist_db()->SetUnsafe(a, b); |
- EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
- EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(b)); |
- EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(c)); |
+ EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
+ EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(b)); |
+ EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(c)); |
std::set<std::string> blacklisted_ids; |
- blacklist.GetMalwareIDs(Set(a, c), base::Bind(&Assign, &blacklisted_ids)); |
+ blacklist.GetMalwareIDs( |
+ Set(a, c), base::Bind(&Assign<std::set<std::string> >, &blacklisted_ids)); |
base::RunLoop().RunUntilIdle(); |
EXPECT_EQ(Set(a), blacklisted_ids); |
@@ -103,21 +141,24 @@ TEST_F(BlacklistTest, SafeBrowsing) { |
Blacklist blacklist(prefs()); |
TestBlacklist tester(&blacklist); |
+ BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); |
+ fetcher->SetState(a, BLACKLISTED_MALWARE); |
+ blacklist.SetBlacklistStateFetcherForTest(fetcher); |
- EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
+ EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
blacklist_db()->SetUnsafe(a); |
// The manager is still disabled at this point, so it won't be blacklisted. |
- EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
+ EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
blacklist_db()->Enable().NotifyUpdate(); |
base::RunLoop().RunUntilIdle(); |
// Now it should be. |
- EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
+ EXPECT_EQ(BLACKLISTED_MALWARE, tester.GetBlacklistState(a)); |
blacklist_db()->ClearUnsafe().NotifyUpdate(); |
// Safe browsing blacklist empty, now enabled. |
- EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
+ EXPECT_EQ(NOT_BLACKLISTED, tester.GetBlacklistState(a)); |
} |
// Tests that Blacklist clears the old prefs blacklist on startup. |
@@ -138,7 +179,7 @@ TEST_F(BlacklistTest, ClearsPreferencesBlacklist) { |
EXPECT_EQ(Set(a, c, d), prefs()->GetBlacklistedExtensions()); |
Blacklist blacklist(prefs()); |
- TestBlacklist tester(&blacklist); |
+ blacklist.SetBlacklistStateFetcherForTest(new BlacklistStateFetcherMock()); |
// Blacklist has been cleared. Only the installed extension "a" left. |
EXPECT_EQ(Set(a), prefs()->GetBlacklistedExtensions()); |
@@ -150,7 +191,8 @@ TEST_F(BlacklistTest, ClearsPreferencesBlacklist) { |
// concern of somebody else (currently, ExtensionService). |
std::set<std::string> blacklisted_ids; |
blacklist.GetMalwareIDs(Set(a, b, c, d), |
- base::Bind(&Assign, &blacklisted_ids)); |
+ base::Bind(&Assign<std::set<std::string> >, |
+ &blacklisted_ids)); |
base::RunLoop().RunUntilIdle(); |
EXPECT_EQ(std::set<std::string>(), blacklisted_ids); |
@@ -161,5 +203,105 @@ TEST_F(BlacklistTest, ClearsPreferencesBlacklist) { |
EXPECT_FALSE(prefs()->IsExtensionBlacklisted(d)); |
} |
-} // namespace |
+// Test getting different blacklist states from Blacklist. |
+TEST_F(BlacklistTest, GetBlacklistStates) { |
+ Blacklist blacklist(prefs()); |
+ |
+ std::string a = AddExtension("a"); |
+ std::string b = AddExtension("b"); |
+ std::string c = AddExtension("c"); |
+ std::string d = AddExtension("d"); |
+ std::string e = AddExtension("e"); |
+ |
+ blacklist_db()->Enable(); |
+ blacklist_db()->SetUnsafe(a, b, c, d); |
+ |
+ // Will be deleted by blacklist destructor. |
+ BlacklistStateFetcherMock* fetcher = new BlacklistStateFetcherMock(); |
+ fetcher->SetState(a, BLACKLISTED_MALWARE); |
+ fetcher->SetState(b, BLACKLISTED_SECURITY_VULNERABILITY); |
+ fetcher->SetState(c, BLACKLISTED_CWS_POLICY_VIOLATION); |
+ fetcher->SetState(d, BLACKLISTED_POTENTIALLY_UNWANTED); |
+ blacklist.SetBlacklistStateFetcherForTest(fetcher); |
+ |
+ Blacklist::BlacklistStateMap states_abc; |
+ Blacklist::BlacklistStateMap states_bcd; |
+ blacklist.GetBlacklistedIDs(Set(a, b, c, e), |
+ base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
+ &states_abc)); |
+ blacklist.GetBlacklistedIDs(Set(b, c, d, e), |
+ base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
+ &states_bcd)); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ EXPECT_EQ(BLACKLISTED_MALWARE, states_abc[a]); |
+ EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_abc[b]); |
+ EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_abc[c]); |
+ EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, states_bcd[b]); |
+ EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states_bcd[c]); |
+ EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_bcd[d]); |
+ EXPECT_EQ(states_abc.end(), states_abc.find(e)); |
+ EXPECT_EQ(states_bcd.end(), states_bcd.find(e)); |
+ |
+ int old_request_count = fetcher->request_count(); |
+ Blacklist::BlacklistStateMap states_ad; |
+ blacklist.GetBlacklistedIDs(Set(a, d, e), |
+ base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
+ &states_ad)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(BLACKLISTED_MALWARE, states_ad[a]); |
+ EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states_ad[d]); |
+ EXPECT_EQ(states_ad.end(), states_ad.find(e)); |
+ EXPECT_EQ(old_request_count, fetcher->request_count()); |
+} |
+ |
+// Test both Blacklist and BlacklistStateFetcher by requesting the blacklist |
+// states, sending fake requests and parsing the responses. |
+TEST_F(BlacklistTest, FetchBlacklistStates) { |
+ Blacklist blacklist(prefs()); |
+ |
+ std::string a = AddExtension("a"); |
+ std::string b = AddExtension("b"); |
+ std::string c = AddExtension("c"); |
+ |
+ blacklist_db()->Enable(); |
+ blacklist_db()->SetUnsafe(a, b); |
+ |
+ // Prepare real fetcher. |
+ BlacklistStateFetcher* fetcher = new BlacklistStateFetcher(); |
+ TestBlacklistStateFetcher fetcher_tester(fetcher); |
+ blacklist.SetBlacklistStateFetcherForTest(fetcher); |
+ |
+ fetcher_tester.SetBlacklistVerdict( |
+ a, ClientCRXListInfoResponse_Verdict_CWS_POLICY_VIOLATION); |
+ fetcher_tester.SetBlacklistVerdict( |
+ b, ClientCRXListInfoResponse_Verdict_POTENTIALLY_UNWANTED); |
+ |
+ Blacklist::BlacklistStateMap states; |
+ blacklist.GetBlacklistedIDs( |
+ Set(a, b, c), base::Bind(&Assign<Blacklist::BlacklistStateMap>, &states)); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Two fetchers should be created. |
+ EXPECT_TRUE(fetcher_tester.HandleFetcher(0)); |
+ EXPECT_TRUE(fetcher_tester.HandleFetcher(1)); |
+ |
+ EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, states[a]); |
+ EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, states[b]); |
+ EXPECT_EQ(states.end(), states.find(c)); |
+ |
+ Blacklist::BlacklistStateMap cached_states; |
+ |
+ blacklist.GetBlacklistedIDs( |
+ Set(a, b, c), base::Bind(&Assign<Blacklist::BlacklistStateMap>, |
+ &cached_states)); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // No new fetchers. |
+ EXPECT_FALSE(fetcher_tester.HandleFetcher(2)); |
+ EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, cached_states[a]); |
+ EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, cached_states[b]); |
+ EXPECT_EQ(cached_states.end(), cached_states.find(c)); |
+} |
+ |
} // namespace extensions |