| Index: chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
|
| index b418d14a6e4de6fc90c6b4f9204e0aba1c50eb19..75139169f1690f3c9d98aa2898c78ede3e249079 100644
|
| --- a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
|
| @@ -86,14 +86,66 @@ class ClientSideDetectionServiceTest : public testing::Test {
|
| response_data, success);
|
| }
|
|
|
| - int GetNumReportsPerDay() {
|
| - return csd_service_->GetNumReportsPerDay();
|
| + int GetNumReports() {
|
| + return csd_service_->GetNumReports();
|
| }
|
|
|
| std::queue<base::Time>& GetPhishingReportTimes() {
|
| return csd_service_->phishing_report_times_;
|
| }
|
|
|
| + void SetCache(const GURL& gurl, bool is_phishing, base::Time time) {
|
| + csd_service_->cache_[gurl] =
|
| + make_linked_ptr(new ClientSideDetectionService::CacheState(is_phishing,
|
| + time));
|
| + }
|
| +
|
| + void TestCache() {
|
| + ClientSideDetectionService::PhishingCache& cache = csd_service_->cache_;
|
| + base::Time now = base::Time::Now();
|
| + base::Time time = now - ClientSideDetectionService::kNegativeCacheInterval +
|
| + base::TimeDelta::FromMinutes(5);
|
| + cache[GURL("http://first.url.com/")] =
|
| + make_linked_ptr(new ClientSideDetectionService::CacheState(false,
|
| + time));
|
| +
|
| + time = now - ClientSideDetectionService::kNegativeCacheInterval -
|
| + base::TimeDelta::FromHours(1);
|
| + cache[GURL("http://second.url.com/")] =
|
| + make_linked_ptr(new ClientSideDetectionService::CacheState(false,
|
| + time));
|
| +
|
| + time = now - ClientSideDetectionService::kPositiveCacheInterval -
|
| + base::TimeDelta::FromMinutes(5);
|
| + cache[GURL("http://third.url.com/")] =
|
| + make_linked_ptr(new ClientSideDetectionService::CacheState(true, time));
|
| +
|
| + time = now - ClientSideDetectionService::kPositiveCacheInterval +
|
| + base::TimeDelta::FromMinutes(5);
|
| + cache[GURL("http://fourth.url.com/")] =
|
| + make_linked_ptr(new ClientSideDetectionService::CacheState(true, time));
|
| +
|
| + csd_service_->UpdateCache();
|
| +
|
| + // 3 elements should be in the cache, the first, third, and fourth.
|
| + EXPECT_EQ(3U, cache.size());
|
| + EXPECT_NE(cache.find(GURL("http://first.url.com/")), cache.end());
|
| + EXPECT_NE(cache.find(GURL("http://third.url.com/")), cache.end());
|
| + EXPECT_NE(cache.find(GURL("http://fourth.url.com/")), cache.end());
|
| +
|
| + // While 3 elements remain, only the first and the fourth are actually
|
| + // valid.
|
| + bool is_phishing;
|
| + EXPECT_TRUE(csd_service_->GetCachedResult(GURL("http://first.url.com"),
|
| + &is_phishing));
|
| + EXPECT_FALSE(is_phishing);
|
| + EXPECT_FALSE(csd_service_->GetCachedResult(GURL("http://third.url.com"),
|
| + &is_phishing));
|
| + EXPECT_TRUE(csd_service_->GetCachedResult(GURL("http://fourth.url.com"),
|
| + &is_phishing));
|
| + EXPECT_TRUE(is_phishing);
|
| + }
|
| +
|
| protected:
|
| scoped_ptr<ClientSideDetectionService> csd_service_;
|
| scoped_ptr<FakeURLFetcherFactory> factory_;
|
| @@ -188,16 +240,57 @@ TEST_F(ClientSideDetectionServiceTest, SendClientReportPhishingRequest) {
|
| SetClientReportPhishingResponse(response.SerializeAsString(),
|
| true /* success */);
|
| EXPECT_TRUE(SendClientReportPhishingRequest(url, score));
|
| +
|
| + // Caching causes this to still count as phishy.
|
| response.set_phishy(false);
|
| SetClientReportPhishingResponse(response.SerializeAsString(),
|
| true /* success */);
|
| - EXPECT_FALSE(SendClientReportPhishingRequest(url, score));
|
| + EXPECT_TRUE(SendClientReportPhishingRequest(url, score));
|
| +
|
| + // This request will fail and should not be cached.
|
| + GURL second_url("http://b.com/");
|
| + response.set_phishy(false);
|
| + SetClientReportPhishingResponse(response.SerializeAsString(),
|
| + false /* success*/);
|
| + EXPECT_FALSE(SendClientReportPhishingRequest(second_url, score));
|
| +
|
| + // Verify that the previous request was not cached.
|
| + response.set_phishy(true);
|
| + SetClientReportPhishingResponse(response.SerializeAsString(),
|
| + true /* success */);
|
| + EXPECT_TRUE(SendClientReportPhishingRequest(second_url, score));
|
| +
|
| + // This request is blocked because it's not in the cache and we have more
|
| + // than 3 requests.
|
| + GURL third_url("http://c.com");
|
| + response.set_phishy(true);
|
| + SetClientReportPhishingResponse(response.SerializeAsString(),
|
| + true /* success */);
|
| + EXPECT_FALSE(SendClientReportPhishingRequest(third_url, score));
|
| +
|
| + // Verify that caching still works even when new requests are blocked.
|
| + response.set_phishy(true);
|
| + SetClientReportPhishingResponse(response.SerializeAsString(),
|
| + true /* success */);
|
| + EXPECT_TRUE(SendClientReportPhishingRequest(url, score));
|
| +
|
| + // Verify that we allow cache refreshing even when requests are blocked.
|
| + base::Time cache_time = base::Time::Now() - base::TimeDelta::FromHours(1);
|
| + SetCache(second_url, true, cache_time);
|
| +
|
| + // Even though this element is in the cache, it's not currently valid so
|
| + // we make request and return that value instead.
|
| + response.set_phishy(false);
|
| + SetClientReportPhishingResponse(response.SerializeAsString(),
|
| + true /* success */);
|
| + EXPECT_FALSE(SendClientReportPhishingRequest(second_url, score));
|
|
|
| base::Time after = base::Time::Now();
|
|
|
| - // Check that we have recorded 3 requests, all within the correct time range.
|
| + // Check that we have recorded 5 requests, all within the correct time range.
|
| + // The blocked request and the cached requests should not be present.
|
| std::queue<base::Time>& report_times = GetPhishingReportTimes();
|
| - EXPECT_EQ(3U, report_times.size());
|
| + EXPECT_EQ(5U, report_times.size());
|
| while (!report_times.empty()) {
|
| base::Time time = report_times.back();
|
| report_times.pop();
|
| @@ -221,7 +314,17 @@ TEST_F(ClientSideDetectionServiceTest, GetNumReportTest) {
|
| report_times.push(now);
|
| report_times.push(now);
|
|
|
| - EXPECT_EQ(2, GetNumReportsPerDay());
|
| + EXPECT_EQ(2, GetNumReports());
|
| +}
|
| +
|
| +TEST_F(ClientSideDetectionServiceTest, CacheTest) {
|
| + SetModelFetchResponse("bogus model", true /* success */);
|
| + ScopedTempDir tmp_dir;
|
| + ASSERT_TRUE(tmp_dir.CreateUniqueTempDir());
|
| + csd_service_.reset(ClientSideDetectionService::Create(
|
| + tmp_dir.path().AppendASCII("model"), NULL));
|
| +
|
| + TestCache();
|
| }
|
|
|
| } // namespace safe_browsing
|
|
|