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

Unified Diff: net/dns/host_cache_unittest.cc

Issue 2791653002: Serialize and deserialize HostCache for persistence (Closed)
Patch Set: fix warning Created 3 years, 7 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
« no previous file with comments | « net/dns/host_cache.cc ('k') | net/log/net_log_util.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/dns/host_cache_unittest.cc
diff --git a/net/dns/host_cache_unittest.cc b/net/dns/host_cache_unittest.cc
index 5f35f2e17c38e7f2b7a83ab7d3141afaa1d86634..15a43e3c5cda78c79898dfe94b585baad1a07a0e 100644
--- a/net/dns/host_cache_unittest.cc
+++ b/net/dns/host_cache_unittest.cc
@@ -12,6 +12,7 @@
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "base/values.h"
#include "net/base/net_errors.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -640,4 +641,115 @@ TEST(HostCacheTest, KeyComparators) {
}
}
+TEST(HostCacheTest, SerializeAndDeserialize) {
+ const base::TimeDelta kTTL = base::TimeDelta::FromSeconds(10);
+
+ HostCache cache(kMaxCacheEntries);
+
+ // Start at t=0.
+ base::TimeTicks now;
+
+ HostCache::Key key1 = Key("foobar.com");
+ HostCache::Key key2 = Key("foobar2.com");
+ HostCache::Key key3 = Key("foobar3.com");
+ HostCache::Key key4 = Key("foobar4.com");
+
+ IPAddress address_ipv4(1, 2, 3, 4);
+ IPAddress address_ipv6(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ IPEndPoint endpoint_ipv4(address_ipv4, 0);
+ IPEndPoint endpoint_ipv6(address_ipv6, 0);
+
+ HostCache::Entry entry1 = HostCache::Entry(OK, AddressList(endpoint_ipv4));
+ AddressList addresses2 = AddressList(endpoint_ipv6);
+ addresses2.push_back(endpoint_ipv4);
+ HostCache::Entry entry2 = HostCache::Entry(OK, addresses2);
+ HostCache::Entry entry3 = HostCache::Entry(OK, AddressList(endpoint_ipv6));
+ HostCache::Entry entry4 = HostCache::Entry(OK, AddressList(endpoint_ipv4));
+
+ EXPECT_EQ(0u, cache.size());
+
+ // Add an entry for "foobar.com" at t=0.
+ EXPECT_FALSE(cache.Lookup(key1, now));
+ cache.Set(key1, entry1, now, kTTL);
+ EXPECT_TRUE(cache.Lookup(key1, now));
+ EXPECT_TRUE(cache.Lookup(key1, now)->error() == entry1.error());
+
+ EXPECT_EQ(1u, cache.size());
+
+ // Advance to t=5.
+ now += base::TimeDelta::FromSeconds(5);
+
+ // Add entries for "foobar2.com" and "foobar3.com" at t=5.
+ EXPECT_FALSE(cache.Lookup(key2, now));
+ cache.Set(key2, entry2, now, kTTL);
+ EXPECT_TRUE(cache.Lookup(key2, now));
+ EXPECT_EQ(2u, cache.size());
+
+ EXPECT_FALSE(cache.Lookup(key3, now));
+ cache.Set(key3, entry3, now, kTTL);
+ EXPECT_TRUE(cache.Lookup(key3, now));
+ EXPECT_EQ(3u, cache.size());
+
+ // Advance to t=12, ansd serialize the cache.
+ now += base::TimeDelta::FromSeconds(7);
+
+ std::unique_ptr<base::ListValue> serialized_cache =
+ cache.GetAsListValue(/*include_staleness=*/false);
+ HostCache restored_cache(kMaxCacheEntries);
+
+ // Add entries for "foobar3.com" and "foobar4.com" to the cache before
+ // restoring it. The "foobar3.com" result is different from the original.
+ EXPECT_FALSE(restored_cache.Lookup(key3, now));
+ restored_cache.Set(key3, entry1, now, kTTL);
+ EXPECT_TRUE(restored_cache.Lookup(key3, now));
+ EXPECT_EQ(1u, restored_cache.size());
+
+ EXPECT_FALSE(restored_cache.Lookup(key4, now));
+ restored_cache.Set(key4, entry4, now, kTTL);
+ EXPECT_TRUE(restored_cache.Lookup(key4, now));
+ EXPECT_EQ(2u, restored_cache.size());
+
+ restored_cache.RestoreFromListValue(*serialized_cache);
+
+ HostCache::EntryStaleness stale;
+
+ // The "foobar.com" entry is stale due to both network changes and expiration
+ // time.
+ EXPECT_FALSE(restored_cache.Lookup(key1, now));
+ const HostCache::Entry* result1 =
+ restored_cache.LookupStale(key1, now, &stale);
+ EXPECT_TRUE(result1);
+ EXPECT_EQ(1u, result1->addresses().size());
+ EXPECT_EQ(address_ipv4, result1->addresses().front().address());
+ EXPECT_EQ(1, stale.network_changes);
+ // Time to TimeTicks conversion is fuzzy, so just check that expected and
+ // actual expiration times are close.
+ EXPECT_GT(base::TimeDelta::FromMilliseconds(1),
+ (base::TimeDelta::FromSeconds(2) - stale.expired_by).magnitude());
+
+ // The "foobar2.com" entry is stale only due to network changes.
+ EXPECT_FALSE(restored_cache.Lookup(key2, now));
+ const HostCache::Entry* result2 =
+ restored_cache.LookupStale(key2, now, &stale);
+ EXPECT_TRUE(result2);
+ EXPECT_EQ(2u, result2->addresses().size());
+ EXPECT_EQ(address_ipv6, result2->addresses().front().address());
+ EXPECT_EQ(address_ipv4, result2->addresses().back().address());
+ EXPECT_EQ(1, stale.network_changes);
+ EXPECT_GT(base::TimeDelta::FromMilliseconds(1),
+ (base::TimeDelta::FromSeconds(-3) - stale.expired_by).magnitude());
+
+ // The "foobar3.com" entry is the new one, not the restored one.
+ const HostCache::Entry* result3 = restored_cache.Lookup(key3, now);
+ EXPECT_TRUE(result3);
+ EXPECT_EQ(1u, result3->addresses().size());
+ EXPECT_EQ(address_ipv4, result3->addresses().front().address());
+
+ // The "foobar4.com" entry is still present and usable.
+ const HostCache::Entry* result4 = restored_cache.Lookup(key4, now);
+ EXPECT_TRUE(result4);
+ EXPECT_EQ(1u, result4->addresses().size());
+ EXPECT_EQ(address_ipv4, result4->addresses().front().address());
+}
+
} // namespace net
« no previous file with comments | « net/dns/host_cache.cc ('k') | net/log/net_log_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698