OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/cert/multi_threaded_cert_verifier.h" | 5 #include "net/cert/multi_threaded_cert_verifier.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/debug/leak_annotations.h" | 10 #include "base/debug/leak_annotations.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 base::FilePath certs_dir = GetTestCertsDirectory(); | 83 base::FilePath certs_dir = GetTestCertsDirectory(); |
84 scoped_refptr<X509Certificate> test_cert( | 84 scoped_refptr<X509Certificate> test_cert( |
85 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 85 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
86 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 86 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
87 | 87 |
88 int error; | 88 int error; |
89 CertVerifyResult verify_result; | 89 CertVerifyResult verify_result; |
90 TestCompletionCallback callback; | 90 TestCompletionCallback callback; |
91 std::unique_ptr<CertVerifier::Request> request; | 91 std::unique_ptr<CertVerifier::Request> request; |
92 | 92 |
93 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 93 error = verifier_.Verify( |
94 NULL, &verify_result, callback.callback(), &request, | 94 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
95 BoundNetLog()); | 95 std::string(), CertificateList()), |
| 96 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
96 ASSERT_EQ(ERR_IO_PENDING, error); | 97 ASSERT_EQ(ERR_IO_PENDING, error); |
97 EXPECT_TRUE(request); | 98 EXPECT_TRUE(request); |
98 error = callback.WaitForResult(); | 99 error = callback.WaitForResult(); |
99 ASSERT_TRUE(IsCertificateError(error)); | 100 ASSERT_TRUE(IsCertificateError(error)); |
100 ASSERT_EQ(1u, verifier_.requests()); | 101 ASSERT_EQ(1u, verifier_.requests()); |
101 ASSERT_EQ(0u, verifier_.cache_hits()); | 102 ASSERT_EQ(0u, verifier_.cache_hits()); |
102 ASSERT_EQ(0u, verifier_.inflight_joins()); | 103 ASSERT_EQ(0u, verifier_.inflight_joins()); |
103 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 104 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
104 | 105 |
105 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 106 error = verifier_.Verify( |
106 NULL, &verify_result, callback.callback(), &request, | 107 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
107 BoundNetLog()); | 108 std::string(), CertificateList()), |
| 109 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
108 // Synchronous completion. | 110 // Synchronous completion. |
109 ASSERT_NE(ERR_IO_PENDING, error); | 111 ASSERT_NE(ERR_IO_PENDING, error); |
110 ASSERT_TRUE(IsCertificateError(error)); | 112 ASSERT_TRUE(IsCertificateError(error)); |
111 ASSERT_FALSE(request); | 113 ASSERT_FALSE(request); |
112 ASSERT_EQ(2u, verifier_.requests()); | 114 ASSERT_EQ(2u, verifier_.requests()); |
113 ASSERT_EQ(1u, verifier_.cache_hits()); | 115 ASSERT_EQ(1u, verifier_.cache_hits()); |
114 ASSERT_EQ(0u, verifier_.inflight_joins()); | 116 ASSERT_EQ(0u, verifier_.inflight_joins()); |
115 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 117 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
116 } | 118 } |
117 | 119 |
(...skipping 25 matching lines...) Expand all Loading... |
143 intermediates.push_back(intermediate_cert2->os_cert_handle()); | 145 intermediates.push_back(intermediate_cert2->os_cert_handle()); |
144 scoped_refptr<X509Certificate> cert_chain2 = | 146 scoped_refptr<X509Certificate> cert_chain2 = |
145 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 147 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), |
146 intermediates); | 148 intermediates); |
147 | 149 |
148 int error; | 150 int error; |
149 CertVerifyResult verify_result; | 151 CertVerifyResult verify_result; |
150 TestCompletionCallback callback; | 152 TestCompletionCallback callback; |
151 std::unique_ptr<CertVerifier::Request> request; | 153 std::unique_ptr<CertVerifier::Request> request; |
152 | 154 |
153 error = verifier_.Verify(cert_chain1.get(), "www.example.com", std::string(), | 155 error = verifier_.Verify( |
154 0, NULL, &verify_result, callback.callback(), | 156 CertVerifier::RequestParams(cert_chain1, "www.example.com", 0, |
155 &request, BoundNetLog()); | 157 std::string(), CertificateList()), |
| 158 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
156 ASSERT_EQ(ERR_IO_PENDING, error); | 159 ASSERT_EQ(ERR_IO_PENDING, error); |
157 EXPECT_TRUE(request); | 160 EXPECT_TRUE(request); |
158 error = callback.WaitForResult(); | 161 error = callback.WaitForResult(); |
159 ASSERT_TRUE(IsCertificateError(error)); | 162 ASSERT_TRUE(IsCertificateError(error)); |
160 ASSERT_EQ(1u, verifier_.requests()); | 163 ASSERT_EQ(1u, verifier_.requests()); |
161 ASSERT_EQ(0u, verifier_.cache_hits()); | 164 ASSERT_EQ(0u, verifier_.cache_hits()); |
162 ASSERT_EQ(0u, verifier_.inflight_joins()); | 165 ASSERT_EQ(0u, verifier_.inflight_joins()); |
163 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 166 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
164 | 167 |
165 error = verifier_.Verify(cert_chain2.get(), "www.example.com", std::string(), | 168 error = verifier_.Verify( |
166 0, NULL, &verify_result, callback.callback(), | 169 CertVerifier::RequestParams(cert_chain2, "www.example.com", 0, |
167 &request, BoundNetLog()); | 170 std::string(), CertificateList()), |
| 171 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
168 ASSERT_EQ(ERR_IO_PENDING, error); | 172 ASSERT_EQ(ERR_IO_PENDING, error); |
169 EXPECT_TRUE(request); | 173 EXPECT_TRUE(request); |
170 error = callback.WaitForResult(); | 174 error = callback.WaitForResult(); |
171 ASSERT_TRUE(IsCertificateError(error)); | 175 ASSERT_TRUE(IsCertificateError(error)); |
172 ASSERT_EQ(2u, verifier_.requests()); | 176 ASSERT_EQ(2u, verifier_.requests()); |
173 ASSERT_EQ(0u, verifier_.cache_hits()); | 177 ASSERT_EQ(0u, verifier_.cache_hits()); |
174 ASSERT_EQ(0u, verifier_.inflight_joins()); | 178 ASSERT_EQ(0u, verifier_.inflight_joins()); |
175 ASSERT_EQ(2u, verifier_.GetCacheSize()); | 179 ASSERT_EQ(2u, verifier_.GetCacheSize()); |
176 } | 180 } |
177 | 181 |
178 // Tests an inflight join. | 182 // Tests an inflight join. |
179 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { | 183 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { |
180 base::FilePath certs_dir = GetTestCertsDirectory(); | 184 base::FilePath certs_dir = GetTestCertsDirectory(); |
181 scoped_refptr<X509Certificate> test_cert( | 185 scoped_refptr<X509Certificate> test_cert( |
182 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 186 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
183 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 187 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
184 | 188 |
185 int error; | 189 int error; |
186 CertVerifyResult verify_result; | 190 CertVerifyResult verify_result; |
187 TestCompletionCallback callback; | 191 TestCompletionCallback callback; |
188 std::unique_ptr<CertVerifier::Request> request; | 192 std::unique_ptr<CertVerifier::Request> request; |
189 CertVerifyResult verify_result2; | 193 CertVerifyResult verify_result2; |
190 TestCompletionCallback callback2; | 194 TestCompletionCallback callback2; |
191 std::unique_ptr<CertVerifier::Request> request2; | 195 std::unique_ptr<CertVerifier::Request> request2; |
192 | 196 |
193 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 197 error = verifier_.Verify( |
194 NULL, &verify_result, callback.callback(), &request, | 198 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
195 BoundNetLog()); | 199 std::string(), CertificateList()), |
| 200 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
196 ASSERT_EQ(ERR_IO_PENDING, error); | 201 ASSERT_EQ(ERR_IO_PENDING, error); |
197 EXPECT_TRUE(request); | 202 EXPECT_TRUE(request); |
198 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 203 error = verifier_.Verify( |
199 NULL, &verify_result2, callback2.callback(), | 204 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
200 &request2, BoundNetLog()); | 205 std::string(), CertificateList()), |
| 206 NULL, &verify_result2, callback2.callback(), &request2, BoundNetLog()); |
201 EXPECT_EQ(ERR_IO_PENDING, error); | 207 EXPECT_EQ(ERR_IO_PENDING, error); |
202 EXPECT_TRUE(request2); | 208 EXPECT_TRUE(request2); |
203 error = callback.WaitForResult(); | 209 error = callback.WaitForResult(); |
204 EXPECT_TRUE(IsCertificateError(error)); | 210 EXPECT_TRUE(IsCertificateError(error)); |
205 error = callback2.WaitForResult(); | 211 error = callback2.WaitForResult(); |
206 ASSERT_TRUE(IsCertificateError(error)); | 212 ASSERT_TRUE(IsCertificateError(error)); |
207 ASSERT_EQ(2u, verifier_.requests()); | 213 ASSERT_EQ(2u, verifier_.requests()); |
208 ASSERT_EQ(0u, verifier_.cache_hits()); | 214 ASSERT_EQ(0u, verifier_.cache_hits()); |
209 ASSERT_EQ(1u, verifier_.inflight_joins()); | 215 ASSERT_EQ(1u, verifier_.inflight_joins()); |
210 } | 216 } |
211 | 217 |
212 // Tests that the callback of a canceled request is never made. | 218 // Tests that the callback of a canceled request is never made. |
213 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { | 219 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { |
214 base::FilePath certs_dir = GetTestCertsDirectory(); | 220 base::FilePath certs_dir = GetTestCertsDirectory(); |
215 scoped_refptr<X509Certificate> test_cert( | 221 scoped_refptr<X509Certificate> test_cert( |
216 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 222 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
217 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 223 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
218 | 224 |
219 int error; | 225 int error; |
220 CertVerifyResult verify_result; | 226 CertVerifyResult verify_result; |
221 std::unique_ptr<CertVerifier::Request> request; | 227 std::unique_ptr<CertVerifier::Request> request; |
222 | 228 |
223 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 229 error = verifier_.Verify( |
224 NULL, &verify_result, base::Bind(&FailTest), | 230 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
225 &request, BoundNetLog()); | 231 std::string(), CertificateList()), |
| 232 NULL, &verify_result, base::Bind(&FailTest), &request, BoundNetLog()); |
226 ASSERT_EQ(ERR_IO_PENDING, error); | 233 ASSERT_EQ(ERR_IO_PENDING, error); |
227 ASSERT_TRUE(request); | 234 ASSERT_TRUE(request); |
228 request.reset(); | 235 request.reset(); |
229 | 236 |
230 // Issue a few more requests to the worker pool and wait for their | 237 // Issue a few more requests to the worker pool and wait for their |
231 // completion, so that the task of the canceled request (which runs on a | 238 // completion, so that the task of the canceled request (which runs on a |
232 // worker thread) is likely to complete by the end of this test. | 239 // worker thread) is likely to complete by the end of this test. |
233 TestCompletionCallback callback; | 240 TestCompletionCallback callback; |
234 for (int i = 0; i < 5; ++i) { | 241 for (int i = 0; i < 5; ++i) { |
235 error = verifier_.Verify(test_cert.get(), "www2.example.com", std::string(), | 242 error = verifier_.Verify( |
236 0, NULL, &verify_result, callback.callback(), | 243 CertVerifier::RequestParams(test_cert, "www2.example.com", 0, |
237 &request, BoundNetLog()); | 244 std::string(), CertificateList()), |
| 245 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
238 ASSERT_EQ(ERR_IO_PENDING, error); | 246 ASSERT_EQ(ERR_IO_PENDING, error); |
239 EXPECT_TRUE(request); | 247 EXPECT_TRUE(request); |
240 error = callback.WaitForResult(); | 248 error = callback.WaitForResult(); |
241 verifier_.ClearCache(); | 249 verifier_.ClearCache(); |
242 } | 250 } |
243 } | 251 } |
244 | 252 |
245 // Tests that a canceled request is not leaked. | 253 // Tests that a canceled request is not leaked. |
246 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { | 254 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { |
247 base::FilePath certs_dir = GetTestCertsDirectory(); | 255 base::FilePath certs_dir = GetTestCertsDirectory(); |
248 scoped_refptr<X509Certificate> test_cert( | 256 scoped_refptr<X509Certificate> test_cert( |
249 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 257 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
250 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 258 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
251 | 259 |
252 int error; | 260 int error; |
253 CertVerifyResult verify_result; | 261 CertVerifyResult verify_result; |
254 TestCompletionCallback callback; | 262 TestCompletionCallback callback; |
255 std::unique_ptr<CertVerifier::Request> request; | 263 std::unique_ptr<CertVerifier::Request> request; |
256 | 264 |
257 { | 265 { |
258 // Because shutdown intentionally doesn't join worker threads, memory may | 266 // Because shutdown intentionally doesn't join worker threads, memory may |
259 // be leaked if the main thread shuts down before the worker thread | 267 // be leaked if the main thread shuts down before the worker thread |
260 // completes. In particular MultiThreadedCertVerifier calls | 268 // completes. In particular MultiThreadedCertVerifier calls |
261 // base::WorkerPool::PostTaskAndReply(), which leaks its "relay" when it | 269 // base::WorkerPool::PostTaskAndReply(), which leaks its "relay" when it |
262 // can't post the reply back to the origin thread. See | 270 // can't post the reply back to the origin thread. See |
263 // https://crbug.com/522514 | 271 // https://crbug.com/522514 |
264 ANNOTATE_SCOPED_MEMORY_LEAK; | 272 ANNOTATE_SCOPED_MEMORY_LEAK; |
265 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), | 273 error = verifier_.Verify( |
266 0, NULL, &verify_result, callback.callback(), | 274 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
267 &request, BoundNetLog()); | 275 std::string(), CertificateList()), |
| 276 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
268 } | 277 } |
269 ASSERT_EQ(ERR_IO_PENDING, error); | 278 ASSERT_EQ(ERR_IO_PENDING, error); |
270 EXPECT_TRUE(request); | 279 EXPECT_TRUE(request); |
271 request.reset(); | 280 request.reset(); |
272 // Destroy |verifier| by going out of scope. | 281 // Destroy |verifier| by going out of scope. |
273 } | 282 } |
274 | 283 |
275 TEST_F(MultiThreadedCertVerifierTest, CertTrustAnchorProvider) { | 284 TEST_F(MultiThreadedCertVerifierTest, CertTrustAnchorProvider) { |
276 MockCertTrustAnchorProvider trust_provider; | 285 MockCertTrustAnchorProvider trust_provider; |
277 verifier_.SetCertTrustAnchorProvider(&trust_provider); | 286 verifier_.SetCertTrustAnchorProvider(&trust_provider); |
278 | 287 |
279 scoped_refptr<X509Certificate> test_cert( | 288 scoped_refptr<X509Certificate> test_cert( |
280 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); | 289 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem")); |
281 ASSERT_TRUE(test_cert.get()); | 290 ASSERT_TRUE(test_cert.get()); |
282 | 291 |
283 const CertificateList empty_cert_list; | 292 const CertificateList empty_cert_list; |
284 CertificateList cert_list; | 293 CertificateList cert_list; |
285 cert_list.push_back(test_cert); | 294 cert_list.push_back(test_cert); |
286 | 295 |
287 // Check that Verify() asks the |trust_provider| for the current list of | 296 // Check that Verify() asks the |trust_provider| for the current list of |
288 // additional trust anchors. | 297 // additional trust anchors. |
289 int error; | 298 int error; |
290 CertVerifyResult verify_result; | 299 CertVerifyResult verify_result; |
291 TestCompletionCallback callback; | 300 TestCompletionCallback callback; |
292 std::unique_ptr<CertVerifier::Request> request; | 301 std::unique_ptr<CertVerifier::Request> request; |
293 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 302 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
294 .WillOnce(ReturnRef(empty_cert_list)); | 303 .WillOnce(ReturnRef(empty_cert_list)); |
295 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 304 error = verifier_.Verify( |
296 NULL, &verify_result, callback.callback(), &request, | 305 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
297 BoundNetLog()); | 306 std::string(), CertificateList()), |
| 307 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
298 Mock::VerifyAndClearExpectations(&trust_provider); | 308 Mock::VerifyAndClearExpectations(&trust_provider); |
299 ASSERT_EQ(ERR_IO_PENDING, error); | 309 ASSERT_EQ(ERR_IO_PENDING, error); |
300 EXPECT_TRUE(request); | 310 EXPECT_TRUE(request); |
301 error = callback.WaitForResult(); | 311 error = callback.WaitForResult(); |
302 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 312 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
303 ASSERT_EQ(1u, verifier_.requests()); | 313 ASSERT_EQ(1u, verifier_.requests()); |
304 ASSERT_EQ(0u, verifier_.cache_hits()); | 314 ASSERT_EQ(0u, verifier_.cache_hits()); |
305 | 315 |
306 // The next Verify() uses the cached result. | 316 // The next Verify() uses the cached result. |
307 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 317 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
308 .WillOnce(ReturnRef(empty_cert_list)); | 318 .WillOnce(ReturnRef(empty_cert_list)); |
309 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 319 error = verifier_.Verify( |
310 NULL, &verify_result, callback.callback(), &request, | 320 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
311 BoundNetLog()); | 321 std::string(), CertificateList()), |
| 322 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
312 Mock::VerifyAndClearExpectations(&trust_provider); | 323 Mock::VerifyAndClearExpectations(&trust_provider); |
313 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 324 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
314 EXPECT_FALSE(request); | 325 EXPECT_FALSE(request); |
315 ASSERT_EQ(2u, verifier_.requests()); | 326 ASSERT_EQ(2u, verifier_.requests()); |
316 ASSERT_EQ(1u, verifier_.cache_hits()); | 327 ASSERT_EQ(1u, verifier_.cache_hits()); |
317 | 328 |
318 // Another Verify() for the same certificate but with a different list of | 329 // Another Verify() for the same certificate but with a different list of |
319 // trust anchors will not reuse the cache. | 330 // trust anchors will not reuse the cache. |
320 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 331 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
321 .WillOnce(ReturnRef(cert_list)); | 332 .WillOnce(ReturnRef(cert_list)); |
322 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 333 error = verifier_.Verify( |
323 NULL, &verify_result, callback.callback(), &request, | 334 CertVerifier::RequestParams(test_cert, "www.example.com", 0, |
324 BoundNetLog()); | 335 std::string(), CertificateList()), |
| 336 NULL, &verify_result, callback.callback(), &request, BoundNetLog()); |
325 Mock::VerifyAndClearExpectations(&trust_provider); | 337 Mock::VerifyAndClearExpectations(&trust_provider); |
326 ASSERT_EQ(ERR_IO_PENDING, error); | 338 ASSERT_EQ(ERR_IO_PENDING, error); |
327 EXPECT_TRUE(request); | 339 EXPECT_TRUE(request); |
328 error = callback.WaitForResult(); | 340 error = callback.WaitForResult(); |
329 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 341 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
330 ASSERT_EQ(3u, verifier_.requests()); | 342 ASSERT_EQ(3u, verifier_.requests()); |
331 ASSERT_EQ(1u, verifier_.cache_hits()); | 343 ASSERT_EQ(1u, verifier_.cache_hits()); |
332 } | 344 } |
333 | 345 |
334 // Tests de-duplication of requests. | 346 // Tests de-duplication of requests. |
(...skipping 19 matching lines...) Expand all Loading... |
354 std::unique_ptr<CertVerifier::Request> request4; | 366 std::unique_ptr<CertVerifier::Request> request4; |
355 CertVerifyResult verify_result5; | 367 CertVerifyResult verify_result5; |
356 TestCompletionCallback callback5; | 368 TestCompletionCallback callback5; |
357 std::unique_ptr<CertVerifier::Request> request5; | 369 std::unique_ptr<CertVerifier::Request> request5; |
358 | 370 |
359 const char domain1[] = "www.example1.com"; | 371 const char domain1[] = "www.example1.com"; |
360 const char domain2[] = "www.exampleB.com"; | 372 const char domain2[] = "www.exampleB.com"; |
361 const char domain3[] = "www.example3.com"; | 373 const char domain3[] = "www.example3.com"; |
362 | 374 |
363 // Start 3 unique requests. | 375 // Start 3 unique requests. |
364 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 376 error = verifier_.Verify( |
365 &verify_result1, callback1.callback(), &request1, | 377 CertVerifier::RequestParams(test_cert, domain2, 0, std::string(), |
366 BoundNetLog()); | 378 CertificateList()), |
| 379 nullptr, &verify_result1, callback1.callback(), &request1, BoundNetLog()); |
367 ASSERT_EQ(ERR_IO_PENDING, error); | 380 ASSERT_EQ(ERR_IO_PENDING, error); |
368 EXPECT_TRUE(request1); | 381 EXPECT_TRUE(request1); |
369 | 382 |
370 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 383 error = verifier_.Verify( |
371 &verify_result2, callback2.callback(), &request2, | 384 CertVerifier::RequestParams(test_cert, domain2, 0, std::string(), |
372 BoundNetLog()); | 385 CertificateList()), |
| 386 nullptr, &verify_result2, callback2.callback(), &request2, BoundNetLog()); |
373 EXPECT_EQ(ERR_IO_PENDING, error); | 387 EXPECT_EQ(ERR_IO_PENDING, error); |
374 EXPECT_TRUE(request2); | 388 EXPECT_TRUE(request2); |
375 | 389 |
376 error = verifier_.Verify(test_cert.get(), domain3, std::string(), 0, nullptr, | 390 error = verifier_.Verify( |
377 &verify_result3, callback3.callback(), &request3, | 391 CertVerifier::RequestParams(test_cert, domain3, 0, std::string(), |
378 BoundNetLog()); | 392 CertificateList()), |
| 393 nullptr, &verify_result3, callback3.callback(), &request3, BoundNetLog()); |
379 EXPECT_EQ(ERR_IO_PENDING, error); | 394 EXPECT_EQ(ERR_IO_PENDING, error); |
380 EXPECT_TRUE(request3); | 395 EXPECT_TRUE(request3); |
381 | 396 |
382 // Start duplicate requests (which should join to existing jobs). | 397 // Start duplicate requests (which should join to existing jobs). |
383 error = verifier_.Verify(test_cert.get(), domain1, std::string(), 0, nullptr, | 398 error = verifier_.Verify( |
384 &verify_result4, callback4.callback(), &request4, | 399 CertVerifier::RequestParams(test_cert, domain1, 0, std::string(), |
385 BoundNetLog()); | 400 CertificateList()), |
| 401 nullptr, &verify_result4, callback4.callback(), &request4, BoundNetLog()); |
386 EXPECT_EQ(ERR_IO_PENDING, error); | 402 EXPECT_EQ(ERR_IO_PENDING, error); |
387 EXPECT_TRUE(request4); | 403 EXPECT_TRUE(request4); |
388 | 404 |
389 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 405 error = verifier_.Verify( |
390 &verify_result5, callback5.callback(), &request5, | 406 CertVerifier::RequestParams(test_cert, domain2, 0, std::string(), |
391 BoundNetLog()); | 407 CertificateList()), |
| 408 nullptr, &verify_result5, callback5.callback(), &request5, BoundNetLog()); |
392 EXPECT_EQ(ERR_IO_PENDING, error); | 409 EXPECT_EQ(ERR_IO_PENDING, error); |
393 EXPECT_TRUE(request5); | 410 EXPECT_TRUE(request5); |
394 | 411 |
395 error = callback1.WaitForResult(); | 412 error = callback1.WaitForResult(); |
396 EXPECT_TRUE(IsCertificateError(error)); | 413 EXPECT_TRUE(IsCertificateError(error)); |
397 error = callback2.WaitForResult(); | 414 error = callback2.WaitForResult(); |
398 ASSERT_TRUE(IsCertificateError(error)); | 415 ASSERT_TRUE(IsCertificateError(error)); |
399 error = callback4.WaitForResult(); | 416 error = callback4.WaitForResult(); |
400 ASSERT_TRUE(IsCertificateError(error)); | 417 ASSERT_TRUE(IsCertificateError(error)); |
401 | 418 |
402 // Let the other requests automatically cancel. | 419 // Let the other requests automatically cancel. |
403 ASSERT_EQ(5u, verifier_.requests()); | 420 ASSERT_EQ(5u, verifier_.requests()); |
404 ASSERT_EQ(0u, verifier_.cache_hits()); | 421 ASSERT_EQ(0u, verifier_.cache_hits()); |
405 ASSERT_EQ(2u, verifier_.inflight_joins()); | 422 ASSERT_EQ(2u, verifier_.inflight_joins()); |
406 } | 423 } |
407 | 424 |
408 } // namespace net | 425 } // namespace net |
OLD | NEW |