// 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_OBJECT_POOL_MOCK_H_
#define CHAPS_OBJECT_POOL_MOCK_H_

#include "chaps/object_pool.h"

#include <string>
#include <vector>

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

#include "chaps/object.h"

namespace chaps {

class ObjectPoolMock : public ObjectPool {
 public:
  ObjectPoolMock();
  ~ObjectPoolMock() override;

  MOCK_METHOD2(GetInternalBlob, bool(int, std::string*));
  MOCK_METHOD2(SetInternalBlob, bool(int, const std::string&));
  MOCK_METHOD1(SetEncryptionKey, bool(const brillo::SecureBlob&));
  MOCK_METHOD1(Insert, ObjectPool::Result(Object*));
  MOCK_METHOD1(Import, ObjectPool::Result(Object*));
  MOCK_METHOD1(Delete, ObjectPool::Result(const Object*));
  MOCK_METHOD0(DeleteAll, ObjectPool::Result());
  MOCK_METHOD2(Find,
               ObjectPool::Result(const Object*, std::vector<const Object*>*));
  MOCK_METHOD2(FindByHandle, ObjectPool::Result(int, const Object**));
  MOCK_METHOD1(GetModifiableObject, Object*(const Object*));
  MOCK_METHOD1(Flush, ObjectPool::Result(const Object*));
  MOCK_METHOD0(IsPrivateLoaded, bool());
  void SetupFake(int handle_base) {
    last_handle_ = handle_base;
    ON_CALL(*this, Insert(testing::_))
        .WillByDefault(testing::Invoke(this, &ObjectPoolMock::FakeInsert));
    ON_CALL(*this, Import(testing::_))
        .WillByDefault(testing::Invoke(this, &ObjectPoolMock::FakeInsert));
    ON_CALL(*this, Delete(testing::_))
        .WillByDefault(testing::Invoke(this, &ObjectPoolMock::FakeDelete));
    ON_CALL(*this, Find(testing::_, testing::_))
        .WillByDefault(testing::Invoke(this, &ObjectPoolMock::FakeFind));
    ON_CALL(*this, FindByHandle(testing::_, testing::_))
        .WillByDefault(
            testing::Invoke(this, &ObjectPoolMock::FakeFindByHandle));
    ON_CALL(*this, IsPrivateLoaded()).WillByDefault(testing::Return(true));
  }

 private:
  ObjectPool::Result FakeInsert(Object* o) {
    v_.push_back(o);
    o->set_handle(++last_handle_);
    return ObjectPool::Result::Success;
  }
  ObjectPool::Result FakeDelete(const Object* o) {
    for (size_t i = 0; i < v_.size(); ++i) {
      if (o == v_[i]) {
        delete v_[i];
        v_.erase(v_.begin() + i);
        return ObjectPool::Result::Success;
      }
    }
    return ObjectPool::Result::Failure;
  }
  ObjectPool::Result FakeFind(const Object* o, std::vector<const Object*>* v) {
    for (size_t i = 0; i < v_.size(); ++i)
      v->push_back(v_[i]);
    return ObjectPool::Result::Success;
  }
  ObjectPool::Result FakeFindByHandle(int handle, const Object** o) {
    for (size_t i = 0; i < v_.size(); ++i) {
      if (handle == v_[i]->handle()) {
        *o = v_[i];
        return ObjectPool::Result::Success;
      }
    }
    return ObjectPool::Result::Failure;
  }
  std::vector<const Object*> v_;
  int last_handle_;

  DISALLOW_COPY_AND_ASSIGN(ObjectPoolMock);
};

}  // namespace chaps

#endif  // CHAPS_OBJECT_POOL_MOCK_H_
