// 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/zxdb/console/console_context.h"

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/client/mock_remote_api.h"
#include "src/developer/debug/zxdb/console/console_test.h"

namespace zxdb {

namespace {

class ConsoleContextTest : public ConsoleTest {};

}  // namespace

// Verifies that the breakpoint is set to the current one when it's hit.
TEST_F(ConsoleContextTest, CurrentBreakpoint) {
  // Breakpoint 1.
  console().ProcessInputLine("b 0x10000");
  auto event = console().GetOutputEvent();
  ASSERT_NE(std::string::npos, event.output.AsString().find("Created Breakpoint 1"))
      << event.output.AsString();
  int breakpoint_1_backend_id = mock_remote_api()->last_breakpoint_id();

  // Breakpoint 2.
  console().ProcessInputLine("b 0x20000");
  event = console().GetOutputEvent();
  ASSERT_NE(std::string::npos, event.output.AsString().find("Created Breakpoint 2"))
      << event.output.AsString();

  // Breakpoint 2 should be active, so its address should be returned when we ask for the location.
  console().ProcessInputLine("bp get location");
  event = console().GetOutputEvent();
  ASSERT_NE(std::string::npos, event.output.AsString().find("location = 0x20000"))
      << event.output.AsString();

  // Provide a stop at breakpoint 1.
  debug_ipc::NotifyException notify;
  notify.type = debug_ipc::ExceptionType::kSoftware;
  notify.thread.process_koid = kProcessKoid;
  notify.thread.thread_koid = kThreadKoid;
  notify.thread.state = debug_ipc::ThreadRecord::State::kBlocked;
  notify.thread.frames.emplace_back(0x10000, 0);
  notify.hit_breakpoints.emplace_back();
  notify.hit_breakpoints[0].id = breakpoint_1_backend_id;
  notify.hit_breakpoints[0].hit_count = 1;
  InjectException(notify);

  // Should have issued a stop at the first location.
  event = console().GetOutputEvent();
  ASSERT_NE(std::string::npos, event.output.AsString().find("0x10000 (no symbol info)"))
      << event.output.AsString();

  // Breakpoint 1 should now be active.
  console().ProcessInputLine("bp get location");
  event = console().GetOutputEvent();
  ASSERT_NE(std::string::npos, event.output.AsString().find("location = 0x10000"))
      << event.output.AsString();
}

}  // namespace zxdb
