Chromium Code Reviews| Index: components/safe_browsing_db/v4_local_database_manager_unittest.cc |
| diff --git a/components/safe_browsing_db/v4_local_database_manager_unittest.cc b/components/safe_browsing_db/v4_local_database_manager_unittest.cc |
| index 3b1a686197eade5b30d754b7dc9cce6710895d39..8c3701a905747d5f95eeffb584e75ec30768b7bf 100644 |
| --- a/components/safe_browsing_db/v4_local_database_manager_unittest.cc |
| +++ b/components/safe_browsing_db/v4_local_database_manager_unittest.cc |
| @@ -105,6 +105,39 @@ class FakeV4Database : public V4Database { |
| const bool stores_available_; |
| }; |
| +class FakeV4GetHashProtocolManager : public V4GetHashProtocolManager { |
| + public: |
| + FakeV4GetHashProtocolManager( |
| + net::URLRequestContextGetter* request_context_getter, |
| + const StoresToCheck& stores_to_check, |
| + const V4ProtocolConfig& config, |
| + const std::vector<FullHashInfo>& expected_response, |
| + const scoped_refptr<base::TestSimpleTaskRunner>& task_runner) |
| + : V4GetHashProtocolManager(request_context_getter, |
| + stores_to_check, |
| + config), |
| + expected_response_(expected_response), |
| + task_runner_(task_runner) {} |
| + |
| + 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
|
| + // Wait for tasks on the task runner so we're sure that the |
| + // V4LocalDatabaseManager has read the data from disk. |
| + task_runner_->RunPendingTasks(); |
| + base::RunLoop().RunUntilIdle(); |
| + } |
| + |
| + void GetFullHashes(const FullHashToStoreAndHashPrefixesMap& |
| + full_hash_to_matching_hash_prefixes, |
| + FullHashCallback callback) override { |
| + 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
|
| + callback.Run(expected_response_); |
| + } |
| + |
| + private: |
| + const std::vector<FullHashInfo> expected_response_; |
| + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| +}; |
| + |
| class TestClient : public SafeBrowsingDatabaseManager::Client { |
| public: |
| TestClient(SBThreatType sb_threat_type, |
| @@ -214,6 +247,13 @@ class V4LocalDatabaseManagerTest : public PlatformTest { |
| WaitForTasksOnTaskRunner(); |
| } |
| + void ReplaceV4GetHashProtocolManager(const StoresToCheck& stores_to_check) { |
| + v4_local_database_manager_->v4_get_hash_protocol_manager_ = |
| + base::MakeUnique<FakeV4GetHashProtocolManager>( |
| + nullptr, stores_to_check, GetTestV4ProtocolConfig(), |
| + std::vector<FullHashInfo>{}, task_runner_); |
| + } |
| + |
| void ResetV4Database() { |
| V4Database::Destroy(std::move(v4_local_database_manager_->v4_database_)); |
| } |
| @@ -616,6 +656,38 @@ TEST_F(V4LocalDatabaseManagerTest, TestMatchModuleWhitelist) { |
| v4_local_database_manager_)); |
| } |
| +// 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.
|
| +TEST_F(V4LocalDatabaseManagerTest, TestCheckBrowseUrlWithSameClientAndCancel) { |
| + WaitForTasksOnTaskRunner(); |
| + net::TestURLFetcherFactory factory; |
| + |
| + StoreAndHashPrefixes store_and_hash_prefixes; |
| + store_and_hash_prefixes.emplace_back(GetUrlMalwareId(), |
| + HashPrefix("sن\340\t\006_")); |
| + ReplaceV4Database(store_and_hash_prefixes); |
| + ReplaceV4GetHashProtocolManager(StoresToCheck({GetUrlMalwareId()})); |
| + |
| + GURL first_url("http://example.com/a"); |
| + GURL second_url("http://example.com/"); |
| + TestClient client(SB_THREAT_TYPE_SAFE, first_url); |
| + // The fake database returns a matched hash prefix. |
| + EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl(first_url, &client)); |
| + |
| + // That check gets queued. Now, let's cancel the check. After this, we should |
| + // not receive a call for |OnCheckBrowseUrlResult| with |first_url|. |
| + v4_local_database_manager_->CancelCheck(&client); |
| + |
| + // Now, re-use that client but for |second_url|. |
| + client.expected_url = second_url; |
| + EXPECT_FALSE(v4_local_database_manager_->CheckBrowseUrl(second_url, &client)); |
| + |
| + // Wait for PerformFullHashCheck to complete. |
| + WaitForTasksOnTaskRunner(); |
| + // |result_received_| is true only if OnCheckBrowseUrlResult gets called with |
| + // the |url| equal to |expected_url|, which is |second_url| in this test. |
| + EXPECT_TRUE(client.result_received_); |
| +} |
| + |
| // TODO(nparker): Add tests for |
| // CheckDownloadUrl() |
| // CheckExtensionIDs() |