// 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_FACTORY_MOCK_H_
#define CHAPS_CHAPS_FACTORY_MOCK_H_

#include "chaps/chaps_factory.h"

#include <gmock/gmock.h>

namespace chaps {

class ChapsFactoryMock : public ChapsFactory {
 public:
  ChapsFactoryMock();
  ChapsFactoryMock(const ChapsFactoryMock&) = delete;
  ChapsFactoryMock& operator=(const ChapsFactoryMock&) = delete;

  ~ChapsFactoryMock() override;

  MOCK_METHOD5(CreateSession,
               Session*(int, ObjectPool*, TPMUtility*, HandleGenerator*, bool));
  MOCK_METHOD4(CreateObjectPool,
               ObjectPool*(HandleGenerator*,
                           SlotPolicy*,
                           ObjectStore*,
                           ObjectImporter*));
  MOCK_METHOD1(CreateObjectStore, ObjectStore*(const base::FilePath&));
  MOCK_METHOD0(CreateObject, Object*());
  MOCK_METHOD1(CreateObjectPolicy, ObjectPolicy*(CK_OBJECT_CLASS));
  MOCK_METHOD3(CreateObjectImporter,
               ObjectImporter*(int, const base::FilePath&, TPMUtility*));
  MOCK_METHOD1(CreateSlotPolicy, SlotPolicy*(bool));
};

}  // namespace chaps

#endif  // CHAPS_CHAPS_FACTORY_MOCK_H_
