// Copyright 2017 The Chromium Authors
// 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);

  // Creates a FakeClientCertIdentity from a certificate file (DER or PEM).
  // Signing attempts will fail. Returns nullptr on error.
  static std::unique_ptr<FakeClientCertIdentity> CreateFromCertAndFailSigning(
      const base::FilePath& dir,
      const std::string& cert_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(base::OnceCallback<void(scoped_refptr<SSLPrivateKey>)>
                             private_key_callback) override;

 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_
