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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/leak_annotations.h" | 8 #include "base/debug/leak_annotations.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 | 78 |
79 TEST_F(MultiThreadedCertVerifierTest, CacheHit) { | 79 TEST_F(MultiThreadedCertVerifierTest, CacheHit) { |
80 base::FilePath certs_dir = GetTestCertsDirectory(); | 80 base::FilePath certs_dir = GetTestCertsDirectory(); |
81 scoped_refptr<X509Certificate> test_cert( | 81 scoped_refptr<X509Certificate> test_cert( |
82 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 82 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
83 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 83 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
84 | 84 |
85 int error; | 85 int error; |
86 CertVerifyResult verify_result; | 86 CertVerifyResult verify_result; |
87 TestCompletionCallback callback; | 87 TestCompletionCallback callback; |
88 scoped_ptr<CertVerifier::Request> request_handle; | 88 scoped_ptr<CertVerifier::Request> request; |
89 | 89 |
90 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 90 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
91 NULL, &verify_result, callback.callback(), | 91 NULL, &verify_result, callback.callback(), &request, |
92 &request_handle, BoundNetLog()); | 92 BoundNetLog()); |
93 ASSERT_EQ(ERR_IO_PENDING, error); | 93 ASSERT_EQ(ERR_IO_PENDING, error); |
94 EXPECT_TRUE(request_handle); | 94 EXPECT_TRUE(request); |
95 error = callback.WaitForResult(); | 95 error = callback.WaitForResult(); |
96 ASSERT_TRUE(IsCertificateError(error)); | 96 ASSERT_TRUE(IsCertificateError(error)); |
97 ASSERT_EQ(1u, verifier_.requests()); | 97 ASSERT_EQ(1u, verifier_.requests()); |
98 ASSERT_EQ(0u, verifier_.cache_hits()); | 98 ASSERT_EQ(0u, verifier_.cache_hits()); |
99 ASSERT_EQ(0u, verifier_.inflight_joins()); | 99 ASSERT_EQ(0u, verifier_.inflight_joins()); |
100 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 100 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
101 | 101 |
102 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 102 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
103 NULL, &verify_result, callback.callback(), | 103 NULL, &verify_result, callback.callback(), &request, |
104 &request_handle, BoundNetLog()); | 104 BoundNetLog()); |
105 // Synchronous completion. | 105 // Synchronous completion. |
106 ASSERT_NE(ERR_IO_PENDING, error); | 106 ASSERT_NE(ERR_IO_PENDING, error); |
107 ASSERT_TRUE(IsCertificateError(error)); | 107 ASSERT_TRUE(IsCertificateError(error)); |
108 ASSERT_TRUE(request_handle == NULL); | 108 ASSERT_FALSE(request); |
109 ASSERT_EQ(2u, verifier_.requests()); | 109 ASSERT_EQ(2u, verifier_.requests()); |
110 ASSERT_EQ(1u, verifier_.cache_hits()); | 110 ASSERT_EQ(1u, verifier_.cache_hits()); |
111 ASSERT_EQ(0u, verifier_.inflight_joins()); | 111 ASSERT_EQ(0u, verifier_.inflight_joins()); |
112 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 112 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
113 } | 113 } |
114 | 114 |
115 // Tests the same server certificate with different intermediate CA | 115 // Tests the same server certificate with different intermediate CA |
116 // certificates. These should be treated as different certificate chains even | 116 // certificates. These should be treated as different certificate chains even |
117 // though the two X509Certificate objects contain the same server certificate. | 117 // though the two X509Certificate objects contain the same server certificate. |
118 TEST_F(MultiThreadedCertVerifierTest, DifferentCACerts) { | 118 TEST_F(MultiThreadedCertVerifierTest, DifferentCACerts) { |
(...skipping 19 matching lines...) Expand all Loading... |
138 | 138 |
139 intermediates.clear(); | 139 intermediates.clear(); |
140 intermediates.push_back(intermediate_cert2->os_cert_handle()); | 140 intermediates.push_back(intermediate_cert2->os_cert_handle()); |
141 scoped_refptr<X509Certificate> cert_chain2 = | 141 scoped_refptr<X509Certificate> cert_chain2 = |
142 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), | 142 X509Certificate::CreateFromHandle(server_cert->os_cert_handle(), |
143 intermediates); | 143 intermediates); |
144 | 144 |
145 int error; | 145 int error; |
146 CertVerifyResult verify_result; | 146 CertVerifyResult verify_result; |
147 TestCompletionCallback callback; | 147 TestCompletionCallback callback; |
148 scoped_ptr<CertVerifier::Request> request_handle; | 148 scoped_ptr<CertVerifier::Request> request; |
149 | 149 |
150 error = verifier_.Verify(cert_chain1.get(), "www.example.com", std::string(), | 150 error = verifier_.Verify(cert_chain1.get(), "www.example.com", std::string(), |
151 0, NULL, &verify_result, callback.callback(), | 151 0, NULL, &verify_result, callback.callback(), |
152 &request_handle, BoundNetLog()); | 152 &request, BoundNetLog()); |
153 ASSERT_EQ(ERR_IO_PENDING, error); | 153 ASSERT_EQ(ERR_IO_PENDING, error); |
154 EXPECT_TRUE(request_handle); | 154 EXPECT_TRUE(request); |
155 error = callback.WaitForResult(); | 155 error = callback.WaitForResult(); |
156 ASSERT_TRUE(IsCertificateError(error)); | 156 ASSERT_TRUE(IsCertificateError(error)); |
157 ASSERT_EQ(1u, verifier_.requests()); | 157 ASSERT_EQ(1u, verifier_.requests()); |
158 ASSERT_EQ(0u, verifier_.cache_hits()); | 158 ASSERT_EQ(0u, verifier_.cache_hits()); |
159 ASSERT_EQ(0u, verifier_.inflight_joins()); | 159 ASSERT_EQ(0u, verifier_.inflight_joins()); |
160 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 160 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
161 | 161 |
162 error = verifier_.Verify(cert_chain2.get(), "www.example.com", std::string(), | 162 error = verifier_.Verify(cert_chain2.get(), "www.example.com", std::string(), |
163 0, NULL, &verify_result, callback.callback(), | 163 0, NULL, &verify_result, callback.callback(), |
164 &request_handle, BoundNetLog()); | 164 &request, BoundNetLog()); |
165 ASSERT_EQ(ERR_IO_PENDING, error); | 165 ASSERT_EQ(ERR_IO_PENDING, error); |
166 EXPECT_TRUE(request_handle); | 166 EXPECT_TRUE(request); |
167 error = callback.WaitForResult(); | 167 error = callback.WaitForResult(); |
168 ASSERT_TRUE(IsCertificateError(error)); | 168 ASSERT_TRUE(IsCertificateError(error)); |
169 ASSERT_EQ(2u, verifier_.requests()); | 169 ASSERT_EQ(2u, verifier_.requests()); |
170 ASSERT_EQ(0u, verifier_.cache_hits()); | 170 ASSERT_EQ(0u, verifier_.cache_hits()); |
171 ASSERT_EQ(0u, verifier_.inflight_joins()); | 171 ASSERT_EQ(0u, verifier_.inflight_joins()); |
172 ASSERT_EQ(2u, verifier_.GetCacheSize()); | 172 ASSERT_EQ(2u, verifier_.GetCacheSize()); |
173 } | 173 } |
174 | 174 |
175 // Tests an inflight join. | 175 // Tests an inflight join. |
176 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { | 176 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { |
177 base::FilePath certs_dir = GetTestCertsDirectory(); | 177 base::FilePath certs_dir = GetTestCertsDirectory(); |
178 scoped_refptr<X509Certificate> test_cert( | 178 scoped_refptr<X509Certificate> test_cert( |
179 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 179 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
180 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 180 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
181 | 181 |
182 int error; | 182 int error; |
183 CertVerifyResult verify_result; | 183 CertVerifyResult verify_result; |
184 TestCompletionCallback callback; | 184 TestCompletionCallback callback; |
185 scoped_ptr<CertVerifier::Request> request_handle; | 185 scoped_ptr<CertVerifier::Request> request; |
186 CertVerifyResult verify_result2; | 186 CertVerifyResult verify_result2; |
187 TestCompletionCallback callback2; | 187 TestCompletionCallback callback2; |
188 scoped_ptr<CertVerifier::Request> request_handle2; | 188 scoped_ptr<CertVerifier::Request> request2; |
189 | 189 |
190 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 190 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
191 NULL, &verify_result, callback.callback(), | 191 NULL, &verify_result, callback.callback(), &request, |
192 &request_handle, BoundNetLog()); | 192 BoundNetLog()); |
193 ASSERT_EQ(ERR_IO_PENDING, error); | 193 ASSERT_EQ(ERR_IO_PENDING, error); |
194 EXPECT_TRUE(request_handle); | 194 EXPECT_TRUE(request); |
195 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 195 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
196 NULL, &verify_result2, callback2.callback(), | 196 NULL, &verify_result2, callback2.callback(), |
197 &request_handle2, BoundNetLog()); | 197 &request2, BoundNetLog()); |
198 EXPECT_EQ(ERR_IO_PENDING, error); | 198 EXPECT_EQ(ERR_IO_PENDING, error); |
199 EXPECT_TRUE(request_handle2); | 199 EXPECT_TRUE(request2); |
200 error = callback.WaitForResult(); | 200 error = callback.WaitForResult(); |
201 EXPECT_TRUE(IsCertificateError(error)); | 201 EXPECT_TRUE(IsCertificateError(error)); |
202 error = callback2.WaitForResult(); | 202 error = callback2.WaitForResult(); |
203 ASSERT_TRUE(IsCertificateError(error)); | 203 ASSERT_TRUE(IsCertificateError(error)); |
204 ASSERT_EQ(2u, verifier_.requests()); | 204 ASSERT_EQ(2u, verifier_.requests()); |
205 ASSERT_EQ(0u, verifier_.cache_hits()); | 205 ASSERT_EQ(0u, verifier_.cache_hits()); |
206 ASSERT_EQ(1u, verifier_.inflight_joins()); | 206 ASSERT_EQ(1u, verifier_.inflight_joins()); |
207 } | 207 } |
208 | 208 |
209 // Tests that the callback of a canceled request is never made. | 209 // Tests that the callback of a canceled request is never made. |
210 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { | 210 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { |
211 base::FilePath certs_dir = GetTestCertsDirectory(); | 211 base::FilePath certs_dir = GetTestCertsDirectory(); |
212 scoped_refptr<X509Certificate> test_cert( | 212 scoped_refptr<X509Certificate> test_cert( |
213 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 213 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
214 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 214 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
215 | 215 |
216 int error; | 216 int error; |
217 CertVerifyResult verify_result; | 217 CertVerifyResult verify_result; |
218 scoped_ptr<CertVerifier::Request> request_handle; | 218 scoped_ptr<CertVerifier::Request> request; |
219 | 219 |
220 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 220 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
221 NULL, &verify_result, base::Bind(&FailTest), | 221 NULL, &verify_result, base::Bind(&FailTest), |
222 &request_handle, BoundNetLog()); | 222 &request, BoundNetLog()); |
223 ASSERT_EQ(ERR_IO_PENDING, error); | 223 ASSERT_EQ(ERR_IO_PENDING, error); |
224 ASSERT_TRUE(request_handle); | 224 ASSERT_TRUE(request); |
225 request_handle.reset(); | 225 request.reset(); |
226 | 226 |
227 // Issue a few more requests to the worker pool and wait for their | 227 // Issue a few more requests to the worker pool and wait for their |
228 // completion, so that the task of the canceled request (which runs on a | 228 // completion, so that the task of the canceled request (which runs on a |
229 // worker thread) is likely to complete by the end of this test. | 229 // worker thread) is likely to complete by the end of this test. |
230 TestCompletionCallback callback; | 230 TestCompletionCallback callback; |
231 for (int i = 0; i < 5; ++i) { | 231 for (int i = 0; i < 5; ++i) { |
232 error = verifier_.Verify(test_cert.get(), "www2.example.com", std::string(), | 232 error = verifier_.Verify(test_cert.get(), "www2.example.com", std::string(), |
233 0, NULL, &verify_result, callback.callback(), | 233 0, NULL, &verify_result, callback.callback(), |
234 &request_handle, BoundNetLog()); | 234 &request, BoundNetLog()); |
235 ASSERT_EQ(ERR_IO_PENDING, error); | 235 ASSERT_EQ(ERR_IO_PENDING, error); |
236 EXPECT_TRUE(request_handle); | 236 EXPECT_TRUE(request); |
237 error = callback.WaitForResult(); | 237 error = callback.WaitForResult(); |
238 verifier_.ClearCache(); | 238 verifier_.ClearCache(); |
239 } | 239 } |
240 } | 240 } |
241 | 241 |
242 // Tests that a canceled request is not leaked. | 242 // Tests that a canceled request is not leaked. |
243 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { | 243 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { |
244 base::FilePath certs_dir = GetTestCertsDirectory(); | 244 base::FilePath certs_dir = GetTestCertsDirectory(); |
245 scoped_refptr<X509Certificate> test_cert( | 245 scoped_refptr<X509Certificate> test_cert( |
246 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 246 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
247 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); | 247 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); |
248 | 248 |
249 int error; | 249 int error; |
250 CertVerifyResult verify_result; | 250 CertVerifyResult verify_result; |
251 TestCompletionCallback callback; | 251 TestCompletionCallback callback; |
252 scoped_ptr<CertVerifier::Request> request_handle; | 252 scoped_ptr<CertVerifier::Request> request; |
253 | 253 |
254 { | 254 { |
255 // Because shutdown intentionally doesn't join worker threads, a | 255 // Because shutdown intentionally doesn't join worker threads, a |
256 // CertVerifyWorker may be leaked if the main thread shuts down before the | 256 // CertVerifyWorker may be leaked if the main thread shuts down before the |
257 // worker thread. | 257 // worker thread. |
258 ANNOTATE_SCOPED_MEMORY_LEAK; | 258 ANNOTATE_SCOPED_MEMORY_LEAK; |
259 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), | 259 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), |
260 0, NULL, &verify_result, callback.callback(), | 260 0, NULL, &verify_result, callback.callback(), |
261 &request_handle, BoundNetLog()); | 261 &request, BoundNetLog()); |
262 } | 262 } |
263 ASSERT_EQ(ERR_IO_PENDING, error); | 263 ASSERT_EQ(ERR_IO_PENDING, error); |
264 EXPECT_TRUE(request_handle); | 264 EXPECT_TRUE(request); |
265 request_handle.reset(); | 265 request.reset(); |
266 // Destroy |verifier| by going out of scope. | 266 // Destroy |verifier| by going out of scope. |
267 } | 267 } |
268 | 268 |
269 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { | 269 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { |
270 SHA1HashValue a_key; | 270 SHA1HashValue a_key; |
271 memset(a_key.data, 'a', sizeof(a_key.data)); | 271 memset(a_key.data, 'a', sizeof(a_key.data)); |
272 | 272 |
273 SHA1HashValue z_key; | 273 SHA1HashValue z_key; |
274 memset(z_key.data, 'z', sizeof(z_key.data)); | 274 memset(z_key.data, 'z', sizeof(z_key.data)); |
275 | 275 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 386 |
387 const CertificateList empty_cert_list; | 387 const CertificateList empty_cert_list; |
388 CertificateList cert_list; | 388 CertificateList cert_list; |
389 cert_list.push_back(test_cert); | 389 cert_list.push_back(test_cert); |
390 | 390 |
391 // Check that Verify() asks the |trust_provider| for the current list of | 391 // Check that Verify() asks the |trust_provider| for the current list of |
392 // additional trust anchors. | 392 // additional trust anchors. |
393 int error; | 393 int error; |
394 CertVerifyResult verify_result; | 394 CertVerifyResult verify_result; |
395 TestCompletionCallback callback; | 395 TestCompletionCallback callback; |
396 scoped_ptr<CertVerifier::Request> request_handle; | 396 scoped_ptr<CertVerifier::Request> request; |
397 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 397 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
398 .WillOnce(ReturnRef(empty_cert_list)); | 398 .WillOnce(ReturnRef(empty_cert_list)); |
399 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 399 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
400 NULL, &verify_result, callback.callback(), | 400 NULL, &verify_result, callback.callback(), &request, |
401 &request_handle, BoundNetLog()); | 401 BoundNetLog()); |
402 Mock::VerifyAndClearExpectations(&trust_provider); | 402 Mock::VerifyAndClearExpectations(&trust_provider); |
403 ASSERT_EQ(ERR_IO_PENDING, error); | 403 ASSERT_EQ(ERR_IO_PENDING, error); |
404 EXPECT_TRUE(request_handle); | 404 EXPECT_TRUE(request); |
405 error = callback.WaitForResult(); | 405 error = callback.WaitForResult(); |
406 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 406 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
407 ASSERT_EQ(1u, verifier_.requests()); | 407 ASSERT_EQ(1u, verifier_.requests()); |
408 ASSERT_EQ(0u, verifier_.cache_hits()); | 408 ASSERT_EQ(0u, verifier_.cache_hits()); |
409 | 409 |
410 // The next Verify() uses the cached result. | 410 // The next Verify() uses the cached result. |
411 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 411 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
412 .WillOnce(ReturnRef(empty_cert_list)); | 412 .WillOnce(ReturnRef(empty_cert_list)); |
413 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 413 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
414 NULL, &verify_result, callback.callback(), | 414 NULL, &verify_result, callback.callback(), &request, |
415 &request_handle, BoundNetLog()); | 415 BoundNetLog()); |
416 Mock::VerifyAndClearExpectations(&trust_provider); | 416 Mock::VerifyAndClearExpectations(&trust_provider); |
417 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 417 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
418 EXPECT_FALSE(request_handle); | 418 EXPECT_FALSE(request); |
419 ASSERT_EQ(2u, verifier_.requests()); | 419 ASSERT_EQ(2u, verifier_.requests()); |
420 ASSERT_EQ(1u, verifier_.cache_hits()); | 420 ASSERT_EQ(1u, verifier_.cache_hits()); |
421 | 421 |
422 // Another Verify() for the same certificate but with a different list of | 422 // Another Verify() for the same certificate but with a different list of |
423 // trust anchors will not reuse the cache. | 423 // trust anchors will not reuse the cache. |
424 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 424 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
425 .WillOnce(ReturnRef(cert_list)); | 425 .WillOnce(ReturnRef(cert_list)); |
426 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, | 426 error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0, |
427 NULL, &verify_result, callback.callback(), | 427 NULL, &verify_result, callback.callback(), &request, |
428 &request_handle, BoundNetLog()); | 428 BoundNetLog()); |
429 Mock::VerifyAndClearExpectations(&trust_provider); | 429 Mock::VerifyAndClearExpectations(&trust_provider); |
430 ASSERT_EQ(ERR_IO_PENDING, error); | 430 ASSERT_EQ(ERR_IO_PENDING, error); |
431 EXPECT_TRUE(request_handle); | 431 EXPECT_TRUE(request); |
432 error = callback.WaitForResult(); | 432 error = callback.WaitForResult(); |
433 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 433 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
434 ASSERT_EQ(3u, verifier_.requests()); | 434 ASSERT_EQ(3u, verifier_.requests()); |
435 ASSERT_EQ(1u, verifier_.cache_hits()); | 435 ASSERT_EQ(1u, verifier_.cache_hits()); |
436 } | 436 } |
437 | 437 |
438 // Tests de-duplication of requests. | 438 // Tests de-duplication of requests. |
439 // Starts up 5 requests, of which 3 are unique. | 439 // Starts up 5 requests, of which 3 are unique. |
440 TEST_F(MultiThreadedCertVerifierTest, MultipleInflightJoin) { | 440 TEST_F(MultiThreadedCertVerifierTest, MultipleInflightJoin) { |
441 base::FilePath certs_dir = GetTestCertsDirectory(); | 441 base::FilePath certs_dir = GetTestCertsDirectory(); |
442 scoped_refptr<X509Certificate> test_cert( | 442 scoped_refptr<X509Certificate> test_cert( |
443 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 443 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
444 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); | 444 ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get()); |
445 | 445 |
446 int error; | 446 int error; |
447 CertVerifyResult verify_result1; | 447 CertVerifyResult verify_result1; |
448 TestCompletionCallback callback1; | 448 TestCompletionCallback callback1; |
449 scoped_ptr<CertVerifier::Request> request_handle1; | 449 scoped_ptr<CertVerifier::Request> request1; |
450 CertVerifyResult verify_result2; | 450 CertVerifyResult verify_result2; |
451 TestCompletionCallback callback2; | 451 TestCompletionCallback callback2; |
452 scoped_ptr<CertVerifier::Request> request_handle2; | 452 scoped_ptr<CertVerifier::Request> request2; |
453 CertVerifyResult verify_result3; | 453 CertVerifyResult verify_result3; |
454 TestCompletionCallback callback3; | 454 TestCompletionCallback callback3; |
455 scoped_ptr<CertVerifier::Request> request_handle3; | 455 scoped_ptr<CertVerifier::Request> request3; |
456 CertVerifyResult verify_result4; | 456 CertVerifyResult verify_result4; |
457 TestCompletionCallback callback4; | 457 TestCompletionCallback callback4; |
458 scoped_ptr<CertVerifier::Request> request_handle4; | 458 scoped_ptr<CertVerifier::Request> request4; |
459 CertVerifyResult verify_result5; | 459 CertVerifyResult verify_result5; |
460 TestCompletionCallback callback5; | 460 TestCompletionCallback callback5; |
461 scoped_ptr<CertVerifier::Request> request_handle5; | 461 scoped_ptr<CertVerifier::Request> request5; |
462 | 462 |
463 const char domain1[] = "www.example1.com"; | 463 const char domain1[] = "www.example1.com"; |
464 const char domain2[] = "www.exampleB.com"; | 464 const char domain2[] = "www.exampleB.com"; |
465 const char domain3[] = "www.example3.com"; | 465 const char domain3[] = "www.example3.com"; |
466 | 466 |
467 // Start 3 unique requests. | 467 // Start 3 unique requests. |
468 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 468 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, |
469 &verify_result1, callback1.callback(), | 469 &verify_result1, callback1.callback(), &request1, |
470 &request_handle1, BoundNetLog()); | 470 BoundNetLog()); |
471 ASSERT_EQ(ERR_IO_PENDING, error); | 471 ASSERT_EQ(ERR_IO_PENDING, error); |
472 EXPECT_TRUE(request_handle1); | 472 EXPECT_TRUE(request1); |
473 | 473 |
474 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 474 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, |
475 &verify_result2, callback2.callback(), | 475 &verify_result2, callback2.callback(), &request2, |
476 &request_handle2, BoundNetLog()); | 476 BoundNetLog()); |
477 EXPECT_EQ(ERR_IO_PENDING, error); | 477 EXPECT_EQ(ERR_IO_PENDING, error); |
478 EXPECT_TRUE(request_handle2); | 478 EXPECT_TRUE(request2); |
479 | 479 |
480 error = verifier_.Verify(test_cert.get(), domain3, std::string(), 0, nullptr, | 480 error = verifier_.Verify(test_cert.get(), domain3, std::string(), 0, nullptr, |
481 &verify_result3, callback3.callback(), | 481 &verify_result3, callback3.callback(), &request3, |
482 &request_handle3, BoundNetLog()); | 482 BoundNetLog()); |
483 EXPECT_EQ(ERR_IO_PENDING, error); | 483 EXPECT_EQ(ERR_IO_PENDING, error); |
484 EXPECT_TRUE(request_handle3); | 484 EXPECT_TRUE(request3); |
485 | 485 |
486 // Start duplicate requests (which should join to existing jobs). | 486 // Start duplicate requests (which should join to existing jobs). |
487 error = verifier_.Verify(test_cert.get(), domain1, std::string(), 0, nullptr, | 487 error = verifier_.Verify(test_cert.get(), domain1, std::string(), 0, nullptr, |
488 &verify_result4, callback4.callback(), | 488 &verify_result4, callback4.callback(), &request4, |
489 &request_handle4, BoundNetLog()); | 489 BoundNetLog()); |
490 EXPECT_EQ(ERR_IO_PENDING, error); | 490 EXPECT_EQ(ERR_IO_PENDING, error); |
491 EXPECT_TRUE(request_handle4); | 491 EXPECT_TRUE(request4); |
492 | 492 |
493 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, | 493 error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr, |
494 &verify_result5, callback5.callback(), | 494 &verify_result5, callback5.callback(), &request5, |
495 &request_handle5, BoundNetLog()); | 495 BoundNetLog()); |
496 EXPECT_EQ(ERR_IO_PENDING, error); | 496 EXPECT_EQ(ERR_IO_PENDING, error); |
497 EXPECT_TRUE(request_handle5); | 497 EXPECT_TRUE(request5); |
498 | 498 |
499 error = callback1.WaitForResult(); | 499 error = callback1.WaitForResult(); |
500 EXPECT_TRUE(IsCertificateError(error)); | 500 EXPECT_TRUE(IsCertificateError(error)); |
501 error = callback2.WaitForResult(); | 501 error = callback2.WaitForResult(); |
502 ASSERT_TRUE(IsCertificateError(error)); | 502 ASSERT_TRUE(IsCertificateError(error)); |
503 error = callback4.WaitForResult(); | 503 error = callback4.WaitForResult(); |
504 ASSERT_TRUE(IsCertificateError(error)); | 504 ASSERT_TRUE(IsCertificateError(error)); |
505 | 505 |
506 // Let the other requests automatically cancel. | 506 // Let the other requests automatically cancel. |
507 ASSERT_EQ(5u, verifier_.requests()); | 507 ASSERT_EQ(5u, verifier_.requests()); |
508 ASSERT_EQ(0u, verifier_.cache_hits()); | 508 ASSERT_EQ(0u, verifier_.cache_hits()); |
509 ASSERT_EQ(2u, verifier_.inflight_joins()); | 509 ASSERT_EQ(2u, verifier_.inflight_joins()); |
510 } | 510 } |
511 | 511 |
512 } // namespace net | 512 } // namespace net |
OLD | NEW |