// Copyright 2017 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.

#ifndef NET_SSL_CLIENT_CERT_IDENTITY_TEST_UTIL_H_
#define NET_SSL_CLIENT_CERT_IDENTITY_TEST_UTIL_H_

#include "net/ssl/client_cert_identity.h"

namespace base {
class FilePath;
}

namespace net {

// Simple ClientCertIdentity implementation for testing.
// Note: this implementation of AcquirePrivateKey will always call the callback
// synchronously.
class FakeClientCertIdentity : public ClientCertIdentity {
 public:
  FakeClientCertIdentity(scoped_refptr<X509Certificate> cert,
                         scoped_refptr<SSLPrivateKey> key);
  ~FakeClientCertIdentity() override;

  // Creates a FakeClientCertIdentity from a certificate file (DER or PEM) and
  // private key file (unencrypted pkcs8). Returns nullptr on error.
  static std::unique_ptr<FakeClientCertIdentity> CreateFromCertAndKeyFiles(
      const base::FilePath& dir,
      const std::string& cert_filename,
      const std::string& key_filename);

  // Duplicates the FakeClientCertIdentity.
  std::unique_ptr<FakeClientCertIdentity> Copy();

  // Returns the SSLPrivateKey in a more convenient way, for tests.
  SSLPrivateKey* ssl_private_key() const { return key_.get(); }

  // ClientCertIdentity implementation:
  void AcquirePrivateKey(
      const base::Callback<void(scoped_refptr<SSLPrivateKey>)>&
          private_key_callback) override;
#if defined(OS_MACOSX)
  SecIdentityRef sec_identity_ref() const override;
#endif

 private:
  scoped_refptr<SSLPrivateKey> key_;
};

// Converts a CertificateList to a ClientCertIdentityList of
// FakeClientCertIdentity, with null private keys.
ClientCertIdentityList FakeClientCertIdentityListFromCertificateList(
    const CertificateList& certs);

}  // namespace net

#endif  // NET_SSL_CLIENT_CERT_IDENTITY_TEST_UTIL_H_
