4 * Babeltrace bt_dwarf (DWARF utilities) tests
6 * Copyright (c) 2015 EfficiOS Inc. and Linux Foundation
7 * Copyright (c) 2015 Antoine Busque <abusque@efficios.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; under version 2 of the License.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include <lttng-utils/debug-info/dwarf.h>
33 #define SO_NAME "libhello_so"
34 #define DWARF_DIR_NAME "dwarf_full"
35 #define ELF_DIR_NAME "elf_only"
38 * Test that we fail on an ELF file without DWARF.
41 void test_bt_no_dwarf(const char *data_dir
)
45 Dwarf
*dwarf_info
= NULL
;
47 path
= g_build_filename(data_dir
, ELF_DIR_NAME
, SO_NAME
, NULL
);
49 diag("Failed to allocate memory for path");
53 fd
= open(path
, O_RDONLY
);
54 ok(fd
>= 0, "Open ELF file %s", path
);
56 skip(1, "dwarf_begin failed as expected");
58 dwarf_info
= dwarf_begin(fd
, DWARF_C_READ
);
59 ok(dwarf_info
== NULL
, "dwarf_begin failed as expected");
62 if (dwarf_info
!= NULL
) {
63 dwarf_end(dwarf_info
);
70 * Test with a proper ELF file with DWARF.
73 void test_bt_dwarf(const char *data_dir
)
77 char *die_name
= NULL
;
78 struct bt_dwarf_cu
*cu
= NULL
;
79 struct bt_dwarf_die
*die
= NULL
;
80 Dwarf
*dwarf_info
= NULL
;
82 path
= g_build_filename(data_dir
, DWARF_DIR_NAME
, SO_NAME
, NULL
);
84 diag("Failed to allocate memory for path");
88 fd
= open(path
, O_RDONLY
);
89 ok(fd
>= 0, "Open DWARF file %s", path
);
93 dwarf_info
= dwarf_begin(fd
, DWARF_C_READ
);
94 ok(dwarf_info
!= NULL
, "dwarf_begin successful");
95 cu
= bt_dwarf_cu_create(dwarf_info
);
96 ok(cu
!= NULL
, "bt_dwarf_cu_create successful");
97 ret
= bt_dwarf_cu_next(cu
);
98 ok(ret
== 0, "bt_dwarf_cu_next successful");
99 die
= bt_dwarf_die_create(cu
);
100 ok(die
!= NULL
, "bt_dwarf_die_create successful");
105 * Test bt_dwarf_die_next twice, as the code path is different
106 * for DIEs at depth 0 (just created) and other depths.
108 ret
= bt_dwarf_die_next(die
);
109 ok(ret
== 0, "bt_dwarf_die_next from root DIE successful");
111 "bt_dwarf_die_next from root DIE - correct depth value");
112 ret
= bt_dwarf_die_next(die
);
114 "bt_dwarf_die_next from non-root DIE successful");
116 "bt_dwarf_die_next from non-root DIE - correct depth value");
118 /* Reset DIE to test dwarf_child */
119 bt_dwarf_die_destroy(die
);
120 die
= bt_dwarf_die_create(cu
);
122 diag("Failed to create bt_dwarf_die");
126 ret
= bt_dwarf_die_child(die
);
127 ok(ret
== 0, "bt_dwarf_die_child successful");
128 ok(die
->depth
== 1, "bt_dwarf_die_child - correct depth value");
130 ret
= bt_dwarf_die_get_tag(die
, &tag
);
131 ok(ret
== 0, "bt_dwarf_die_get_tag successful");
132 ok(tag
== DW_TAG_typedef
, "bt_dwarf_die_get_tag - correct tag value");
133 ret
= bt_dwarf_die_get_name(die
, &die_name
);
134 ok(ret
== 0, "bt_dwarf_die_get_name successful");
135 ok(strcmp(die_name
, "size_t") == 0,
136 "bt_dwarf_die_get_name - correct name value");
138 bt_dwarf_die_destroy(die
);
139 bt_dwarf_cu_destroy(cu
);
140 dwarf_end(dwarf_info
);
146 int main(int argc
, char **argv
)
148 const char *data_dir
;
150 plan_tests(NR_TESTS
);
158 test_bt_no_dwarf(data_dir
);
159 test_bt_dwarf(data_dir
);
This page took 0.032899 seconds and 4 git commands to generate.