//===-- 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 = json::parse(text); ASSERT_TRUE(static_cast(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::FromJSON(json_symbol, §_list); EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded()); EXPECT_EQ(symbol->GetName(), ConstString("foo")); EXPECT_EQ(symbol->GetFileAddress(), static_cast(0x1000)); EXPECT_EQ(symbol->GetType(), eSymbolTypeCode); } TEST(JSONSymbolTest, DeserializeCodeValue) { std::string text = R"( { "name": "foo", "type": "code", "size": 32, "value": 4096 })"; Expected 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::FromJSON(json_symbol, §_list); EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded()); EXPECT_EQ(symbol->GetName(), ConstString("foo")); EXPECT_EQ(symbol->GetRawValue(), static_cast(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 = 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 = 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 = 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::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::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::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::FromJSON(json_symbol, §_list); EXPECT_THAT_EXPECTED( symbol, llvm::FailedWithMessage("no section found for address: 0xfff")); }