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 |