// 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 "libmems/test_fakes.h"
#include "mems_setup/delegate.h"

#include <base/check.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 CreateDirectory(const base::FilePath&) override;
  bool Exists(const base::FilePath&) override;
  std::vector<base::FilePath> EnumerateAllFiles(
      base::FilePath file_path) 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;

  void SetMockContext(libmems::fakes::FakeIioContext* mock_context) {
    mock_context_ = mock_context;
  }

 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_;

  libmems::fakes::FakeIioContext* mock_context_ = nullptr;
};

}  // namespace fakes

}  // namespace mems_setup

#endif  // MEMS_SETUP_TEST_FAKES_H_
