// Copyright 2019 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 MEMS_SETUP_TEST_FAKES_H_
#define MEMS_SETUP_TEST_FAKES_H_

#include <algorithm>
#include <functional>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include "mems_setup/delegate.h"

namespace mems_setup {
namespace fakes {

class FakeDelegate : public Delegate {
 public:
  void SetVpdValue(const std::string& name, const std::string& value) {
    CHECK(!name.empty());
    CHECK(!value.empty());
    vpd_.emplace(name, value);
  }

  base::Optional<std::string> ReadVpdValue(const std::string& key) override;

  bool ProbeKernelModule(const std::string& module) override;

  size_t GetNumModulesProbed() const { return probed_modules_.size(); }

  bool Exists(const base::FilePath&) override;

  void CreateFile(const base::FilePath&);

  base::Optional<gid_t> FindGroupId(const char* group) override;

  int GetPermissions(const base::FilePath& path) override;
  bool SetPermissions(const base::FilePath& path, int mode) override;

  void AddGroup(const std::string& name, gid_t gid) {
    groups_.emplace(name, gid);
  }

  bool GetOwnership(const base::FilePath& path, uid_t* user, gid_t* group);
  bool SetOwnership(const base::FilePath& path,
                    uid_t user,
                    gid_t group) override;

 private:
  std::vector<std::string> probed_modules_;
  std::map<std::string, std::string> vpd_;
  std::map<std::string, gid_t> groups_;
  std::map<std::string, int> permissions_;
  std::map<std::string, std::pair<uid_t, gid_t>> ownerships_;
  std::set<base::FilePath> existing_files_;
};

}  // namespace fakes

}  // namespace mems_setup

#endif  // MEMS_SETUP_TEST_FAKES_H_
