// Copyright 2020 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 DIAGNOSTICS_CROS_HEALTHD_SYSTEM_FAKE_SYSTEM_UTILITIES_H_
#define DIAGNOSTICS_CROS_HEALTHD_SYSTEM_FAKE_SYSTEM_UTILITIES_H_

#include <sys/utsname.h>

#include <string>

#include <base/optional.h>

#include "diagnostics/cros_healthd/system/system_utilities.h"
#include "diagnostics/cros_healthd/system/system_utilities_constants.h"

namespace diagnostics {

// Fake implementation of the SystemUtilities interface.
class FakeSystemUtilities final : public SystemUtilities {
 public:
  FakeSystemUtilities();
  FakeSystemUtilities(const FakeSystemUtilities&) = delete;
  FakeSystemUtilities& operator=(const FakeSystemUtilities&) = delete;
  ~FakeSystemUtilities() override;

  // SystemUtilities overrides:
  int Uname(struct utsname* buf) override;

  // Sets the response to any Uname() calls. If specified, |machine| will be
  // used to populate the Uname() call's |buf|.machine output parameter. The
  // other fields of |buf| will be left empty.
  void SetUnameResponse(int ret_code,
                        const base::Optional<std::string>& machine);

 private:
  // Used as the return value for any Uname() calls received. Defaults to
  // success.
  int uname_ret_code_ = 0;
  // When |uname_ret_code_| is set to success, any received Uname() calls will
  // set the |buf|.machine output parameter to this value.
  std::string uname_machine_ = kUnameMachineX86_64;
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_CROS_HEALTHD_SYSTEM_FAKE_SYSTEM_UTILITIES_H_
