blob: dc8c7b04157ed5188f20cbc9514fe3918a3ba4b5 [file] [log] [blame]
// 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 "src/developer/debug/zxdb/console/commands/verb_watch.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/client/mock_frame.h"
#include "src/developer/debug/zxdb/client/mock_remote_api.h"
#include "src/developer/debug/zxdb/console/commands/breakpoint_command_test.h"
#include "src/developer/debug/zxdb/console/console_test.h"
namespace zxdb {
namespace {
class VerbWatch : public BreakpointCommandTest {};
} // namespace
TEST_F(VerbWatch, Temporary) {
console().ProcessInputLine("watch 0x12345");
auto event = console().GetOutputEvent();
ASSERT_EQ(MockConsole::OutputEvent::Type::kOutput, event.type);
EXPECT_EQ(
"This expression's value is stored in a temporary location. Only values\n"
"stored in memory can be watched.\n"
"\n"
"The watch command will implicitly take the address of the result of the\n"
"expression. To set a breakpoint on a literal address you can do either:\n"
"\n"
" watch *(uint32_t*)0x12345678\n"
" break --type=write --size=4 0x12345678\n",
event.output.AsString());
// No breakpoints should have been created.
EXPECT_TRUE(session().system().GetBreakpoints().empty());
}
TEST_F(VerbWatch, Nonexistant) {
// This variable is not found.
console().ProcessInputLine("break -t write *nonesitant_var");
auto event = console().GetOutputEvent();
ASSERT_EQ(MockConsole::OutputEvent::Type::kOutput, event.type);
EXPECT_EQ(
"Unable to evaluate the expression for the command. The result was:\n"
" No variable 'nonesitant_var' found.",
event.output.AsString());
// No breakpoints should have been created.
EXPECT_TRUE(session().system().GetBreakpoints().empty());
}
TEST_F(VerbWatch, Value) {
constexpr uint64_t kAddress = 0x1234;
// While not strictly necessary, the full expression is evaluated and then we take its address.
// This simplifies the implementation but does mean that all addresses we use need to map to valid
// data. Provide that here.
breakpoint_remote_api()->AddMemory(kAddress, {0, 0});
console().ProcessInputLine("watch *(uint16_t*)0x1234");
auto event = console().GetOutputEvent();
ASSERT_EQ(MockConsole::OutputEvent::Type::kOutput, event.type);
EXPECT_EQ("Created Breakpoint 1 type=write size=2 @ 0x1234\n", event.output.AsString());
// One breakpoint should have been created.
auto breakpoints = session().system().GetBreakpoints();
ASSERT_EQ(1u, breakpoints.size());
// Validate the set request.
ASSERT_TRUE(breakpoint_remote_api()->last_request);
ASSERT_EQ(1u, breakpoint_remote_api()->last_request->breakpoint.locations.size());
EXPECT_EQ(kAddress,
breakpoint_remote_api()->last_request->breakpoint.locations[0].address_range.begin());
EXPECT_EQ(2u,
breakpoint_remote_api()->last_request->breakpoint.locations[0].address_range.size());
}
} // namespace zxdb