// 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_CHAPS_PROXY_MOCK_H_
#define CHAPS_CHAPS_PROXY_MOCK_H_

#include <string>
#include <vector>

#include <brillo/secure_blob.h>
#include <chaps/proto_bindings/ck_structs.pb.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "chaps/chaps_interface.h"
#include "chaps/isolate.h"

namespace chaps {

// Defined in chaps.cc.
extern void EnableMockProxy(ChapsInterface* proxy,
                            brillo::SecureBlob* isolate_credential,
                            bool is_initialized);
extern void DisableMockProxy();
extern void SetRetryTimeParameters(uint32_t timeout_ms,
                                   uint32_t delay_ms);

// ChapsProxyMock is a mock of ChapsInterface.
class ChapsProxyMock : public ChapsInterface {
 public:
  explicit ChapsProxyMock(bool is_initialized)
    : isolate_credential_(
          IsolateCredentialManager::GetDefaultIsolateCredential()) {
    EnableMockProxy(this, &isolate_credential_, is_initialized);
  }

  ~ChapsProxyMock() override {
    DisableMockProxy();
  }

  MOCK_METHOD3(GetSlotList, uint32_t(const brillo::SecureBlob&, bool,
                                     std::vector<uint64_t>*));
  MOCK_METHOD3(GetSlotInfo, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     SlotInfo*));
  MOCK_METHOD3(GetTokenInfo, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      TokenInfo*));
  MOCK_METHOD3(GetMechanismList, uint32_t(const brillo::SecureBlob&,
                                          uint64_t, std::vector<uint64_t>*));
  MOCK_METHOD4(GetMechanismInfo, uint32_t(const brillo::SecureBlob&,
                                          uint64_t,
                                          uint64_t,
                                          MechanismInfo*));
  MOCK_METHOD4(InitToken, uint32_t(const brillo::SecureBlob&,
                                   uint64_t,
                                   const std::string*,
                                   const std::vector<uint8_t>&));
  MOCK_METHOD3(InitPIN, uint32_t(const brillo::SecureBlob&, uint64_t,
                                 const std::string*));
  MOCK_METHOD4(SetPIN, uint32_t(const brillo::SecureBlob&, uint64_t,
                                const std::string*,
                                const std::string*));
  MOCK_METHOD4(OpenSession, uint32_t(const brillo::SecureBlob&, uint64_t,
                                     uint64_t, uint64_t*));
  MOCK_METHOD2(CloseSession, uint32_t(const brillo::SecureBlob&, uint64_t));
  MOCK_METHOD2(CloseAllSessions, uint32_t(const brillo::SecureBlob&,
                                          uint64_t));
  MOCK_METHOD3(GetSessionInfo, uint32_t(const brillo::SecureBlob&, uint64_t,
                                        SessionInfo*));
  MOCK_METHOD3(GetOperationState, uint32_t(const brillo::SecureBlob&,
                                           uint64_t, std::vector<uint8_t>*));
  MOCK_METHOD5(SetOperationState, uint32_t(const brillo::SecureBlob&,
                                           uint64_t,
                                           const std::vector<uint8_t>&,
                                           uint64_t,
                                           uint64_t));
  MOCK_METHOD4(Login, uint32_t(const brillo::SecureBlob&, uint64_t, uint64_t,
                               const std::string*));
  MOCK_METHOD2(Logout, uint32_t(const brillo::SecureBlob&, uint64_t));
  MOCK_METHOD4(CreateObject, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      const std::vector<uint8_t>&,
                                      uint64_t*));
  MOCK_METHOD5(CopyObject, uint32_t(const brillo::SecureBlob&, uint64_t,
                                    uint64_t, const std::vector<uint8_t>&,
                                    uint64_t*));
  MOCK_METHOD3(DestroyObject, uint32_t(const brillo::SecureBlob&, uint64_t,
                                       uint64_t));
  MOCK_METHOD4(GetObjectSize, uint32_t(const brillo::SecureBlob&, uint64_t,
                                       uint64_t, uint64_t*));
  MOCK_METHOD5(GetAttributeValue, uint32_t(const brillo::SecureBlob&,
                                           uint64_t,
                                           uint64_t,
                                           const std::vector<uint8_t>&,
                                           std::vector<uint8_t>*));
  MOCK_METHOD4(SetAttributeValue, uint32_t(const brillo::SecureBlob&,
                                           uint64_t,
                                           uint64_t,
                                           const std::vector<uint8_t>&));
  MOCK_METHOD3(FindObjectsInit, uint32_t(const brillo::SecureBlob&, uint64_t,
                                         const std::vector<uint8_t>&));
  MOCK_METHOD4(FindObjects, uint32_t(const brillo::SecureBlob&, uint64_t,
                                     uint64_t, std::vector<uint64_t>*));
  MOCK_METHOD2(FindObjectsFinal, uint32_t(const brillo::SecureBlob&,
                                          uint64_t));
  MOCK_METHOD5(EncryptInit, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     uint64_t,
                                     const std::vector<uint8_t>&,
                                     uint64_t key_handle));
  MOCK_METHOD6(Encrypt, uint32_t(const brillo::SecureBlob&,
                                 uint64_t,
                                 const std::vector<uint8_t>&,
                                 uint64_t,
                                 uint64_t*,
                                 std::vector<uint8_t>*));
  MOCK_METHOD6(EncryptUpdate, uint32_t(const brillo::SecureBlob&,
                                       uint64_t,
                                       const std::vector<uint8_t>&,
                                       uint64_t,
                                       uint64_t*,
                                       std::vector<uint8_t>*));
  MOCK_METHOD5(EncryptFinal, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      uint64_t,
                                      uint64_t*,
                                      std::vector<uint8_t>*));
  MOCK_METHOD2(EncryptCancel, void(const brillo::SecureBlob&,
                                   uint64_t));
  MOCK_METHOD5(DecryptInit, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     uint64_t,
                                     const std::vector<uint8_t>&,
                                     uint64_t));
  MOCK_METHOD6(Decrypt, uint32_t(const brillo::SecureBlob&,
                                 uint64_t,
                                 const std::vector<uint8_t>&,
                                 uint64_t,
                                 uint64_t*,
                                 std::vector<uint8_t>*));
  MOCK_METHOD6(DecryptUpdate, uint32_t(const brillo::SecureBlob&,
                                       uint64_t,
                                       const std::vector<uint8_t>&,
                                       uint64_t,
                                       uint64_t*,
                                       std::vector<uint8_t>*));
  MOCK_METHOD5(DecryptFinal, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      uint64_t,
                                      uint64_t*,
                                      std::vector<uint8_t>*));
  MOCK_METHOD2(DecryptCancel, void(const brillo::SecureBlob&,
                                   uint64_t));
  MOCK_METHOD4(DigestInit, uint32_t(const brillo::SecureBlob&,
                                    uint64_t,
                                    uint64_t,
                                    const std::vector<uint8_t>&));
  MOCK_METHOD6(Digest, uint32_t(const brillo::SecureBlob&,
                                uint64_t,
                                const std::vector<uint8_t>&,
                                uint64_t,
                                uint64_t*,
                                std::vector<uint8_t>*));
  MOCK_METHOD3(DigestUpdate, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      const std::vector<uint8_t>&));
  MOCK_METHOD3(DigestKey, uint32_t(const brillo::SecureBlob&,
                                   uint64_t,
                                   uint64_t));
  MOCK_METHOD5(DigestFinal, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     uint64_t,
                                     uint64_t*,
                                     std::vector<uint8_t>*));
  MOCK_METHOD2(DigestCancel, void(const brillo::SecureBlob&,
                                  uint64_t));
  MOCK_METHOD5(SignInit, uint32_t(const brillo::SecureBlob&,
                                  uint64_t,
                                  uint64_t,
                                  const std::vector<uint8_t>&,
                                  uint64_t));
  MOCK_METHOD6(Sign, uint32_t(const brillo::SecureBlob&,
                              uint64_t,
                              const std::vector<uint8_t>&,
                              uint64_t,
                              uint64_t*,
                              std::vector<uint8_t>*));
  MOCK_METHOD3(SignUpdate, uint32_t(const brillo::SecureBlob&,
                                    uint64_t,
                                    const std::vector<uint8_t>&));
  MOCK_METHOD5(SignFinal, uint32_t(const brillo::SecureBlob&,
                                   uint64_t,
                                   uint64_t,
                                   uint64_t*,
                                   std::vector<uint8_t>*));
  MOCK_METHOD2(SignCancel, void(const brillo::SecureBlob&,
                                uint64_t));
  MOCK_METHOD5(SignRecoverInit, uint32_t(const brillo::SecureBlob&,
                                         uint64_t,
                                         uint64_t,
                                         const std::vector<uint8_t>&,
                                         uint64_t));
  MOCK_METHOD6(SignRecover, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     const std::vector<uint8_t>&,
                                     uint64_t,
                                     uint64_t*,
                                     std::vector<uint8_t>*));
  MOCK_METHOD5(VerifyInit, uint32_t(const brillo::SecureBlob&,
                                    uint64_t,
                                    uint64_t,
                                    const std::vector<uint8_t>&,
                                    uint64_t));
  MOCK_METHOD4(Verify, uint32_t(const brillo::SecureBlob&,
                                uint64_t,
                                const std::vector<uint8_t>&,
                                const std::vector<uint8_t>&));
  MOCK_METHOD3(VerifyUpdate, uint32_t(const brillo::SecureBlob&,
                                      uint64_t,
                                      const std::vector<uint8_t>&));
  MOCK_METHOD3(VerifyFinal, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     const std::vector<uint8_t>&));
  MOCK_METHOD2(VerifyCancel, void(const brillo::SecureBlob&,
                                  uint64_t));
  MOCK_METHOD5(VerifyRecoverInit, uint32_t(const brillo::SecureBlob&,
                                           uint64_t,
                                           uint64_t,
                                           const std::vector<uint8_t>&,
                                           uint64_t));
  MOCK_METHOD6(VerifyRecover, uint32_t(const brillo::SecureBlob&,
                                       uint64_t,
                                       const std::vector<uint8_t>&,
                                       uint64_t,
                                       uint64_t*,
                                       std::vector<uint8_t>*));
  MOCK_METHOD6(DigestEncryptUpdate, uint32_t(const brillo::SecureBlob&,
                                             uint64_t,
                                             const std::vector<uint8_t>&,
                                             uint64_t,
                                             uint64_t*,
                                             std::vector<uint8_t>*));
  MOCK_METHOD6(DecryptDigestUpdate, uint32_t(const brillo::SecureBlob&,
                                             uint64_t,
                                             const std::vector<uint8_t>&,
                                             uint64_t,
                                             uint64_t*,
                                             std::vector<uint8_t>*));
  MOCK_METHOD6(SignEncryptUpdate, uint32_t(const brillo::SecureBlob&,
                                           uint64_t,
                                           const std::vector<uint8_t>&,
                                           uint64_t,
                                           uint64_t*,
                                           std::vector<uint8_t>*));
  MOCK_METHOD6(DecryptVerifyUpdate, uint32_t(const brillo::SecureBlob&,
                                             uint64_t,
                                             const std::vector<uint8_t>&,
                                             uint64_t,
                                             uint64_t*,
                                             std::vector<uint8_t>*));
  MOCK_METHOD6(GenerateKey, uint32_t(const brillo::SecureBlob&,
                                     uint64_t,
                                     uint64_t,
                                     const std::vector<uint8_t>&,
                                     const std::vector<uint8_t>&,
                                     uint64_t*));
  MOCK_METHOD8(GenerateKeyPair, uint32_t(const brillo::SecureBlob&,
                                         uint64_t,
                                         uint64_t,
                                         const std::vector<uint8_t>&,
                                         const std::vector<uint8_t>&,
                                         const std::vector<uint8_t>&,
                                         uint64_t*,
                                         uint64_t*));
  MOCK_METHOD9(WrapKey, uint32_t(const brillo::SecureBlob&,
                                 uint64_t,
                                 uint64_t,
                                 const std::vector<uint8_t>&,
                                 uint64_t,
                                 uint64_t,
                                 uint64_t,
                                 uint64_t*,
                                 std::vector<uint8_t>*));
  MOCK_METHOD8(UnwrapKey, uint32_t(const brillo::SecureBlob&,
                                   uint64_t,
                                   uint64_t,
                                   const std::vector<uint8_t>&,
                                   uint64_t,
                                   const std::vector<uint8_t>&,
                                   const std::vector<uint8_t>&,
                                   uint64_t*));
  MOCK_METHOD7(DeriveKey, uint32_t(const brillo::SecureBlob&,
                                   uint64_t,
                                   uint64_t,
                                   const std::vector<uint8_t>&,
                                   uint64_t,
                                   const std::vector<uint8_t>&,
                                   uint64_t*));
  MOCK_METHOD3(SeedRandom, uint32_t(const brillo::SecureBlob&,
                                    uint64_t,
                                    const std::vector<uint8_t>&));
  MOCK_METHOD4(GenerateRandom, uint32_t(const brillo::SecureBlob&,
                                        uint64_t,
                                        uint64_t,
                                        std::vector<uint8_t>*));

 private:
  brillo::SecureBlob isolate_credential_;

  DISALLOW_COPY_AND_ASSIGN(ChapsProxyMock);
};

}  // namespace chaps

#endif  // CHAPS_CHAPS_PROXY_MOCK_H_
