• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "base/bind.h"
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_bundle.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace extensions {
17 namespace {
18 
Set(const std::string & a)19 std::set<std::string> Set(const std::string& a) {
20   std::set<std::string> set;
21   set.insert(a);
22   return set;
23 }
Set(const std::string & a,const std::string & b)24 std::set<std::string> Set(const std::string& a, const std::string& b) {
25   std::set<std::string> set = Set(a);
26   set.insert(b);
27   return set;
28 }
Set(const std::string & a,const std::string & b,const std::string & c)29 std::set<std::string> Set(const std::string& a,
30                           const std::string& b,
31                           const std::string& c) {
32   std::set<std::string> set = Set(a, b);
33   set.insert(c);
34   return set;
35 }
Set(const std::string & a,const std::string & b,const std::string & d,const std::string & c)36 std::set<std::string> Set(const std::string& a,
37                           const std::string& b,
38                           const std::string& d,
39                           const std::string& c) {
40   std::set<std::string> set = Set(a, b, c);
41   set.insert(d);
42   return set;
43 }
44 
45 class BlacklistTest : public testing::Test {
46  public:
BlacklistTest()47   BlacklistTest()
48       : test_prefs_(base::MessageLoopProxy::current()),
49         blacklist_db_(new FakeSafeBrowsingDatabaseManager(false)),
50         scoped_blacklist_db_(blacklist_db_) {}
51 
52  protected:
prefs()53   ExtensionPrefs* prefs() {
54     return test_prefs_.prefs();
55   }
56 
blacklist_db()57   FakeSafeBrowsingDatabaseManager* blacklist_db() {
58     return blacklist_db_.get();
59   }
60 
AddExtension(const std::string & id)61   std::string AddExtension(const std::string& id) {
62     return test_prefs_.AddExtension(id)->id();
63   }
64 
65  private:
66   content::TestBrowserThreadBundle browser_thread_bundle_;
67 
68   TestExtensionPrefs test_prefs_;
69 
70   scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db_;
71 
72   Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db_;
73 };
74 
Assign(std::set<std::string> * to,const std::set<std::string> & from)75 void Assign(std::set<std::string> *to, const std::set<std::string>& from) {
76   *to = from;
77 }
78 
TEST_F(BlacklistTest,OnlyIncludesRequestedIDs)79 TEST_F(BlacklistTest, OnlyIncludesRequestedIDs) {
80   std::string a = AddExtension("a");
81   std::string b = AddExtension("b");
82   std::string c = AddExtension("c");
83 
84   Blacklist blacklist(prefs());
85   TestBlacklist tester(&blacklist);
86 
87   blacklist_db()->Enable();
88   blacklist_db()->SetUnsafe(a, b);
89 
90   EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(a));
91   EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(b));
92   EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(c));
93 
94   std::set<std::string> blacklisted_ids;
95   blacklist.GetMalwareIDs(Set(a, c), base::Bind(&Assign, &blacklisted_ids));
96   base::RunLoop().RunUntilIdle();
97 
98   EXPECT_EQ(Set(a), blacklisted_ids);
99 }
100 
TEST_F(BlacklistTest,SafeBrowsing)101 TEST_F(BlacklistTest, SafeBrowsing) {
102   std::string a = AddExtension("a");
103 
104   Blacklist blacklist(prefs());
105   TestBlacklist tester(&blacklist);
106 
107   EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a));
108 
109   blacklist_db()->SetUnsafe(a);
110   // The manager is still disabled at this point, so it won't be blacklisted.
111   EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a));
112 
113   blacklist_db()->Enable().NotifyUpdate();
114   base::RunLoop().RunUntilIdle();
115   // Now it should be.
116   EXPECT_EQ(Blacklist::BLACKLISTED_MALWARE, tester.GetBlacklistState(a));
117 
118   blacklist_db()->ClearUnsafe().NotifyUpdate();
119   // Safe browsing blacklist empty, now enabled.
120   EXPECT_EQ(Blacklist::NOT_BLACKLISTED, tester.GetBlacklistState(a));
121 }
122 
123 // Tests that Blacklist clears the old prefs blacklist on startup.
TEST_F(BlacklistTest,ClearsPreferencesBlacklist)124 TEST_F(BlacklistTest, ClearsPreferencesBlacklist) {
125   std::string a = AddExtension("a");
126   std::string b = AddExtension("b");
127 
128   // Blacklist an installed extension.
129   prefs()->SetExtensionBlacklisted(a, true);
130 
131   // Blacklist some non-installed extensions. This is what the old preferences
132   // blacklist looked like.
133   std::string c = "cccccccccccccccccccccccccccccccc";
134   std::string d = "dddddddddddddddddddddddddddddddd";
135   prefs()->SetExtensionBlacklisted(c, true);
136   prefs()->SetExtensionBlacklisted(d, true);
137 
138   EXPECT_EQ(Set(a, c, d), prefs()->GetBlacklistedExtensions());
139 
140   Blacklist blacklist(prefs());
141   TestBlacklist tester(&blacklist);
142 
143   // Blacklist has been cleared. Only the installed extension "a" left.
144   EXPECT_EQ(Set(a), prefs()->GetBlacklistedExtensions());
145   EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(a).get());
146   EXPECT_TRUE(prefs()->GetInstalledExtensionInfo(b).get());
147 
148   // "a" won't actually be *blacklisted* since it doesn't appear in
149   // safebrowsing. Blacklist no longer reads from prefs. This is purely a
150   // concern of somebody else (currently, ExtensionService).
151   std::set<std::string> blacklisted_ids;
152   blacklist.GetMalwareIDs(Set(a, b, c, d),
153                           base::Bind(&Assign, &blacklisted_ids));
154   base::RunLoop().RunUntilIdle();
155   EXPECT_EQ(std::set<std::string>(), blacklisted_ids);
156 
157   // Prefs are still unaffected for installed extensions, though.
158   EXPECT_TRUE(prefs()->IsExtensionBlacklisted(a));
159   EXPECT_FALSE(prefs()->IsExtensionBlacklisted(b));
160   EXPECT_FALSE(prefs()->IsExtensionBlacklisted(c));
161   EXPECT_FALSE(prefs()->IsExtensionBlacklisted(d));
162 }
163 
164 }  // namespace
165 }  // namespace extensions
166