| 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/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 | 88 |
| 89 error = verifier_.Verify(test_cert.get(), | 89 error = verifier_.Verify(test_cert.get(), |
| 90 "www.example.com", | 90 "www.example.com", |
| 91 0, | 91 0, |
| 92 NULL, | 92 NULL, |
| 93 &verify_result, | 93 &verify_result, |
| 94 callback.callback(), | 94 callback.callback(), |
| 95 &request_handle, | 95 &request_handle, |
| 96 BoundNetLog()); | 96 BoundNetLog()); |
| 97 ASSERT_EQ(ERR_IO_PENDING, error); | 97 ASSERT_EQ(ERR_IO_PENDING, error); |
| 98 ASSERT_TRUE(request_handle != NULL); | 98 EXPECT_TRUE(request_handle); |
| 99 error = callback.WaitForResult(); | 99 error = callback.WaitForResult(); |
| 100 ASSERT_TRUE(IsCertificateError(error)); | 100 ASSERT_TRUE(IsCertificateError(error)); |
| 101 ASSERT_EQ(1u, verifier_.requests()); | 101 ASSERT_EQ(1u, verifier_.requests()); |
| 102 ASSERT_EQ(0u, verifier_.cache_hits()); | 102 ASSERT_EQ(0u, verifier_.cache_hits()); |
| 103 ASSERT_EQ(0u, verifier_.inflight_joins()); | 103 ASSERT_EQ(0u, verifier_.inflight_joins()); |
| 104 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 104 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
| 105 | 105 |
| 106 error = verifier_.Verify(test_cert.get(), | 106 error = verifier_.Verify(test_cert.get(), |
| 107 "www.example.com", | 107 "www.example.com", |
| 108 0, | 108 0, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 | 158 |
| 159 error = verifier_.Verify(cert_chain1.get(), | 159 error = verifier_.Verify(cert_chain1.get(), |
| 160 "www.example.com", | 160 "www.example.com", |
| 161 0, | 161 0, |
| 162 NULL, | 162 NULL, |
| 163 &verify_result, | 163 &verify_result, |
| 164 callback.callback(), | 164 callback.callback(), |
| 165 &request_handle, | 165 &request_handle, |
| 166 BoundNetLog()); | 166 BoundNetLog()); |
| 167 ASSERT_EQ(ERR_IO_PENDING, error); | 167 ASSERT_EQ(ERR_IO_PENDING, error); |
| 168 ASSERT_TRUE(request_handle != NULL); | 168 EXPECT_TRUE(request_handle); |
| 169 error = callback.WaitForResult(); | 169 error = callback.WaitForResult(); |
| 170 ASSERT_TRUE(IsCertificateError(error)); | 170 ASSERT_TRUE(IsCertificateError(error)); |
| 171 ASSERT_EQ(1u, verifier_.requests()); | 171 ASSERT_EQ(1u, verifier_.requests()); |
| 172 ASSERT_EQ(0u, verifier_.cache_hits()); | 172 ASSERT_EQ(0u, verifier_.cache_hits()); |
| 173 ASSERT_EQ(0u, verifier_.inflight_joins()); | 173 ASSERT_EQ(0u, verifier_.inflight_joins()); |
| 174 ASSERT_EQ(1u, verifier_.GetCacheSize()); | 174 ASSERT_EQ(1u, verifier_.GetCacheSize()); |
| 175 | 175 |
| 176 error = verifier_.Verify(cert_chain2.get(), | 176 error = verifier_.Verify(cert_chain2.get(), |
| 177 "www.example.com", | 177 "www.example.com", |
| 178 0, | 178 0, |
| 179 NULL, | 179 NULL, |
| 180 &verify_result, | 180 &verify_result, |
| 181 callback.callback(), | 181 callback.callback(), |
| 182 &request_handle, | 182 &request_handle, |
| 183 BoundNetLog()); | 183 BoundNetLog()); |
| 184 ASSERT_EQ(ERR_IO_PENDING, error); | 184 ASSERT_EQ(ERR_IO_PENDING, error); |
| 185 ASSERT_TRUE(request_handle != NULL); | 185 EXPECT_TRUE(request_handle); |
| 186 error = callback.WaitForResult(); | 186 error = callback.WaitForResult(); |
| 187 ASSERT_TRUE(IsCertificateError(error)); | 187 ASSERT_TRUE(IsCertificateError(error)); |
| 188 ASSERT_EQ(2u, verifier_.requests()); | 188 ASSERT_EQ(2u, verifier_.requests()); |
| 189 ASSERT_EQ(0u, verifier_.cache_hits()); | 189 ASSERT_EQ(0u, verifier_.cache_hits()); |
| 190 ASSERT_EQ(0u, verifier_.inflight_joins()); | 190 ASSERT_EQ(0u, verifier_.inflight_joins()); |
| 191 ASSERT_EQ(2u, verifier_.GetCacheSize()); | 191 ASSERT_EQ(2u, verifier_.GetCacheSize()); |
| 192 } | 192 } |
| 193 | 193 |
| 194 // Tests an inflight join. | 194 // Tests an inflight join. |
| 195 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { | 195 TEST_F(MultiThreadedCertVerifierTest, InflightJoin) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 208 | 208 |
| 209 error = verifier_.Verify(test_cert.get(), | 209 error = verifier_.Verify(test_cert.get(), |
| 210 "www.example.com", | 210 "www.example.com", |
| 211 0, | 211 0, |
| 212 NULL, | 212 NULL, |
| 213 &verify_result, | 213 &verify_result, |
| 214 callback.callback(), | 214 callback.callback(), |
| 215 &request_handle, | 215 &request_handle, |
| 216 BoundNetLog()); | 216 BoundNetLog()); |
| 217 ASSERT_EQ(ERR_IO_PENDING, error); | 217 ASSERT_EQ(ERR_IO_PENDING, error); |
| 218 ASSERT_TRUE(request_handle != NULL); | 218 EXPECT_TRUE(request_handle); |
| 219 error = verifier_.Verify(test_cert.get(), | 219 error = verifier_.Verify(test_cert.get(), |
| 220 "www.example.com", | 220 "www.example.com", |
| 221 0, | 221 0, |
| 222 NULL, | 222 NULL, |
| 223 &verify_result2, | 223 &verify_result2, |
| 224 callback2.callback(), | 224 callback2.callback(), |
| 225 &request_handle2, | 225 &request_handle2, |
| 226 BoundNetLog()); | 226 BoundNetLog()); |
| 227 ASSERT_EQ(ERR_IO_PENDING, error); | 227 EXPECT_EQ(ERR_IO_PENDING, error); |
| 228 ASSERT_TRUE(request_handle2 != NULL); | 228 EXPECT_TRUE(request_handle2 != NULL); |
| 229 error = callback.WaitForResult(); | 229 error = callback.WaitForResult(); |
| 230 ASSERT_TRUE(IsCertificateError(error)); | 230 EXPECT_TRUE(IsCertificateError(error)); |
| 231 error = callback2.WaitForResult(); | 231 error = callback2.WaitForResult(); |
| 232 ASSERT_TRUE(IsCertificateError(error)); | 232 ASSERT_TRUE(IsCertificateError(error)); |
| 233 ASSERT_EQ(2u, verifier_.requests()); | 233 ASSERT_EQ(2u, verifier_.requests()); |
| 234 ASSERT_EQ(0u, verifier_.cache_hits()); | 234 ASSERT_EQ(0u, verifier_.cache_hits()); |
| 235 ASSERT_EQ(1u, verifier_.inflight_joins()); | 235 ASSERT_EQ(1u, verifier_.inflight_joins()); |
| 236 } | 236 } |
| 237 | 237 |
| 238 // Tests that the callback of a canceled request is never made. | 238 // Tests that the callback of a canceled request is never made. |
| 239 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { | 239 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) { |
| 240 base::FilePath certs_dir = GetTestCertsDirectory(); | 240 base::FilePath certs_dir = GetTestCertsDirectory(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 265 for (int i = 0; i < 5; ++i) { | 265 for (int i = 0; i < 5; ++i) { |
| 266 error = verifier_.Verify(test_cert.get(), | 266 error = verifier_.Verify(test_cert.get(), |
| 267 "www2.example.com", | 267 "www2.example.com", |
| 268 0, | 268 0, |
| 269 NULL, | 269 NULL, |
| 270 &verify_result, | 270 &verify_result, |
| 271 callback.callback(), | 271 callback.callback(), |
| 272 &request_handle, | 272 &request_handle, |
| 273 BoundNetLog()); | 273 BoundNetLog()); |
| 274 ASSERT_EQ(ERR_IO_PENDING, error); | 274 ASSERT_EQ(ERR_IO_PENDING, error); |
| 275 ASSERT_TRUE(request_handle != NULL); | 275 EXPECT_TRUE(request_handle); |
| 276 error = callback.WaitForResult(); | 276 error = callback.WaitForResult(); |
| 277 verifier_.ClearCache(); | 277 verifier_.ClearCache(); |
| 278 } | 278 } |
| 279 } | 279 } |
| 280 | 280 |
| 281 // Tests that a canceled request is not leaked. | 281 // Tests that a canceled request is not leaked. |
| 282 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { | 282 TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) { |
| 283 base::FilePath certs_dir = GetTestCertsDirectory(); | 283 base::FilePath certs_dir = GetTestCertsDirectory(); |
| 284 scoped_refptr<X509Certificate> test_cert( | 284 scoped_refptr<X509Certificate> test_cert( |
| 285 ImportCertFromFile(certs_dir, "ok_cert.pem")); | 285 ImportCertFromFile(certs_dir, "ok_cert.pem")); |
| 286 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); | 286 ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert); |
| 287 | 287 |
| 288 int error; | 288 int error; |
| 289 CertVerifyResult verify_result; | 289 CertVerifyResult verify_result; |
| 290 TestCompletionCallback callback; | 290 TestCompletionCallback callback; |
| 291 CertVerifier::RequestHandle request_handle; | 291 CertVerifier::RequestHandle request_handle; |
| 292 | 292 |
| 293 error = verifier_.Verify(test_cert.get(), | 293 error = verifier_.Verify(test_cert.get(), |
| 294 "www.example.com", | 294 "www.example.com", |
| 295 0, | 295 0, |
| 296 NULL, | 296 NULL, |
| 297 &verify_result, | 297 &verify_result, |
| 298 callback.callback(), | 298 callback.callback(), |
| 299 &request_handle, | 299 &request_handle, |
| 300 BoundNetLog()); | 300 BoundNetLog()); |
| 301 ASSERT_EQ(ERR_IO_PENDING, error); | 301 ASSERT_EQ(ERR_IO_PENDING, error); |
| 302 ASSERT_TRUE(request_handle != NULL); | 302 EXPECT_TRUE(request_handle); |
| 303 verifier_.CancelRequest(request_handle); | 303 verifier_.CancelRequest(request_handle); |
| 304 // Destroy |verifier| by going out of scope. | 304 // Destroy |verifier| by going out of scope. |
| 305 } | 305 } |
| 306 | 306 |
| 307 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { | 307 TEST_F(MultiThreadedCertVerifierTest, RequestParamsComparators) { |
| 308 SHA1HashValue a_key; | 308 SHA1HashValue a_key; |
| 309 memset(a_key.data, 'a', sizeof(a_key.data)); | 309 memset(a_key.data, 'a', sizeof(a_key.data)); |
| 310 | 310 |
| 311 SHA1HashValue z_key; | 311 SHA1HashValue z_key; |
| 312 memset(z_key.data, 'z', sizeof(z_key.data)); | 312 memset(z_key.data, 'z', sizeof(z_key.data)); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 error = verifier_.Verify(test_cert.get(), | 425 error = verifier_.Verify(test_cert.get(), |
| 426 "www.example.com", | 426 "www.example.com", |
| 427 0, | 427 0, |
| 428 NULL, | 428 NULL, |
| 429 &verify_result, | 429 &verify_result, |
| 430 callback.callback(), | 430 callback.callback(), |
| 431 &request_handle, | 431 &request_handle, |
| 432 BoundNetLog()); | 432 BoundNetLog()); |
| 433 Mock::VerifyAndClearExpectations(&trust_provider); | 433 Mock::VerifyAndClearExpectations(&trust_provider); |
| 434 ASSERT_EQ(ERR_IO_PENDING, error); | 434 ASSERT_EQ(ERR_IO_PENDING, error); |
| 435 ASSERT_TRUE(request_handle); | 435 EXPECT_TRUE(request_handle); |
| 436 error = callback.WaitForResult(); | 436 error = callback.WaitForResult(); |
| 437 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 437 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
| 438 ASSERT_EQ(1u, verifier_.requests()); | 438 ASSERT_EQ(1u, verifier_.requests()); |
| 439 ASSERT_EQ(0u, verifier_.cache_hits()); | 439 ASSERT_EQ(0u, verifier_.cache_hits()); |
| 440 | 440 |
| 441 // The next Verify() uses the cached result. | 441 // The next Verify() uses the cached result. |
| 442 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) | 442 EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors()) |
| 443 .WillOnce(ReturnRef(empty_cert_list)); | 443 .WillOnce(ReturnRef(empty_cert_list)); |
| 444 error = verifier_.Verify(test_cert.get(), | 444 error = verifier_.Verify(test_cert.get(), |
| 445 "www.example.com", | 445 "www.example.com", |
| (...skipping 16 matching lines...) Expand all Loading... |
| 462 error = verifier_.Verify(test_cert.get(), | 462 error = verifier_.Verify(test_cert.get(), |
| 463 "www.example.com", | 463 "www.example.com", |
| 464 0, | 464 0, |
| 465 NULL, | 465 NULL, |
| 466 &verify_result, | 466 &verify_result, |
| 467 callback.callback(), | 467 callback.callback(), |
| 468 &request_handle, | 468 &request_handle, |
| 469 BoundNetLog()); | 469 BoundNetLog()); |
| 470 Mock::VerifyAndClearExpectations(&trust_provider); | 470 Mock::VerifyAndClearExpectations(&trust_provider); |
| 471 ASSERT_EQ(ERR_IO_PENDING, error); | 471 ASSERT_EQ(ERR_IO_PENDING, error); |
| 472 ASSERT_TRUE(request_handle != NULL); | 472 EXPECT_TRUE(request_handle); |
| 473 error = callback.WaitForResult(); | 473 error = callback.WaitForResult(); |
| 474 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); | 474 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, error); |
| 475 ASSERT_EQ(3u, verifier_.requests()); | 475 ASSERT_EQ(3u, verifier_.requests()); |
| 476 ASSERT_EQ(1u, verifier_.cache_hits()); | 476 ASSERT_EQ(1u, verifier_.cache_hits()); |
| 477 } | 477 } |
| 478 | 478 |
| 479 } // namespace net | 479 } // namespace net |
| OLD | NEW |