// Copyright (c) 2013 The Chromium OS 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 CRYPTOHOME_MOCK_ATTESTATION_H_
#define CRYPTOHOME_MOCK_ATTESTATION_H_

#include "cryptohome/attestation.h"

#include <string>

#include <chromeos/secure_blob.h>
#include <gmock/gmock.h>

namespace cryptohome {

class Platform;

class MockAttestation : public Attestation {
 public:
  MockAttestation(): Attestation() { }
  virtual ~MockAttestation() {}

  MOCK_METHOD5(Initialize, void(Tpm*,
                                TpmInit*,
                                Platform*,
                                Crypto*,
                                InstallAttributes*));
  MOCK_METHOD0(IsPreparedForEnrollment, bool());
  MOCK_METHOD0(IsEnrolled, bool());
  MOCK_METHOD0(PrepareForEnrollment, void());
  MOCK_METHOD0(PrepareForEnrollmentAsync, void());
  MOCK_METHOD0(Verify, bool());
  MOCK_METHOD0(VerifyEK, bool());
  MOCK_METHOD2(CreateEnrollRequest, bool(Attestation::PCAType,
                                         chromeos::SecureBlob*));
  MOCK_METHOD2(Enroll, bool(Attestation::PCAType,
                            const chromeos::SecureBlob&));
  MOCK_METHOD5(CreateCertRequest, bool(Attestation::PCAType,
                                       CertificateProfile,
                                       const std::string&,
                                       const std::string&,
                                       chromeos::SecureBlob*));
  MOCK_METHOD5(FinishCertRequest, bool(const chromeos::SecureBlob&,
                                       bool,
                                       const std::string&,
                                       const std::string&,
                                       chromeos::SecureBlob*));
  MOCK_METHOD4(GetCertificateChain, bool(bool,
                                         const std::string&,
                                         const std::string&,
                                         chromeos::SecureBlob*));
  MOCK_METHOD4(GetPublicKey, bool(bool,
                                  const std::string&,
                                  const std::string&,
                                  chromeos::SecureBlob*));
  MOCK_METHOD3(DoesKeyExist, bool(bool,
                                  const std::string&,
                                  const std::string&));
  MOCK_METHOD8(SignEnterpriseChallenge, bool(bool,
                                             const std::string&,
                                             const std::string&,
                                             const std::string&,
                                             const chromeos::SecureBlob&,
                                             bool,
                                             const chromeos::SecureBlob&,
                                             chromeos::SecureBlob*));
  MOCK_METHOD5(SignSimpleChallenge, bool(bool,
                                         const std::string&,
                                         const std::string&,
                                         const chromeos::SecureBlob&,
                                         chromeos::SecureBlob*));
  MOCK_METHOD3(RegisterKey, bool(bool,
                                 const std::string&,
                                 const std::string&));
  MOCK_METHOD4(GetKeyPayload, bool(bool,
                                   const std::string&,
                                   const std::string&,
                                   chromeos::SecureBlob*));
  MOCK_METHOD4(SetKeyPayload, bool(bool,
                                   const std::string&,
                                   const std::string&,
                                   const chromeos::SecureBlob&));
  MOCK_METHOD3(DeleteKeysByPrefix, bool(bool,
                                        const std::string&,
                                        const std::string&));
  MOCK_METHOD1(GetEKInfo, bool(std::string*));
  MOCK_METHOD2(GetIdentityResetRequest, bool(const std::string&,
                                             chromeos::SecureBlob*));
  MOCK_METHOD1(set_database_path, void(const char*));
  MOCK_METHOD1(set_enterprise_test_key, void(RSA*));  // NOLINT "unnamed" param.
  MOCK_METHOD0(ThreadMain, void());
  MOCK_METHOD0(OnFinalized, void());
};

}  // namespace cryptohome

#endif  // CRYPTOHOME_MOCK_ATTESTATION_H_
