// 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_SESSION_MOCK_H_
#define CHAPS_SESSION_MOCK_H_

#include <string>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "chaps/attributes.h"
#include "chaps/session.h"
#include "pkcs11/cryptoki.h"

namespace chaps {

class SessionMock : public Session {
 public:
  SessionMock();
  ~SessionMock() override;

  MOCK_CONST_METHOD0(GetSlot, int());
  MOCK_CONST_METHOD0(GetState, CK_STATE());
  MOCK_CONST_METHOD0(IsReadOnly, bool());
  MOCK_CONST_METHOD1(IsOperationActive, bool(OperationType));
  MOCK_METHOD3(CreateObject, CK_RV(const CK_ATTRIBUTE_PTR,
                                   int,
                                   int*));
  MOCK_METHOD4(CopyObject, CK_RV(const CK_ATTRIBUTE_PTR,
                                 int,
                                 int,
                                 int*));
  MOCK_METHOD1(DestroyObject, CK_RV(int));
  MOCK_METHOD2(GetObject, bool(int, const Object**));
  MOCK_METHOD2(GetModifiableObject, bool(int, Object**));
  MOCK_METHOD1(FlushModifiableObject, CK_RV(Object*));
  MOCK_METHOD2(FindObjectsInit, CK_RV(const CK_ATTRIBUTE_PTR, int));
  MOCK_METHOD2(FindObjects, CK_RV(int, std::vector<int>*));
  MOCK_METHOD0(FindObjectsFinal, CK_RV());
  MOCK_METHOD4(OperationInit, CK_RV(OperationType,
                                    CK_MECHANISM_TYPE,
                                    const std::string&,
                                    const Object*));
  MOCK_METHOD4(OperationUpdate, CK_RV(OperationType,
                                      const std::string&,
                                      int*,
                                      std::string*));
  MOCK_METHOD3(OperationFinal, CK_RV(OperationType, int*, std::string*));
  MOCK_METHOD1(OperationCancel, void(OperationType));
  MOCK_METHOD1(VerifyFinal, CK_RV(const std::string&));
  MOCK_METHOD4(OperationSinglePart, CK_RV(OperationType,
                                          const std::string&,
                                          int*,
                                          std::string*));
  MOCK_METHOD5(GenerateKey, CK_RV(CK_MECHANISM_TYPE,
                                  const std::string&,
                                  const CK_ATTRIBUTE_PTR,
                                  int,
                                  int*));
  MOCK_METHOD8(GenerateKeyPair, CK_RV(CK_MECHANISM_TYPE,
                                      const std::string&,
                                      const CK_ATTRIBUTE_PTR,
                                      int,
                                      const CK_ATTRIBUTE_PTR,
                                      int,
                                      int*,
                                      int*));
  MOCK_METHOD1(SeedRandom, CK_RV(const std::string&));
  MOCK_METHOD2(GenerateRandom, CK_RV(int, std::string*));
  MOCK_METHOD0(IsPrivateLoaded, bool());

 private:
  DISALLOW_COPY_AND_ASSIGN(SessionMock);
};

}  // namespace chaps

#endif  // CHAPS_SESSION_MOCK_H_
