@@ -40,8 +40,8 @@ class UprobeSymaddrsTest : public ::testing::Test {
4040 void SetUp () {
4141 std::filesystem::path p = px::testing::BazelRunfilePath (kGoGRPCServer );
4242 ASSERT_OK_AND_ASSIGN (dwarf_reader_, DwarfReader::CreateIndexingAll (p));
43- offset_locator_ = std::make_unique<GoOffsetLocator>(
44- GoOffsetLocator ( dwarf_reader_.get (), {}, {}, {} , " 1.19.0" ));
43+ offset_locator_ = std::make_unique<GoOffsetLocator>(GoOffsetLocator (
44+ dwarf_reader_.get (), struct_offsets_, function_args_, build_info_ , " 1.19.0" ));
4545 ASSERT_OK_AND_ASSIGN (elf_reader_, ElfReader::Create (p));
4646 }
4747
@@ -50,6 +50,9 @@ class UprobeSymaddrsTest : public ::testing::Test {
5050
5151 std::unique_ptr<DwarfReader> dwarf_reader_;
5252 std::unique_ptr<GoOffsetLocator> offset_locator_;
53+ StructOffsetMap struct_offsets_;
54+ FunctionArgMap function_args_;
55+ obj_tools::BuildInfo build_info_;
5356 std::unique_ptr<ElfReader> elf_reader_;
5457};
5558
@@ -112,59 +115,98 @@ TEST(UprobeSymaddrsNodeTest, TLSWrapSymAddrsFromDwarfInfo) {
112115 EXPECT_EQ (symaddrs.uv__io_s_fd_offset , 0x04 );
113116}
114117
118+ StructOffsetMap empty_struct_map;
119+ FunctionArgMap empty_fn_arg_map;
120+ obj_tools::BuildInfo empty_build_info;
121+
115122TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingStruct) {
116- auto offset_locator = GoOffsetLocator (nullptr , {}, {}, {}, " " );
123+ auto offset_locator =
124+ GoOffsetLocator (nullptr , empty_struct_map, empty_fn_arg_map, empty_build_info, " " );
117125 auto status = offset_locator.GetStructMemberOffset (" runtime.g" , " goid" );
118126 EXPECT_FALSE (status.ok ());
119127}
120128
121129// NOLINTNEXTLINE: runtime/string
122130std::string go_version = " 1.19.0" ;
123- auto struct_map = StructOffsetMap{{" runtime.g" , {{" goid" , {{go_version, 152 }}}}}};
131+ // NOLINTNEXTLINE: runtime/string
132+ std::string golang_x_net_version = " v1.0.0" ;
133+
134+ auto struct_map = StructOffsetMap{
135+ {
136+ " runtime.g" ,
137+ {" std" , {{" goid" , {{go_version, 152 }}}}},
138+ },
139+ {
140+ " golang.org/x/net/http2.DataFrame" ,
141+ {" golang.org/x/net" , {{" data" , {{golang_x_net_version.substr (1 ), 16 }}}}},
142+ },
143+ };
124144
125145TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingMember) {
126- auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, go_version);
146+ auto offset_locator =
147+ GoOffsetLocator (nullptr , struct_map, empty_fn_arg_map, empty_build_info, go_version);
127148 EXPECT_FALSE (offset_locator.GetStructMemberOffset (" runtime.g" , " missing_member" ).ok ());
128149}
129150
130151TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingVersion) {
131- auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, " 1.18.0" );
152+ auto offset_locator =
153+ GoOffsetLocator (nullptr , struct_map, empty_fn_arg_map, empty_build_info, " 1.18.0" );
132154 EXPECT_FALSE (offset_locator.GetStructMemberOffset (" runtime.g" , " goid" ).ok ());
133155}
134156
135- TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFSuccessfulLookup) {
136- auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, go_version);
157+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFSuccessfulLookupStdlib) {
158+ auto offset_locator =
159+ GoOffsetLocator (nullptr , struct_map, empty_fn_arg_map, empty_build_info, go_version);
137160
138161 ASSERT_OK_AND_ASSIGN (uint64_t offset, offset_locator.GetStructMemberOffset (" runtime.g" , " goid" ));
139162 EXPECT_EQ (offset, 152 );
140163}
141164
165+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFSuccessfulLookupGolangXNet) {
166+ obj_tools::BuildInfo build_info;
167+ build_info.deps .push_back (
168+ obj_tools::Module{" golang.org/x/net" , golang_x_net_version, " " , nullptr });
169+ auto offset_locator =
170+ GoOffsetLocator (nullptr , struct_map, empty_fn_arg_map, build_info, go_version);
171+
172+ ASSERT_OK_AND_ASSIGN (uint64_t offset, offset_locator.GetStructMemberOffset (
173+ " golang.org/x/net/http2.DataFrame" , " data" ));
174+ EXPECT_EQ (offset, 16 );
175+ }
176+
142177TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFMissingFunction) {
143- auto offset_locator = GoOffsetLocator (nullptr , {}, {}, {}, " " );
178+ auto offset_locator =
179+ GoOffsetLocator (nullptr , empty_struct_map, empty_fn_arg_map, empty_build_info, go_version);
144180 auto status = offset_locator.GetFunctionArgInfo (" missing_func" );
145181 EXPECT_FALSE (status.ok ());
146182}
147183
148- TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFMissingVersion) {
149- FunctionArgMap fn_arg_map;
184+ FunctionArgMap GetFunctionArgMap () {
150185 auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kRegister , 8 };
151- fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
186+ FunctionArgMap fn_arg_map;
187+ fn_arg_map[" crypto/tls.(*Conn).Read" ] = std::make_pair (" std" , FuncVersionMap{});
188+ fn_arg_map[" crypto/tls.(*Conn).Read" ].second [" b" ][go_version] =
152189 std::make_unique<obj_tools::VarLocation>(var_location);
190+ return fn_arg_map;
191+ }
153192
154- auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, " 1.18.0" );
193+ TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFMissingVersion) {
194+ FunctionArgMap fn_arg_map = GetFunctionArgMap ();
195+ auto offset_locator =
196+ GoOffsetLocator (nullptr , struct_map, fn_arg_map, empty_build_info, " 1.18.0" );
155197 auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Write" );
156198 EXPECT_FALSE (status.ok ());
157199}
158200
159201TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFUnknownLocation) {
160- FunctionArgMap fn_arg_map;
161202 auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kUnknown , -1 };
162- fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
203+ auto fn_arg_map = GetFunctionArgMap ();
204+ fn_arg_map[" crypto/tls.(*Conn).Read" ].second [" b" ][go_version] =
163205 std::make_unique<obj_tools::VarLocation>(var_location);
164206
165- auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
207+ auto offset_locator =
208+ GoOffsetLocator (nullptr , struct_map, fn_arg_map, empty_build_info, go_version);
166209
167- auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" );
168210 ASSERT_OK_AND_ASSIGN (auto args, offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" ));
169211 EXPECT_NE (args.find (" b" ), args.end ());
170212 auto & arg_info = args[" b" ];
@@ -173,22 +215,20 @@ TEST(GoOffsetLocator, GetStructMemberOffsetNoDWARFUnknownLocation) {
173215}
174216
175217TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFNullLocation) {
176- FunctionArgMap fn_arg_map;
177- fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] = nullptr ;
218+ FunctionArgMap fn_arg_map = GetFunctionArgMap () ;
219+ fn_arg_map[" crypto/tls.(*Conn).Read" ]. second [" b" ][go_version] = nullptr ;
178220
179- auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
221+ auto offset_locator =
222+ GoOffsetLocator (nullptr , struct_map, fn_arg_map, empty_build_info, go_version);
180223
181224 auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" );
182225 EXPECT_FALSE (status.ok ());
183226}
184227
185228TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFSuccessfulLookup) {
186- FunctionArgMap fn_arg_map;
187- auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kRegister , 8 };
188- fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
189- std::make_unique<obj_tools::VarLocation>(var_location);
190-
191- auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
229+ FunctionArgMap fn_arg_map = GetFunctionArgMap ();
230+ auto offset_locator =
231+ GoOffsetLocator (nullptr , struct_map, fn_arg_map, empty_build_info, go_version);
192232
193233 ASSERT_OK_AND_ASSIGN (auto args, offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" ));
194234 EXPECT_NE (args.find (" b" ), args.end ());
0 commit comments