Index: net/reporting/reporting_cache_unittest.cc |
diff --git a/net/reporting/reporting_cache_unittest.cc b/net/reporting/reporting_cache_unittest.cc |
index 73023400392fa0f02b19c874ec057e609842176f..19229db22e766c6f1edaceed8aca2c9c8238b4d9 100644 |
--- a/net/reporting/reporting_cache_unittest.cc |
+++ b/net/reporting/reporting_cache_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <string> |
#include "base/memory/ptr_util.h" |
+#include "base/test/simple_test_tick_clock.h" |
#include "base/time/time.h" |
#include "base/values.h" |
#include "net/reporting/reporting_client.h" |
@@ -42,6 +43,12 @@ class ReportingCacheTest : public ReportingTestBase { |
TestReportingObserver* observer() { return &observer_; } |
+ size_t report_count() { |
+ std::vector<const ReportingReport*> reports; |
+ cache()->GetReports(&reports); |
+ return reports.size(); |
+ } |
+ |
const GURL kUrl1_ = GURL("https://origin1/path"); |
const url::Origin kOrigin1_ = url::Origin(GURL("https://origin1/")); |
const url::Origin kOrigin2_ = url::Origin(GURL("https://origin2/")); |
@@ -400,5 +407,65 @@ TEST_F(ReportingCacheTest, IncludeSubdomainsPreferMoreSpecificSuperdomain) { |
EXPECT_EQ(kSuperOrigin, clients[0]->origin); |
} |
+TEST_F(ReportingCacheTest, EvictOldest) { |
+ ASSERT_LT(0u, policy().max_report_count); |
+ ASSERT_GT(std::numeric_limits<size_t>::max(), policy().max_report_count); |
+ |
+ base::TimeTicks earliest_queued = tick_clock()->NowTicks(); |
+ |
+ // Enqueue the maximum number of reports, spaced apart in time. |
+ for (size_t i = 0; i < policy().max_report_count; ++i) { |
+ cache()->AddReport(kUrl1_, kGroup1_, kType_, |
+ base::MakeUnique<base::DictionaryValue>(), |
+ tick_clock()->NowTicks(), 0); |
+ tick_clock()->Advance(base::TimeDelta::FromMinutes(1)); |
+ } |
+ EXPECT_EQ(policy().max_report_count, report_count()); |
+ |
+ // Add one more report to force the cache to evict one. |
+ cache()->AddReport(kUrl1_, kGroup1_, kType_, |
+ base::MakeUnique<base::DictionaryValue>(), kNow_, 0); |
+ |
+ // Make sure the cache evicted a report to make room for the new one, and make |
+ // sure the report evicted was the earliest-queued one. |
+ std::vector<const ReportingReport*> reports; |
+ cache()->GetReports(&reports); |
+ EXPECT_EQ(policy().max_report_count, reports.size()); |
+ for (const ReportingReport* report : reports) |
+ EXPECT_NE(earliest_queued, report->queued); |
+} |
+ |
+TEST_F(ReportingCacheTest, DontEvictPendingReports) { |
+ ASSERT_LT(0u, policy().max_report_count); |
+ ASSERT_GT(std::numeric_limits<size_t>::max(), policy().max_report_count); |
+ |
+ // Enqueue the maximum number of reports, spaced apart in time. |
+ for (size_t i = 0; i < policy().max_report_count; ++i) { |
+ cache()->AddReport(kUrl1_, kGroup1_, kType_, |
+ base::MakeUnique<base::DictionaryValue>(), |
+ tick_clock()->NowTicks(), 0); |
+ tick_clock()->Advance(base::TimeDelta::FromMinutes(1)); |
+ } |
+ EXPECT_EQ(policy().max_report_count, report_count()); |
+ |
+ // Mark all of the queued reports pending. |
+ std::vector<const ReportingReport*> queued_reports; |
+ cache()->GetReports(&queued_reports); |
+ cache()->SetReportsPending(queued_reports); |
+ |
+ // Add one more report to force the cache to evict one. Since the cache has |
+ // only pending reports, it will be forced to evict the *new* report! |
+ cache()->AddReport(kUrl1_, kGroup1_, kType_, |
+ base::MakeUnique<base::DictionaryValue>(), kNow_, 0); |
+ |
+ // Make sure the cache evicted a report, and make sure the report evicted was |
+ // the new, non-pending one. |
+ std::vector<const ReportingReport*> reports; |
+ cache()->GetReports(&reports); |
+ EXPECT_EQ(policy().max_report_count, reports.size()); |
+ for (const ReportingReport* report : reports) |
+ EXPECT_TRUE(cache()->IsReportPendingForTesting(report)); |
+} |
+ |
} // namespace |
} // namespace net |