Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2755)

Unified Diff: net/sdch/sdch_owner_unittest.cc

Issue 881413003: Make SDCH dictionaries persistent across browser restart. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated Matt's suggestion and removed SdchDictionaryFetcher::Data. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/sdch/sdch_owner_unittest.cc
diff --git a/net/sdch/sdch_owner_unittest.cc b/net/sdch/sdch_owner_unittest.cc
index e89533a361c4a45477c6affcf16a87ea2820031b..0b31b6f45af4fd1e4eecb00604ea94aa0d1accda 100644
--- a/net/sdch/sdch_owner_unittest.cc
+++ b/net/sdch/sdch_owner_unittest.cc
@@ -120,6 +120,26 @@ class MockURLRequestJobFactory : public URLRequestJobFactory {
}
};
+// File testing infrastructure summary:
+// * NewSdchDictionary(): Creates a dictionary of a specific size.
+// * URLRequestErrorCountingJob: A URLRequestJob that returns an error
+// and counts the number of outstanding (started but not finished)
+// jobs, and calls a global callback when that number transitions to zero.
+// * MockURLRequestJobFactory: Factory to create the above jobs. Tracks
+// the number of jobs created.
+// * SdchOwnerTest: Interfaces
+// * Access manager, owner, and net log
+// * Return the number of jobs created in a time interval
+// * Return dictionary present in the manager
+// * Notify SdchOwner of an incoming dictionary (& wait until jobs clear)
+// * Attempt to add a dictionary and test for success.
+// Test patterns:
+// * Let the owner know about a Get-Dictionary header and test for
+// appropriate jobs being created.
+// * Let the owner know that a dictionary was successfully fetched
+// and test for appropriate outcome.
+// * Either of the above, having previously added dictionaries to create
+// a particular initial state.
class SdchOwnerTest : public testing::Test {
public:
static const size_t kMaxSizeForTesting = 1000 * 50;
@@ -172,7 +192,9 @@ class SdchOwnerTest : public testing::Test {
// associate it with a unique URL, add it to the manager through
// SdchOwner::OnDictionaryFetched(), and return whether that
// addition was successful or not.
- bool CreateAndAddDictionary(size_t size, std::string* server_hash_p) {
+ bool CreateAndAddDictionary(size_t size,
+ std::string* server_hash_p,
+ base::Time last_used_time) {
GURL dictionary_url(
base::StringPrintf("%s/d%d", generic_url, dictionary_creation_index_));
std::string dictionary_text(NewSdchDictionary(size - 4));
@@ -184,7 +206,8 @@ class SdchOwnerTest : public testing::Test {
if (DictionaryPresentInManager(server_hash))
return false;
- sdch_owner().OnDictionaryFetched(dictionary_text, dictionary_url, net_log_);
+ sdch_owner().OnDictionaryFetched(last_used_time, 0, dictionary_text,
+ dictionary_url, net_log_);
if (server_hash_p)
*server_hash_p = server_hash;
return DictionaryPresentInManager(server_hash);
@@ -220,7 +243,8 @@ TEST_F(SdchOwnerTest, OnGetDictionary_Fetching) {
// Fetch generated when half full.
GURL dict_url2(std::string(generic_url) + "/d2");
std::string dictionary1(NewSdchDictionary(kMaxSizeForTesting / 2));
- sdch_owner().OnDictionaryFetched(dictionary1, dict_url1, bound_net_log());
+ sdch_owner().OnDictionaryFetched(base::Time::Now(), 1, dictionary1, dict_url1,
+ bound_net_log());
EXPECT_EQ(0, JobsRecentlyCreated());
SignalGetDictionaryAndClearJobs(request_url, dict_url2);
EXPECT_EQ(1, JobsRecentlyCreated());
@@ -229,7 +253,8 @@ TEST_F(SdchOwnerTest, OnGetDictionary_Fetching) {
GURL dict_url3(std::string(generic_url) + "/d3");
std::string dictionary2(NewSdchDictionary(
(kMaxSizeForTesting / 2 - kMinFetchSpaceForTesting / 2)));
- sdch_owner().OnDictionaryFetched(dictionary2, dict_url2, bound_net_log());
+ sdch_owner().OnDictionaryFetched(base::Time::Now(), 1, dictionary2, dict_url2,
+ bound_net_log());
EXPECT_EQ(0, JobsRecentlyCreated());
SignalGetDictionaryAndClearJobs(request_url, dict_url3);
EXPECT_EQ(0, JobsRecentlyCreated());
@@ -241,16 +266,23 @@ TEST_F(SdchOwnerTest, OnDictionaryFetched_Fetching) {
std::string client_hash;
std::string server_hash;
+ // In the past, but still fresh for an unused dictionary.
+ base::Time dictionary_last_used_time(base::Time::Now() -
+ base::TimeDelta::FromMinutes(30));
+
// Add successful when empty.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr,
+ dictionary_last_used_time));
EXPECT_EQ(0, JobsRecentlyCreated());
// Add successful when half full.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr,
+ dictionary_last_used_time));
EXPECT_EQ(0, JobsRecentlyCreated());
// Add unsuccessful when full.
- EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr));
+ EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting / 2, nullptr,
+ dictionary_last_used_time));
EXPECT_EQ(0, JobsRecentlyCreated());
}
@@ -261,23 +293,19 @@ TEST_F(SdchOwnerTest, ConfirmAutoEviction) {
std::string server_hash_d3;
// Add two dictionaries, one recent, one more than a day in the past.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d1));
-
- scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(2));
- sdch_owner().SetClockForTesting(clock.Pass());
+ base::Time fresh(base::Time::Now() - base::TimeDelta::FromHours(23));
+ base::Time stale(base::Time::Now() - base::TimeDelta::FromHours(25));
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d2));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d1, fresh));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d2, stale));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
- // The addition of a new dictionary should succeed, evicting the old one.
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now());
- sdch_owner().SetClockForTesting(clock.Pass());
-
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d3));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d3, fresh));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
@@ -292,26 +320,23 @@ TEST_F(SdchOwnerTest, ConfirmAutoEviction_2) {
// Add dictionaries, one recent, two more than a day in the past that
// between them add up to the space needed.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d1));
+ base::Time fresh(base::Time::Now() - base::TimeDelta::FromHours(23));
+ base::Time stale(base::Time::Now() - base::TimeDelta::FromHours(25));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d1, fresh));
- scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(2));
- sdch_owner().SetClockForTesting(clock.Pass());
-
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2));
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2, stale));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3, stale));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
- // The addition of a new dictionary should succeed, evicting the old one.
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now());
- sdch_owner().SetClockForTesting(clock.Pass());
-
std::string server_hash_d4;
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4, fresh));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d3));
@@ -326,17 +351,18 @@ TEST_F(SdchOwnerTest, ConfirmAutoEviction_Oldest) {
// Add dictionaries, one recent, one two days in the past, and one
// four days in the past.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1));
+ base::Time fresh(base::Time::Now() - base::TimeDelta::FromHours(23));
+ base::Time stale_newer(base::Time::Now() - base::TimeDelta::FromHours(47));
+ base::Time stale_older(base::Time::Now() - base::TimeDelta::FromHours(71));
- scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(2));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1, fresh));
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(4));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2,
+ stale_newer));
+
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3,
+ stale_older));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
@@ -344,12 +370,10 @@ TEST_F(SdchOwnerTest, ConfirmAutoEviction_Oldest) {
// The addition of a new dictionary should succeed, evicting only the
// oldest one.
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now());
- sdch_owner().SetClockForTesting(clock.Pass());
std::string server_hash_d4;
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4, fresh));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d3));
@@ -364,33 +388,31 @@ TEST_F(SdchOwnerTest, UseChangesEviction) {
// Add dictionaries, one recent, one two days in the past, and one
// four days in the past.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1));
+ base::Time fresh(base::Time::Now() - base::TimeDelta::FromHours(23));
+ base::Time stale_newer(base::Time::Now() - base::TimeDelta::FromHours(47));
+ base::Time stale_older(base::Time::Now() - base::TimeDelta::FromHours(71));
+
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1, fresh));
- scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(2));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2,
+ stale_newer));
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(4));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3,
+ stale_older));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now());
- sdch_owner().SetClockForTesting(clock.Pass());
-
// Use the oldest dictionary.
sdch_owner().OnDictionaryUsed(&sdch_manager(), server_hash_d3);
// The addition of a new dictionary should succeed, evicting only the
// newer stale one.
std::string server_hash_d4;
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4, fresh));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
@@ -405,33 +427,31 @@ TEST_F(SdchOwnerTest, UsePreventsAddition) {
// Add dictionaries, one recent, one two days in the past, and one
// four days in the past.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1));
+ base::Time fresh(base::Time::Now() - base::TimeDelta::FromMinutes(30));
+ base::Time stale_newer(base::Time::Now() - base::TimeDelta::FromHours(47));
+ base::Time stale_older(base::Time::Now() - base::TimeDelta::FromHours(71));
- scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(2));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d1, fresh));
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now() - base::TimeDelta::FromDays(4));
- sdch_owner().SetClockForTesting(clock.Pass());
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d2,
+ stale_newer));
+
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting / 4, &server_hash_d3,
+ stale_older));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
- clock.reset(new base::SimpleTestClock);
- clock->SetNow(base::Time::Now());
- sdch_owner().SetClockForTesting(clock.Pass());
-
// Use the older dictionaries.
sdch_owner().OnDictionaryUsed(&sdch_manager(), server_hash_d2);
sdch_owner().OnDictionaryUsed(&sdch_manager(), server_hash_d3);
// The addition of a new dictionary should fail, not evicting anything.
std::string server_hash_d4;
- EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4));
+ EXPECT_FALSE(
+ CreateAndAddDictionary(kMaxSizeForTesting / 2, &server_hash_d4, fresh));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d2));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d3));
@@ -444,10 +464,12 @@ TEST_F(SdchOwnerTest, ClearReturnsSpace) {
std::string server_hash_d2;
// Take up all the space.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d1));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d1,
+ base::Time::Now()));
// Addition should fail.
- EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d2));
+ EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d2,
+ base::Time::Now()));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
@@ -457,7 +479,8 @@ TEST_F(SdchOwnerTest, ClearReturnsSpace) {
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
// Addition should now succeed.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, nullptr));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting, nullptr, base::Time::Now()));
}
// Confirm memory pressure gets all the space back.
@@ -466,10 +489,12 @@ TEST_F(SdchOwnerTest, MemoryPressureReturnsSpace) {
std::string server_hash_d2;
// Take up all the space.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d1));
+ EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d1,
+ base::Time::Now()));
// Addition should fail.
- EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d2));
+ EXPECT_FALSE(CreateAndAddDictionary(kMaxSizeForTesting, &server_hash_d2,
+ base::Time::Now()));
EXPECT_TRUE(DictionaryPresentInManager(server_hash_d1));
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
@@ -485,7 +510,8 @@ TEST_F(SdchOwnerTest, MemoryPressureReturnsSpace) {
EXPECT_FALSE(DictionaryPresentInManager(server_hash_d2));
// Addition should now succeed.
- EXPECT_TRUE(CreateAndAddDictionary(kMaxSizeForTesting, nullptr));
+ EXPECT_TRUE(
+ CreateAndAddDictionary(kMaxSizeForTesting, nullptr, base::Time::Now()));
}
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698