// Copyright 2020 The Fuchsia 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 "src/developer/debug/debug_agent/mock_job_handle.h"

#include "src/developer/debug/debug_agent/mock_process_handle.h"

namespace debug_agent {

zx::job MockJobHandle::null_handle_;

MockJobHandle::MockJobHandle(zx_koid_t koid, std::string name)
    : job_koid_(koid), name_(std::move(name)) {
  // Tests could accidentally write to this handle since it's returned as a mutable value in some
  // cases. Catch accidents like that.
  FX_DCHECK(!null_handle_);
}

std::unique_ptr<JobHandle> MockJobHandle::Duplicate() const {
  return std::make_unique<MockJobHandle>(*this);
}

std::vector<std::unique_ptr<JobHandle>> MockJobHandle::GetChildJobs() const {
  // Need to return a unique set of objects every time so make copies.
  std::vector<std::unique_ptr<JobHandle>> result;
  for (auto& job : child_jobs_)
    result.push_back(std::make_unique<MockJobHandle>(job));
  return result;
}

std::vector<std::unique_ptr<ProcessHandle>> MockJobHandle::GetChildProcesses() const {
  // Need to return a unique set of objects every time so make copies.
  std::vector<std::unique_ptr<ProcessHandle>> result;
  for (auto& process : child_processes_)
    result.push_back(std::make_unique<MockProcessHandle>(process));
  return result;
}

}  // namespace debug_agent
