// Copyright 2018 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_PROPERTY_STORE_TEST_H_
#define SHILL_PROPERTY_STORE_TEST_H_

#include <string>
#include <vector>

#include <base/files/scoped_temp_dir.h>
#include <brillo/any.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "shill/error.h"
#include "shill/key_value_store.h"
#include "shill/manager.h"
#include "shill/mock_control.h"
#include "shill/mock_metrics.h"
#include "shill/property_store.h"
#include "shill/test_event_dispatcher.h"

namespace shill {

class PropertyStoreTest : public testing::TestWithParam<brillo::Any> {
 public:
  using PropertyTypes = ::testing::Types<bool,
                                         int16_t,
                                         int32_t,
                                         std::string,
                                         Stringmap,
                                         Stringmaps,
                                         Strings,
                                         uint8_t,
                                         uint16_t,
                                         Uint16s,
                                         uint32_t>;

  // In real code, it's frowned upon to have non-POD static members, as there
  // can be ordering issues if your constructors have side effects.
  // These constructors don't, and declaring these as static lets me
  // autogenerate a bunch of unit test code that I would otherwise need to
  // copypaste.  So I think it's safe and worth it.
  static const brillo::Any kBoolV;
  static const brillo::Any kByteV;
  static const brillo::Any kInt16V;
  static const brillo::Any kInt32V;
  static const brillo::Any kKeyValueStoreV;
  static const brillo::Any kStringV;
  static const brillo::Any kStringmapV;
  static const brillo::Any kStringmapsV;
  static const brillo::Any kStringsV;
  static const brillo::Any kUint16V;
  static const brillo::Any kUint16sV;
  static const brillo::Any kUint32V;
  static const brillo::Any kUint64V;

  PropertyStoreTest();
  ~PropertyStoreTest() override;

  void SetUp() override;

  MOCK_METHOD(void, TestCallback, (const std::string&));
  MOCK_METHOD(KeyValueStore, GetKeyValueStoreCallback, (Error*));
  MOCK_METHOD(KeyValueStores, GetKeyValueStoresCallback, (Error*));
  MOCK_METHOD(bool, SetKeyValueStoreCallback, (const KeyValueStore&, Error*));
  MOCK_METHOD(bool, SetKeyValueStoresCallback, (const KeyValueStores&, Error*));

  // Convenience overloads for GetProperty. Normally, we don't overload
  // functions. But this is extremely useful for type-parameterized tests.
  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          bool* storage,
                          Error* error) {
    return store.GetBoolProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          int16_t* storage,
                          Error* error) {
    return store.GetInt16Property(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          int32_t* storage,
                          Error* error) {
    return store.GetInt32Property(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          std::string* storage,
                          Error* error) {
    return store.GetStringProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          Stringmap* storage,
                          Error* error) {
    return store.GetStringmapProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          Stringmaps* storage,
                          Error* error) {
    return store.GetStringmapsProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          Strings* storage,
                          Error* error) {
    return store.GetStringsProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          uint8_t* storage,
                          Error* error) {
    return store.GetUint8Property(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          uint16_t* storage,
                          Error* error) {
    return store.GetUint16Property(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          Uint16s* storage,
                          Error* error) {
    return store.GetUint16sProperty(name, storage, error);
  }

  static bool GetProperty(const PropertyStore& store,
                          const std::string& name,
                          uint32_t* storage,
                          Error* error) {
    return store.GetUint32Property(name, storage, error);
  }

  // Convenience overloads for RegisterProperty. Normally, we don't overload
  // functions. But this is extremely useful for type-parameterized tests.
  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               bool* storage) {
    store->RegisterBool(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               int16_t* storage) {
    store->RegisterInt16(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               int32_t* storage) {
    store->RegisterInt32(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               std::string* storage) {
    store->RegisterString(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               Stringmap* storage) {
    store->RegisterStringmap(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               Stringmaps* storage) {
    store->RegisterStringmaps(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               Strings* storage) {
    store->RegisterStrings(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               uint8_t* storage) {
    store->RegisterUint8(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               uint16_t* storage) {
    store->RegisterUint16(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               Uint16s* storage) {
    store->RegisterUint16s(name, storage);
  }

  static void RegisterProperty(PropertyStore* store,
                               const std::string& name,
                               uint32_t* storage) {
    store->RegisterUint32(name, storage);
  }

 protected:
  Manager* manager() { return &manager_; }
  const Manager* manager() const { return &manager_; }
  MockControl* control_interface() { return &control_interface_; }
  EventDispatcher* dispatcher() { return &dispatcher_; }
  MockMetrics* metrics() { return &metrics_; }
  const std::vector<Technology>& default_technology_order() const {
    return default_technology_order_;
  }

  const std::string& run_path() const { return path_; }
  const std::string& storage_path() const { return path_; }

  const std::string& internal_error() const { return internal_error_; }
  const std::string& invalid_args() const { return invalid_args_; }
  const std::string& invalid_prop() const { return invalid_prop_; }

 private:
  const std::string internal_error_;
  const std::string invalid_args_;
  const std::string invalid_prop_;
  base::ScopedTempDir dir_;
  const std::string path_;

  MockControl control_interface_;
  EventDispatcherForTest dispatcher_;
  testing::NiceMock<MockMetrics> metrics_;
  const std::vector<Technology> default_technology_order_;
  Manager manager_;
};

}  // namespace shill

#endif  // SHILL_PROPERTY_STORE_TEST_H_
