// 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();
  virtual ~SessionMock();

  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_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(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*));

 private:
  DISALLOW_COPY_AND_ASSIGN(SessionMock);
};

}  // namespace chaps

#endif  // CHAPS_SESSION_MOCK_H
