| Index: net/cert/multi_threaded_cert_verifier_unittest.cc
|
| diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc
|
| index 142e65a8f648156e29b12d5387c1c0657213964d..cb58291e69dbb998d790fc7d820231534c5f9bb8 100644
|
| --- a/net/cert/multi_threaded_cert_verifier_unittest.cc
|
| +++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
|
| @@ -85,7 +85,7 @@ TEST_F(MultiThreadedCertVerifierTest, CacheHit) {
|
| int error;
|
| CertVerifyResult verify_result;
|
| TestCompletionCallback callback;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
|
|
| error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0,
|
| NULL, &verify_result, callback.callback(),
|
| @@ -145,7 +145,7 @@ TEST_F(MultiThreadedCertVerifierTest, DifferentCACerts) {
|
| int error;
|
| CertVerifyResult verify_result;
|
| TestCompletionCallback callback;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
|
|
| error = verifier_.Verify(cert_chain1.get(), "www.example.com", std::string(),
|
| 0, NULL, &verify_result, callback.callback(),
|
| @@ -182,10 +182,10 @@ TEST_F(MultiThreadedCertVerifierTest, InflightJoin) {
|
| int error;
|
| CertVerifyResult verify_result;
|
| TestCompletionCallback callback;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
| CertVerifyResult verify_result2;
|
| TestCompletionCallback callback2;
|
| - CertVerifier::RequestHandle request_handle2;
|
| + scoped_ptr<CertVerifier::Request> request_handle2;
|
|
|
| error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0,
|
| NULL, &verify_result, callback.callback(),
|
| @@ -196,7 +196,7 @@ TEST_F(MultiThreadedCertVerifierTest, InflightJoin) {
|
| NULL, &verify_result2, callback2.callback(),
|
| &request_handle2, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, error);
|
| - EXPECT_TRUE(request_handle2 != NULL);
|
| + EXPECT_TRUE(request_handle2);
|
| error = callback.WaitForResult();
|
| EXPECT_TRUE(IsCertificateError(error));
|
| error = callback2.WaitForResult();
|
| @@ -215,14 +215,14 @@ TEST_F(MultiThreadedCertVerifierTest, CancelRequest) {
|
|
|
| int error;
|
| CertVerifyResult verify_result;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
|
|
| error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0,
|
| NULL, &verify_result, base::Bind(&FailTest),
|
| &request_handle, BoundNetLog());
|
| ASSERT_EQ(ERR_IO_PENDING, error);
|
| - ASSERT_TRUE(request_handle != NULL);
|
| - verifier_.CancelRequest(request_handle);
|
| + ASSERT_TRUE(request_handle);
|
| + request_handle.reset();
|
|
|
| // Issue a few more requests to the worker pool and wait for their
|
| // completion, so that the task of the canceled request (which runs on a
|
| @@ -249,7 +249,7 @@ TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) {
|
| int error;
|
| CertVerifyResult verify_result;
|
| TestCompletionCallback callback;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
|
|
| {
|
| // Because shutdown intentionally doesn't join worker threads, a
|
| @@ -262,7 +262,7 @@ TEST_F(MultiThreadedCertVerifierTest, CancelRequestThenQuit) {
|
| }
|
| ASSERT_EQ(ERR_IO_PENDING, error);
|
| EXPECT_TRUE(request_handle);
|
| - verifier_.CancelRequest(request_handle);
|
| + request_handle.reset();
|
| // Destroy |verifier| by going out of scope.
|
| }
|
|
|
| @@ -393,7 +393,7 @@ TEST_F(MultiThreadedCertVerifierTest, CertTrustAnchorProvider) {
|
| int error;
|
| CertVerifyResult verify_result;
|
| TestCompletionCallback callback;
|
| - CertVerifier::RequestHandle request_handle;
|
| + scoped_ptr<CertVerifier::Request> request_handle;
|
| EXPECT_CALL(trust_provider, GetAdditionalTrustAnchors())
|
| .WillOnce(ReturnRef(empty_cert_list));
|
| error = verifier_.Verify(test_cert.get(), "www.example.com", std::string(), 0,
|
| @@ -435,4 +435,78 @@ TEST_F(MultiThreadedCertVerifierTest, CertTrustAnchorProvider) {
|
| ASSERT_EQ(1u, verifier_.cache_hits());
|
| }
|
|
|
| +// Tests de-duplication of requests.
|
| +// Starts up 5 requests, of which 3 are unique.
|
| +TEST_F(MultiThreadedCertVerifierTest, MultipleInflightJoin) {
|
| + base::FilePath certs_dir = GetTestCertsDirectory();
|
| + scoped_refptr<X509Certificate> test_cert(
|
| + ImportCertFromFile(certs_dir, "ok_cert.pem"));
|
| + ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| +
|
| + int error;
|
| + CertVerifyResult verify_result1;
|
| + TestCompletionCallback callback1;
|
| + scoped_ptr<CertVerifier::Request> request_handle1;
|
| + CertVerifyResult verify_result2;
|
| + TestCompletionCallback callback2;
|
| + scoped_ptr<CertVerifier::Request> request_handle2;
|
| + CertVerifyResult verify_result3;
|
| + TestCompletionCallback callback3;
|
| + scoped_ptr<CertVerifier::Request> request_handle3;
|
| + CertVerifyResult verify_result4;
|
| + TestCompletionCallback callback4;
|
| + scoped_ptr<CertVerifier::Request> request_handle4;
|
| + CertVerifyResult verify_result5;
|
| + TestCompletionCallback callback5;
|
| + scoped_ptr<CertVerifier::Request> request_handle5;
|
| +
|
| + const char domain1[] = "www.example1.com";
|
| + const char domain2[] = "www.exampleB.com";
|
| + const char domain3[] = "www.example3.com";
|
| +
|
| + // Start 3 unique requests.
|
| + error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr,
|
| + &verify_result1, callback1.callback(),
|
| + &request_handle1, BoundNetLog());
|
| + ASSERT_EQ(ERR_IO_PENDING, error);
|
| + EXPECT_TRUE(request_handle1);
|
| +
|
| + error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr,
|
| + &verify_result2, callback2.callback(),
|
| + &request_handle2, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, error);
|
| + EXPECT_TRUE(request_handle2);
|
| +
|
| + error = verifier_.Verify(test_cert.get(), domain3, std::string(), 0, nullptr,
|
| + &verify_result3, callback3.callback(),
|
| + &request_handle3, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, error);
|
| + EXPECT_TRUE(request_handle3);
|
| +
|
| + // Start duplicate requests (which should join to existing jobs).
|
| + error = verifier_.Verify(test_cert.get(), domain1, std::string(), 0, nullptr,
|
| + &verify_result4, callback4.callback(),
|
| + &request_handle4, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, error);
|
| + EXPECT_TRUE(request_handle4);
|
| +
|
| + error = verifier_.Verify(test_cert.get(), domain2, std::string(), 0, nullptr,
|
| + &verify_result5, callback5.callback(),
|
| + &request_handle5, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, error);
|
| + EXPECT_TRUE(request_handle5);
|
| +
|
| + error = callback1.WaitForResult();
|
| + EXPECT_TRUE(IsCertificateError(error));
|
| + error = callback2.WaitForResult();
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| + error = callback4.WaitForResult();
|
| + ASSERT_TRUE(IsCertificateError(error));
|
| +
|
| + // Let the other requests automatically cancel.
|
| + ASSERT_EQ(5u, verifier_.requests());
|
| + ASSERT_EQ(0u, verifier_.cache_hits());
|
| + ASSERT_EQ(2u, verifier_.inflight_joins());
|
| +}
|
| +
|
| } // namespace net
|
|
|