| 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 |