| //===-- 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")); |
| } |