| Index: net/ssl/client_cert_store_nss_unittest.cc
 | 
| diff --git a/net/ssl/client_cert_store_nss_unittest.cc b/net/ssl/client_cert_store_nss_unittest.cc
 | 
| index 00d3a9c655d32c590565da87c5d1912a445197de..0fcd2b700988b6eaf0bfeb6d55dbe6aabb070f06 100644
 | 
| --- a/net/ssl/client_cert_store_nss_unittest.cc
 | 
| +++ b/net/ssl/client_cert_store_nss_unittest.cc
 | 
| @@ -4,7 +4,21 @@
 | 
|  
 | 
|  #include "net/ssl/client_cert_store_nss.h"
 | 
|  
 | 
| +#include <cert.h>
 | 
| +#include <certt.h>
 | 
| +#include <pk11pub.h>
 | 
| +#include <stdint.h>
 | 
| +
 | 
| +#include <string>
 | 
| +
 | 
| +#include "base/memory/ref_counted.h"
 | 
| +#include "base/run_loop.h"
 | 
| +#include "crypto/scoped_test_nss_db.h"
 | 
| +#include "net/cert/x509_certificate.h"
 | 
|  #include "net/ssl/client_cert_store_unittest-inl.h"
 | 
| +#include "net/ssl/ssl_cert_request_info.h"
 | 
| +#include "net/test/cert_test_util.h"
 | 
| +#include "testing/gtest/include/gtest/gtest.h"
 | 
|  
 | 
|  namespace net {
 | 
|  
 | 
| @@ -18,7 +32,7 @@ class ClientCertStoreNSSTestDelegate {
 | 
|      // Filters |input_certs| using the logic being used to filter the system
 | 
|      // store when GetClientCerts() is called.
 | 
|      ClientCertStoreNSS::FilterCertsOnWorkerThread(
 | 
| -        input_certs, cert_request_info, false, selected_certs);
 | 
| +        input_certs, cert_request_info, selected_certs);
 | 
|      return true;
 | 
|    }
 | 
|  };
 | 
| @@ -27,4 +41,47 @@ INSTANTIATE_TYPED_TEST_CASE_P(NSS,
 | 
|                                ClientCertStoreTest,
 | 
|                                ClientCertStoreNSSTestDelegate);
 | 
|  
 | 
| +// Tests that ClientCertStoreNSS attempts to build a certificate chain by
 | 
| +// querying NSS before return a certificate.
 | 
| +TEST(ClientCertStoreNSSTest, BuildsCertificateChain) {
 | 
| +  // Set up a test DB and import client_1.pem and client_1_ca.pem.
 | 
| +  scoped_refptr<X509Certificate> client_1(
 | 
| +      ImportCertFromFile(GetTestCertsDirectory(), "client_1.pem"));
 | 
| +  ASSERT_TRUE(client_1.get());
 | 
| +  scoped_refptr<X509Certificate> client_1_ca(
 | 
| +      ImportCertFromFile(GetTestCertsDirectory(), "client_1_ca.pem"));
 | 
| +  ASSERT_TRUE(client_1_ca.get());
 | 
| +
 | 
| +  crypto::ScopedTestNSSDB test_db;
 | 
| +  ASSERT_EQ(SECSuccess,
 | 
| +            PK11_ImportCert(test_db.slot(), client_1->os_cert_handle(),
 | 
| +                            CK_INVALID_HANDLE, "client_1",
 | 
| +                            PR_FALSE /* includeTrust (unused) */));
 | 
| +  ASSERT_EQ(SECSuccess,
 | 
| +            PK11_ImportCert(test_db.slot(), client_1_ca->os_cert_handle(),
 | 
| +                            CK_INVALID_HANDLE, "client_1_ca",
 | 
| +                            PR_FALSE /* includeTrust (unused) */));
 | 
| +
 | 
| +  // Request certificates matching client_1_ca.pem.
 | 
| +  scoped_ptr<ClientCertStoreNSS> store(
 | 
| +      new ClientCertStoreNSS(ClientCertStoreNSS::PasswordDelegateFactory()));
 | 
| +  scoped_refptr<SSLCertRequestInfo> request(new SSLCertRequestInfo);
 | 
| +  request->cert_authorities.push_back(std::string(
 | 
| +      reinterpret_cast<const char*>(kAuthority1DN), sizeof(kAuthority1DN)));
 | 
| +
 | 
| +  CertificateList selected_certs;
 | 
| +  base::RunLoop loop;
 | 
| +  store->GetClientCerts(*request.get(), &selected_certs, loop.QuitClosure());
 | 
| +  loop.Run();
 | 
| +
 | 
| +  // The result should have include client_1_ca.pem.
 | 
| +  ASSERT_EQ(1u, selected_certs.size());
 | 
| +  scoped_refptr<X509Certificate> selected_cert = selected_certs[0];
 | 
| +  EXPECT_TRUE(selected_cert->Equals(client_1.get()));
 | 
| +  ASSERT_EQ(1u, selected_cert->GetIntermediateCertificates().size());
 | 
| +  EXPECT_TRUE(X509Certificate::IsSameOSCert(
 | 
| +      client_1_ca->os_cert_handle(),
 | 
| +      selected_cert->GetIntermediateCertificates()[0]));
 | 
| +}
 | 
| +
 | 
|  }  // namespace net
 | 
| 
 |