| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/files/scoped_temp_dir.h" | 5 #include "base/files/scoped_temp_dir.h" |
| 6 #include "base/memory/ptr_util.h" | 6 #include "base/memory/ptr_util.h" |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
| 10 #include "components/safe_browsing_db/v4_database.h" | 10 #include "components/safe_browsing_db/v4_database.h" |
| 11 #include "components/safe_browsing_db/v4_local_database_manager.h" | 11 #include "components/safe_browsing_db/v4_local_database_manager.h" |
| 12 #include "content/public/test/test_browser_thread_bundle.h" | 12 #include "content/public/test/test_browser_thread_bundle.h" |
| 13 #include "net/url_request/test_url_fetcher_factory.h" | 13 #include "net/url_request/test_url_fetcher_factory.h" |
| 14 #include "testing/platform_test.h" | 14 #include "testing/platform_test.h" |
| 15 | 15 |
| 16 namespace safe_browsing { | 16 namespace safe_browsing { |
| 17 | 17 |
| 18 class FakeV4Database : public V4Database { | 18 class FakeV4Database : public V4Database { |
| 19 public: | 19 public: |
| 20 FakeV4Database(const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, | 20 static void Create( |
| 21 std::unique_ptr<StoreMap> store_map, | 21 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, |
| 22 const StoreAndHashPrefixes& store_and_hash_prefixes) | 22 std::unique_ptr<StoreMap> store_map, |
| 23 : V4Database(db_task_runner, std::move(store_map)), | 23 const StoreAndHashPrefixes& store_and_hash_prefixes, |
| 24 store_and_hash_prefixes_(store_and_hash_prefixes) {} | 24 NewDatabaseReadyCallback new_db_callback) { |
| 25 // Mimics V4Database::Create |
| 26 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner = |
| 27 base::MessageLoop::current()->task_runner(); |
| 28 db_task_runner->PostTask( |
| 29 FROM_HERE, |
| 30 base::Bind(&FakeV4Database::CreateOnTaskRunner, db_task_runner, |
| 31 base::Passed(&store_map), store_and_hash_prefixes, |
| 32 callback_task_runner, new_db_callback)); |
| 33 } |
| 25 | 34 |
| 26 void GetStoresMatchingFullHash( | 35 void GetStoresMatchingFullHash( |
| 27 const FullHash& full_hash, | 36 const FullHash& full_hash, |
| 28 const StoresToCheck& stores_to_check, | 37 const StoresToCheck& stores_to_check, |
| 29 StoreAndHashPrefixes* store_and_hash_prefixes) override { | 38 StoreAndHashPrefixes* store_and_hash_prefixes) override { |
| 30 *store_and_hash_prefixes = store_and_hash_prefixes_; | 39 *store_and_hash_prefixes = store_and_hash_prefixes_; |
| 31 } | 40 } |
| 32 | 41 |
| 33 private: | 42 private: |
| 34 const StoreAndHashPrefixes& store_and_hash_prefixes_; | 43 static void CreateOnTaskRunner( |
| 44 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, |
| 45 std::unique_ptr<StoreMap> store_map, |
| 46 const StoreAndHashPrefixes& store_and_hash_prefixes, |
| 47 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner, |
| 48 NewDatabaseReadyCallback new_db_callback) { |
| 49 // Mimics the semantics of V4Database::CreateOnTaskRunner |
| 50 std::unique_ptr<FakeV4Database> fake_v4_database(new FakeV4Database( |
| 51 db_task_runner, std::move(store_map), store_and_hash_prefixes)); |
| 52 callback_task_runner->PostTask( |
| 53 FROM_HERE, |
| 54 base::Bind(new_db_callback, base::Passed(&fake_v4_database))); |
| 55 } |
| 56 |
| 57 FakeV4Database(const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, |
| 58 std::unique_ptr<StoreMap> store_map, |
| 59 const StoreAndHashPrefixes& store_and_hash_prefixes) |
| 60 : V4Database(db_task_runner, std::move(store_map)), |
| 61 store_and_hash_prefixes_(store_and_hash_prefixes) {} |
| 62 |
| 63 const StoreAndHashPrefixes store_and_hash_prefixes_; |
| 35 }; | 64 }; |
| 36 | 65 |
| 37 class TestClient : public SafeBrowsingDatabaseManager::Client { | 66 class TestClient : public SafeBrowsingDatabaseManager::Client { |
| 38 public: | 67 public: |
| 39 TestClient(SBThreatType sb_threat_type, const GURL& url) | 68 TestClient(SBThreatType sb_threat_type, const GURL& url) |
| 40 : expected_sb_threat_type(sb_threat_type), expected_url(url) {} | 69 : expected_sb_threat_type(sb_threat_type), expected_url(url) {} |
| 41 | 70 |
| 42 void OnCheckBrowseUrlResult(const GURL& url, | 71 void OnCheckBrowseUrlResult(const GURL& url, |
| 43 SBThreatType threat_type, | 72 SBThreatType threat_type, |
| 44 const ThreatMetadata& metadata) override { | 73 const ThreatMetadata& metadata) override { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 70 void TearDown() override { | 99 void TearDown() override { |
| 71 StopLocalDatabaseManager(); | 100 StopLocalDatabaseManager(); |
| 72 | 101 |
| 73 PlatformTest::TearDown(); | 102 PlatformTest::TearDown(); |
| 74 } | 103 } |
| 75 | 104 |
| 76 void ForceDisableLocalDatabaseManager() { | 105 void ForceDisableLocalDatabaseManager() { |
| 77 v4_local_database_manager_->enabled_ = false; | 106 v4_local_database_manager_->enabled_ = false; |
| 78 } | 107 } |
| 79 | 108 |
| 109 void ForceEnableLocalDatabaseManager() { |
| 110 v4_local_database_manager_->enabled_ = true; |
| 111 } |
| 112 |
| 80 const V4LocalDatabaseManager::QueuedChecks& GetQueuedChecks() { | 113 const V4LocalDatabaseManager::QueuedChecks& GetQueuedChecks() { |
| 81 return v4_local_database_manager_->queued_checks_; | 114 return v4_local_database_manager_->queued_checks_; |
| 82 } | 115 } |
| 83 | 116 |
| 84 void ReplaceV4Database(const StoreAndHashPrefixes& store_and_hash_prefixes) { | 117 void ReplaceV4Database(const StoreAndHashPrefixes& store_and_hash_prefixes) { |
| 85 v4_local_database_manager_->v4_database_.reset(new FakeV4Database( | 118 // Disable the V4LocalDatabaseManager first so that if the callback to |
| 86 task_runner_, base::MakeUnique<StoreMap>(), store_and_hash_prefixes)); | 119 // verify checksum has been scheduled, then it doesn't do anything when it |
| 120 // is called back. |
| 121 ForceDisableLocalDatabaseManager(); |
| 122 // Wait to make sure that the callback gets executed if it has already been |
| 123 // scheduled. |
| 124 WaitForTasksOnTaskRunner(); |
| 125 // Re-enable the V4LocalDatabaseManager otherwise the checks won't work and |
| 126 // the fake database won't be set either. |
| 127 ForceEnableLocalDatabaseManager(); |
| 128 |
| 129 NewDatabaseReadyCallback db_ready_callback = |
| 130 base::Bind(&V4LocalDatabaseManager::DatabaseReadyForChecks, |
| 131 base::Unretained(v4_local_database_manager_.get())); |
| 132 FakeV4Database::Create(task_runner_, base::MakeUnique<StoreMap>(), |
| 133 store_and_hash_prefixes, db_ready_callback); |
| 134 WaitForTasksOnTaskRunner(); |
| 87 } | 135 } |
| 88 | 136 |
| 89 void ResetV4Database() { v4_local_database_manager_->v4_database_.reset(); } | 137 void ResetV4Database() { |
| 138 V4Database::Destroy(std::move(v4_local_database_manager_->v4_database_)); |
| 139 } |
| 90 | 140 |
| 91 void StartLocalDatabaseManager() { | 141 void StartLocalDatabaseManager() { |
| 92 v4_local_database_manager_->StartOnIOThread(NULL, V4ProtocolConfig()); | 142 v4_local_database_manager_->StartOnIOThread(NULL, V4ProtocolConfig()); |
| 93 | |
| 94 task_runner_->RunPendingTasks(); | |
| 95 base::RunLoop().RunUntilIdle(); | |
| 96 } | 143 } |
| 97 | 144 |
| 98 void StopLocalDatabaseManager() { | 145 void StopLocalDatabaseManager() { |
| 99 v4_local_database_manager_->StopOnIOThread(true); | 146 v4_local_database_manager_->StopOnIOThread(true); |
| 100 | 147 |
| 101 // Force destruction of the database. | 148 // Force destruction of the database. |
| 102 task_runner_->RunPendingTasks(); | 149 task_runner_->RunPendingTasks(); |
| 103 base::RunLoop().RunUntilIdle(); | 150 base::RunLoop().RunUntilIdle(); |
| 104 } | 151 } |
| 105 | 152 |
| 153 void WaitForTasksOnTaskRunner() { |
| 154 // Wait for tasks on the task runner so we're sure that the |
| 155 // V4LocalDatabaseManager has read the data from disk. |
| 156 task_runner_->RunPendingTasks(); |
| 157 base::RunLoop().RunUntilIdle(); |
| 158 } |
| 159 |
| 106 base::ScopedTempDir base_dir_; | 160 base::ScopedTempDir base_dir_; |
| 107 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 161 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 108 content::TestBrowserThreadBundle thread_bundle_; | 162 content::TestBrowserThreadBundle thread_bundle_; |
| 109 scoped_refptr<V4LocalDatabaseManager> v4_local_database_manager_; | 163 scoped_refptr<V4LocalDatabaseManager> v4_local_database_manager_; |
| 110 }; | 164 }; |
| 111 | 165 |
| 112 TEST_F(V4LocalDatabaseManagerTest, TestGetThreatSource) { | 166 TEST_F(V4LocalDatabaseManagerTest, TestGetThreatSource) { |
| 167 WaitForTasksOnTaskRunner(); |
| 113 EXPECT_EQ(ThreatSource::LOCAL_PVER4, | 168 EXPECT_EQ(ThreatSource::LOCAL_PVER4, |
| 114 v4_local_database_manager_->GetThreatSource()); | 169 v4_local_database_manager_->GetThreatSource()); |
| 115 } | 170 } |
| 116 | 171 |
| 117 TEST_F(V4LocalDatabaseManagerTest, TestIsSupported) { | 172 TEST_F(V4LocalDatabaseManagerTest, TestIsSupported) { |
| 173 WaitForTasksOnTaskRunner(); |
| 118 EXPECT_TRUE(v4_local_database_manager_->IsSupported()); | 174 EXPECT_TRUE(v4_local_database_manager_->IsSupported()); |
| 119 } | 175 } |
| 120 | 176 |
| 121 TEST_F(V4LocalDatabaseManagerTest, TestCanCheckUrl) { | 177 TEST_F(V4LocalDatabaseManagerTest, TestCanCheckUrl) { |
| 178 WaitForTasksOnTaskRunner(); |
| 122 EXPECT_TRUE( | 179 EXPECT_TRUE( |
| 123 v4_local_database_manager_->CanCheckUrl(GURL("http://example.com/a/"))); | 180 v4_local_database_manager_->CanCheckUrl(GURL("http://example.com/a/"))); |
| 124 EXPECT_TRUE( | 181 EXPECT_TRUE( |
| 125 v4_local_database_manager_->CanCheckUrl(GURL("https://example.com/a/"))); | 182 v4_local_database_manager_->CanCheckUrl(GURL("https://example.com/a/"))); |
| 126 EXPECT_TRUE( | 183 EXPECT_TRUE( |
| 127 v4_local_database_manager_->CanCheckUrl(GURL("ftp://example.com/a/"))); | 184 v4_local_database_manager_->CanCheckUrl(GURL("ftp://example.com/a/"))); |
| 128 EXPECT_FALSE( | 185 EXPECT_FALSE( |
| 129 v4_local_database_manager_->CanCheckUrl(GURL("adp://example.com/a/"))); | 186 v4_local_database_manager_->CanCheckUrl(GURL("adp://example.com/a/"))); |
| 130 } | 187 } |
| 131 | 188 |
| 132 TEST_F(V4LocalDatabaseManagerTest, | 189 TEST_F(V4LocalDatabaseManagerTest, |
| 133 TestCheckBrowseUrlWithEmptyStoresReturnsNoMatch) { | 190 TestCheckBrowseUrlWithEmptyStoresReturnsNoMatch) { |
| 191 WaitForTasksOnTaskRunner(); |
| 134 // Both the stores are empty right now so CheckBrowseUrl should return true. | 192 // Both the stores are empty right now so CheckBrowseUrl should return true. |
| 135 EXPECT_TRUE(v4_local_database_manager_->CheckBrowseUrl( | 193 EXPECT_TRUE(v4_local_database_manager_->CheckBrowseUrl( |
| 136 GURL("http://example.com/a/"), nullptr)); | 194 GURL("http://example.com/a/"), nullptr)); |
| 137 } | 195 } |
| 138 | 196 |
| 139 TEST_F(V4LocalDatabaseManagerTest, TestCheckBrowseUrlWithFakeDbReturnsMatch) { | 197 TEST_F(V4LocalDatabaseManagerTest, TestCheckBrowseUrlWithFakeDbReturnsMatch) { |
| 198 WaitForTasksOnTaskRunner(); |
| 140 net::TestURLFetcherFactory factory; | 199 net::TestURLFetcherFactory factory; |
| 141 | 200 |
| 142 StoreAndHashPrefixes store_and_hash_prefixes; | 201 StoreAndHashPrefixes store_and_hash_prefixes; |
| 143 store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), HashPrefix("aaaa")); | 202 store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), HashPrefix("aaaa")); |
| 144 ReplaceV4Database(store_and_hash_prefixes); | 203 ReplaceV4Database(store_and_hash_prefixes); |
| 145 | 204 |
| 146 // The fake database returns a matched hash prefix. | 205 // The fake database returns a matched hash prefix. |
| 147 EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl( | 206 EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl( |
| 148 GURL("http://example.com/a/"), nullptr)); | 207 GURL("http://example.com/a/"), nullptr)); |
| 149 } | 208 } |
| 150 | 209 |
| 151 TEST_F(V4LocalDatabaseManagerTest, | 210 TEST_F(V4LocalDatabaseManagerTest, |
| 152 TestCheckBrowseUrlReturnsNoMatchWhenDisabled) { | 211 TestCheckBrowseUrlReturnsNoMatchWhenDisabled) { |
| 153 StoreAndHashPrefixes store_and_hash_prefixes; | 212 WaitForTasksOnTaskRunner(); |
| 154 store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), HashPrefix("aaaa")); | |
| 155 ReplaceV4Database(store_and_hash_prefixes); | |
| 156 | 213 |
| 157 // The same URL returns |false| in the previous test because | 214 // The same URL returns |false| in the previous test because |
| 158 // v4_local_database_manager_ is enabled. | 215 // v4_local_database_manager_ is enabled. |
| 159 ForceDisableLocalDatabaseManager(); | 216 ForceDisableLocalDatabaseManager(); |
| 160 | 217 |
| 161 EXPECT_TRUE(v4_local_database_manager_->CheckBrowseUrl( | 218 EXPECT_TRUE(v4_local_database_manager_->CheckBrowseUrl( |
| 162 GURL("http://example.com/a/"), nullptr)); | 219 GURL("http://example.com/a/"), nullptr)); |
| 163 } | 220 } |
| 164 | 221 |
| 165 TEST_F(V4LocalDatabaseManagerTest, TestGetSeverestThreatTypeAndMetadata) { | 222 TEST_F(V4LocalDatabaseManagerTest, TestGetSeverestThreatTypeAndMetadata) { |
| 223 WaitForTasksOnTaskRunner(); |
| 224 |
| 166 FullHashInfo fhi_malware(FullHash("Malware"), GetUrlMalwareId(), | 225 FullHashInfo fhi_malware(FullHash("Malware"), GetUrlMalwareId(), |
| 167 base::Time::Now()); | 226 base::Time::Now()); |
| 168 fhi_malware.metadata.population_id = "malware_popid"; | 227 fhi_malware.metadata.population_id = "malware_popid"; |
| 169 | 228 |
| 170 FullHashInfo fhi_api(FullHash("api"), GetChromeUrlApiId(), base::Time::Now()); | 229 FullHashInfo fhi_api(FullHash("api"), GetChromeUrlApiId(), base::Time::Now()); |
| 171 fhi_api.metadata.population_id = "api_popid"; | 230 fhi_api.metadata.population_id = "api_popid"; |
| 172 | 231 |
| 173 std::vector<FullHashInfo> fhis({fhi_malware, fhi_api}); | 232 std::vector<FullHashInfo> fhis({fhi_malware, fhi_api}); |
| 174 | 233 |
| 175 SBThreatType result_threat_type; | 234 SBThreatType result_threat_type; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 186 &result_threat_type, &metadata, fhis); | 245 &result_threat_type, &metadata, fhis); |
| 187 EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, result_threat_type); | 246 EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, result_threat_type); |
| 188 EXPECT_EQ("malware_popid", metadata.population_id); | 247 EXPECT_EQ("malware_popid", metadata.population_id); |
| 189 } | 248 } |
| 190 | 249 |
| 191 TEST_F(V4LocalDatabaseManagerTest, TestChecksAreQueued) { | 250 TEST_F(V4LocalDatabaseManagerTest, TestChecksAreQueued) { |
| 192 const GURL url("https://www.example.com/"); | 251 const GURL url("https://www.example.com/"); |
| 193 TestClient client(SB_THREAT_TYPE_SAFE, url); | 252 TestClient client(SB_THREAT_TYPE_SAFE, url); |
| 194 EXPECT_TRUE(GetQueuedChecks().empty()); | 253 EXPECT_TRUE(GetQueuedChecks().empty()); |
| 195 v4_local_database_manager_->CheckBrowseUrl(url, &client); | 254 v4_local_database_manager_->CheckBrowseUrl(url, &client); |
| 196 // The database is available so the check shouldn't get queued. | |
| 197 EXPECT_TRUE(GetQueuedChecks().empty()); | |
| 198 | |
| 199 ResetV4Database(); | |
| 200 v4_local_database_manager_->CheckBrowseUrl(url, &client); | |
| 201 // The database is unavailable so the check should get queued. | 255 // The database is unavailable so the check should get queued. |
| 202 EXPECT_EQ(1ul, GetQueuedChecks().size()); | 256 EXPECT_EQ(1ul, GetQueuedChecks().size()); |
| 203 | 257 |
| 204 // The following function calls StartOnIOThread which should load the | 258 // The following function waits for the DB to load. |
| 205 // database from disk and cause the queued check to be performed. | 259 WaitForTasksOnTaskRunner(); |
| 206 StartLocalDatabaseManager(); | |
| 207 EXPECT_TRUE(GetQueuedChecks().empty()); | 260 EXPECT_TRUE(GetQueuedChecks().empty()); |
| 208 | 261 |
| 209 ResetV4Database(); | 262 ResetV4Database(); |
| 210 v4_local_database_manager_->CheckBrowseUrl(url, &client); | 263 v4_local_database_manager_->CheckBrowseUrl(url, &client); |
| 211 // The database is unavailable so the check should get queued. | 264 // The database is unavailable so the check should get queued. |
| 212 EXPECT_EQ(1ul, GetQueuedChecks().size()); | 265 EXPECT_EQ(1ul, GetQueuedChecks().size()); |
| 213 | 266 |
| 214 StopLocalDatabaseManager(); | 267 StopLocalDatabaseManager(); |
| 215 EXPECT_TRUE(GetQueuedChecks().empty()); | 268 EXPECT_TRUE(GetQueuedChecks().empty()); |
| 216 } | 269 } |
| 217 | 270 |
| 218 } // namespace safe_browsing | 271 } // namespace safe_browsing |
| OLD | NEW |