// Copyright (c) 2012 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 CHAPS_TPM_UTILITY_MOCK_H_
#define CHAPS_TPM_UTILITY_MOCK_H_

#include <string>

#include "chaps/tpm_utility.h"

#include <base/macros.h>
#include <gmock/gmock.h>

namespace chaps {

class TPMUtilityMock : public TPMUtility {
 public:
  TPMUtilityMock();
  ~TPMUtilityMock() override;

  MOCK_METHOD0(MinRSAKeyBits, size_t());
  MOCK_METHOD0(MaxRSAKeyBits, size_t());
  MOCK_METHOD0(Init, bool());
  MOCK_METHOD0(IsTPMAvailable, bool());
  MOCK_METHOD0(GetTPMVersion, TPMVersion());
  MOCK_METHOD5(Authenticate,
               bool(int,
                    const brillo::SecureBlob&,
                    const std::string&,
                    const std::string&,
                    brillo::SecureBlob*));
  MOCK_METHOD5(ChangeAuthData,
               bool(int,
                    const brillo::SecureBlob&,
                    const brillo::SecureBlob&,
                    const std::string&,
                    std::string*));
  MOCK_METHOD2(GenerateRandom, bool(int, std::string*));
  MOCK_METHOD1(StirRandom, bool(const std::string&));
  MOCK_METHOD6(GenerateRSAKey,
               bool(int,
                    int,
                    const std::string&,
                    const brillo::SecureBlob&,
                    std::string*,
                    int*));
  MOCK_METHOD3(GetRSAPublicKey, bool(int, std::string*, std::string*));
  MOCK_METHOD1(IsECCurveSupported, bool(int));
  MOCK_METHOD5(GenerateECCKey,
               bool(int, int, const brillo::SecureBlob&, std::string*, int*));
  MOCK_METHOD2(GetECCPublicKey, bool(int, std::string*));
  MOCK_METHOD7(WrapRSAKey,
               bool(int,
                    const std::string&,
                    const std::string&,
                    const std::string&,
                    const brillo::SecureBlob&,
                    std::string*,
                    int*));
  MOCK_METHOD8(WrapECCKey,
               bool(int,
                    int,
                    const std::string&,
                    const std::string&,
                    const std::string&,
                    const brillo::SecureBlob&,
                    std::string*,
                    int*));
  MOCK_METHOD4(LoadKey,
               bool(int, const std::string&, const brillo::SecureBlob&, int*));
  MOCK_METHOD5(
      LoadKeyWithParent,
      bool(int, const std::string&, const brillo::SecureBlob&, int, int*));
  MOCK_METHOD1(UnloadKeysForSlot, void(int));
  MOCK_METHOD3(Bind, bool(int, const std::string&, std::string*));
  MOCK_METHOD3(Unbind, bool(int, const std::string&, std::string*));
  MOCK_METHOD5(Sign,
               bool(int,
                    CK_MECHANISM_TYPE,
                    const std::string&,
                    const std::string&,
                    std::string*));
  MOCK_METHOD0(IsSRKReady, bool());

 private:
  DISALLOW_COPY_AND_ASSIGN(TPMUtilityMock);
};

}  // namespace chaps

#endif  // CHAPS_TPM_UTILITY_MOCK_H_
