blob: 12e1dd8870f71cc5cd67c390fd1ace9715b0ce1f [file] [log] [blame]
// 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::kSoftwareBreakpoint;
notify.thread.id = {.process = kProcessKoid, .thread = 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