// 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 <base/macros.h>
#include <gmock/gmock.h>

#include "login_manager/system_utils.h"

namespace login_manager {

class MockSystemUtils : public SystemUtils {
 public:
  MockSystemUtils();
  ~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));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockSystemUtils);
};

}  // namespace login_manager

#endif  // LOGIN_MANAGER_MOCK_SYSTEM_UTILS_H_
