1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/host_cache.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/format_macros.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/stl_util-inl.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_util.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst int kMaxCacheEntries = 10;
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst base::TimeDelta kSuccessEntryTTL = base::TimeDelta::FromSeconds(10);
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst base::TimeDelta kFailureEntryTTL = base::TimeDelta::FromSeconds(0);
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Builds a key for |hostname|, defaulting the address family to unspecified.
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottHostCache::Key Key(const std::string& hostname) {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return HostCache::Key(hostname, ADDRESS_FAMILY_UNSPECIFIED, 0);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, Basic) {
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Start at t=0.
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry1 = NULL;  // Entry for foobar.com.
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry2 = NULL;  // Entry for foobar2.com.
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0U, cache.size());
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for "foobar.com" at t=0.
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), base::TimeTicks()) == NULL);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), OK, AddressList(), now);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = cache.Lookup(Key("foobar.com"), base::TimeTicks());
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(entry1 == NULL);
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, cache.size());
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=5.
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(5);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for "foobar2.com" at t=5.
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar2.com"), base::TimeTicks()) == NULL);
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar2.com"), OK, AddressList(), now);
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2 = cache.Lookup(Key("foobar2.com"), base::TimeTicks());
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(NULL == entry1);
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2U, cache.size());
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=9
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(4);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Verify that the entries we added are still retrievable, and usable.
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=10; entry1 is now expired.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(1);
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Update entry1, so it is no longer expired.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), OK, AddressList(), now);
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Re-uses existing entry storage.
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2U, cache.size());
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Both entries should still be retrievable and usable.
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=20; both entries are now expired.
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(10);
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar2.com"), now) == NULL);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Try caching entries for a failed resolve attempt -- since we set
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the TTL of such entries to 0 it won't work.
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, NoCacheNegative) {
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Set t=0.
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), base::TimeTicks()) == NULL);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), ERR_NAME_NOT_RESOLVED, AddressList(), now);
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, cache.size());
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We disallow use of negative entries.
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now overwrite with a valid entry, and then overwrite with negative entry
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // again -- the valid entry should be kicked out.
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), OK, AddressList(), now);
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(cache.Lookup(Key("foobar.com"), now) == NULL);
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), ERR_NAME_NOT_RESOLVED, AddressList(), now);
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Try caching entries for a failed resolves for 10 seconds.
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, CacheNegativeEntry) {
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries,
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                  base::TimeDelta::FromSeconds(0), // success entry TTL.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                  base::TimeDelta::FromSeconds(10)); // failure entry TTL.
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Start at t=0.
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry1 = NULL;  // Entry for foobar.com.
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry2 = NULL;  // Entry for foobar2.com.
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0U, cache.size());
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for "foobar.com" at t=0.
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), base::TimeTicks()) == NULL);
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), ERR_NAME_NOT_RESOLVED, AddressList(), now);
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = cache.Lookup(Key("foobar.com"), base::TimeTicks());
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(entry1 == NULL);
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, cache.size());
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=5.
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(5);
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for "foobar2.com" at t=5.
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar2.com"), base::TimeTicks()) == NULL);
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar2.com"), ERR_NAME_NOT_RESOLVED, AddressList(), now);
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2 = cache.Lookup(Key("foobar2.com"), base::TimeTicks());
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(NULL == entry1);
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2U, cache.size());
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=9
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(4);
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Verify that the entries we added are still retrievable, and usable.
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=10; entry1 is now expired.
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(1);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Update entry1, so it is no longer expired.
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), ERR_NAME_NOT_RESOLVED, AddressList(), now);
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Re-uses existing entry storage.
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2U, cache.size());
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Both entries should still be retrievable and usable.
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry1, cache.Lookup(Key("foobar.com"), now));
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(entry2, cache.Lookup(Key("foobar2.com"), now));
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Advance to t=20; both entries are now expired.
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  now += base::TimeDelta::FromSeconds(10);
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), now) == NULL);
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar2.com"), now) == NULL);
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, Compact) {
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Initial entries limit is big enough to accomadate everything we add.
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0U, cache.size());
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // t=10
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now = base::TimeTicks() + base::TimeDelta::FromSeconds(10);
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add five valid entries at t=10.
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 5; ++i) {
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string hostname = base::StringPrintf("valid%d", i);
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    cache.Set(Key(hostname), OK, AddressList(), now);
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(5U, cache.size());
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add 3 expired entries at t=0.
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 3; ++i) {
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string hostname = base::StringPrintf("expired%d", i);
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    base::TimeTicks t = now - base::TimeDelta::FromSeconds(10);
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    cache.Set(Key(hostname), OK, AddressList(), t);
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(8U, cache.size());
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add 2 negative entries at t=10
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 2; ++i) {
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string hostname = base::StringPrintf("negative%d", i);
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    cache.Set(Key(hostname), ERR_NAME_NOT_RESOLVED, AddressList(), now);
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(10U, cache.size());
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid0")));
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid1")));
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid2")));
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid3")));
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid4")));
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("expired0")));
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("expired1")));
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("expired2")));
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("negative0")));
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("negative1")));
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Shrink the max constraints bound and compact. We expect the "negative"
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // and "expired" entries to have been dropped.
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.max_entries_ = 5;
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Compact(now, NULL);
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(5U, cache.entries_.size());
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid0")));
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid1")));
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid2")));
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid3")));
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ContainsKey(cache.entries_, Key("valid4")));
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ContainsKey(cache.entries_, Key("expired0")));
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ContainsKey(cache.entries_, Key("expired1")));
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ContainsKey(cache.entries_, Key("expired2")));
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ContainsKey(cache.entries_, Key("negative0")));
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ContainsKey(cache.entries_, Key("negative1")));
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Shrink further -- this time the compact will start dropping valid entries
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to make space.
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.max_entries_ = 3;
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Compact(now, NULL);
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3U, cache.size());
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Add entries while the cache is at capacity, causing evictions.
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, SetWithCompact) {
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(3, kSuccessEntryTTL, kFailureEntryTTL);
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // t=10
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now = base::TimeTicks() + kSuccessEntryTTL;
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("host1"), OK, AddressList(), now);
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("host2"), OK, AddressList(), now);
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("expired"), OK, AddressList(), now - kSuccessEntryTTL);
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3U, cache.size());
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Should all be retrievable except "expired".
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(NULL == cache.Lookup(Key("host1"), now));
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(NULL == cache.Lookup(Key("host2"), now));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(NULL == cache.Lookup(Key("expired"), now));
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Adding the fourth entry will cause "expired" to be evicted.
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("host3"), OK, AddressList(), now);
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3U, cache.size());
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("expired"), now) == NULL);
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(cache.Lookup(Key("host1"), now) == NULL);
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(cache.Lookup(Key("host2"), now) == NULL);
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(cache.Lookup(Key("host3"), now) == NULL);
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add two more entries. Something should be evicted, however "host5"
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // should definitely be in there (since it was last inserted).
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("host4"), OK, AddressList(), now);
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3U, cache.size());
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("host5"), OK, AddressList(), now);
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3U, cache.size());
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(cache.Lookup(Key("host5"), now) == NULL);
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests that the same hostname can be duplicated in the cache, so long as
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the address family differs.
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, AddressFamilyIsPartOfKey) {
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // t=0.
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostCache::Key key1("foobar.com", ADDRESS_FAMILY_UNSPECIFIED, 0);
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostCache::Key key2("foobar.com", ADDRESS_FAMILY_IPV4, 0);
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry1 = NULL;  // Entry for key1
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const HostCache::Entry* entry2 = NULL;  // Entry for key2
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0U, cache.size());
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for ("foobar.com", UNSPECIFIED) at t=0.
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(key1, base::TimeTicks()) == NULL);
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(key1, OK, AddressList(), now);
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry1 = cache.Lookup(key1, base::TimeTicks());
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(entry1 == NULL);
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, cache.size());
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add an entry for ("foobar.com", IPV4_ONLY) at t=0.
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(key2, base::TimeTicks()) == NULL);
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(key2, OK, AddressList(), now);
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  entry2 = cache.Lookup(key2, base::TimeTicks());
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(entry2 == NULL);
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2U, cache.size());
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Even though the hostnames were the same, we should have two unique
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // entries (because the address families differ).
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(entry1, entry2);
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the same hostname can be duplicated in the cache, so long as
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the HostResolverFlags differ.
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HostCacheTest, HostResolverFlagsArePartOfKey) {
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // t=0.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks now;
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostCache::Key key1("foobar.com", ADDRESS_FAMILY_IPV4, 0);
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HostCache::Key key2("foobar.com", ADDRESS_FAMILY_IPV4,
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      HOST_RESOLVER_CANONNAME);
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HostCache::Key key3("foobar.com", ADDRESS_FAMILY_IPV4,
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      HOST_RESOLVER_LOOPBACK_ONLY);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const HostCache::Entry* entry1 = NULL;  // Entry for key1
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const HostCache::Entry* entry2 = NULL;  // Entry for key2
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const HostCache::Entry* entry3 = NULL;  // Entry for key3
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0U, cache.size());
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add an entry for ("foobar.com", IPV4, NONE) at t=0.
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(cache.Lookup(key1, base::TimeTicks()) == NULL);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  cache.Set(key1, OK, AddressList(), now);
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry1 = cache.Lookup(key1, base::TimeTicks());
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(entry1 == NULL);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1U, cache.size());
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add an entry for ("foobar.com", IPV4, CANONNAME) at t=0.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(cache.Lookup(key2, base::TimeTicks()) == NULL);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  cache.Set(key2, OK, AddressList(), now);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry2 = cache.Lookup(key2, base::TimeTicks());
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(entry2 == NULL);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2U, cache.size());
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Add an entry for ("foobar.com", IPV4, LOOPBACK_ONLY) at t=0.
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(cache.Lookup(key3, base::TimeTicks()) == NULL);
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cache.Set(key3, OK, AddressList(), now);
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  entry3 = cache.Lookup(key3, base::TimeTicks());
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(entry3 == NULL);
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(3U, cache.size());
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Even though the hostnames were the same, we should have two unique
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // entries (because the HostResolverFlags differ).
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(entry1, entry2);
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NE(entry1, entry3);
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NE(entry2, entry3);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, NoCache) {
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Disable caching.
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(0, kSuccessEntryTTL, kFailureEntryTTL);
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.caching_is_disabled());
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Set t=0.
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Lookup and Set should have no effect.
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), base::TimeTicks()) == NULL);
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar.com"), OK, AddressList(), now);
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(cache.Lookup(Key("foobar.com"), base::TimeTicks()) == NULL);
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0U, cache.size());
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, Clear) {
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HostCache cache(kMaxCacheEntries, kSuccessEntryTTL, kFailureEntryTTL);
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Set t=0.
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::TimeTicks now;
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0u, cache.size());
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Add three entries.
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar1.com"), OK, AddressList(), now);
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar2.com"), OK, AddressList(), now);
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.Set(Key("foobar3.com"), OK, AddressList(), now);
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3u, cache.size());
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache.clear();
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0u, cache.size());
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests the less than and equal operators for HostCache::Key work.
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HostCacheTest, KeyComparators) {
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct {
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Inputs.
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    HostCache::Key key1;
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    HostCache::Key key2;
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Expectation.
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //   -1 means key1 is less than key2
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //    0 means key1 equals key2
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //    1 means key1 is greater than key2
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int expected_comparison;
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } tests[] = {
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_IPV4, 0),
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_IPV4, 0),
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      -1
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host2", ADDRESS_FAMILY_UNSPECIFIED, 0),
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      -1
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    },
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_IPV4, 0),
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host2", ADDRESS_FAMILY_UNSPECIFIED, 0),
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      1
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    },
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host2", ADDRESS_FAMILY_IPV4, 0),
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      -1
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    },
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        {
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED,
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     HOST_RESOLVER_CANONNAME),
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      -1
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED,
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     HOST_RESOLVER_CANONNAME),
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED, 0),
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      1
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host1", ADDRESS_FAMILY_UNSPECIFIED,
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     HOST_RESOLVER_CANONNAME),
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      HostCache::Key("host2", ADDRESS_FAMILY_UNSPECIFIED,
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     HOST_RESOLVER_CANONNAME),
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      -1
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    },
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]", i));
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const HostCache::Key& key1 = tests[i].key1;
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const HostCache::Key& key2 = tests[i].key2;
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    switch (tests[i].expected_comparison) {
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      case -1:
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_TRUE(key1 < key2);
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key2 < key1);
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key2 == key1);
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      case 0:
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key1 < key2);
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key2 < key1);
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_TRUE(key2 == key1);
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      case 1:
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key1 < key2);
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_TRUE(key2 < key1);
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        EXPECT_FALSE(key2 == key1);
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      default:
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        FAIL() << "Invalid expectation. Can be only -1, 0, 1";
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
484