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