// Copyright (c) 2010 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 LOGIN_MANAGER_MOCK_SYSTEM_UTILS_H_
#define LOGIN_MANAGER_MOCK_SYSTEM_UTILS_H_

#include <stdint.h>
#include <unistd.h>

#include <string>
#include <vector>

#include <gmock/gmock.h>

#include "login_manager/system_utils.h"

namespace login_manager {

class MockSystemUtils : public SystemUtils {
 public:
  MockSystemUtils();
  MockSystemUtils(const MockSystemUtils&) = delete;
  MockSystemUtils& operator=(const MockSystemUtils&) = delete;

  ~MockSystemUtils() override;

  MOCK_METHOD(int, kill, (pid_t, uid_t, int), (override));
  MOCK_METHOD(time_t, time, (time_t*), (override));  // NOLINT
  MOCK_METHOD(pid_t, fork, (), (override));
  MOCK_METHOD(int, close, (int), (override));
  MOCK_METHOD(int, chdir, (const base::FilePath&), (override));
  MOCK_METHOD(pid_t, setsid, (), (override));
  MOCK_METHOD(int,
              execve,
              (const base::FilePath&, const char* const[], const char* const[]),
              (override));
  MOCK_METHOD(bool, EnterNewMountNamespace, (), (override));
  MOCK_METHOD(bool,
              GetAppOutput,
              (const std::vector<std::string>&, std::string*),
              (override));
  MOCK_METHOD(DevModeState, GetDevModeState, (), (override));
  MOCK_METHOD(VmState, GetVmState, (), (override));
  MOCK_METHOD(bool, ProcessGroupIsGone, (pid_t, base::TimeDelta), (override));
  MOCK_METHOD(bool, ProcessIsGone, (pid_t, base::TimeDelta), (override));
  MOCK_METHOD(pid_t, Wait, (pid_t, base::TimeDelta, int*), (override));
  MOCK_METHOD(bool,
              EnsureAndReturnSafeFileSize,
              (const base::FilePath&, int32_t*),
              (override));
  MOCK_METHOD(bool, Exists, (const base::FilePath&), (override));
  MOCK_METHOD(bool, DirectoryExists, (const base::FilePath&), (override));
  MOCK_METHOD(bool, CreateDir, (const base::FilePath&), (override));
  MOCK_METHOD(bool,
              EnumerateFiles,
              (const base::FilePath&, int, std::vector<base::FilePath>*),
              (override));
  MOCK_METHOD(bool,
              GetUniqueFilenameInWriteOnlyTempDir,
              (base::FilePath*),
              (override));
  MOCK_METHOD(bool, RemoveFile, (const base::FilePath&), (override));
  MOCK_METHOD(bool,
              AtomicFileWrite,
              (const base::FilePath&, const std::string&),
              (override));
  MOCK_METHOD(int64_t,
              AmountOfFreeDiskSpace,
              (const base::FilePath&),
              (override));
  MOCK_METHOD(bool,
              GetGidAndGroups,
              (uid_t, gid_t*, std::vector<gid_t>*),
              (override));

  MOCK_METHOD(bool,
              ReadFileToString,
              (const base::FilePath&, std::string*),
              (override));
  MOCK_METHOD(bool,
              WriteStringToFile,
              (const base::FilePath&, const std::string&),
              (override));

  MOCK_METHOD(bool,
              ChangeBlockedSignals,
              (int, const std::vector<int>&),
              (override));

  MOCK_METHOD(bool,
              LaunchAndWait,
              (const std::vector<std::string>&, int*),
              (override));
  MOCK_METHOD(bool,
              RunInMinijail,
              (const ScopedMinijail& jail,
               const std::vector<std::string>&,
               const std::vector<std::string>&,
               pid_t*),
              (override));
};

}  // namespace login_manager

#endif  // LOGIN_MANAGER_MOCK_SYSTEM_UTILS_H_
