192 lines
5.1 KiB
C++
192 lines
5.1 KiB
C++
//===-- JSONSymbolTest.cpp ------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Core/Section.h"
|
|
#include "lldb/Symbol/Symbol.h"
|
|
#include "llvm/Testing/Support/Error.h"
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace lldb;
|
|
using namespace llvm;
|
|
using namespace lldb_private;
|
|
|
|
static std::string g_error_no_section_list = "no section list provided";
|
|
static std::string g_error_both_value_and_address =
|
|
"symbol cannot contain both a value and an address";
|
|
static std::string g_error_neither_value_or_address =
|
|
"symbol must contain either a value or an address";
|
|
|
|
TEST(JSONSymbolTest, DeserializeCodeAddress) {
|
|
std::string text = R"(
|
|
{
|
|
"name": "foo",
|
|
"type": "code",
|
|
"size": 32,
|
|
"address": 4096
|
|
})";
|
|
|
|
Expected<json::Value> json = json::parse(text);
|
|
ASSERT_TRUE(static_cast<bool>(json));
|
|
|
|
json::Path::Root root;
|
|
JSONSymbol json_symbol;
|
|
ASSERT_TRUE(fromJSON(*json, json_symbol, root));
|
|
|
|
SectionSP sect_sp(new Section(
|
|
/*module_sp=*/ModuleSP(),
|
|
/*obj_file=*/nullptr,
|
|
/*sect_id=*/1,
|
|
/*name=*/ConstString(".text"),
|
|
/*sect_type=*/eSectionTypeCode,
|
|
/*file_vm_addr=*/0x1000,
|
|
/*vm_size=*/0x1000,
|
|
/*file_offset=*/0,
|
|
/*file_size=*/0,
|
|
/*log2align=*/5,
|
|
/*flags=*/0x10203040));
|
|
SectionList sect_list;
|
|
sect_list.AddSection(sect_sp);
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, §_list);
|
|
EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded());
|
|
EXPECT_EQ(symbol->GetName(), ConstString("foo"));
|
|
EXPECT_EQ(symbol->GetFileAddress(), static_cast<lldb::addr_t>(0x1000));
|
|
EXPECT_EQ(symbol->GetType(), eSymbolTypeCode);
|
|
}
|
|
|
|
TEST(JSONSymbolTest, DeserializeCodeValue) {
|
|
std::string text = R"(
|
|
{
|
|
"name": "foo",
|
|
"type": "code",
|
|
"size": 32,
|
|
"value": 4096
|
|
})";
|
|
|
|
Expected<json::Value> json = json::parse(text);
|
|
EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
|
|
|
|
json::Path::Root root;
|
|
JSONSymbol json_symbol;
|
|
ASSERT_TRUE(fromJSON(*json, json_symbol, root));
|
|
|
|
SectionList sect_list;
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, §_list);
|
|
EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded());
|
|
EXPECT_EQ(symbol->GetName(), ConstString("foo"));
|
|
EXPECT_EQ(symbol->GetRawValue(), static_cast<lldb::addr_t>(0x1000));
|
|
EXPECT_EQ(symbol->GetType(), eSymbolTypeCode);
|
|
}
|
|
|
|
TEST(JSONSymbolTest, JSONInvalidValueAndAddress) {
|
|
std::string text = R"(
|
|
{
|
|
"name": "foo",
|
|
"type": "code",
|
|
"size": 32,
|
|
"value": 4096,
|
|
"address": 4096
|
|
})";
|
|
|
|
Expected<json::Value> json = json::parse(text);
|
|
EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
|
|
|
|
json::Path::Root root;
|
|
JSONSymbol json_symbol;
|
|
ASSERT_FALSE(fromJSON(*json, json_symbol, root));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, JSONInvalidNoValueOrAddress) {
|
|
std::string text = R"(
|
|
{
|
|
"name": "foo",
|
|
"type": "code",
|
|
"size": 32
|
|
})";
|
|
|
|
Expected<json::Value> json = json::parse(text);
|
|
EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
|
|
|
|
json::Path::Root root;
|
|
JSONSymbol json_symbol;
|
|
ASSERT_FALSE(fromJSON(*json, json_symbol, root));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, JSONInvalidType) {
|
|
std::string text = R"(
|
|
{
|
|
"name": "foo",
|
|
"type": "bogus",
|
|
"value": 4096,
|
|
"size": 32
|
|
})";
|
|
|
|
Expected<json::Value> json = json::parse(text);
|
|
EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
|
|
|
|
json::Path::Root root;
|
|
JSONSymbol json_symbol;
|
|
ASSERT_FALSE(fromJSON(*json, json_symbol, root));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, SymbolInvalidNoSectionList) {
|
|
JSONSymbol json_symbol;
|
|
json_symbol.value = 0x1;
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, nullptr);
|
|
EXPECT_THAT_EXPECTED(symbol,
|
|
llvm::FailedWithMessage(g_error_no_section_list));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, SymbolInvalidValueAndAddress) {
|
|
JSONSymbol json_symbol;
|
|
json_symbol.value = 0x1;
|
|
json_symbol.address = 0x2;
|
|
|
|
SectionList sect_list;
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, §_list);
|
|
EXPECT_THAT_EXPECTED(symbol,
|
|
llvm::FailedWithMessage(g_error_both_value_and_address));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, SymbolInvalidNoValueOrAddress) {
|
|
JSONSymbol json_symbol;
|
|
|
|
SectionList sect_list;
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, §_list);
|
|
EXPECT_THAT_EXPECTED(
|
|
symbol, llvm::FailedWithMessage(g_error_neither_value_or_address));
|
|
}
|
|
|
|
TEST(JSONSymbolTest, SymbolInvalidAddressNotInSection) {
|
|
JSONSymbol json_symbol;
|
|
json_symbol.address = 0x0fff;
|
|
|
|
SectionSP sect_sp(new Section(
|
|
/*module_sp=*/ModuleSP(),
|
|
/*obj_file=*/nullptr,
|
|
/*sect_id=*/1,
|
|
/*name=*/ConstString(".text"),
|
|
/*sect_type=*/eSectionTypeCode,
|
|
/*file_vm_addr=*/0x1000,
|
|
/*vm_size=*/0x1000,
|
|
/*file_offset=*/0,
|
|
/*file_size=*/0,
|
|
/*log2align=*/5,
|
|
/*flags=*/0x10203040));
|
|
SectionList sect_list;
|
|
sect_list.AddSection(sect_sp);
|
|
|
|
Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, §_list);
|
|
EXPECT_THAT_EXPECTED(
|
|
symbol, llvm::FailedWithMessage("no section found for address: 0xfff"));
|
|
}
|