// 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_SLOT_MANAGER_MOCK_H_
#define CHAPS_SLOT_MANAGER_MOCK_H_

#include <string>
#include <vector>

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

#include "chaps/slot_manager.h"
#include "pkcs11/cryptoki.h"

namespace chaps {

class SlotManagerMock : public SlotManager {
 public:
  SlotManagerMock();
  ~SlotManagerMock() override;

  MOCK_METHOD0(GetSlotCount, int());
  MOCK_CONST_METHOD2(IsTokenPresent, bool(const brillo::SecureBlob&, int));
  MOCK_CONST_METHOD2(IsTokenAccessible, bool(const brillo::SecureBlob&,
                                             int));
  MOCK_CONST_METHOD3(GetSlotInfo, void(const brillo::SecureBlob&, int,
                                       CK_SLOT_INFO*));
  MOCK_CONST_METHOD3(GetTokenInfo, void(const brillo::SecureBlob&, int,
                                        CK_TOKEN_INFO*));
  MOCK_CONST_METHOD2(GetMechanismInfo, MechanismMap* (
      const brillo::SecureBlob&, int));
  MOCK_METHOD3(OpenSession, int(const brillo::SecureBlob&, int, bool));
  MOCK_METHOD2(CloseSession, bool(const brillo::SecureBlob&, int));
  MOCK_METHOD2(CloseAllSessions, void(const brillo::SecureBlob&, int));
  MOCK_CONST_METHOD3(GetSession, bool(const brillo::SecureBlob&, int,
                                      Session**));

 private:
  DISALLOW_COPY_AND_ASSIGN(SlotManagerMock);
};

}  // namespace chaps

#endif  // CHAPS_SLOT_MANAGER_MOCK_H_
