| Index: components/safe_browsing_db/database_manager_unittest.cc
|
| diff --git a/components/safe_browsing_db/database_manager_unittest.cc b/components/safe_browsing_db/database_manager_unittest.cc
|
| index 92cdacf066fa2197443e6282d77692657f5649d2..caec9bd817f0d9f5c64b5478aa72664c9cf08fb6 100644
|
| --- a/components/safe_browsing_db/database_manager_unittest.cc
|
| +++ b/components/safe_browsing_db/database_manager_unittest.cc
|
| @@ -10,6 +10,7 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "base/base64.h"
|
| #include "base/location.h"
|
| #include "base/macros.h"
|
| #include "base/memory/ptr_util.h"
|
| @@ -18,9 +19,12 @@
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "components/safe_browsing_db/test_database_manager.h"
|
| -#include "components/safe_browsing_db/v4_get_hash_protocol_manager.h"
|
| +#include "components/safe_browsing_db/v4_protocol_manager_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| +#include "crypto/sha2.h"
|
| +#include "net/url_request/test_url_fetcher_factory.h"
|
| +#include "net/url_request/url_fetcher_delegate.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -30,79 +34,6 @@ namespace safe_browsing {
|
|
|
| namespace {
|
|
|
| -void InvokeFullHashCallback(
|
| - V4GetHashProtocolManager::FullHashCallback callback,
|
| - const std::vector<SBFullHashResult>& full_hashes,
|
| - base::Time negative_cache_expire) {
|
| - callback.Run(full_hashes, negative_cache_expire);
|
| -}
|
| -
|
| -// A TestV4GetHashProtocolManager that returns fixed responses from the
|
| -// Safe Browsing server for testing purpose.
|
| -class TestV4GetHashProtocolManager : public V4GetHashProtocolManager {
|
| - public:
|
| - TestV4GetHashProtocolManager(
|
| - net::URLRequestContextGetter* request_context_getter,
|
| - const V4ProtocolConfig& config)
|
| - : V4GetHashProtocolManager(request_context_getter, config),
|
| - negative_cache_expire_(base::Time()), delay_seconds_(0) {}
|
| -
|
| - ~TestV4GetHashProtocolManager() override {}
|
| -
|
| - void GetFullHashesWithApis(const std::vector<SBPrefix>& prefixes,
|
| - FullHashCallback callback) override {
|
| - prefixes_ = prefixes;
|
| - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
|
| - FROM_HERE, base::Bind(InvokeFullHashCallback, callback, full_hashes_,
|
| - negative_cache_expire_),
|
| - base::TimeDelta::FromSeconds(delay_seconds_));
|
| - }
|
| -
|
| - void SetDelaySeconds(int delay) {
|
| - delay_seconds_ = delay;
|
| - }
|
| -
|
| - void SetNegativeCacheDurationMins(base::Time now,
|
| - int negative_cache_duration_mins) {
|
| - // Don't add a TimeDelta to the maximum time to avoid undefined behavior.
|
| - negative_cache_expire_ = now.is_max() ? now :
|
| - now + base::TimeDelta::FromMinutes(negative_cache_duration_mins);
|
| - }
|
| -
|
| - // Prepare the GetFullHash results for the next request.
|
| - void AddGetFullHashResponse(const SBFullHashResult& full_hash_result) {
|
| - full_hashes_.push_back(full_hash_result);
|
| - }
|
| -
|
| - // Clear the GetFullHash results for the next request.
|
| - void ClearFullHashResponse() {
|
| - full_hashes_.clear();
|
| - }
|
| -
|
| - // Returns the prefixes that were sent in the last request.
|
| - const std::vector<SBPrefix>& GetRequestPrefixes() { return prefixes_; }
|
| -
|
| - private:
|
| - std::vector<SBPrefix> prefixes_;
|
| - std::vector<SBFullHashResult> full_hashes_;
|
| - base::Time negative_cache_expire_;
|
| - int delay_seconds_;
|
| -};
|
| -
|
| -// Factory that creates test protocol manager instances.
|
| -class TestV4GetHashProtocolManagerFactory :
|
| - public V4GetHashProtocolManagerFactory {
|
| - public:
|
| - TestV4GetHashProtocolManagerFactory() {}
|
| - ~TestV4GetHashProtocolManagerFactory() override {}
|
| -
|
| - V4GetHashProtocolManager* CreateProtocolManager(
|
| - net::URLRequestContextGetter* request_context_getter,
|
| - const V4ProtocolConfig& config) override {
|
| - return new TestV4GetHashProtocolManager(request_context_getter, config);
|
| - }
|
| -};
|
| -
|
| class TestClient : public SafeBrowsingDatabaseManager::Client {
|
| public:
|
| TestClient() : callback_invoked_(false) {}
|
| @@ -131,9 +62,6 @@ class TestClient : public SafeBrowsingDatabaseManager::Client {
|
| class SafeBrowsingDatabaseManagerTest : public testing::Test {
|
| protected:
|
| void SetUp() override {
|
| - V4GetHashProtocolManager::RegisterFactory(
|
| - base::MakeUnique<TestV4GetHashProtocolManagerFactory>());
|
| -
|
| db_manager_ = new TestSafeBrowsingDatabaseManager();
|
| db_manager_->StartOnIOThread(NULL, V4ProtocolConfig());
|
| }
|
| @@ -141,7 +69,29 @@ class SafeBrowsingDatabaseManagerTest : public testing::Test {
|
| void TearDown() override {
|
| base::RunLoop().RunUntilIdle();
|
| db_manager_->StopOnIOThread(false);
|
| - V4GetHashProtocolManager::RegisterFactory(nullptr);
|
| + }
|
| +
|
| + std::string GetStockV4GetHashResponse() {
|
| + UpdateListIdentifier list_id = GetChromeUrlApiId();
|
| + FullHash full_hash = crypto::SHA256HashString("example.com/more");
|
| +
|
| + FindFullHashesResponse response;
|
| + response.mutable_negative_cache_duration()->set_seconds(600);
|
| + ThreatMatch* m = response.add_matches();
|
| + m->set_platform_type(list_id.platform_type);
|
| + m->set_threat_entry_type(list_id.threat_entry_type);
|
| + m->set_threat_type(list_id.threat_type);
|
| + m->mutable_threat()->set_hash(full_hash);
|
| + m->mutable_cache_duration()->set_seconds(300);
|
| +
|
| + ThreatEntryMetadata::MetadataEntry* e =
|
| + m->mutable_threat_entry_metadata()->add_entries();
|
| + e->set_key("permission");
|
| + e->set_value("GEOLOCATION");
|
| +
|
| + std::string res_data;
|
| + response.SerializeToString(&res_data);
|
| + return res_data;
|
| }
|
|
|
| scoped_refptr<SafeBrowsingDatabaseManager> db_manager_;
|
| @@ -151,390 +101,50 @@ class SafeBrowsingDatabaseManagerTest : public testing::Test {
|
| };
|
|
|
| TEST_F(SafeBrowsingDatabaseManagerTest, CheckApiBlacklistUrlWrongScheme) {
|
| - TestClient client;
|
| - const GURL url("file://example.txt");
|
| - EXPECT_TRUE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| -}
|
| -
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, CheckApiBlacklistUrlPrefixes) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - // Generated from the sorted output of UrlToFullHashes in util.h.
|
| - std::vector<SBPrefix> expected_prefixes =
|
| - {1237562338, 2871045197, 3553205461, 3766933875};
|
| -
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| - std::vector<SBPrefix> prefixes = pm->GetRequestPrefixes();
|
| - EXPECT_EQ(expected_prefixes.size(), prefixes.size());
|
| - for (unsigned int i = 0; i < prefixes.size(); ++i) {
|
| - EXPECT_EQ(expected_prefixes[i], prefixes[i]);
|
| - }
|
| -}
|
| -
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, HandleGetHashesWithApisResults) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| -
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(1ul, permissions.size());
|
| - EXPECT_EQ(1ul, permissions.count("GEOLOCATION"));
|
| -}
|
| -
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, HandleGetHashesWithApisResultsNoMatch) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("wrongexample.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| -
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(0ul, permissions.size());
|
| -}
|
| -
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, HandleGetHashesWithApisResultsMatches) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| - SBFullHashResult full_hash_result2;
|
| - full_hash_result2.hash = SBFullHashForString("example.com/more");
|
| - full_hash_result2.metadata.api_permissions.insert("NOTIFICATIONS");
|
| - pm->AddGetFullHashResponse(full_hash_result2);
|
| - SBFullHashResult full_hash_result3;
|
| - full_hash_result3.hash = SBFullHashForString("wrongexample.com/");
|
| - full_hash_result3.metadata.api_permissions.insert("AUDIO_CAPTURE");
|
| - pm->AddGetFullHashResponse(full_hash_result3);
|
| -
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(2ul, permissions.size());
|
| - EXPECT_EQ(1ul, permissions.count("GEOLOCATION"));
|
| - EXPECT_EQ(1ul, permissions.count("NOTIFICATIONS"));
|
| + EXPECT_TRUE(
|
| + db_manager_->CheckApiBlacklistUrl(GURL("file://example.txt"), nullptr));
|
| }
|
|
|
| TEST_F(SafeBrowsingDatabaseManagerTest, CancelApiCheck) {
|
| + net::TestURLFetcherFactory factory;
|
| TestClient client;
|
| const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| - pm->SetDelaySeconds(100);
|
|
|
| EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| EXPECT_TRUE(db_manager_->CancelApiCheck(&client));
|
| - base::RunLoop().RunUntilIdle();
|
|
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(0ul, permissions.size());
|
| - EXPECT_FALSE(client.callback_invoked());
|
| -}
|
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
|
| + DCHECK(fetcher);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(GetStockV4GetHashResponse());
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
|
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, ResultsAreCached) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - base::Time now = base::Time::UnixEpoch();
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - full_hash_result.cache_expire_after = now + base::TimeDelta::FromMinutes(3);
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| - pm->SetNegativeCacheDurationMins(now, 5);
|
| -
|
| - EXPECT_TRUE(db_manager_->v4_full_hash_cache_.empty());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(1ul, permissions.size());
|
| - EXPECT_EQ(1ul, permissions.count("GEOLOCATION"));
|
| -
|
| - // Check the cache.
|
| - const SafeBrowsingDatabaseManager::PrefixToFullHashResultsMap& cache =
|
| - db_manager_->v4_full_hash_cache_[SB_THREAT_TYPE_API_ABUSE];
|
| - // Generated from the sorted output of UrlToFullHashes in util.h.
|
| - std::vector<SBPrefix> expected_prefixes =
|
| - {1237562338, 2871045197, 3553205461, 3766933875};
|
| - EXPECT_EQ(expected_prefixes.size(),
|
| - db_manager_->v4_full_hash_cache_[SB_THREAT_TYPE_API_ABUSE].size());
|
| -
|
| - auto entry = cache.find(expected_prefixes[0]);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(now + base::TimeDelta::FromMinutes(5), entry->second.expire_after);
|
| - EXPECT_EQ(0ul, entry->second.full_hashes.size());
|
| -
|
| - entry = cache.find(expected_prefixes[1]);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(now + base::TimeDelta::FromMinutes(5), entry->second.expire_after);
|
| - EXPECT_EQ(0ul, entry->second.full_hashes.size());
|
| -
|
| - entry = cache.find(expected_prefixes[2]);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(now + base::TimeDelta::FromMinutes(5), entry->second.expire_after);
|
| - EXPECT_EQ(0ul, entry->second.full_hashes.size());
|
| -
|
| - entry = cache.find(expected_prefixes[3]);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(now + base::TimeDelta::FromMinutes(5), entry->second.expire_after);
|
| - EXPECT_EQ(1ul, entry->second.full_hashes.size());
|
| - EXPECT_TRUE(SBFullHashEqual(full_hash_result.hash,
|
| - entry->second.full_hashes[0].hash));
|
| - EXPECT_EQ(1ul, entry->second.full_hashes[0].metadata.api_permissions.size());
|
| - EXPECT_EQ(1ul, entry->second.full_hashes[0].metadata.api_permissions.
|
| - count("GEOLOCATION"));
|
| - EXPECT_EQ(full_hash_result.cache_expire_after,
|
| - entry->second.full_hashes[0].cache_expire_after);
|
| -}
|
| -
|
| -// An uninitialized value for negative cache expire does not cache results.
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, ResultsAreNotCachedOnNull) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - base::Time now = base::Time::UnixEpoch();
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.cache_expire_after = now + base::TimeDelta::FromMinutes(3);
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| -
|
| - EXPECT_TRUE(db_manager_->v4_full_hash_cache_.empty());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| base::RunLoop().RunUntilIdle();
|
|
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - EXPECT_TRUE(
|
| - db_manager_->v4_full_hash_cache_[SB_THREAT_TYPE_API_ABUSE].empty());
|
| -}
|
| -
|
| -// Checks that results are looked up correctly in the cache.
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, GetCachedResults) {
|
| - base::Time now = base::Time::UnixEpoch();
|
| - std::vector<SBFullHash> full_hashes;
|
| - SBFullHash full_hash = SBFullHashForString("example.com/");
|
| - full_hashes.push_back(full_hash);
|
| - std::vector<SBFullHashResult> cached_results;
|
| - std::vector<SBPrefix> prefixes;
|
| - db_manager_->GetFullHashCachedResults(SB_THREAT_TYPE_API_ABUSE,
|
| - full_hashes, now, &prefixes, &cached_results);
|
| -
|
| - // The cache is empty.
|
| - EXPECT_TRUE(cached_results.empty());
|
| - EXPECT_EQ(1ul, prefixes.size());
|
| - EXPECT_EQ(full_hash.prefix, prefixes[0]);
|
| -
|
| - // Prefix has a cache entry but full hash is not there.
|
| - SBCachedFullHashResult& entry = db_manager_->
|
| - v4_full_hash_cache_[SB_THREAT_TYPE_API_ABUSE][full_hash.prefix] =
|
| - SBCachedFullHashResult(now + base::TimeDelta::FromMinutes(5));
|
| - db_manager_->GetFullHashCachedResults(SB_THREAT_TYPE_API_ABUSE,
|
| - full_hashes, now, &prefixes, &cached_results);
|
| -
|
| - EXPECT_TRUE(prefixes.empty());
|
| - EXPECT_TRUE(cached_results.empty());
|
| -
|
| - // Expired negative cache entry.
|
| - entry.expire_after = now - base::TimeDelta::FromMinutes(5);
|
| - db_manager_->GetFullHashCachedResults(SB_THREAT_TYPE_API_ABUSE,
|
| - full_hashes, now, &prefixes, &cached_results);
|
| -
|
| - EXPECT_TRUE(cached_results.empty());
|
| - EXPECT_EQ(1ul, prefixes.size());
|
| - EXPECT_EQ(full_hash.prefix, prefixes[0]);
|
| -
|
| - // Now put the full hash in the cache.
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = full_hash;
|
| - full_hash_result.cache_expire_after = now + base::TimeDelta::FromMinutes(3);
|
| - entry.full_hashes.push_back(full_hash_result);
|
| - db_manager_->GetFullHashCachedResults(SB_THREAT_TYPE_API_ABUSE,
|
| - full_hashes, now, &prefixes, &cached_results);
|
| -
|
| - EXPECT_TRUE(prefixes.empty());
|
| - EXPECT_EQ(1ul, cached_results.size());
|
| - EXPECT_TRUE(SBFullHashEqual(full_hash, cached_results[0].hash));
|
| -
|
| - // Expired full hash in cache.
|
| - entry.full_hashes.clear();
|
| - full_hash_result.cache_expire_after = now - base::TimeDelta::FromMinutes(3);
|
| - entry.full_hashes.push_back(full_hash_result);
|
| - db_manager_->GetFullHashCachedResults(SB_THREAT_TYPE_API_ABUSE,
|
| - full_hashes, now, &prefixes, &cached_results);
|
| -
|
| - EXPECT_TRUE(cached_results.empty());
|
| - EXPECT_EQ(1ul, prefixes.size());
|
| - EXPECT_EQ(full_hash.prefix, prefixes[0]);
|
| -}
|
| -
|
| -// Checks that the cached results and request results are merged.
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, CachedResultsMerged) {
|
| - TestClient client;
|
| - const GURL url("https://www.example.com/more");
|
| - TestV4GetHashProtocolManager* pm = static_cast<TestV4GetHashProtocolManager*>(
|
| - db_manager_->v4_get_hash_protocol_manager_);
|
| - // Set now to max time so the cache expire times are in the future.
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("GEOLOCATION");
|
| - full_hash_result.cache_expire_after = base::Time::Max();
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| - pm->SetNegativeCacheDurationMins(base::Time::Max(), 0);
|
| -
|
| - EXPECT_TRUE(db_manager_->v4_full_hash_cache_.empty());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - const std::set<std::string>& permissions = client.GetBlockedPermissions();
|
| - EXPECT_EQ(1ul, permissions.size());
|
| - EXPECT_EQ(1ul, permissions.count("GEOLOCATION"));
|
| -
|
| - // The results should be cached, so remove them from the protocol manager
|
| - // response.
|
| - TestClient client2;
|
| - pm->ClearFullHashResponse();
|
| - pm->SetNegativeCacheDurationMins(base::Time(), 0);
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client2));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client2.callback_invoked());
|
| - const std::set<std::string>& permissions2 =
|
| - client2.GetBlockedPermissions();
|
| - EXPECT_EQ(1ul, permissions2.size());
|
| - EXPECT_EQ(1ul, permissions2.count("GEOLOCATION"));
|
| -
|
| - // Add a different result to the protocol manager response and ensure it is
|
| - // merged with the cached result in the metadata.
|
| - TestClient client3;
|
| - const GURL url2("https://m.example.com/more");
|
| - full_hash_result.hash = SBFullHashForString("m.example.com/");
|
| - full_hash_result.metadata.api_permissions.insert("NOTIFICATIONS");
|
| - pm->AddGetFullHashResponse(full_hash_result);
|
| - pm->SetNegativeCacheDurationMins(base::Time::Max(), 0);
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url2, &client3));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(client3.callback_invoked());
|
| - const std::set<std::string>& permissions3 =
|
| - client3.GetBlockedPermissions();
|
| - EXPECT_EQ(2ul, permissions3.size());
|
| - EXPECT_EQ(1ul, permissions3.count("GEOLOCATION"));
|
| - EXPECT_EQ(1ul, permissions3.count("NOTIFICATIONS"));
|
| + EXPECT_FALSE(client.callback_invoked());
|
| + EXPECT_EQ(0ul, client.GetBlockedPermissions().size());
|
| }
|
|
|
| -TEST_F(SafeBrowsingDatabaseManagerTest, CachedResultsAreEvicted) {
|
| - base::Time epoch = base::Time::UnixEpoch();
|
| - SBFullHashResult full_hash_result;
|
| - full_hash_result.hash = SBFullHashForString("example.com/");
|
| - full_hash_result.cache_expire_after = epoch;
|
| -
|
| - SafeBrowsingDatabaseManager::PrefixToFullHashResultsMap& cache =
|
| - db_manager_->v4_full_hash_cache_[SB_THREAT_TYPE_API_ABUSE];
|
| -
|
| - // Fill the cache with some expired entries.
|
| - // Both negative cache and full hash expired.
|
| - cache[full_hash_result.hash.prefix] = SBCachedFullHashResult(epoch);
|
| - cache[full_hash_result.hash.prefix].full_hashes.push_back(full_hash_result);
|
| -
|
| +TEST_F(SafeBrowsingDatabaseManagerTest, GetApiCheckResponse) {
|
| + net::TestURLFetcherFactory factory;
|
| TestClient client;
|
| const GURL url("https://www.example.com/more");
|
|
|
| - EXPECT_EQ(1ul, cache.size());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Cache should be empty.
|
| - EXPECT_TRUE(client.callback_invoked());
|
| - EXPECT_TRUE(cache.empty());
|
| -
|
| - // Negative cache still valid and full hash expired.
|
| - cache[full_hash_result.hash.prefix] =
|
| - SBCachedFullHashResult(base::Time::Max());
|
| - cache[full_hash_result.hash.prefix].full_hashes.push_back(full_hash_result);
|
| -
|
| - EXPECT_EQ(1ul, cache.size());
|
| EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
|
|
| - // Cache entry should still be there.
|
| - EXPECT_EQ(1ul, cache.size());
|
| - auto entry = cache.find(full_hash_result.hash.prefix);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(base::Time::Max(), entry->second.expire_after);
|
| - EXPECT_EQ(1ul, entry->second.full_hashes.size());
|
| - EXPECT_TRUE(SBFullHashEqual(full_hash_result.hash,
|
| - entry->second.full_hashes[0].hash));
|
| - EXPECT_EQ(full_hash_result.cache_expire_after,
|
| - entry->second.full_hashes[0].cache_expire_after);
|
| -
|
| - // Negative cache still valid and full hash still valid.
|
| - cache[full_hash_result.hash.prefix].full_hashes[0].
|
| - cache_expire_after = base::Time::Max();
|
| -
|
| - EXPECT_EQ(1ul, cache.size());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| - base::RunLoop().RunUntilIdle();
|
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0);
|
| + DCHECK(fetcher);
|
| + fetcher->set_status(net::URLRequestStatus());
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(GetStockV4GetHashResponse());
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
|
|
| - // Cache entry should still be there.
|
| - EXPECT_EQ(1ul, cache.size());
|
| - entry = cache.find(full_hash_result.hash.prefix);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(base::Time::Max(), entry->second.expire_after);
|
| - EXPECT_EQ(1ul, entry->second.full_hashes.size());
|
| - EXPECT_TRUE(SBFullHashEqual(full_hash_result.hash,
|
| - entry->second.full_hashes[0].hash));
|
| - EXPECT_EQ(base::Time::Max(),
|
| - entry->second.full_hashes[0].cache_expire_after);
|
| -
|
| - // Negative cache expired and full hash still valid.
|
| - cache[full_hash_result.hash.prefix].expire_after = epoch;
|
| -
|
| - EXPECT_EQ(1ul, cache.size());
|
| - EXPECT_FALSE(db_manager_->CheckApiBlacklistUrl(url, &client));
|
| base::RunLoop().RunUntilIdle();
|
|
|
| - // Cache entry should still be there.
|
| - EXPECT_EQ(1ul, cache.size());
|
| - entry = cache.find(full_hash_result.hash.prefix);
|
| - EXPECT_NE(cache.end(), entry);
|
| - EXPECT_EQ(epoch, entry->second.expire_after);
|
| - EXPECT_EQ(1ul, entry->second.full_hashes.size());
|
| - EXPECT_TRUE(SBFullHashEqual(full_hash_result.hash,
|
| - entry->second.full_hashes[0].hash));
|
| - EXPECT_EQ(base::Time::Max(),
|
| - entry->second.full_hashes[0].cache_expire_after);
|
| + ASSERT_TRUE(client.callback_invoked());
|
| + ASSERT_EQ(1ul, client.GetBlockedPermissions().size());
|
| + EXPECT_EQ("GEOLOCATION", *(client.GetBlockedPermissions().begin()));
|
| }
|
|
|
| } // namespace safe_browsing
|
|
|