1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/base/expiring_cache.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <functional>
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker using testing::Pointee;
17*6777b538SAndroid Build Coastguard Worker using testing::StrEq;
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker namespace net {
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker namespace {
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker const int kMaxCacheEntries = 10;
24*6777b538SAndroid Build Coastguard Worker typedef ExpiringCache<std::string, std::string, base::TimeTicks, std::less<>>
25*6777b538SAndroid Build Coastguard Worker Cache;
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker struct TestFunctor {
operator ()net::__anoncc11fa0d0111::TestFunctor28*6777b538SAndroid Build Coastguard Worker bool operator()(const std::string& now,
29*6777b538SAndroid Build Coastguard Worker const std::string& expiration) const {
30*6777b538SAndroid Build Coastguard Worker return now != expiration;
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker };
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker } // namespace
35*6777b538SAndroid Build Coastguard Worker
TEST(ExpiringCacheTest,Basic)36*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, Basic) {
37*6777b538SAndroid Build Coastguard Worker const base::TimeDelta kTTL = base::Seconds(10);
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker Cache cache(kMaxCacheEntries);
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // Start at t=0.
42*6777b538SAndroid Build Coastguard Worker base::TimeTicks now;
43*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cache.size());
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker // Add an entry at t=0
46*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("entry1", now));
47*6777b538SAndroid Build Coastguard Worker cache.Put("entry1", "test1", now, now + kTTL);
48*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry1", now), Pointee(StrEq("test1")));
49*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cache.size());
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker // Advance to t=5.
52*6777b538SAndroid Build Coastguard Worker now += base::Seconds(5);
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker // Add an entry at t=5.
55*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("entry2", now));
56*6777b538SAndroid Build Coastguard Worker cache.Put("entry2", "test2", now, now + kTTL);
57*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry2", now), Pointee(StrEq("test2")));
58*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cache.size());
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker // Advance to t=9.
61*6777b538SAndroid Build Coastguard Worker now += base::Seconds(4);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // Verify that the entries added are still retrievable and usable.
64*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry1", now), Pointee(StrEq("test1")));
65*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry2", now), Pointee(StrEq("test2")));
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker // Advance to t=10; entry1 is now expired.
68*6777b538SAndroid Build Coastguard Worker now += base::Seconds(1);
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("entry1", now));
71*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry2", now), Pointee(StrEq("test2")));
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker // The expired element should no longer be in the cache.
74*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cache.size());
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker // Update entry1 so it is no longer expired.
77*6777b538SAndroid Build Coastguard Worker cache.Put("entry1", "test1", now, now + kTTL);
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker // Both entries should be retrievable and usable.
80*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cache.size());
81*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry1", now), Pointee(StrEq("test1")));
82*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("entry2", now), Pointee(StrEq("test2")));
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker // Advance to t=20; both entries are now expired.
85*6777b538SAndroid Build Coastguard Worker now += base::Seconds(10);
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("entry1", now));
88*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("entry2", now));
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker
TEST(ExpiringCacheTest,Compact)91*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, Compact) {
92*6777b538SAndroid Build Coastguard Worker const base::TimeDelta kTTL = base::Seconds(10);
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker Cache cache(kMaxCacheEntries);
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker // Start at t=0.
97*6777b538SAndroid Build Coastguard Worker base::TimeTicks now;
98*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cache.size());
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker // Add five valid entries at t=10 that expire at t=20.
101*6777b538SAndroid Build Coastguard Worker base::TimeTicks t10 = now + kTTL;
102*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) {
103*6777b538SAndroid Build Coastguard Worker std::string name = base::StringPrintf("valid%d", i);
104*6777b538SAndroid Build Coastguard Worker cache.Put(name, "I'm valid!", t10, t10 + kTTL);
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5U, cache.size());
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Worker // Add three entries at t=0 that expire at t=10.
109*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 3; ++i) {
110*6777b538SAndroid Build Coastguard Worker std::string name = base::StringPrintf("expired%d", i);
111*6777b538SAndroid Build Coastguard Worker cache.Put(name, "I'm expired.", now, t10);
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(8U, cache.size());
114*6777b538SAndroid Build Coastguard Worker
115*6777b538SAndroid Build Coastguard Worker // Add two negative (instantly expired) entries at t=0 that expire at t=0.
116*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) {
117*6777b538SAndroid Build Coastguard Worker std::string name = base::StringPrintf("negative%d", i);
118*6777b538SAndroid Build Coastguard Worker cache.Put(name, "I was never valid.", now, now);
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(10U, cache.size());
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid0"));
123*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid1"));
124*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid2"));
125*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid3"));
126*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid4"));
127*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "expired0"));
128*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "expired1"));
129*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "expired2"));
130*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "negative0"));
131*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "negative1"));
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker // Shrink the new max constraints bound and compact. The "negative" and
134*6777b538SAndroid Build Coastguard Worker // "expired" entries should be dropped.
135*6777b538SAndroid Build Coastguard Worker cache.max_entries_ = 6;
136*6777b538SAndroid Build Coastguard Worker cache.Compact(now);
137*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5U, cache.size());
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid0"));
140*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid1"));
141*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid2"));
142*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid3"));
143*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::Contains(cache.entries_, "valid4"));
144*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(base::Contains(cache.entries_, "expired0"));
145*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(base::Contains(cache.entries_, "expired1"));
146*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(base::Contains(cache.entries_, "expired2"));
147*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(base::Contains(cache.entries_, "negative0"));
148*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(base::Contains(cache.entries_, "negative1"));
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker // Shrink further -- this time the compact will start dropping valid entries
151*6777b538SAndroid Build Coastguard Worker // to make space.
152*6777b538SAndroid Build Coastguard Worker cache.max_entries_ = 4;
153*6777b538SAndroid Build Coastguard Worker cache.Compact(now);
154*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker
157*6777b538SAndroid Build Coastguard Worker // Add entries while the cache is at capacity, causing evictions.
TEST(ExpiringCacheTest,SetWithCompact)158*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, SetWithCompact) {
159*6777b538SAndroid Build Coastguard Worker const base::TimeDelta kTTL = base::Seconds(10);
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker Cache cache(3);
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker // t=10
164*6777b538SAndroid Build Coastguard Worker base::TimeTicks now = base::TimeTicks() + kTTL;
165*6777b538SAndroid Build Coastguard Worker
166*6777b538SAndroid Build Coastguard Worker cache.Put("test1", "test1", now, now + kTTL);
167*6777b538SAndroid Build Coastguard Worker cache.Put("test2", "test2", now, now + kTTL);
168*6777b538SAndroid Build Coastguard Worker cache.Put("expired", "expired", now, now);
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
171*6777b538SAndroid Build Coastguard Worker
172*6777b538SAndroid Build Coastguard Worker // Should all be retrievable except "expired".
173*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test1", now), Pointee(StrEq("test1")));
174*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test2", now), Pointee(StrEq("test2")));
175*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("expired", now));
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker // Adding the fourth entry will cause "expired" to be evicted.
178*6777b538SAndroid Build Coastguard Worker cache.Put("test3", "test3", now, now + kTTL);
179*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
180*6777b538SAndroid Build Coastguard Worker
181*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("expired", now));
182*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test1", now), Pointee(StrEq("test1")));
183*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test2", now), Pointee(StrEq("test2")));
184*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test3", now), Pointee(StrEq("test3")));
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker // Add two more entries. Something should be evicted, however "test5"
187*6777b538SAndroid Build Coastguard Worker // should definitely be in there (since it was last inserted).
188*6777b538SAndroid Build Coastguard Worker cache.Put("test4", "test4", now, now + kTTL);
189*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
190*6777b538SAndroid Build Coastguard Worker cache.Put("test5", "test5", now, now + kTTL);
191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
192*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test5", now), Pointee(StrEq("test5")));
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker
TEST(ExpiringCacheTest,Clear)195*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, Clear) {
196*6777b538SAndroid Build Coastguard Worker const base::TimeDelta kTTL = base::Seconds(10);
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker Cache cache(kMaxCacheEntries);
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker // Start at t=0.
201*6777b538SAndroid Build Coastguard Worker base::TimeTicks now;
202*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cache.size());
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker // Add three entries.
205*6777b538SAndroid Build Coastguard Worker cache.Put("test1", "foo", now, now + kTTL);
206*6777b538SAndroid Build Coastguard Worker cache.Put("test2", "foo", now, now + kTTL);
207*6777b538SAndroid Build Coastguard Worker cache.Put("test3", "foo", now, now + kTTL);
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
209*6777b538SAndroid Build Coastguard Worker
210*6777b538SAndroid Build Coastguard Worker cache.Clear();
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cache.size());
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker
TEST(ExpiringCacheTest,GetTruncatesExpiredEntries)215*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, GetTruncatesExpiredEntries) {
216*6777b538SAndroid Build Coastguard Worker const base::TimeDelta kTTL = base::Seconds(10);
217*6777b538SAndroid Build Coastguard Worker
218*6777b538SAndroid Build Coastguard Worker Cache cache(kMaxCacheEntries);
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard Worker // Start at t=0.
221*6777b538SAndroid Build Coastguard Worker base::TimeTicks now;
222*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cache.size());
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker // Add three entries at t=0.
225*6777b538SAndroid Build Coastguard Worker cache.Put("test1", "foo1", now, now + kTTL);
226*6777b538SAndroid Build Coastguard Worker cache.Put("test2", "foo2", now, now + kTTL);
227*6777b538SAndroid Build Coastguard Worker cache.Put("test3", "foo3", now, now + kTTL);
228*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker // Ensure the entries were added.
231*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test1", now), Pointee(StrEq("foo1")));
232*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test2", now), Pointee(StrEq("foo2")));
233*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test3", now), Pointee(StrEq("foo3")));
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker // Add five entries at t=10.
236*6777b538SAndroid Build Coastguard Worker now += kTTL;
237*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) {
238*6777b538SAndroid Build Coastguard Worker std::string name = base::StringPrintf("valid%d", i);
239*6777b538SAndroid Build Coastguard Worker cache.Put(name, name, now, now + kTTL); // Expire at t=20.
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(8U, cache.size());
242*6777b538SAndroid Build Coastguard Worker
243*6777b538SAndroid Build Coastguard Worker // Now access two expired entries and ensure the cache size goes down.
244*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("test1", now));
245*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("test2", now));
246*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(6U, cache.size());
247*6777b538SAndroid Build Coastguard Worker
248*6777b538SAndroid Build Coastguard Worker // Accessing non-expired entries should return entries and not adjust the
249*6777b538SAndroid Build Coastguard Worker // cache size.
250*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 5; ++i) {
251*6777b538SAndroid Build Coastguard Worker std::string name = base::StringPrintf("valid%d", i);
252*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get(name, now), Pointee(StrEq(name)));
253*6777b538SAndroid Build Coastguard Worker }
254*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(6U, cache.size());
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker
TEST(ExpiringCacheTest,CustomFunctor)257*6777b538SAndroid Build Coastguard Worker TEST(ExpiringCacheTest, CustomFunctor) {
258*6777b538SAndroid Build Coastguard Worker ExpiringCache<std::string, std::string, std::string, TestFunctor> cache(5);
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard Worker const std::string kNow("Now");
261*6777b538SAndroid Build Coastguard Worker const std::string kLater("A little bit later");
262*6777b538SAndroid Build Coastguard Worker const std::string kMuchLater("Much later");
263*6777b538SAndroid Build Coastguard Worker const std::string kHeatDeath("The heat death of the universe");
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, cache.size());
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker // Add three entries at t=kNow that expire at kLater.
268*6777b538SAndroid Build Coastguard Worker cache.Put("test1", "foo1", kNow, kLater);
269*6777b538SAndroid Build Coastguard Worker cache.Put("test2", "foo2", kNow, kLater);
270*6777b538SAndroid Build Coastguard Worker cache.Put("test3", "foo3", kNow, kLater);
271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker // Add two entries at t=kNow that expire at kMuchLater
274*6777b538SAndroid Build Coastguard Worker cache.Put("test4", "foo4", kNow, kMuchLater);
275*6777b538SAndroid Build Coastguard Worker cache.Put("test5", "foo5", kNow, kMuchLater);
276*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5U, cache.size());
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker // Ensure the entries were added.
279*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test1", kNow), Pointee(StrEq("foo1")));
280*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test2", kNow), Pointee(StrEq("foo2")));
281*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test3", kNow), Pointee(StrEq("foo3")));
282*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test4", kNow), Pointee(StrEq("foo4")));
283*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test5", kNow), Pointee(StrEq("foo5")));
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker // Add one entry at t=kLater that expires at kHeatDeath, which will expire
286*6777b538SAndroid Build Coastguard Worker // one of test1-3.
287*6777b538SAndroid Build Coastguard Worker cache.Put("test6", "foo6", kLater, kHeatDeath);
288*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test6", kLater), Pointee(StrEq("foo6")));
289*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cache.size());
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker // Now compact at kMuchLater, which should remove all but "test6".
292*6777b538SAndroid Build Coastguard Worker cache.max_entries_ = 2;
293*6777b538SAndroid Build Coastguard Worker cache.Compact(kMuchLater);
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cache.size());
296*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test6", kMuchLater), Pointee(StrEq("foo6")));
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker // Finally, "test6" should not be valid at the end of the universe.
299*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("test6", kHeatDeath));
300*6777b538SAndroid Build Coastguard Worker
301*6777b538SAndroid Build Coastguard Worker // Because comparison is based on equality, not strict weak ordering, we
302*6777b538SAndroid Build Coastguard Worker // should be able to add something at kHeatDeath that expires at kMuchLater.
303*6777b538SAndroid Build Coastguard Worker cache.Put("test7", "foo7", kHeatDeath, kMuchLater);
304*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cache.size());
305*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test7", kNow), Pointee(StrEq("foo7")));
306*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test7", kLater), Pointee(StrEq("foo7")));
307*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cache.Get("test7", kHeatDeath), Pointee(StrEq("foo7")));
308*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cache.Get("test7", kMuchLater));
309*6777b538SAndroid Build Coastguard Worker }
310*6777b538SAndroid Build Coastguard Worker
311*6777b538SAndroid Build Coastguard Worker } // namespace net
312