// Copyright 2021 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 LIBCROSSYSTEM_CROSSYSTEM_FAKE_H_
#define LIBCROSSYSTEM_CROSSYSTEM_FAKE_H_

#include <map>
#include <optional>
#include <set>
#include <string>

#include <brillo/brillo_export.h>
#include <libcrossystem/crossystem.h>

namespace crossystem {

namespace fake {

// A fake implementation that simulates the manipulation of system properties
// with an in-memory table.  By default, all properties are unset so getters
// will return |std::nullopt| (or other equivalent value type).
class BRILLO_EXPORT CrossystemFake : public Crossystem {
 public:
  CrossystemFake() = default;

  std::optional<int> VbGetSystemPropertyInt(
      const std::string& name) const override;

  bool VbSetSystemPropertyInt(const std::string& name, int value) override;

  std::optional<std::string> VbGetSystemPropertyString(
      const std::string& name) const override;

  bool VbSetSystemPropertyString(const std::string& name,
                                 const std::string& value) override;

  // Unset the value of the specific system property.
  //
  // After the property is unset, both VbGetSystemPropertyInt() and
  // VbGetSystemPropertyString() return |std::nullopt|.
  //
  // @param name The name of the target system property.
  void UnsetSystemPropertyValue(const std::string& name);

  // Specify whether the system property is read-only or not.
  //
  // After the property is marked RO, both VbSetSystemPropertyString() and
  // VbSetSystemPropertyInt() will return |false|.
  //
  // @param name The name of the target system property.
  // @param is_readonly |true| to mark the system property read-only.
  void SetSystemPropertyReadOnlyStatus(const std::string& name,
                                       bool is_readonly);

 private:
  std::set<std::string> readonly_system_peroperty_names_;
  std::map<std::string, int> system_int_properties_;
  std::map<std::string, std::string> system_str_properties_;
};

}  // namespace fake

}  // namespace crossystem

#endif  // LIBCROSSYSTEM_CROSSYSTEM_FAKE_H_
