// Copyright 2016 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.

#include "login_manager/fake_container_manager.h"

namespace login_manager {

FakeContainerManager::FakeContainerManager(pid_t pid) : pid_(pid) {}

bool FakeContainerManager::IsManagedJob(pid_t pid) {
  return running_ && pid_ == pid;
}

void FakeContainerManager::HandleExit(const siginfo_t& status) {}

void FakeContainerManager::RequestJobExit() {
  LOG_IF(FATAL, !running_) << "Trying to stop an already stopped container";
  running_ = false;
  exit_callback_.Run(pid_, true);
}

void FakeContainerManager::EnsureJobExit(base::TimeDelta timeout) {}

bool FakeContainerManager::StartContainer(const std::vector<std::string>& env,
                                          const ExitCallback& exit_callback) {
  LOG_IF(FATAL, running_) << "Trying to start an already started container";
  exit_callback_ = exit_callback;
  running_ = true;
  return true;
}

void FakeContainerManager::SetStatefulMode(StatefulMode mode) {}

bool FakeContainerManager::GetRootFsPath(base::FilePath* path_out) const {
  if (!running_)
    return false;
  *path_out = base::FilePath();
  return true;
}

bool FakeContainerManager::GetContainerPID(pid_t* pid_out) const {
  if (!running_)
    return false;
  *pid_out = pid_;
  return true;
}

void FakeContainerManager::SimulateCrash() {
  LOG_IF(FATAL, !running_) << "Trying to crash an already stopped container";
  running_ = false;
  exit_callback_.Run(pid_, false);
}

}  // namespace login_manager
