| Index: net/base/cert_verifier_unittest.cc
 | 
| ===================================================================
 | 
| --- net/base/cert_verifier_unittest.cc	(revision 107789)
 | 
| +++ net/base/cert_verifier_unittest.cc	(working copy)
 | 
| @@ -59,6 +59,7 @@
 | 
|    ASSERT_EQ(1u, verifier.requests());
 | 
|    ASSERT_EQ(0u, verifier.cache_hits());
 | 
|    ASSERT_EQ(0u, verifier.inflight_joins());
 | 
| +  ASSERT_EQ(1u, verifier.GetCacheSize());
 | 
|  
 | 
|    error = verifier.Verify(test_cert, "www.example.com", 0, NULL, &verify_result,
 | 
|                            callback.callback(), &request_handle, BoundNetLog());
 | 
| @@ -69,8 +70,74 @@
 | 
|    ASSERT_EQ(2u, verifier.requests());
 | 
|    ASSERT_EQ(1u, verifier.cache_hits());
 | 
|    ASSERT_EQ(0u, verifier.inflight_joins());
 | 
| +  ASSERT_EQ(1u, verifier.GetCacheSize());
 | 
|  }
 | 
|  
 | 
| +// Tests the same server certificate with different intermediate CA
 | 
| +// certificates.  These should be treated as different certificate chains even
 | 
| +// though the two X509Certificate objects contain the same server certificate.
 | 
| +TEST(CertVerifierTest, DifferentCACerts) {
 | 
| +  TestTimeService* time_service = new TestTimeService;
 | 
| +  base::Time current_time = base::Time::Now();
 | 
| +  time_service->set_current_time(current_time);
 | 
| +  CertVerifier verifier(time_service);
 | 
| +
 | 
| +  FilePath certs_dir = GetTestCertsDirectory();
 | 
| +
 | 
| +  scoped_refptr<X509Certificate> server_cert =
 | 
| +      ImportCertFromFile(certs_dir, "salesforce_com_test.der");
 | 
| +  ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert);
 | 
| +
 | 
| +  scoped_refptr<X509Certificate> intermediate_cert1 =
 | 
| +      ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2011.der");
 | 
| +  ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert1);
 | 
| +
 | 
| +  scoped_refptr<X509Certificate> intermediate_cert2 =
 | 
| +      ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2016.der");
 | 
| +  ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert2);
 | 
| +
 | 
| +  X509Certificate::OSCertHandles intermediates;
 | 
| +  intermediates.push_back(intermediate_cert1->os_cert_handle());
 | 
| +  scoped_refptr<X509Certificate> cert_chain1 =
 | 
| +      X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
 | 
| +                                        intermediates);
 | 
| +
 | 
| +  intermediates.clear();
 | 
| +  intermediates.push_back(intermediate_cert2->os_cert_handle());
 | 
| +  scoped_refptr<X509Certificate> cert_chain2 =
 | 
| +      X509Certificate::CreateFromHandle(server_cert->os_cert_handle(),
 | 
| +                                        intermediates);
 | 
| +
 | 
| +  int error;
 | 
| +  CertVerifyResult verify_result;
 | 
| +  TestCompletionCallback callback;
 | 
| +  CertVerifier::RequestHandle request_handle;
 | 
| +
 | 
| +  error = verifier.Verify(cert_chain1, "www.example.com", 0, NULL,
 | 
| +                          &verify_result, callback.callback(),
 | 
| +                          &request_handle, BoundNetLog());
 | 
| +  ASSERT_EQ(ERR_IO_PENDING, error);
 | 
| +  ASSERT_TRUE(request_handle != NULL);
 | 
| +  error = callback.WaitForResult();
 | 
| +  ASSERT_TRUE(IsCertificateError(error));
 | 
| +  ASSERT_EQ(1u, verifier.requests());
 | 
| +  ASSERT_EQ(0u, verifier.cache_hits());
 | 
| +  ASSERT_EQ(0u, verifier.inflight_joins());
 | 
| +  ASSERT_EQ(1u, verifier.GetCacheSize());
 | 
| +
 | 
| +  error = verifier.Verify(cert_chain2, "www.example.com", 0, NULL,
 | 
| +                          &verify_result, callback.callback(),
 | 
| +                          &request_handle, BoundNetLog());
 | 
| +  ASSERT_EQ(ERR_IO_PENDING, error);
 | 
| +  ASSERT_TRUE(request_handle != NULL);
 | 
| +  error = callback.WaitForResult();
 | 
| +  ASSERT_TRUE(IsCertificateError(error));
 | 
| +  ASSERT_EQ(2u, verifier.requests());
 | 
| +  ASSERT_EQ(0u, verifier.cache_hits());
 | 
| +  ASSERT_EQ(0u, verifier.inflight_joins());
 | 
| +  ASSERT_EQ(2u, verifier.GetCacheSize());
 | 
| +}
 | 
| +
 | 
|  // Tests an inflight join.
 | 
|  TEST(CertVerifierTest, InflightJoin) {
 | 
|    TestTimeService* time_service = new TestTimeService;
 | 
| 
 |