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

#ifndef SRC_DEVELOPER_DEBUG_DEBUG_AGENT_MOCK_EXCEPTION_HANDLE_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_MOCK_EXCEPTION_HANDLE_H_

#include <zircon/status.h>

#include <functional>
#include <utility>

#include "sdk/lib/syslog/cpp/macros.h"
#include "src/developer/debug/debug_agent/exception_handle.h"
#include "src/developer/debug/debug_agent/mock_thread_handle.h"
#include "src/lib/fxl/macros.h"

namespace debug_agent {

// ExceptionHandle abstracts zx::exception, allowing for a more straightforward
// implementation in tests in overrides of this class.
class MockExceptionHandle : public ExceptionHandle {
 public:
  // std::function and not fit::, as it is more convenient for test logic to
  // have MockExceptionHandle as copyable.
  using SetStateCallback = std::function<void(Resolution)>;
  using SetStrategyCallback = std::function<void(debug_ipc::ExceptionStrategy)>;

  MockExceptionHandle() = default;

  explicit MockExceptionHandle(uint64_t thread_koid,
                               debug_ipc::ExceptionType type = debug_ipc::ExceptionType::kGeneral)
      : thread_koid_(thread_koid), type_(type) {}

  MockExceptionHandle(SetStateCallback on_state_change, SetStrategyCallback on_strategy_change)
      : on_state_change_(std::move(on_state_change)),
        on_strategy_change_(std::move(on_strategy_change)) {}

  ~MockExceptionHandle() = default;

  std::unique_ptr<ThreadHandle> GetThreadHandle() const override {
    return std::make_unique<MockThreadHandle>(thread_koid_);
  }

  debug_ipc::ExceptionType GetType(const ThreadHandle& thread) const override { return type_; }

  void set_type(debug_ipc::ExceptionType type) { type_ = type; }

  fit::result<debug::Status, Resolution> GetResolution() const override {
    return fit::ok(resolution_);
  }

  debug::Status SetResolution(Resolution resolution) override {
    resolution_ = resolution;
    on_state_change_(resolution);
    return debug::Status();
  }

  fit::result<debug::Status, debug_ipc::ExceptionStrategy> GetStrategy() const override {
    return fit::ok(strategy_);
  }

  debug::Status SetStrategy(debug_ipc::ExceptionStrategy strategy) override {
    strategy_ = strategy;
    on_strategy_change_(strategy);
    return debug::Status();
  }

 private:
  uint64_t thread_koid_ = ZX_KOID_INVALID;
  debug_ipc::ExceptionType type_ = debug_ipc::ExceptionType::kGeneral;
  Resolution resolution_ = Resolution::kTryNext;
  debug_ipc::ExceptionStrategy strategy_ = debug_ipc::ExceptionStrategy::kFirstChance;
  SetStateCallback on_state_change_ = [](Resolution) {};
  SetStrategyCallback on_strategy_change_ = [](debug_ipc::ExceptionStrategy) {};
};

}  // namespace debug_agent

#endif  // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_MOCK_EXCEPTION_HANDLE_H_
