// Copyright (c) 2011 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 SHILL_MOCK_STORE_
#define SHILL_MOCK_STORE_

#include <set>
#include <string>
#include <vector>

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

#include "shill/store_interface.h"

namespace shill {

class MockStore : public StoreInterface {
 public:
  MockStore();
  virtual ~MockStore();

  MOCK_METHOD0(Flush, bool());
  MOCK_CONST_METHOD0(GetGroups, std::set<std::string>());
  MOCK_CONST_METHOD1(GetGroupsWithKey,
                     std::set<std::string>(const std::string &key));
  MOCK_CONST_METHOD1(ContainsGroup, bool(const std::string &group));
  MOCK_METHOD2(DeleteKey, bool(const std::string &group,
                               const std::string &key));
  MOCK_METHOD1(DeleteGroup, bool(const std::string &group));
  MOCK_METHOD1(SetHeader, bool(const std::string &header));
  MOCK_CONST_METHOD3(GetString, bool(const std::string &group,
                                     const std::string &key,
                                     std::string *value));
  MOCK_METHOD3(SetString, bool(const std::string &group,
                               const std::string &key,
                               const std::string &value));
  MOCK_CONST_METHOD3(GetBool, bool(const std::string &group,
                                   const std::string &key,
                                   bool *value));
  MOCK_METHOD3(SetBool, bool(const std::string &group,
                             const std::string &key,
                             bool value));
  MOCK_CONST_METHOD3(GetInt, bool(const std::string &group,
                                  const std::string &key,
                                  int *value));
  MOCK_METHOD3(SetInt, bool(const std::string &group,
                            const std::string &key,
                            int value));
  MOCK_CONST_METHOD3(GetUint64, bool(const std::string &group,
                                     const std::string &key,
                                     uint64 *value));
  MOCK_METHOD3(SetUint64, bool(const std::string &group,
                               const std::string &key,
                               uint64 value));
  MOCK_CONST_METHOD3(GetStringList, bool(const std::string &group,
                                         const std::string &key,
                                         std::vector<std::string> *value));
  MOCK_METHOD3(SetStringList, bool(const std::string &group,
                                   const std::string &key,
                                   const std::vector<std::string> &value));
  MOCK_METHOD3(GetCryptedString, bool(const std::string &group,
                                      const std::string &key,
                                      std::string *value));
  MOCK_METHOD3(SetCryptedString, bool(const std::string &group,
                                      const std::string &key,
                                      const std::string &value));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockStore);
};

}  // namespace shill

#endif  // SHILL_MOCK_STORE_
