[1/2] tests: Add symtab test suite
Commit Message
Add (Catch based) test suite to test symbol table reading through the
result persisted in abigail::corpus.
The test cases are created through simple C source files targeting the
desired properties (having an undefined/export function or both). The
Makefile that comes with them recreates the test cases from the sources.
This covers reading sorted_(undefined_)var|fun_symbols as well as the
corresponding symbols maps accessible through the accessors of
abigail::corpus.
* tests/Makefile.am: add new test runtestsymtab
* tests/data/Makefile.am: add new test data for runtestsymtab
* tests/data/test-symtab/basic/empty.c: New test case source.
* tests/data/test-symtab/basic/link_against_me.c: Likewise.
* tests/data/test-symtab/basic/no_debug_info.c: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable.c: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable_undefined.c: Likewise.
* tests/data/test-symtab/basic/single_function.c: Likewise.
* tests/data/test-symtab/basic/single_undefined_function.c: Likewise.
* tests/data/test-symtab/basic/single_undefined_variable.c: Likewise.
* tests/data/test-symtab/basic/single_variable.c: Likewise.
* tests/data/test-symtab/basic/empty.so: New test data.
* tests/data/test-symtab/basic/link_against_me.so: Likewise.
* tests/data/test-symtab/basic/no_debug_info.so: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable.so: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable_undefined.so: Likewise.
* tests/data/test-symtab/basic/single_function.so: Likewise.
* tests/data/test-symtab/basic/single_undefined_function.so: Likewise.
* tests/data/test-symtab/basic/single_undefined_variable.so: Likewise.
* tests/data/test-symtab/basic/single_variable.so: Likewise.
* tests/test-symtab.cc: New test driver.
Signed-off-by: Matthias Maennich <maennich@google.com>
---
tests/Makefile.am | 4 +
tests/data/Makefile.am | 22 +-
tests/data/test-symtab/basic/Makefile | 19 ++
tests/data/test-symtab/basic/empty.c | 1 +
tests/data/test-symtab/basic/empty.so | Bin 0 -> 15608 bytes
.../data/test-symtab/basic/link_against_me.c | 2 +
.../data/test-symtab/basic/link_against_me.so | Bin 0 -> 15600 bytes
tests/data/test-symtab/basic/no_debug_info.c | 1 +
tests/data/test-symtab/basic/no_debug_info.so | Bin 0 -> 15360 bytes
.../basic/one_function_one_variable.c | 3 +
.../basic/one_function_one_variable.so | Bin 0 -> 16624 bytes
.../one_function_one_variable_undefined.c | 7 +
.../one_function_one_variable_undefined.so | Bin 0 -> 16792 bytes
.../data/test-symtab/basic/single_function.c | 1 +
.../data/test-symtab/basic/single_function.so | Bin 0 -> 16472 bytes
.../basic/single_undefined_function.c | 5 +
.../basic/single_undefined_function.so | Bin 0 -> 16648 bytes
.../basic/single_undefined_variable.c | 7 +
.../basic/single_undefined_variable.so | Bin 0 -> 16728 bytes
.../data/test-symtab/basic/single_variable.c | 1 +
.../data/test-symtab/basic/single_variable.so | Bin 0 -> 16280 bytes
tests/test-symtab.cc | 205 ++++++++++++++++++
22 files changed, 277 insertions(+), 1 deletion(-)
create mode 100644 tests/data/test-symtab/basic/Makefile
create mode 100644 tests/data/test-symtab/basic/empty.c
create mode 100755 tests/data/test-symtab/basic/empty.so
create mode 100644 tests/data/test-symtab/basic/link_against_me.c
create mode 100755 tests/data/test-symtab/basic/link_against_me.so
create mode 100644 tests/data/test-symtab/basic/no_debug_info.c
create mode 100755 tests/data/test-symtab/basic/no_debug_info.so
create mode 100644 tests/data/test-symtab/basic/one_function_one_variable.c
create mode 100755 tests/data/test-symtab/basic/one_function_one_variable.so
create mode 100644 tests/data/test-symtab/basic/one_function_one_variable_undefined.c
create mode 100755 tests/data/test-symtab/basic/one_function_one_variable_undefined.so
create mode 100644 tests/data/test-symtab/basic/single_function.c
create mode 100755 tests/data/test-symtab/basic/single_function.so
create mode 100644 tests/data/test-symtab/basic/single_undefined_function.c
create mode 100755 tests/data/test-symtab/basic/single_undefined_function.so
create mode 100644 tests/data/test-symtab/basic/single_undefined_variable.c
create mode 100755 tests/data/test-symtab/basic/single_undefined_variable.so
create mode 100644 tests/data/test-symtab/basic/single_variable.c
create mode 100755 tests/data/test-symtab/basic/single_variable.so
create mode 100644 tests/test-symtab.cc
Comments
Hello,
Matthias Maennich <maennich@google.com> a écrit:
[...]
> +++ b/tests/test-symtab.cc
> +TEST_CASE("Symtab::Empty", "[symtab, basic]")
> +{
> + const std::string binary = "basic/empty.so";
You see, the main criteria I care about in testing is actually the
capacity for someone who is running the test to debug it (when it fails)
without having to know about the details about a particular testing
framework. I know other people favor "fancy test outputs" and other
niceties. I don't really care about those :-) What I care the most
about is to be able to pratically debug and fix stuff because I think
that's what matters ultimately, fixing stuff to make it work.
That means, I should be able to run the test under the debugger, set a
breakpoint in the source code of the test that I am reading and go from
there.
So for instance, in this example, I can't do that. I can't set a
breakpoint at the line where the variable "binary" is defined, without
knowing about the function that is automatically generated by the macro
TEST_CASE("blah") etc. To me, that's a real loss of functionality
compared to the other libabigail tests. I was a bit reluctant to accept
the use of libCatch, because of that. But I think there is a middle
ground we can strike here.
How about we decide that each test case should be its own function? I.e,
having:
void
test_case1()
{
//blah.
}
and then
TEST_CASE("Symtab::Empty", "[symtab, basic]")
{
test_case1();
}
That way, when the "Symtab::Empty" test fails, I can do:
$ gdb --args runtestsymtab
> break test_case1
> run
And then break inside test_case1 and work from there.
Or something along those lines. This might seem like a minor point to
you today, but when we are gone and someone else has (or maybe us 10
years from now when we forgot everything about today) to fix issues
raised by this test failing, being able to single step from the failing
test will prove invaluable. So I really care about this.
What do you think? I am probably missing something. Maybe you have a better idea?
Cheers,
Dodji Seketeli <dodji@seketeli.org> a écrit:
[...]
> So for instance, in this example, I can't do that. I can't set a
> breakpoint at the line where the variable "binary" is defined, without
> knowing about the function that is automatically generated by the macro
> TEST_CASE("blah") etc.
Err, I was wrong here. The reason why I couldn't do it was that the test
wasn't being compiled with debug info because I screwed up my
environment, of course.
So, my bad. I take what I have said back. Sorry :-(
I'll go ahead with the review in a subsequent message then.
Thanks!
Cheers,
Matthias Maennich <maennich@google.com> a écrit:
[...]
> tests/data/test-symtab/basic/Makefile | 19 ++
This file is missing from the ChangeLog part of the commit log. So I
have added it there.
[...]
> * tests/Makefile.am: add new test runtestsymtab
> * tests/data/Makefile.am: add new test data for runtestsymtab
> * tests/data/test-symtab/basic/empty.c: New test case source.
> * tests/data/test-symtab/basic/link_against_me.c: Likewise.
> * tests/data/test-symtab/basic/no_debug_info.c: Likewise.
> * tests/data/test-symtab/basic/one_function_one_variable.c: Likewise.
> * tests/data/test-symtab/basic/one_function_one_variable_undefined.c: Likewise.
> * tests/data/test-symtab/basic/single_function.c: Likewise.
> * tests/data/test-symtab/basic/single_undefined_function.c: Likewise.
> * tests/data/test-symtab/basic/single_undefined_variable.c: Likewise.
> * tests/data/test-symtab/basic/single_variable.c: Likewise.
> * tests/data/test-symtab/basic/empty.so: New test data.
> * tests/data/test-symtab/basic/link_against_me.so: Likewise.
> * tests/data/test-symtab/basic/no_debug_info.so: Likewise.
> * tests/data/test-symtab/basic/one_function_one_variable.so: Likewise.
> * tests/data/test-symtab/basic/one_function_one_variable_undefined.so: Likewise.
> * tests/data/test-symtab/basic/single_function.so: Likewise.
> * tests/data/test-symtab/basic/single_undefined_function.so: Likewise.
> * tests/data/test-symtab/basic/single_undefined_variable.so: Likewise.
> * tests/data/test-symtab/basic/single_variable.so: Likewise.
> * tests/test-symtab.cc: New test driver.
>
> Signed-off-by: Matthias Maennich <maennich@google.com>
Acked-by: Dodji Seketeli <dodji@redhat.com>
Applied to master with the change above, thanks!
Cheers,
@@ -49,6 +49,7 @@ runtestini \
runtestkmiwhitelist \
runtestlookupsyms \
runtestreadwrite \
+runtestsymtab \
runtesttoolsutils \
$(FEDABIPKGDIFF_TEST) \
$(ZIP_ARCHIVE_TESTS) \
@@ -154,6 +155,9 @@ runtestelfhelpers_LDADD = libcatch.la $(top_builddir)/src/libabigail.la
runtestcxxcompat_SOURCES = test-cxx-compat.cc
runtestcxxcompat_LDADD = libcatch.la $(top_builddir)/src/libabigail.la
+runtestsymtab_SOURCES = test-symtab.cc
+runtestsymtab_LDADD = libtestutils.la libcatch.la $(top_builddir)/src/libabigail.la
+
runtestsvg_SOURCES=test-svg.cc
runtestsvg_LDADD=$(top_builddir)/src/libabigail.la
@@ -1700,4 +1700,24 @@ test-ini/test01-equal-in-property-string.abignore \
test-kmi-whitelist/whitelist-with-single-entry \
test-kmi-whitelist/whitelist-with-another-single-entry \
test-kmi-whitelist/whitelist-with-duplicate-entry \
-test-kmi-whitelist/whitelist-with-two-sections
+test-kmi-whitelist/whitelist-with-two-sections \
+\
+test-symtab/basic/Makefile \
+test-symtab/basic/empty.c \
+test-symtab/basic/empty.so \
+test-symtab/basic/link_against_me.c \
+test-symtab/basic/link_against_me.so \
+test-symtab/basic/no_debug_info.c \
+test-symtab/basic/no_debug_info.so \
+test-symtab/basic/one_function_one_variable.c \
+test-symtab/basic/one_function_one_variable.so \
+test-symtab/basic/one_function_one_variable_undefined.c \
+test-symtab/basic/one_function_one_variable_undefined.so \
+test-symtab/basic/single_function.c \
+test-symtab/basic/single_function.so \
+test-symtab/basic/single_undefined_function.c \
+test-symtab/basic/single_undefined_function.so \
+test-symtab/basic/single_undefined_variable.c \
+test-symtab/basic/single_undefined_variable.so \
+test-symtab/basic/single_variable.c \
+test-symtab/basic/single_variable.so
new file mode 100644
@@ -0,0 +1,19 @@
+srcs = $(wildcard *.c)
+libs = $(srcs:.c=.so)
+
+flags = -fPIC
+
+all: $(libs)
+
+clean:
+ rm $(libs)
+
+no_debug_info.so: no_debug_info.c Makefile
+ $(CC) $< -shared $(flags) -o $@
+
+link_against_me.so: link_against_me.c
+ $(CC) $< -shared $(flags) -o $@
+
+%.so: %.c Makefile link_against_me.so
+ $(CC) $< -shared $(flags) -g -o $@ link_against_me.so
+
new file mode 100644
@@ -0,0 +1 @@
+// empty!
new file mode 100755
GIT binary patch
literal 15608
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
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,2 @@
+int undefined_variable =1;
+void undefined_function() { }
new file mode 100755
GIT binary patch
literal 15600
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
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1 @@
+// empty!
new file mode 100755
GIT binary patch
literal 15360
zcmeHOPiz%M7@yZirA45kAXSX45e*nwY6U4Kg;)BA#k56hiJC|@+rDl4lJ|$aw~Z|(
z(%5Jqgvg0t;z7BH#)B8VT7n@aUc`%fF^z!)6E!taQ$6tfzTNNlx^KEQgoCG<^zAp_
z@B1?|znSgqVdi9Se_ul?rBKppzhW(OPlRN|ka<QbBr>W)HPLgkx<B+?wPadWn@dL!
zq>{YcMkAX<*Co0H2|LGy?O7a5#R{J_iM~L_<L)BY89VZy*<UZ;=fqSli9}ojVH|f(
z;?7AN<n!VW*~CexaQk5&H~|+;Zi`R_8Tu0T!i^xy?cHtxeM1z-IaV6qjPw%{!{nHa
z^y6tdG<a0K^woDm?SHI3|HO%F?`~;1nS0~S{3bFf_Q#L)+bw<MXeBs5xdP7PN%H5m
zlW^s_<AqYutpr{<a9!md9v*PBe%T+-RRX^}JkXsl75!mvB=1MIWQ#jG<+)?IqL<H|
z@Tn<<^?~_Z5TZ}X`~&|~@YW1RDS9uW0)75Kr1PBe7*KA;a4ZeBEyQqnb;6Lv7>>1q
zTt*rO3<HJ%!+>GHFkl!k3>XFs1BQXyVZfRFrO7$d`0FmEoVVtJhUz!Y?3YbfYN6FV
zKar{W*mZigY|T*ZW2%jvgM)Ln^9PPS+xRVueT%^+N_U>?l&-lt-?DXveXocl|Bpid
zJr`N*xaFK)a4!FLz`4Abc2ZZJYqx@plwd#-G*#!vTDJBq#m{u+$fPEB9d%|qALgoa
z`bMzUIn((ZDL0Q*tJRwm^tjsCMSAKO+J*f2buw}kkGpQ91e#(PFbo(53<HJ%!+>GH
zFkl!k3>XFs1BL;^fMLKeU>GnA7zPXjh5^HXVZbn87%&VN1`Gpt%mB{S;vDT-WRi2W
z>qK7^{Q=Q&K6i`gICuM?=s2hQkY@k$R<*>?b~$t#o<S#lPIR2Tc0^wz@kd48EwWW)
z?Tl_F0#?H=2K4Ka;LWg${JR?Ur<O<X|4ZN;yWSqoFCXgee%9LF<B#OLqP5R%x1ZYC
z-mxR9S?z7@ZS?oF9<1qUKKUF!<Sh0yftZJQNSaQgga3MbRc)T?@kZ5}Kwz3r?#sHV
z_g}57M7&A0CF0Gs`w;bc)+nsYdYo2?6-T0aTCJ^}E00^#YMsJ*t;g4^r1?p!7KL-=
z_5RfPOdN^oX|+LNKI7K3x>s3={`bY*!aAQ_U!{KMqZ4(7-`57UoS*fAAJ_PNL~y+C
zNVb<MsaSuwJuZBIAeF#RfpBhjLCZfK`Y-4C0^v#hUuj(YzNS?2JSOG&JoH~aUtfgy
zhGjf|Ex0}}-xJ=Dux@`0@#X97dYEVVy#GVEML)eX(||1<B>mA9@B=I0YP1|wg2}Nl
zdsHo5w{U}kJIWU>Ds(R+TXM(qr4cXhW`k0>;(C))YP3{1p7#SkYwz8?dvCH6-^0kc
zUb*Z|yM8e!Pph%ASMc5JWT7xkAu-J*&!En=Sfbk>Ba`D~87ooWT(@tiYoOQd9qi%T
zAw91Qb`2cvCYWx90CcmJk~`rQvwTN{Gpeu)%01M7<X~67d!(=L#ol3exa(klFXgDe
zD-vEfNxoF_UsqA;Z>=c1GF=F~5t2bUk`t&EOM!2X7boqJ$y`3WGnZANHsMt!l%1U}
zQe-59va-v5-eXYN;W+H$`M@481<DTmDS9%q%JwHB4kM?CzQ~3;W$+5QQEI6aa1Ls~
z3p{0yR4U4*IV{k;BrKvkfO!ArJ+rnwpdxacmQ%m`!q>9?qCFI0*iRs_|6_Z=evGso
zRN*}x@z{4Dr^J!lrB`9;evjZ8lAIgyb5eoCcZ0ZxIZ$Wm(2sK?9{U(1z8m!Zw{kF*
zA^LH@@ZD0|@8tjDW_F4doxk_U7LUii2&w&h)zhn&wRr5GkUHPcAw4ZVBMm}+7VA4#
z_5O@&@z{?c@x6sK`uKSt;qiliWr?Rq-5>oHFZCK#c(23!;JXy}@N|FZkh2uq5{t)o
zz$v+J2tRTO3v|eL2<5p)`}khKeMQ_$#5fQK9$%$c9zWvoT`^CmC%IVRbLoM2$O~kO
z$E%F^wnY-_RM6V{gZK}~5Rb=x*edbx)8nCkNEP-$|E)}9u~vxZw&LXzQWz8WnhEib
z*N~`!__(aCotUp92^XYee2J2CVLaf4*C+ZO3s)VxBW(~3iBVJO%Pu+o?LAR|{{HCk
F{{nUkt>yp#
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,3 @@
+void exported_function(){}
+
+int exported_variable;
new file mode 100755
GIT binary patch
literal 16624
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
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,7 @@
+extern int undefined_variable;
+void undefined_function(int);
+
+
+static void local_function(){
+ undefined_function(undefined_variable);
+}
new file mode 100755
GIT binary patch
literal 16792
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
MQHRj!BluMDPaKW4n*aa+
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1 @@
+void exported_function(){}
new file mode 100755
GIT binary patch
literal 16472
zcmeHOZ)_Y#6@PmhCr<60owNa`Db0dhlp=2JxM|`va&wOV<PybcFt$WdqwU_^-rY)f
zd(rJ)W48!Sii%Q2mCP5YRFDFyQ0ND!kSYN}s8LWqfdu^od_WeWC`AQ~s?b!R9PjPU
z+uPgQLlqy8sAlBbH}B8y&Ahj>J9EC7uPmHhOeqR*QQ>hQE;|}XvO+O-OjM9$VH$Sg
z^%L-bZ@aCd>Zu(RN~R$EQX2zgE%-Pc5M5%*dJ_9CH3DPN{A);G5iHXvZaeB)dSK9c
zyqjJV?Ohj?aVaz-+=jqy2prS%!k+11;MVUW^>dmWB+&6d3{1(E%K5jwqF>j1HjIno
zWP7HJ`yAq^pC7hx+LuLp{qoWh@iFD}P`mfxN5#*nbF1+F_V<7I)a&0q{n9I$U;L@{
z{g>aXK1phz@aaAiF6f`eq4@IEcMe=dRo}9R8ZANl**<cLE6JYPPm-^qd=HN1+ae)5
zkoSvWlxuaza6Pl(83q`qSC)*T)v(I8>sgJJrMYU|u~y7{)e3aU8l$jg8YSB?tM;=N
zSZf#S4bLhXrKVHx?7D;FQH&=ZH(R0~S7P$lgnTR;bdT+s-#ih>DaRBmms=6J7>d4X
zD<Y?R$mLE%&SQ&plFAIo49E<~49E<~49E<~49E<~4E%p*Ab0uQ!Q9n>zf1t+o`1tj
zwSSen{PV$^VNmTy|A4CYLx05U$bl@@Ud38zgAH;o&it0JFAls#<k%f=FS`3W)zRI~
z_U6ce7TMku6z#v~+dujpA`joqy|9(L@z)c%8+X*4@@DSWcfI@2!IE$=*xoFS9GLIm
zTQfGQpgFOcyFBwCRdX-A?G5Ly&YVH!)`fPveXD|(HwR{sS1xe7Oy7A9m8*!^xNy^t
zy(?PksVp)BG6OOLG6OOLG6OOLG6OOLG6OOLG6OOLAH57H`_<#)7#95osBN{|S)`Ll
zD@bo6Z6T%N|CozZd3G6;wNYjN@Q%R^{GpMs58&rFe`~k>pD5F#i|Mg5BSV)4TX5q3
z<DYqC{8Om*@%S|!-atG4?ULk#eF{G{Y|H=cbv8Zv)zsXs?I*DTGLS`PKxRN@KxRN@
zKxRN@KxRN@KxRN@KxW`0kpbTC%KKY~IV!Q=b(i4(CHQ@U=Y6yL1<&6V?-xAppQZ1Y
zR9JueZo5wW(_%BMzXu)pF|i4j_fTIE`g_P2OF1AgB<Pr+;ojM7AmIJOEur9cuM7K~
zf-?StcF>>DkI?_G2=8N$x5xX6PtDCerX8HO^0w({$Mh-vP-bfS;h?5XO-@bX-y=Y~
zv4eyK@%HSdj=87*1Z?wVgZ^ga;V&ZdW&9)oQ&m(b%J#TU`6ej4m50*z4yoz=>D|hn
z9itz|Zs>4gpPGJb==jjFArfZCzHyR94YjGlLEqOu)4R~4f9wI<SHQKMa@7jAW$OjB
z!hP%eU}uV3RR)wZDHTz;+g+PGbTpO%EmQNFjx|%Z9IIg$kTn~H%FNpIk<5|9TBfXJ
zO6O0{;nj54okFEicj`?y({wJ`PBG)rHgY$i7rh(CCoZ`Yg}UQ4?EFO4&YO9=Y}!@B
zU9X{&3D0spccN%|reDnnao%+8AS6Goeiw``Jg*S7QSsjL^U^I>fuECZ`L^(R>Xr`x
zKNsC{eCovW-7Vh%TB3XqCKKg&DkV{V5Age=+dn?dT2vC$RTzeYiSk|He*Gv)g*5Q{
zrdvJ&Nza#x!Sa6nZu{K;*{CF_t9U|zpU0?Hg?m9uwCDfUMXhP{@9h={PKA&4k>m4}
zP*mWzSGQ6Hemi&M^muQBzqdP*phoZc6rCc9-LJHeUyR8=Ddap)1YQ7+VnvDMf!d=&
z=SGx-`%*(WwYwGbzwX=j-rtu{p49(-alPvM8HQ^bR$?W|&yUbXf!=X)!<X;rxxc>@
z^7wf89m-R5!X_5iCdz?kEzPflm-n!ig5Kxi1C%S!I}S%MU@b&<Di8LNPoq5PT+Nw2
z_N6{@C^S6RYnDp*PVOAPF}#{lpaVEA7)G&fl&kf;Sv87Yz2O>Wa}5gh+Qq7cM{V?@
zhYuf3HllMmwqZ6J=DK0w8+9E@4YOt$#b&Lxj*tjvprzMk+B;(y#^Unq(t@#YZl2By
z%|Cf=cIosS`oXh8EHsL4-KdyOkxmVfPgLW4Vl3nYI5)oxe!svtb@qvqvuBMb78gIi
zuwtyto;<sNZo3Z@`KOW+PagHo9RKkIQ}<yf(1VEssn@`H1!;wAPTjNgveVS_O}kpm
z*hTQUis@EBFRnX?45-%ty<t^N5`yjrt6!{odb#d_?pbSir5gacRS~JK6cNH)010v)
zSaKcxnKhix$P;<Q=5WFTJ@2}p<BhN3%|w}%Z<Y~aI%OOsg0-Deo$F>k->{xxu4+3L
z*D=)20RJy*v@WH!pjbwR^D3VQ9FO@8Rzn>j9XI?3t_>Ogw5Tv;Jg*yhoyi`iu|jKA
z#`8SQbVC?YyZGpZ>tlYiXHiDJ8PDruro0|T6Tgs;XvrZ%z8TN+KGW;MINpD5e;M`U
zlh@<ndriFG;xkh`f5CgWgVzL(Y3wx_cMo5Pwa@Dfrty3;&(w_Jv!X$!KSh1C#QQ_}
zjmFRG7pD9@f_=o}r+JR>oPW@SrJ&=2WfI3fhl(hk*F#Ld#6UqgZWcd}6`ITW{_^)V
zK4%)YXP)WT5IYjV^ZM!vJs4QnF5o&m%fE#R8av!RufzBpFQ3=txEaUyfqs*u_!-aZ
zwN2brOhxmroeSfceiv0yJY<FKWI%bG3uzb+<9~pPD4ys0F@a~hIG*{}u|hW7e=Qqm
zv_5!hD_VYn49SFfsABx5LrG9!Jky&f=6ck0Q8<kIjoZG}2mg!!=Aup$Y=561BgoGL
zp1!e0OT7JeQ5lz!{hvQ%`*#FB9_Q2{@&fSVfP`0WD@wy>H?#uS68P7|z@>R6gC8Cb
kJg(^d!1q1^higXyuE`AvWsId2U?P6+bO2CefEWw^2I-V<qyPW_
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,5 @@
+void undefined_function();
+
+static void local_function() {
+ undefined_function();
+}
new file mode 100755
GIT binary patch
literal 16648
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
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,7 @@
+extern int undefined_variable;
+
+static void other_local_function(int variable) { (void)variable; }
+
+static void local_function(){
+ other_local_function(undefined_variable);
+}
new file mode 100755
GIT binary patch
literal 16728
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
Hh5bJPU|+b4
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1 @@
+int exported_variable;
new file mode 100755
GIT binary patch
literal 16280
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
literal 0
HcmV?d00001
new file mode 100644
@@ -0,0 +1,205 @@
+// -*- Mode: C++ -*-
+//
+// Copyright (C) 2020 Google, Inc.
+//
+// This file is part of the GNU Application Binary Interface Generic
+// Analysis and Instrumentation Library (libabigail). This library is
+// free software; you can redistribute it and/or modify it under the
+// terms of the GNU Lesser General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option) any
+// later version.
+
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Lesser Public License for more details.
+
+// You should have received a copy of the GNU Lesser General Public
+// License along with this program; see the file COPYING-LGPLV3. If
+// not, see <http://www.gnu.org/licenses/>.
+
+// Author: Matthias Maennich
+
+/// @file
+///
+/// This program tests symtab invariants through abg-corpus.
+
+#include <iostream>
+#include <limits>
+#include <vector>
+
+#include "abg-corpus.h"
+#include "abg-dwarf-reader.h"
+#include "abg-ir.h"
+#include "lib/catch.hpp"
+#include "test-utils.h"
+
+using namespace abigail;
+
+using dwarf_reader::create_read_context;
+using dwarf_reader::read_context_sptr;
+using dwarf_reader::read_corpus_from_elf;
+using ir::environment;
+using ir::environment_sptr;
+
+static const std::string test_data_dir =
+ std::string(abigail::tests::get_src_dir()) + "/tests/data/test-symtab/";
+
+dwarf_reader::status
+read_corpus(const std::string path, corpus_sptr& result)
+{
+ const std::string& absolute_path = test_data_dir + path;
+
+ environment_sptr env(new environment);
+ const std::vector<char**> debug_info_root_paths;
+ read_context_sptr ctxt =
+ create_read_context(absolute_path, debug_info_root_paths, env.get());
+
+ dwarf_reader::status status = dwarf_reader::STATUS_UNKNOWN;
+ result = read_corpus_from_elf(*ctxt, status);
+
+ REQUIRE(status != dwarf_reader::STATUS_UNKNOWN);
+ return status;
+}
+
+TEST_CASE("Symtab::Empty", "[symtab, basic]")
+{
+ const std::string binary = "basic/empty.so";
+ corpus_sptr corpus_ptr;
+ const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
+ REQUIRE(corpus_ptr);
+
+ REQUIRE((status & dwarf_reader::STATUS_OK));
+
+ // TODO: Those two assertions are currently not met. Empty symtabs are
+ // currently treated like the error case.
+ // REQUIRE((status & dwarf_reader::STATUS_OK));
+ // REQUIRE((status & dwarf_reader::STATUS_NO_SYMBOLS_FOUND));
+}
+
+TEST_CASE("Symtab::NoDebugInfo", "[symtab, basic]")
+{
+ const std::string binary = "basic/no_debug_info.so";
+ corpus_sptr corpus_ptr;
+ const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
+ REQUIRE(corpus_ptr);
+
+ REQUIRE(status
+ == (dwarf_reader::STATUS_OK
+ | dwarf_reader::STATUS_DEBUG_INFO_NOT_FOUND));
+}
+
+// this value indicates in the following helper method, that we do not want to
+// assert for this particular value. In other words, N is a placeholder for an
+// arbitrary value.
+#define N std::numeric_limits<size_t>::max()
+
+corpus_sptr
+assert_symbol_count(const std::string& path,
+ size_t function_symbols = 0,
+ size_t variable_symbols = 0,
+ size_t undefined_function_symbols = 0,
+ size_t undefined_variable_symbols = 0)
+{
+ corpus_sptr corpus_ptr;
+ const dwarf_reader::status status = read_corpus(path, corpus_ptr);
+ REQUIRE(corpus_ptr);
+
+ REQUIRE(status == dwarf_reader::STATUS_OK);
+ const corpus& corpus = *corpus_ptr;
+
+ if (function_symbols != N)
+ {
+ CHECK(corpus.get_sorted_fun_symbols().size() == function_symbols);
+ CHECK(corpus.get_fun_symbol_map().size() == function_symbols);
+ CHECK(corpus.get_fun_symbol_map_sptr()->size() == function_symbols);
+ }
+ if (variable_symbols != N)
+ {
+ CHECK(corpus.get_sorted_var_symbols().size() == variable_symbols);
+ CHECK(corpus.get_var_symbol_map().size() == variable_symbols);
+ CHECK(corpus.get_var_symbol_map_sptr()->size() == variable_symbols);
+ }
+ if (undefined_variable_symbols != N)
+ {
+ CHECK(corpus.get_sorted_undefined_fun_symbols().size()
+ == undefined_function_symbols);
+ CHECK(corpus.get_undefined_fun_symbol_map().size()
+ == undefined_function_symbols);
+ CHECK(corpus.get_undefined_fun_symbol_map_sptr()->size()
+ == undefined_function_symbols);
+ }
+ if (undefined_function_symbols != N)
+ {
+ CHECK(corpus.get_sorted_undefined_var_symbols().size()
+ == undefined_variable_symbols);
+ CHECK(corpus.get_undefined_var_symbol_map().size()
+ == undefined_variable_symbols);
+ CHECK(corpus.get_undefined_var_symbol_map_sptr()->size()
+ == undefined_variable_symbols);
+ }
+
+ return corpus_ptr;
+}
+
+TEST_CASE("Symtab::SimpleSymtabs", "[symtab, basic]")
+{
+ GIVEN("a binary with no exported symbols")
+ {
+ // TODO: should pass, but does currently not as empty tables are treated
+ // like the error case, but this is an edge case anyway.
+ // assert_symbol_count("empty.so");
+ }
+
+ GIVEN("a binary with a single exported function")
+ {
+ const std::string binary = "basic/single_function.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 1, 0);
+ const elf_symbol_sptr& symbol =
+ corpus->lookup_function_symbol("exported_function");
+ REQUIRE(symbol);
+ CHECK(!corpus->lookup_variable_symbol("exported_function"));
+ CHECK(symbol == corpus->lookup_function_symbol(*symbol));
+ CHECK(symbol != corpus->lookup_variable_symbol(*symbol));
+ }
+
+ GIVEN("a binary with a single exported variable")
+ {
+ const std::string binary = "basic/single_variable.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 0, 1);
+ const elf_symbol_sptr& symbol =
+ corpus->lookup_variable_symbol("exported_variable");
+ REQUIRE(symbol);
+ CHECK(!corpus->lookup_function_symbol("exported_variable"));
+ CHECK(symbol == corpus->lookup_variable_symbol(*symbol));
+ CHECK(symbol != corpus->lookup_function_symbol(*symbol));
+ }
+
+ GIVEN("a binary with one function and one variable exported")
+ {
+ const std::string binary = "basic/one_function_one_variable.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 1, 1);
+ CHECK(corpus->lookup_function_symbol("exported_function"));
+ CHECK(!corpus->lookup_variable_symbol("exported_function"));
+ CHECK(corpus->lookup_variable_symbol("exported_variable"));
+ CHECK(!corpus->lookup_function_symbol("exported_variable"));
+ }
+
+ GIVEN("a binary with a single undefined function")
+ {
+ const std::string binary = "basic/single_undefined_function.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 1, 0);
+ }
+
+ GIVEN("a binary with a single undefined variable")
+ {
+ const std::string binary = "basic/single_undefined_variable.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 0, 1);
+ }
+
+ GIVEN("a binary with one function and one variable undefined")
+ {
+ const std::string binary = "basic/one_function_one_variable_undefined.so";
+ const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 1, 1);
+ }
+}