// Copyright 2019 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 "garnet/bin/debug_agent/mock_process.h"

#include "garnet/bin/debug_agent/debugged_thread.h"

namespace debug_agent {

MockProcess::MockProcess(zx_koid_t koid)
    : DebuggedProcess(nullptr, koid, zx::process(), true) {}

MockProcess::~MockProcess() = default;

void MockProcess::AddThread(zx_koid_t koid) {
  threads_[koid] = std::make_unique<DebuggedThread>(
      this, zx::thread(), koid, ThreadCreationOption::kSuspendedKeepSuspended);
}

DebuggedThread* MockProcess::GetThread(zx_koid_t koid) const {
  auto it = threads_.find(koid);
  if (it == threads_.end())
    return nullptr;
  return it->second.get();
}

std::vector<DebuggedThread*> MockProcess::GetThreads() const {
  std::vector<DebuggedThread*> threads;
  threads.reserve(threads_.size());
  for (auto& kv : threads_)
    threads.emplace_back(kv.second.get());
  return threads;
}

}  // namespace debug_agent
