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

Side by Side Diff: net/ssl/ssl_client_session_cache_unittest.cc

Issue 2625883002: SSLClientSessionCache: Log number of times Lookup is called per Session. (Closed)
Patch Set: reply to comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/ssl/ssl_client_session_cache.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/ssl/ssl_client_session_cache.h" 5 #include "net/ssl/ssl_client_session_cache.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/test/simple_test_clock.h" 10 #include "base/test/simple_test_clock.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 SSLClientSessionCache::Config config; 43 SSLClientSessionCache::Config config;
44 SSLClientSessionCache cache(config); 44 SSLClientSessionCache cache(config);
45 45
46 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new()); 46 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new());
47 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new()); 47 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new());
48 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new()); 48 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new());
49 EXPECT_EQ(1u, session1->references); 49 EXPECT_EQ(1u, session1->references);
50 EXPECT_EQ(1u, session2->references); 50 EXPECT_EQ(1u, session2->references);
51 EXPECT_EQ(1u, session3->references); 51 EXPECT_EQ(1u, session3->references);
52 52
53 EXPECT_EQ(nullptr, cache.Lookup("key1").get()); 53 EXPECT_EQ(nullptr, cache.Lookup("key1", nullptr).get());
54 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 54 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
55 EXPECT_EQ(0u, cache.size()); 55 EXPECT_EQ(0u, cache.size());
56 56
57 cache.Insert("key1", session1.get()); 57 cache.Insert("key1", session1.get());
58 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 58 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
59 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 59 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
60 EXPECT_EQ(1u, cache.size()); 60 EXPECT_EQ(1u, cache.size());
61 61
62 cache.Insert("key2", session2.get()); 62 cache.Insert("key2", session2.get());
63 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 63 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
64 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 64 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
65 EXPECT_EQ(2u, cache.size()); 65 EXPECT_EQ(2u, cache.size());
66 66
67 EXPECT_EQ(2u, session1->references); 67 EXPECT_EQ(2u, session1->references);
68 EXPECT_EQ(2u, session2->references); 68 EXPECT_EQ(2u, session2->references);
69 69
70 cache.Insert("key1", session3.get()); 70 cache.Insert("key1", session3.get());
71 EXPECT_EQ(session3.get(), cache.Lookup("key1").get()); 71 EXPECT_EQ(session3.get(), cache.Lookup("key1", nullptr).get());
72 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 72 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
73 EXPECT_EQ(2u, cache.size()); 73 EXPECT_EQ(2u, cache.size());
74 74
75 EXPECT_EQ(1u, session1->references); 75 EXPECT_EQ(1u, session1->references);
76 EXPECT_EQ(2u, session2->references); 76 EXPECT_EQ(2u, session2->references);
77 EXPECT_EQ(2u, session3->references); 77 EXPECT_EQ(2u, session3->references);
78 78
79 cache.Flush(); 79 cache.Flush();
80 EXPECT_EQ(nullptr, cache.Lookup("key1").get()); 80 EXPECT_EQ(nullptr, cache.Lookup("key1", nullptr).get());
81 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 81 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
82 EXPECT_EQ(nullptr, cache.Lookup("key3").get()); 82 EXPECT_EQ(nullptr, cache.Lookup("key3", nullptr).get());
83 EXPECT_EQ(0u, cache.size()); 83 EXPECT_EQ(0u, cache.size());
84 84
85 EXPECT_EQ(1u, session1->references); 85 EXPECT_EQ(1u, session1->references);
86 EXPECT_EQ(1u, session2->references); 86 EXPECT_EQ(1u, session2->references);
87 EXPECT_EQ(1u, session3->references); 87 EXPECT_EQ(1u, session3->references);
88 } 88 }
89 89
90 // Test that pairs of calls to Lookup/ResetLookupCount appropriately log to
91 // UMA.
92 TEST(SSLClientSessionCacheTest, LookupCountUMA) {
93 SSLClientSessionCache::Config config;
94 SSLClientSessionCache cache(config);
95
96 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new());
97 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new());
98 cache.Insert("key1", session1.get());
99 cache.Insert("key2", session2.get());
100
101 // Test that the count returned increments when multiple lookups of the same
102 // key/session occur before the count is reset.
103 int count;
104 EXPECT_EQ(session1.get(), cache.Lookup("key1", &count).get());
105 EXPECT_EQ(1, count);
106 EXPECT_EQ(session1.get(), cache.Lookup("key1", &count).get());
107 EXPECT_EQ(2, count);
108 cache.ResetLookupCount("key1");
109 EXPECT_EQ(session1.get(), cache.Lookup("key1", &count).get());
110 cache.ResetLookupCount("key1");
111 EXPECT_EQ(1, count);
112
113 // Test that independent keys are logged separately.
114 EXPECT_EQ(session1.get(), cache.Lookup("key1", &count).get());
115 EXPECT_EQ(1, count);
116 EXPECT_EQ(session2.get(), cache.Lookup("key2", &count).get());
117 EXPECT_EQ(1, count);
118
119 // Test that the count is 0 if there is a cache miss.
120 EXPECT_EQ(nullptr, cache.Lookup("not present", &count).get());
121 EXPECT_EQ(0, count);
122
123 // Check that ResetLookupCount doesn't explode if there's a cache miss.
124 cache.ResetLookupCount("not present");
125
126 EXPECT_EQ(2u, cache.size());
127 }
128
90 // Test that a session may be inserted at two different keys. This should never 129 // Test that a session may be inserted at two different keys. This should never
91 // be necessary, but the API doesn't prohibit it. 130 // be necessary, but the API doesn't prohibit it.
92 TEST(SSLClientSessionCacheTest, DoubleInsert) { 131 TEST(SSLClientSessionCacheTest, DoubleInsert) {
93 SSLClientSessionCache::Config config; 132 SSLClientSessionCache::Config config;
94 SSLClientSessionCache cache(config); 133 SSLClientSessionCache cache(config);
95 134
96 bssl::UniquePtr<SSL_SESSION> session(SSL_SESSION_new()); 135 bssl::UniquePtr<SSL_SESSION> session(SSL_SESSION_new());
97 EXPECT_EQ(1u, session->references); 136 EXPECT_EQ(1u, session->references);
98 137
99 EXPECT_EQ(nullptr, cache.Lookup("key1").get()); 138 EXPECT_EQ(nullptr, cache.Lookup("key1", nullptr).get());
100 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 139 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
101 EXPECT_EQ(0u, cache.size()); 140 EXPECT_EQ(0u, cache.size());
102 141
103 cache.Insert("key1", session.get()); 142 cache.Insert("key1", session.get());
104 EXPECT_EQ(session.get(), cache.Lookup("key1").get()); 143 EXPECT_EQ(session.get(), cache.Lookup("key1", nullptr).get());
105 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 144 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
106 EXPECT_EQ(1u, cache.size()); 145 EXPECT_EQ(1u, cache.size());
107 146
108 EXPECT_EQ(2u, session->references); 147 EXPECT_EQ(2u, session->references);
109 148
110 cache.Insert("key2", session.get()); 149 cache.Insert("key2", session.get());
111 EXPECT_EQ(session.get(), cache.Lookup("key1").get()); 150 EXPECT_EQ(session.get(), cache.Lookup("key1", nullptr).get());
112 EXPECT_EQ(session.get(), cache.Lookup("key2").get()); 151 EXPECT_EQ(session.get(), cache.Lookup("key2", nullptr).get());
113 EXPECT_EQ(2u, cache.size()); 152 EXPECT_EQ(2u, cache.size());
114 153
115 EXPECT_EQ(3u, session->references); 154 EXPECT_EQ(3u, session->references);
116 155
117 cache.Flush(); 156 cache.Flush();
118 EXPECT_EQ(nullptr, cache.Lookup("key1").get()); 157 EXPECT_EQ(nullptr, cache.Lookup("key1", nullptr).get());
119 EXPECT_EQ(nullptr, cache.Lookup("key2").get()); 158 EXPECT_EQ(nullptr, cache.Lookup("key2", nullptr).get());
120 EXPECT_EQ(0u, cache.size()); 159 EXPECT_EQ(0u, cache.size());
121 160
122 EXPECT_EQ(1u, session->references); 161 EXPECT_EQ(1u, session->references);
123 } 162 }
124 163
125 // Tests that the session cache's size is correctly bounded. 164 // Tests that the session cache's size is correctly bounded.
126 TEST(SSLClientSessionCacheTest, MaxEntries) { 165 TEST(SSLClientSessionCacheTest, MaxEntries) {
127 SSLClientSessionCache::Config config; 166 SSLClientSessionCache::Config config;
128 config.max_entries = 3; 167 config.max_entries = 3;
129 SSLClientSessionCache cache(config); 168 SSLClientSessionCache cache(config);
130 169
131 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new()); 170 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new());
132 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new()); 171 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new());
133 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new()); 172 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new());
134 bssl::UniquePtr<SSL_SESSION> session4(SSL_SESSION_new()); 173 bssl::UniquePtr<SSL_SESSION> session4(SSL_SESSION_new());
135 174
136 // Insert three entries. 175 // Insert three entries.
137 cache.Insert("key1", session1.get()); 176 cache.Insert("key1", session1.get());
138 cache.Insert("key2", session2.get()); 177 cache.Insert("key2", session2.get());
139 cache.Insert("key3", session3.get()); 178 cache.Insert("key3", session3.get());
140 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 179 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
141 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 180 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
142 EXPECT_EQ(session3.get(), cache.Lookup("key3").get()); 181 EXPECT_EQ(session3.get(), cache.Lookup("key3", nullptr).get());
143 EXPECT_EQ(3u, cache.size()); 182 EXPECT_EQ(3u, cache.size());
144 183
145 // On insertion of a fourth, the first is removed. 184 // On insertion of a fourth, the first is removed.
146 cache.Insert("key4", session4.get()); 185 cache.Insert("key4", session4.get());
147 EXPECT_EQ(nullptr, cache.Lookup("key1").get()); 186 EXPECT_EQ(nullptr, cache.Lookup("key1", nullptr).get());
148 EXPECT_EQ(session4.get(), cache.Lookup("key4").get()); 187 EXPECT_EQ(session4.get(), cache.Lookup("key4", nullptr).get());
149 EXPECT_EQ(session3.get(), cache.Lookup("key3").get()); 188 EXPECT_EQ(session3.get(), cache.Lookup("key3", nullptr).get());
150 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 189 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
151 EXPECT_EQ(3u, cache.size()); 190 EXPECT_EQ(3u, cache.size());
152 191
153 // Despite being newest, the next to be removed is session4 as it was accessed 192 // Despite being newest, the next to be removed is session4 as it was accessed
154 // least. recently. 193 // least. recently.
155 cache.Insert("key1", session1.get()); 194 cache.Insert("key1", session1.get());
156 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 195 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
157 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 196 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
158 EXPECT_EQ(session3.get(), cache.Lookup("key3").get()); 197 EXPECT_EQ(session3.get(), cache.Lookup("key3", nullptr).get());
159 EXPECT_EQ(nullptr, cache.Lookup("key4").get()); 198 EXPECT_EQ(nullptr, cache.Lookup("key4", nullptr).get());
160 EXPECT_EQ(3u, cache.size()); 199 EXPECT_EQ(3u, cache.size());
161 } 200 }
162 201
163 // Tests that session expiration works properly. 202 // Tests that session expiration works properly.
164 TEST(SSLClientSessionCacheTest, Expiration) { 203 TEST(SSLClientSessionCacheTest, Expiration) {
165 const size_t kNumEntries = 20; 204 const size_t kNumEntries = 20;
166 const size_t kExpirationCheckCount = 10; 205 const size_t kExpirationCheckCount = 10;
167 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000); 206 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000);
168 207
169 SSLClientSessionCache::Config config; 208 SSLClientSessionCache::Config config;
(...skipping 15 matching lines...) Expand all
185 bssl::UniquePtr<SSL_SESSION> session = 224 bssl::UniquePtr<SSL_SESSION> session =
186 MakeTestSession(clock->Now(), kTimeout); 225 MakeTestSession(clock->Now(), kTimeout);
187 cache.Insert("key", session.get()); 226 cache.Insert("key", session.get());
188 227
189 // All entries are still in the cache. 228 // All entries are still in the cache.
190 EXPECT_EQ(kNumEntries, cache.size()); 229 EXPECT_EQ(kNumEntries, cache.size());
191 230
192 // Perform one fewer lookup than needed to trigger the expiration check. This 231 // Perform one fewer lookup than needed to trigger the expiration check. This
193 // shall not expire any session. 232 // shall not expire any session.
194 for (size_t i = 0; i < kExpirationCheckCount - 1; i++) 233 for (size_t i = 0; i < kExpirationCheckCount - 1; i++)
195 cache.Lookup("key"); 234 cache.Lookup("key", nullptr);
196 235
197 // All entries are still in the cache. 236 // All entries are still in the cache.
198 EXPECT_EQ(kNumEntries, cache.size()); 237 EXPECT_EQ(kNumEntries, cache.size());
199 238
200 // Perform one more lookup. This will expire all sessions but the last one. 239 // Perform one more lookup. This will expire all sessions but the last one.
201 cache.Lookup("key"); 240 cache.Lookup("key", nullptr);
202 EXPECT_EQ(1u, cache.size()); 241 EXPECT_EQ(1u, cache.size());
203 EXPECT_EQ(session.get(), cache.Lookup("key").get()); 242 EXPECT_EQ(session.get(), cache.Lookup("key", nullptr).get());
204 for (size_t i = 0; i < kNumEntries - 1; i++) { 243 for (size_t i = 0; i < kNumEntries - 1; i++) {
205 SCOPED_TRACE(i); 244 SCOPED_TRACE(i);
206 EXPECT_EQ(nullptr, cache.Lookup(base::SizeTToString(i))); 245 EXPECT_EQ(nullptr, cache.Lookup(base::SizeTToString(i), nullptr));
207 } 246 }
208 } 247 }
209 248
210 // Tests that Lookup performs an expiration check before returning a cached 249 // Tests that Lookup performs an expiration check before returning a cached
211 // session. 250 // session.
212 TEST(SSLClientSessionCacheTest, LookupExpirationCheck) { 251 TEST(SSLClientSessionCacheTest, LookupExpirationCheck) {
213 // kExpirationCheckCount is set to a suitably large number so the automated 252 // kExpirationCheckCount is set to a suitably large number so the automated
214 // pruning never triggers. 253 // pruning never triggers.
215 const size_t kExpirationCheckCount = 1000; 254 const size_t kExpirationCheckCount = 1000;
216 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000); 255 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000);
217 256
218 SSLClientSessionCache::Config config; 257 SSLClientSessionCache::Config config;
219 config.expiration_check_count = kExpirationCheckCount; 258 config.expiration_check_count = kExpirationCheckCount;
220 SSLClientSessionCache cache(config); 259 SSLClientSessionCache cache(config);
221 base::SimpleTestClock* clock = MakeTestClock().release(); 260 base::SimpleTestClock* clock = MakeTestClock().release();
222 cache.SetClockForTesting(base::WrapUnique(clock)); 261 cache.SetClockForTesting(base::WrapUnique(clock));
223 262
224 // Insert an entry into the session cache. 263 // Insert an entry into the session cache.
225 bssl::UniquePtr<SSL_SESSION> session = 264 bssl::UniquePtr<SSL_SESSION> session =
226 MakeTestSession(clock->Now(), kTimeout); 265 MakeTestSession(clock->Now(), kTimeout);
227 cache.Insert("key", session.get()); 266 cache.Insert("key", session.get());
228 EXPECT_EQ(session.get(), cache.Lookup("key").get()); 267 EXPECT_EQ(session.get(), cache.Lookup("key", nullptr).get());
229 EXPECT_EQ(1u, cache.size()); 268 EXPECT_EQ(1u, cache.size());
230 269
231 // Expire the session. 270 // Expire the session.
232 clock->Advance(kTimeout * 2); 271 clock->Advance(kTimeout * 2);
233 272
234 // The entry has not been removed yet. 273 // The entry has not been removed yet.
235 EXPECT_EQ(1u, cache.size()); 274 EXPECT_EQ(1u, cache.size());
236 275
237 // But it will not be returned on lookup and gets pruned at that point. 276 // But it will not be returned on lookup and gets pruned at that point.
238 EXPECT_EQ(nullptr, cache.Lookup("key").get()); 277 EXPECT_EQ(nullptr, cache.Lookup("key", nullptr).get());
239 EXPECT_EQ(0u, cache.size()); 278 EXPECT_EQ(0u, cache.size());
240 279
241 // Re-inserting a session does not refresh the lifetime. The expiration 280 // Re-inserting a session does not refresh the lifetime. The expiration
242 // information in the session is used. 281 // information in the session is used.
243 cache.Insert("key", session.get()); 282 cache.Insert("key", session.get());
244 EXPECT_EQ(nullptr, cache.Lookup("key").get()); 283 EXPECT_EQ(nullptr, cache.Lookup("key", nullptr).get());
245 EXPECT_EQ(0u, cache.size()); 284 EXPECT_EQ(0u, cache.size());
246 285
247 // Re-insert a fresh copy of the session. 286 // Re-insert a fresh copy of the session.
248 session = MakeTestSession(clock->Now(), kTimeout); 287 session = MakeTestSession(clock->Now(), kTimeout);
249 cache.Insert("key", session.get()); 288 cache.Insert("key", session.get());
250 EXPECT_EQ(session.get(), cache.Lookup("key").get()); 289 EXPECT_EQ(session.get(), cache.Lookup("key", nullptr).get());
251 EXPECT_EQ(1u, cache.size()); 290 EXPECT_EQ(1u, cache.size());
252 291
253 // Sessions also are treated as expired if the clock rewinds. 292 // Sessions also are treated as expired if the clock rewinds.
254 clock->Advance(base::TimeDelta::FromSeconds(-1)); 293 clock->Advance(base::TimeDelta::FromSeconds(-1));
255 EXPECT_EQ(nullptr, cache.Lookup("key").get()); 294 EXPECT_EQ(nullptr, cache.Lookup("key", nullptr).get());
256 EXPECT_EQ(0u, cache.size()); 295 EXPECT_EQ(0u, cache.size());
257 } 296 }
258 297
259 // Test that SSL cache is flushed on low memory notifications 298 // Test that SSL cache is flushed on low memory notifications
260 TEST(SSLClientSessionCacheTest, TestFlushOnMemoryNotifications) { 299 TEST(SSLClientSessionCacheTest, TestFlushOnMemoryNotifications) {
261 // kExpirationCheckCount is set to a suitably large number so the automated 300 // kExpirationCheckCount is set to a suitably large number so the automated
262 // pruning never triggers. 301 // pruning never triggers.
263 const size_t kExpirationCheckCount = 1000; 302 const size_t kExpirationCheckCount = 1000;
264 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000); 303 const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(1000);
265 304
266 SSLClientSessionCache::Config config; 305 SSLClientSessionCache::Config config;
267 config.expiration_check_count = kExpirationCheckCount; 306 config.expiration_check_count = kExpirationCheckCount;
268 SSLClientSessionCache cache(config); 307 SSLClientSessionCache cache(config);
269 base::SimpleTestClock* clock = MakeTestClock().release(); 308 base::SimpleTestClock* clock = MakeTestClock().release();
270 cache.SetClockForTesting(base::WrapUnique(clock)); 309 cache.SetClockForTesting(base::WrapUnique(clock));
271 310
272 // Insert an entry into the session cache. 311 // Insert an entry into the session cache.
273 bssl::UniquePtr<SSL_SESSION> session1 = 312 bssl::UniquePtr<SSL_SESSION> session1 =
274 MakeTestSession(clock->Now(), kTimeout); 313 MakeTestSession(clock->Now(), kTimeout);
275 cache.Insert("key1", session1.get()); 314 cache.Insert("key1", session1.get());
276 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 315 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
277 EXPECT_EQ(1u, cache.size()); 316 EXPECT_EQ(1u, cache.size());
278 317
279 // Expire the session. 318 // Expire the session.
280 clock->Advance(kTimeout * 2); 319 clock->Advance(kTimeout * 2);
281 // Add one more session. 320 // Add one more session.
282 bssl::UniquePtr<SSL_SESSION> session2 = 321 bssl::UniquePtr<SSL_SESSION> session2 =
283 MakeTestSession(clock->Now(), kTimeout); 322 MakeTestSession(clock->Now(), kTimeout);
284 cache.Insert("key2", session2.get()); 323 cache.Insert("key2", session2.get());
285 EXPECT_EQ(2u, cache.size()); 324 EXPECT_EQ(2u, cache.size());
286 325
287 // Fire a notification that will flush expired sessions. 326 // Fire a notification that will flush expired sessions.
288 base::MemoryPressureListener::NotifyMemoryPressure( 327 base::MemoryPressureListener::NotifyMemoryPressure(
289 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE); 328 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
290 base::RunLoop().RunUntilIdle(); 329 base::RunLoop().RunUntilIdle();
291 330
292 // Expired session's cache should be flushed. 331 // Expired session's cache should be flushed.
293 // Lookup returns nullptr, when cache entry not found. 332 // Lookup returns nullptr, when cache entry not found.
294 EXPECT_FALSE(cache.Lookup("key1")); 333 EXPECT_FALSE(cache.Lookup("key1", nullptr));
295 EXPECT_TRUE(cache.Lookup("key2")); 334 EXPECT_TRUE(cache.Lookup("key2", nullptr));
296 EXPECT_EQ(1u, cache.size()); 335 EXPECT_EQ(1u, cache.size());
297 336
298 // Fire notification that will flush everything. 337 // Fire notification that will flush everything.
299 base::MemoryPressureListener::NotifyMemoryPressure( 338 base::MemoryPressureListener::NotifyMemoryPressure(
300 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL); 339 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
301 base::RunLoop().RunUntilIdle(); 340 base::RunLoop().RunUntilIdle();
302 EXPECT_EQ(0u, cache.size()); 341 EXPECT_EQ(0u, cache.size());
303 } 342 }
304 343
305 // Basic test for dumping memory stats. 344 // Basic test for dumping memory stats.
306 TEST(SSLClientSessionCacheTest, TestDumpMemoryStats) { 345 TEST(SSLClientSessionCacheTest, TestDumpMemoryStats) {
307 SSLClientSessionCache::Config config; 346 SSLClientSessionCache::Config config;
308 SSLClientSessionCache cache(config); 347 SSLClientSessionCache cache(config);
309 348
310 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new()); 349 bssl::UniquePtr<SSL_SESSION> session1(SSL_SESSION_new());
311 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new()); 350 bssl::UniquePtr<SSL_SESSION> session2(SSL_SESSION_new());
312 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new()); 351 bssl::UniquePtr<SSL_SESSION> session3(SSL_SESSION_new());
313 352
314 // Insert three entries. 353 // Insert three entries.
315 cache.Insert("key1", session1.get()); 354 cache.Insert("key1", session1.get());
316 cache.Insert("key2", session2.get()); 355 cache.Insert("key2", session2.get());
317 cache.Insert("key3", session3.get()); 356 cache.Insert("key3", session3.get());
318 EXPECT_EQ(session1.get(), cache.Lookup("key1").get()); 357 EXPECT_EQ(session1.get(), cache.Lookup("key1", nullptr).get());
319 EXPECT_EQ(session2.get(), cache.Lookup("key2").get()); 358 EXPECT_EQ(session2.get(), cache.Lookup("key2", nullptr).get());
320 EXPECT_EQ(session3.get(), cache.Lookup("key3").get()); 359 EXPECT_EQ(session3.get(), cache.Lookup("key3", nullptr).get());
321 EXPECT_EQ(3u, cache.size()); 360 EXPECT_EQ(3u, cache.size());
322 361
323 base::trace_event::MemoryDumpArgs dump_args = { 362 base::trace_event::MemoryDumpArgs dump_args = {
324 base::trace_event::MemoryDumpLevelOfDetail::DETAILED}; 363 base::trace_event::MemoryDumpLevelOfDetail::DETAILED};
325 std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump( 364 std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump(
326 new base::trace_event::ProcessMemoryDump(nullptr, dump_args)); 365 new base::trace_event::ProcessMemoryDump(nullptr, dump_args));
327 cache.DumpMemoryStats(process_memory_dump.get()); 366 cache.DumpMemoryStats(process_memory_dump.get());
328 367
329 const base::trace_event::MemoryAllocatorDump* dump = 368 const base::trace_event::MemoryAllocatorDump* dump =
330 process_memory_dump->GetAllocatorDump("net/ssl_session_cache"); 369 process_memory_dump->GetAllocatorDump("net/ssl_session_cache");
331 ASSERT_NE(nullptr, dump); 370 ASSERT_NE(nullptr, dump);
332 std::unique_ptr<base::Value> raw_attrs = 371 std::unique_ptr<base::Value> raw_attrs =
333 dump->attributes_for_testing()->ToBaseValue(); 372 dump->attributes_for_testing()->ToBaseValue();
334 base::DictionaryValue* attrs; 373 base::DictionaryValue* attrs;
335 ASSERT_TRUE(raw_attrs->GetAsDictionary(&attrs)); 374 ASSERT_TRUE(raw_attrs->GetAsDictionary(&attrs));
336 ASSERT_TRUE(attrs->HasKey("cert_count")); 375 ASSERT_TRUE(attrs->HasKey("cert_count"));
337 ASSERT_TRUE(attrs->HasKey("serialized_cert_size")); 376 ASSERT_TRUE(attrs->HasKey("serialized_cert_size"));
338 ASSERT_TRUE(attrs->HasKey(base::trace_event::MemoryAllocatorDump::kNameSize)); 377 ASSERT_TRUE(attrs->HasKey(base::trace_event::MemoryAllocatorDump::kNameSize));
339 } 378 }
340 379
341 } // namespace net 380 } // namespace net
OLDNEW
« no previous file with comments | « net/ssl/ssl_client_session_cache.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698