Chromium Code Reviews| 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/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 const StoreAndHashPrefixes& store_and_hash_prefixes, | 98 const StoreAndHashPrefixes& store_and_hash_prefixes, |
| 99 bool stores_available) | 99 bool stores_available) |
| 100 : V4Database(db_task_runner, std::move(store_map)), | 100 : V4Database(db_task_runner, std::move(store_map)), |
| 101 store_and_hash_prefixes_(store_and_hash_prefixes), | 101 store_and_hash_prefixes_(store_and_hash_prefixes), |
| 102 stores_available_(stores_available) {} | 102 stores_available_(stores_available) {} |
| 103 | 103 |
| 104 const StoreAndHashPrefixes store_and_hash_prefixes_; | 104 const StoreAndHashPrefixes store_and_hash_prefixes_; |
| 105 const bool stores_available_; | 105 const bool stores_available_; |
| 106 }; | 106 }; |
| 107 | 107 |
| 108 class FakeV4GetHashProtocolManager : public V4GetHashProtocolManager { | |
| 109 public: | |
| 110 FakeV4GetHashProtocolManager( | |
| 111 net::URLRequestContextGetter* request_context_getter, | |
| 112 const StoresToCheck& stores_to_check, | |
| 113 const V4ProtocolConfig& config, | |
| 114 const std::vector<FullHashInfo>& expected_response, | |
| 115 const scoped_refptr<base::TestSimpleTaskRunner>& task_runner) | |
| 116 : V4GetHashProtocolManager(request_context_getter, | |
| 117 stores_to_check, | |
| 118 config), | |
| 119 expected_response_(expected_response), | |
| 120 task_runner_(task_runner) {} | |
| 121 | |
| 122 void WaitForTasksOnTaskRunner() { | |
|
Nathan Parker
2017/01/09 19:46:28
Make private, or better yet just inline it.
vakh (use Gerrit instead)
2017/01/10 01:54:53
Removed
| |
| 123 // Wait for tasks on the task runner so we're sure that the | |
| 124 // V4LocalDatabaseManager has read the data from disk. | |
| 125 task_runner_->RunPendingTasks(); | |
| 126 base::RunLoop().RunUntilIdle(); | |
| 127 } | |
| 128 | |
| 129 void GetFullHashes(const FullHashToStoreAndHashPrefixesMap& | |
| 130 full_hash_to_matching_hash_prefixes, | |
| 131 FullHashCallback callback) override { | |
| 132 WaitForTasksOnTaskRunner(); | |
|
Nathan Parker
2017/01/09 19:46:28
I'm not clear on why this is necessary -- the one
vakh (use Gerrit instead)
2017/01/10 01:54:53
Removed
| |
| 133 callback.Run(expected_response_); | |
| 134 } | |
| 135 | |
| 136 private: | |
| 137 const std::vector<FullHashInfo> expected_response_; | |
| 138 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
| 139 }; | |
| 140 | |
| 108 class TestClient : public SafeBrowsingDatabaseManager::Client { | 141 class TestClient : public SafeBrowsingDatabaseManager::Client { |
| 109 public: | 142 public: |
| 110 TestClient(SBThreatType sb_threat_type, | 143 TestClient(SBThreatType sb_threat_type, |
| 111 const GURL& url, | 144 const GURL& url, |
| 112 V4LocalDatabaseManager* manager_to_cancel = nullptr) | 145 V4LocalDatabaseManager* manager_to_cancel = nullptr) |
| 113 : expected_sb_threat_type(sb_threat_type), | 146 : expected_sb_threat_type(sb_threat_type), |
| 114 expected_url(url), | 147 expected_url(url), |
| 115 result_received_(false), | 148 result_received_(false), |
| 116 manager_to_cancel_(manager_to_cancel) {} | 149 manager_to_cancel_(manager_to_cancel) {} |
| 117 | 150 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 | 240 |
| 208 NewDatabaseReadyCallback db_ready_callback = | 241 NewDatabaseReadyCallback db_ready_callback = |
| 209 base::Bind(&V4LocalDatabaseManager::DatabaseReadyForChecks, | 242 base::Bind(&V4LocalDatabaseManager::DatabaseReadyForChecks, |
| 210 base::Unretained(v4_local_database_manager_.get())); | 243 base::Unretained(v4_local_database_manager_.get())); |
| 211 FakeV4Database::Create(task_runner_, base::MakeUnique<StoreMap>(), | 244 FakeV4Database::Create(task_runner_, base::MakeUnique<StoreMap>(), |
| 212 store_and_hash_prefixes, db_ready_callback, | 245 store_and_hash_prefixes, db_ready_callback, |
| 213 stores_available); | 246 stores_available); |
| 214 WaitForTasksOnTaskRunner(); | 247 WaitForTasksOnTaskRunner(); |
| 215 } | 248 } |
| 216 | 249 |
| 250 void ReplaceV4GetHashProtocolManager(const StoresToCheck& stores_to_check) { | |
| 251 v4_local_database_manager_->v4_get_hash_protocol_manager_ = | |
| 252 base::MakeUnique<FakeV4GetHashProtocolManager>( | |
| 253 nullptr, stores_to_check, GetTestV4ProtocolConfig(), | |
| 254 std::vector<FullHashInfo>{}, task_runner_); | |
| 255 } | |
| 256 | |
| 217 void ResetV4Database() { | 257 void ResetV4Database() { |
| 218 V4Database::Destroy(std::move(v4_local_database_manager_->v4_database_)); | 258 V4Database::Destroy(std::move(v4_local_database_manager_->v4_database_)); |
| 219 } | 259 } |
| 220 | 260 |
| 221 void SetTaskRunnerForTest() { | 261 void SetTaskRunnerForTest() { |
| 222 v4_local_database_manager_->SetTaskRunnerForTest(task_runner_); | 262 v4_local_database_manager_->SetTaskRunnerForTest(task_runner_); |
| 223 } | 263 } |
| 224 | 264 |
| 225 void StartLocalDatabaseManager() { | 265 void StartLocalDatabaseManager() { |
| 226 v4_local_database_manager_->StartOnIOThread(NULL, | 266 v4_local_database_manager_->StartOnIOThread(NULL, |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 609 EXPECT_FALSE( | 649 EXPECT_FALSE( |
| 610 v4_local_database_manager_->MatchModuleWhitelistString("badstuff.dll")); | 650 v4_local_database_manager_->MatchModuleWhitelistString("badstuff.dll")); |
| 611 // Whitelisted. | 651 // Whitelisted. |
| 612 EXPECT_TRUE( | 652 EXPECT_TRUE( |
| 613 v4_local_database_manager_->MatchModuleWhitelistString("chrome.dll")); | 653 v4_local_database_manager_->MatchModuleWhitelistString("chrome.dll")); |
| 614 | 654 |
| 615 EXPECT_FALSE(FakeV4LocalDatabaseManager::PerformFullHashCheckCalled( | 655 EXPECT_FALSE(FakeV4LocalDatabaseManager::PerformFullHashCheckCalled( |
| 616 v4_local_database_manager_)); | 656 v4_local_database_manager_)); |
| 617 } | 657 } |
| 618 | 658 |
| 659 // See http://crbug.com/660293 | |
|
Nathan Parker
2017/01/09 19:46:28
nit: "This verifies the fix for race in http://...
vakh (use Gerrit instead)
2017/01/10 01:54:53
Done.
| |
| 660 TEST_F(V4LocalDatabaseManagerTest, TestCheckBrowseUrlWithSameClientAndCancel) { | |
| 661 WaitForTasksOnTaskRunner(); | |
| 662 net::TestURLFetcherFactory factory; | |
| 663 | |
| 664 StoreAndHashPrefixes store_and_hash_prefixes; | |
| 665 store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), | |
| 666 HashPrefix("sن\340\t\006_")); | |
| 667 ReplaceV4Database(store_and_hash_prefixes); | |
| 668 ReplaceV4GetHashProtocolManager(StoresToCheck({GetUrlMalwareId()})); | |
| 669 | |
| 670 GURL first_url("http://example.com/a"); | |
| 671 GURL second_url("http://example.com/"); | |
| 672 TestClient client(SB_THREAT_TYPE_SAFE, first_url); | |
| 673 // The fake database returns a matched hash prefix. | |
| 674 EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl(first_url, &client)); | |
| 675 | |
| 676 // That check gets queued. Now, let's cancel the check. After this, we should | |
| 677 // not receive a call for |OnCheckBrowseUrlResult| with |first_url|. | |
| 678 v4_local_database_manager_->CancelCheck(&client); | |
| 679 | |
| 680 // Now, re-use that client but for |second_url|. | |
| 681 client.expected_url = second_url; | |
| 682 EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl(second_url, &client)); | |
| 683 | |
| 684 // Wait for PerformFullHashCheck to complete. | |
| 685 WaitForTasksOnTaskRunner(); | |
| 686 // |result_received_| is true only if OnCheckBrowseUrlResult gets called with | |
| 687 // the |url| equal to |expected_url|, which is |second_url| in this test. | |
| 688 EXPECT_TRUE(client.result_received_); | |
| 689 } | |
| 690 | |
| 619 // TODO(nparker): Add tests for | 691 // TODO(nparker): Add tests for |
| 620 // CheckDownloadUrl() | 692 // CheckDownloadUrl() |
| 621 // CheckExtensionIDs() | 693 // CheckExtensionIDs() |
| 622 // CheckResourceUrl() | 694 // CheckResourceUrl() |
| 623 | 695 |
| 624 } // namespace safe_browsing | 696 } // namespace safe_browsing |
| OLD | NEW |