// Copyright 2018 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/zxdb/client/mock_process.h"

#include "garnet/bin/zxdb/client/memory_dump.h"
#include "garnet/bin/zxdb/common/err.h"
#include "garnet/lib/debug_ipc/helper/message_loop.h"
#include "garnet/lib/debug_ipc/records.h"

namespace zxdb {

using debug_ipc::MessageLoop;

MockProcess::MockProcess(Session* session)
    : Process(session, Process::StartType::kLaunch) {}
MockProcess::~MockProcess() = default;

Target* MockProcess::GetTarget() const { return nullptr; }

uint64_t MockProcess::GetKoid() const { return 0; }

const std::string& MockProcess::GetName() const {
  static std::string name("Mock process");
  return name;
}

ProcessSymbols* MockProcess::GetSymbols() { return nullptr; }

void MockProcess::GetModules(
    std::function<void(const Err&, std::vector<debug_ipc::Module>)> cb) {
  MessageLoop::Current()->PostTask(
      FROM_HERE, [cb]() { cb(Err(), std::vector<debug_ipc::Module>()); });
}

void MockProcess::GetAspace(
    uint64_t address,
    std::function<void(const Err&, std::vector<debug_ipc::AddressRegion>)> cb)
    const {
  MessageLoop::Current()->PostTask(FROM_HERE, [cb]() {
    cb(Err(), std::vector<debug_ipc::AddressRegion>());
  });
}

std::vector<Thread*> MockProcess::GetThreads() const {
  return std::vector<Thread*>();
}

Thread* MockProcess::GetThreadFromKoid(uint64_t koid) { return nullptr; }

void MockProcess::SyncThreads(std::function<void()> cb) {
  MessageLoop::Current()->PostTask(FROM_HERE, [cb]() { cb(); });
}

void MockProcess::Pause() {}

void MockProcess::Continue() {}

void MockProcess::ContinueUntil(const InputLocation& location,
                                std::function<void(const Err&)> cb) {
  MessageLoop::Current()->PostTask(FROM_HERE, [cb]() { cb(Err()); });
}

void MockProcess::ReadMemory(uint64_t address, uint32_t size,
                             std::function<void(const Err&, MemoryDump)> cb) {
  MessageLoop::Current()->PostTask(FROM_HERE,
                                   [cb]() { cb(Err(), MemoryDump()); });
}

void MockProcess::WriteMemory(
      uint64_t address, std::vector<uint8_t> data,
      std::function<void(const Err&)> callback) {
  // Currently always just report success.
  MessageLoop::Current()->PostTask(FROM_HERE,
                                   [cb = std::move(callback)]() { cb(Err()); });
}

}  // namespace zxdb
