[1/2] tests: Add symtab test suite

Message ID 20200518115014.225405-1-maennich@google.com
State Committed
Headers
Series [1/2] tests: Add symtab test suite |

Commit Message

Matthias Männich May 18, 2020, 11:50 a.m. UTC
  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

Dodji Seketeli May 26, 2020, 2 p.m. UTC | #1
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 May 26, 2020, 3:36 p.m. UTC | #2
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,
  
Dodji Seketeli May 27, 2020, 9:06 a.m. UTC | #3
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,
  

Patch

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2d8ab9e794a4..c2d4d1dc5d35 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 7e91f52c44fe..6505de594ab2 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -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
diff --git a/tests/data/test-symtab/basic/Makefile b/tests/data/test-symtab/basic/Makefile
new file mode 100644
index 000000000000..c84d128a4e28
--- /dev/null
+++ b/tests/data/test-symtab/basic/Makefile
@@ -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
+
diff --git a/tests/data/test-symtab/basic/empty.c b/tests/data/test-symtab/basic/empty.c
new file mode 100644
index 000000000000..5bb380ba0db8
--- /dev/null
+++ b/tests/data/test-symtab/basic/empty.c
@@ -0,0 +1 @@ 
+// empty!
diff --git a/tests/data/test-symtab/basic/empty.so b/tests/data/test-symtab/basic/empty.so
new file mode 100755
index 0000000000000000000000000000000000000000..28a54747116d9aa30b02192080e09300835c6716
GIT binary patch
literal 15608
zcmeHOUuYaf7@y=Co7T3mw%TaLu2O9a-X@J{k_u@r&7W>1X=_bE!Lsb#ZSD^4PuSg~
zIejn?gqBk5lk`EM`rtpL_#(chRQg<f5Ck8BScsq!1tlW%{J!1!UH0}iT7B?ohP(ad
z`#UqgncbO(`CcENoM>-r6DSFBL@<|nAdsY_Vs$`Ph@`}j=%i=2*yY=9SW~ss788L8
zRLHp8MhB}TAEoFLDD>>-x2Lf)70rJ(DEa~#_PdWv=k>sT{zx;u#(}APC@K8fNydIx
zq~8_k2YOoCgLZNdD%`%`2M)j`LiYwz0qWb5?1ejCmfO460{G65AIDg4eDkuOpcp3m
z?4&<W)A5sM#h*J4XRZzmTpzxZ8r@;!+n?O`em|)M+vCsty_N|w)MAXESx3&}iL>Xn
z<K)6LbEQhzbUn-QOjDRArl-uT?bx}3>)Foq)M&9%wx_Lh(GGO+8Z$FznKOm5RV=(}
zQ&R%#1M|5efxaN;AM#J7ygS8Sg5HaufL}Tq@I0qH29)KH97}_BD<Qdjb$plAkQ{3T
zu@qGZC<GJ&3IT<HLO>y)5Kssx1QY`If`GB`W2bSc<EI`Wj5ij&_WEsO;fv0j4cGdi
z??_dD>U(;2?MYGXW2((ufq`*(_#5`U-0>BY!>isy6z(mqQ@Bm_rLH~mY<p8uvj51p
zKlC1x19y#!E5?nVj~X{t6Gq!D<IB6=P6{w319aAxX1ex_t@+On7f2<lJ!g%D;m5gZ
zT)g9LF)j^1Pt5YUdcD4!r^l_15#rm<p<U1)ULz%Y@wl5tN<vi>0tx|zfI>hapb$_9
zC<GJ&3IT<HLO>y)5Kssx1QY@a0fm4<Kp~(IPzWdl6aoqXg@8ifKO=y9wYW#S1(D>v
z+O3jbmHZ=;$Nk*hlE=N<M<tJYx{pQlzum1@ShQbWy7lj%6Tc{V+`Tp=zgha9mGpi|
zyCrSh(M<({jnGR4`t_ldZ-QRZKk7k$8gZoj|01}@9&HczmyeH*KBw&;v(p8utR2?-
z^n=O1p#wop>+9|7rQfrBb6gueI2aLY$&yzs+rv4#Y&(Svv6hp`56=w^BnSGnWKK)Y
zoIWv1Ps^>9GkK>{u2kJ*wS2x%&L%y+vh51HH0#y$jOaP<_GBt$&ncvPiiNb5F6692
z(R6DiGVJke*K>QamS_3Zq!gzuw~&dBtd&pj&Ft_cY-y4pA=XLQD?zvAu|AsR8yf4V
zS>7SKV<tGknFVrPH`{L%TCBWN^v23JHS#r@<7^gqZ<^(_inXvLs3*jh#=ZBjHX*hO
zyid*YZ6a>{Bt)0Mz4vB&>U=6J3F-;4U0}V1wF&W{&|>X(gv}cDgrCXKVEqc;x!)ju
z;VU0ag}*cHq7}DoQa&5O`3Wh<cM8D<snQneC%4Ci^B&q_a4V6V+g*voule?^_+KS?
zT>sY_*EK&*{QSnnx$fJy&g194e0vN2H>Er}U$;r#9<!dm_T{bX@LNAl>w5T=<Qn~>
zh4X;4sF3*G>&OS!k&BGuxn6Z<hQ29lX(FaqGBcbg;!-|IwqoXrm9$kfvtGq<O{+R5
zGL_P7(e~`DKG@$s7;nV+BL&lP9IIy9^rfna8OJKwX0}=?)yO5pnPllTnc_QVniFS6
zrpC?jlVhCCGWPPxk*O1-<V~3@5Sm%HV&<)KmUCJ-lJJ`r=JCl>$3`a2Qxg*}j!&D@
zBgZDkDMoW{i=QA9p9J%FsWZ)4HbM`+utYtFKEOotsFf?8t>?;BJzXsnv&lkM_*~v{
z^Fq(o%H$bP&k?#~7cCYF-5-ZOTlDl?#S^+`&(V_+6}p`dunUX=*a98u6u~Odr=EQ|
z1~ou?fzZ>gD|DK>63qw6>~u9pnL<v?I{LRFK6mh5-`F-#k#uh)U^Hik)5(6Py&rDa
zXFzdo!M1^O1i}tch0h}J$9@DlCk?q>dKK34lB7IElw-qxQC2{4-jU{h4Ahw#^yk>{
z$NmP2^G>w?I5(XkU+x#qTaA5CeiwI<E?lDcy-munKlV$|$mca0Uc40X$G!?0#Tz`R
z74c8W20=dycb@9e{^TP5*r!2pPDGgK_<0}U@dJOMNlQti_UN~?66dMHdmZKn=V{~*
zM(x3aE|70m$RFo}3%szYz%Jm{c*x%*1<yU&$2kIdmdK~XIN%2yUm;%}Km2jtSfX2>
zTr~f=_JBX=RZ@lhMM~QC1{CX5N*m*W|GT6J`(r=smj1Ad`h)*~Dr|%PYpFn^t>e#a
zh07<zuuPgaRPcYgAqgt*2j%q{=RY9>zVi?M?Aus-A=_p2UryY^q}xY--~n8DePiq)
fcd_DUo6`9S9hJ%mODD#7{{fk&yciBj^{D?}#aZM}

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/link_against_me.c b/tests/data/test-symtab/basic/link_against_me.c
new file mode 100644
index 000000000000..42d6a46bd23d
--- /dev/null
+++ b/tests/data/test-symtab/basic/link_against_me.c
@@ -0,0 +1,2 @@ 
+int undefined_variable =1;
+void undefined_function() { }
diff --git a/tests/data/test-symtab/basic/link_against_me.so b/tests/data/test-symtab/basic/link_against_me.so
new file mode 100755
index 0000000000000000000000000000000000000000..33c8b5d62cd639f4cb96ff2b363326fbf1818668
GIT binary patch
literal 15600
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/no_debug_info.c b/tests/data/test-symtab/basic/no_debug_info.c
new file mode 100644
index 000000000000..5bb380ba0db8
--- /dev/null
+++ b/tests/data/test-symtab/basic/no_debug_info.c
@@ -0,0 +1 @@ 
+// empty!
diff --git a/tests/data/test-symtab/basic/no_debug_info.so b/tests/data/test-symtab/basic/no_debug_info.so
new file mode 100755
index 0000000000000000000000000000000000000000..827c1eee3e4e8f326af7e360ea444627ee59bee6
GIT binary patch
literal 15360
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
F{{nUkt>yp#

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/one_function_one_variable.c b/tests/data/test-symtab/basic/one_function_one_variable.c
new file mode 100644
index 000000000000..f31122a88fb8
--- /dev/null
+++ b/tests/data/test-symtab/basic/one_function_one_variable.c
@@ -0,0 +1,3 @@ 
+void exported_function(){}
+
+int exported_variable;
diff --git a/tests/data/test-symtab/basic/one_function_one_variable.so b/tests/data/test-symtab/basic/one_function_one_variable.so
new file mode 100755
index 0000000000000000000000000000000000000000..51d918c7ec9be6e5a900bcccc5f0964486d76cb4
GIT binary patch
literal 16624
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/one_function_one_variable_undefined.c b/tests/data/test-symtab/basic/one_function_one_variable_undefined.c
new file mode 100644
index 000000000000..53ff5d82c5f8
--- /dev/null
+++ b/tests/data/test-symtab/basic/one_function_one_variable_undefined.c
@@ -0,0 +1,7 @@ 
+extern int undefined_variable;
+void undefined_function(int);
+
+
+static void local_function(){
+	undefined_function(undefined_variable);
+}
diff --git a/tests/data/test-symtab/basic/one_function_one_variable_undefined.so b/tests/data/test-symtab/basic/one_function_one_variable_undefined.so
new file mode 100755
index 0000000000000000000000000000000000000000..fc2356c2aa0af88bad9f3c0f88837bebd5a53575
GIT binary patch
literal 16792
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
MQHRj!BluMDPaKW4n*aa+

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/single_function.c b/tests/data/test-symtab/basic/single_function.c
new file mode 100644
index 000000000000..8ac09016eb4d
--- /dev/null
+++ b/tests/data/test-symtab/basic/single_function.c
@@ -0,0 +1 @@ 
+void exported_function(){}
diff --git a/tests/data/test-symtab/basic/single_function.so b/tests/data/test-symtab/basic/single_function.so
new file mode 100755
index 0000000000000000000000000000000000000000..9b7e45d6ab0f03d602ff2ac50be3539bf909ace6
GIT binary patch
literal 16472
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/single_undefined_function.c b/tests/data/test-symtab/basic/single_undefined_function.c
new file mode 100644
index 000000000000..484d6a5c6943
--- /dev/null
+++ b/tests/data/test-symtab/basic/single_undefined_function.c
@@ -0,0 +1,5 @@ 
+void undefined_function();
+
+static void local_function() {
+  undefined_function();
+}
diff --git a/tests/data/test-symtab/basic/single_undefined_function.so b/tests/data/test-symtab/basic/single_undefined_function.so
new file mode 100755
index 0000000000000000000000000000000000000000..96d19e3ed7e37160315025ad081ba54f4be03c12
GIT binary patch
literal 16648
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/single_undefined_variable.c b/tests/data/test-symtab/basic/single_undefined_variable.c
new file mode 100644
index 000000000000..b0602c2d4e6a
--- /dev/null
+++ b/tests/data/test-symtab/basic/single_undefined_variable.c
@@ -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);
+}
diff --git a/tests/data/test-symtab/basic/single_undefined_variable.so b/tests/data/test-symtab/basic/single_undefined_variable.so
new file mode 100755
index 0000000000000000000000000000000000000000..7188667cc6d6495bd7712e0f31ec5ed3f75b8737
GIT binary patch
literal 16728
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
Hh5bJPU|+b4

literal 0
HcmV?d00001

diff --git a/tests/data/test-symtab/basic/single_variable.c b/tests/data/test-symtab/basic/single_variable.c
new file mode 100644
index 000000000000..620e156dccbc
--- /dev/null
+++ b/tests/data/test-symtab/basic/single_variable.c
@@ -0,0 +1 @@ 
+int exported_variable;
diff --git a/tests/data/test-symtab/basic/single_variable.so b/tests/data/test-symtab/basic/single_variable.so
new file mode 100755
index 0000000000000000000000000000000000000000..6ba3f4343c69b87a8ec280b6cc59b3db7fd33d8d
GIT binary patch
literal 16280
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

literal 0
HcmV?d00001

diff --git a/tests/test-symtab.cc b/tests/test-symtab.cc
new file mode 100644
index 000000000000..62f8998af5d0
--- /dev/null
+++ b/tests/test-symtab.cc
@@ -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);
+  }
+}