|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/ssl/client_cert_store_mac.h" | 
|  |  | 
|  | #include "net/ssl/client_cert_store_unittest-inl.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class ClientCertStoreMacTestDelegate { | 
|  | public: | 
|  | bool SelectClientCerts(const CertificateList& input_certs, | 
|  | const SSLCertRequestInfo& cert_request_info, | 
|  | CertificateList* selected_certs) { | 
|  | return store_.SelectClientCertsForTesting( | 
|  | input_certs, cert_request_info, selected_certs); | 
|  | } | 
|  |  | 
|  | private: | 
|  | ClientCertStoreMac store_; | 
|  | }; | 
|  |  | 
|  | INSTANTIATE_TYPED_TEST_CASE_P(Mac, | 
|  | ClientCertStoreTest, | 
|  | ClientCertStoreMacTestDelegate); | 
|  |  | 
|  | class ClientCertStoreMacTest : public ::testing::Test { | 
|  | protected: | 
|  | bool SelectClientCertsGivenPreferred( | 
|  | const scoped_refptr<X509Certificate>& preferred_cert, | 
|  | const CertificateList& regular_certs, | 
|  | const SSLCertRequestInfo& request, | 
|  | CertificateList* selected_certs) { | 
|  | return store_.SelectClientCertsGivenPreferredForTesting( | 
|  | preferred_cert, regular_certs, request, selected_certs); | 
|  | } | 
|  |  | 
|  | private: | 
|  | ClientCertStoreMac store_; | 
|  | }; | 
|  |  | 
|  | // Verify that the preferred cert gets filtered out when it doesn't match the | 
|  | // server criteria. | 
|  | TEST_F(ClientCertStoreMacTest, FilterOutThePreferredCert) { | 
|  | scoped_refptr<X509Certificate> cert_1( | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "client_1.pem")); | 
|  | ASSERT_TRUE(cert_1.get()); | 
|  |  | 
|  | std::vector<std::string> authority_2( | 
|  | 1, std::string(reinterpret_cast<const char*>(kAuthority2DN), | 
|  | sizeof(kAuthority2DN))); | 
|  | EXPECT_FALSE(cert_1->IsIssuedByEncoded(authority_2)); | 
|  |  | 
|  | std::vector<scoped_refptr<X509Certificate> > certs; | 
|  | scoped_refptr<SSLCertRequestInfo> request(new SSLCertRequestInfo()); | 
|  | request->cert_authorities = authority_2; | 
|  |  | 
|  | std::vector<scoped_refptr<X509Certificate> > selected_certs; | 
|  | bool rv = SelectClientCertsGivenPreferred( | 
|  | cert_1, certs, *request.get(), &selected_certs); | 
|  | EXPECT_TRUE(rv); | 
|  | EXPECT_EQ(0u, selected_certs.size()); | 
|  | } | 
|  |  | 
|  | // Verify that the preferred cert takes the first position in the output list, | 
|  | // when it does not get filtered out. | 
|  | TEST_F(ClientCertStoreMacTest, PreferredCertGoesFirst) { | 
|  | scoped_refptr<X509Certificate> cert_1( | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "client_1.pem")); | 
|  | ASSERT_TRUE(cert_1.get()); | 
|  | scoped_refptr<X509Certificate> cert_2( | 
|  | ImportCertFromFile(GetTestCertsDirectory(), "client_2.pem")); | 
|  | ASSERT_TRUE(cert_2.get()); | 
|  |  | 
|  | std::vector<scoped_refptr<X509Certificate> > certs; | 
|  | certs.push_back(cert_2); | 
|  | scoped_refptr<SSLCertRequestInfo> request(new SSLCertRequestInfo()); | 
|  |  | 
|  | std::vector<scoped_refptr<X509Certificate> > selected_certs; | 
|  | bool rv = SelectClientCertsGivenPreferred( | 
|  | cert_1, certs, *request.get(), &selected_certs); | 
|  | EXPECT_TRUE(rv); | 
|  | ASSERT_EQ(2u, selected_certs.size()); | 
|  | EXPECT_TRUE(selected_certs[0]->Equals(cert_1.get())); | 
|  | EXPECT_TRUE(selected_certs[1]->Equals(cert_2.get())); | 
|  | } | 
|  |  | 
|  | }  // namespace net |