xref: /llvm-project/lldb/unittests/Symbol/JSONSymbolTest.cpp (revision cf3524a5746f9498280b3a9180b75575c0065d1a)
1 //===-- JSONSymbolTest.cpp ------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/Core/Section.h"
10 #include "lldb/Symbol/Symbol.h"
11 #include "llvm/Testing/Support/Error.h"
12 
13 #include "gtest/gtest.h"
14 
15 using namespace lldb;
16 using namespace llvm;
17 using namespace lldb_private;
18 
19 static std::string g_error_no_section_list = "no section list provided";
20 static std::string g_error_both_value_and_address =
21     "symbol cannot contain both a value and an address";
22 static std::string g_error_neither_value_or_address =
23     "symbol must contain either a value or an address";
24 
TEST(JSONSymbolTest,DeserializeCodeAddress)25 TEST(JSONSymbolTest, DeserializeCodeAddress) {
26   std::string text = R"(
27 {
28   "name": "foo",
29   "type": "code",
30   "size": 32,
31   "address": 4096
32 })";
33 
34   Expected<json::Value> json = json::parse(text);
35   ASSERT_TRUE(static_cast<bool>(json));
36 
37   json::Path::Root root;
38   JSONSymbol json_symbol;
39   ASSERT_TRUE(fromJSON(*json, json_symbol, root));
40 
41   SectionSP sect_sp(new Section(
42       /*module_sp=*/ModuleSP(),
43       /*obj_file=*/nullptr,
44       /*sect_id=*/1,
45       /*name=*/ConstString(".text"),
46       /*sect_type=*/eSectionTypeCode,
47       /*file_vm_addr=*/0x1000,
48       /*vm_size=*/0x1000,
49       /*file_offset=*/0,
50       /*file_size=*/0,
51       /*log2align=*/5,
52       /*flags=*/0x10203040));
53   SectionList sect_list;
54   sect_list.AddSection(sect_sp);
55 
56   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, &sect_list);
57   EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded());
58   EXPECT_EQ(symbol->GetName(), ConstString("foo"));
59   EXPECT_EQ(symbol->GetFileAddress(), static_cast<lldb::addr_t>(0x1000));
60   EXPECT_EQ(symbol->GetType(), eSymbolTypeCode);
61 }
62 
TEST(JSONSymbolTest,DeserializeCodeValue)63 TEST(JSONSymbolTest, DeserializeCodeValue) {
64   std::string text = R"(
65 {
66   "name": "foo",
67   "type": "code",
68   "size": 32,
69   "value": 4096
70 })";
71 
72   Expected<json::Value> json = json::parse(text);
73   EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
74 
75   json::Path::Root root;
76   JSONSymbol json_symbol;
77   ASSERT_TRUE(fromJSON(*json, json_symbol, root));
78 
79   SectionList sect_list;
80 
81   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, &sect_list);
82   EXPECT_THAT_EXPECTED(symbol, llvm::Succeeded());
83   EXPECT_EQ(symbol->GetName(), ConstString("foo"));
84   EXPECT_EQ(symbol->GetRawValue(), static_cast<lldb::addr_t>(0x1000));
85   EXPECT_EQ(symbol->GetType(), eSymbolTypeCode);
86 }
87 
TEST(JSONSymbolTest,JSONInvalidValueAndAddress)88 TEST(JSONSymbolTest, JSONInvalidValueAndAddress) {
89   std::string text = R"(
90 {
91   "name": "foo",
92   "type": "code",
93   "size": 32,
94   "value": 4096,
95   "address": 4096
96 })";
97 
98   Expected<json::Value> json = json::parse(text);
99   EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
100 
101   json::Path::Root root;
102   JSONSymbol json_symbol;
103   ASSERT_FALSE(fromJSON(*json, json_symbol, root));
104 }
105 
TEST(JSONSymbolTest,JSONInvalidNoValueOrAddress)106 TEST(JSONSymbolTest, JSONInvalidNoValueOrAddress) {
107   std::string text = R"(
108 {
109   "name": "foo",
110   "type": "code",
111   "size": 32
112 })";
113 
114   Expected<json::Value> json = json::parse(text);
115   EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
116 
117   json::Path::Root root;
118   JSONSymbol json_symbol;
119   ASSERT_FALSE(fromJSON(*json, json_symbol, root));
120 }
121 
TEST(JSONSymbolTest,JSONInvalidType)122 TEST(JSONSymbolTest, JSONInvalidType) {
123   std::string text = R"(
124 {
125   "name": "foo",
126   "type": "bogus",
127   "value": 4096,
128   "size": 32
129 })";
130 
131   Expected<json::Value> json = json::parse(text);
132   EXPECT_THAT_EXPECTED(json, llvm::Succeeded());
133 
134   json::Path::Root root;
135   JSONSymbol json_symbol;
136   ASSERT_FALSE(fromJSON(*json, json_symbol, root));
137 }
138 
TEST(JSONSymbolTest,SymbolInvalidNoSectionList)139 TEST(JSONSymbolTest, SymbolInvalidNoSectionList) {
140   JSONSymbol json_symbol;
141   json_symbol.value = 0x1;
142 
143   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, nullptr);
144   EXPECT_THAT_EXPECTED(symbol,
145                        llvm::FailedWithMessage(g_error_no_section_list));
146 }
147 
TEST(JSONSymbolTest,SymbolInvalidValueAndAddress)148 TEST(JSONSymbolTest, SymbolInvalidValueAndAddress) {
149   JSONSymbol json_symbol;
150   json_symbol.value = 0x1;
151   json_symbol.address = 0x2;
152 
153   SectionList sect_list;
154 
155   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, &sect_list);
156   EXPECT_THAT_EXPECTED(symbol,
157                        llvm::FailedWithMessage(g_error_both_value_and_address));
158 }
159 
TEST(JSONSymbolTest,SymbolInvalidNoValueOrAddress)160 TEST(JSONSymbolTest, SymbolInvalidNoValueOrAddress) {
161   JSONSymbol json_symbol;
162 
163   SectionList sect_list;
164 
165   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, &sect_list);
166   EXPECT_THAT_EXPECTED(
167       symbol, llvm::FailedWithMessage(g_error_neither_value_or_address));
168 }
169 
TEST(JSONSymbolTest,SymbolInvalidAddressNotInSection)170 TEST(JSONSymbolTest, SymbolInvalidAddressNotInSection) {
171   JSONSymbol json_symbol;
172   json_symbol.address = 0x0fff;
173 
174   SectionSP sect_sp(new Section(
175       /*module_sp=*/ModuleSP(),
176       /*obj_file=*/nullptr,
177       /*sect_id=*/1,
178       /*name=*/ConstString(".text"),
179       /*sect_type=*/eSectionTypeCode,
180       /*file_vm_addr=*/0x1000,
181       /*vm_size=*/0x1000,
182       /*file_offset=*/0,
183       /*file_size=*/0,
184       /*log2align=*/5,
185       /*flags=*/0x10203040));
186   SectionList sect_list;
187   sect_list.AddSection(sect_sp);
188 
189   Expected<Symbol> symbol = Symbol::FromJSON(json_symbol, &sect_list);
190   EXPECT_THAT_EXPECTED(
191       symbol, llvm::FailedWithMessage("no section found for address: 0xfff"));
192 }
193