aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/ChangeLog48
-rw-r--r--tests/Makefile.am32
-rwxr-xr-xtests/coverage.sh4
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpmbin0 -> 8087 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpmbin0 -> 10448 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpmbin0 -> 11316 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpmbin0 -> 7308 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpmbin0 -> 10380 bytes
-rw-r--r--tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpmbin0 -> 10888 bytes
-rw-r--r--tests/debuginfod-rpms/hello2.spec.57
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpmbin0 -> 4112 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpmbin0 -> 3816 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpmbin0 -> 6060 bytes
-rw-r--r--tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpmbin0 -> 4052 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpmbin0 -> 3819 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpmbin0 -> 5156 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpmbin0 -> 6936 bytes
-rw-r--r--tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpmbin0 -> 5092 bytes
-rw-r--r--tests/debuginfod_build_id_find.c62
-rw-r--r--tests/dwelf_elf_e_machine_string.c1
-rwxr-xr-xtests/run-debuginfod-find.sh324
-rwxr-xr-xtests/run-large-elf-file.sh4
22 files changed, 524 insertions, 8 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 97b8dedb..6e3923f5 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,51 @@
+2019-11-26 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (BUILD_STATIC): Add libraries needed for libdw.
+ * coverage.sh: Add debuginfod directory, check whether source
+ is .c or cxx.
+
+2019-11-24 Mark Wielaard <mark@klomp.org>
+
+ * run-debuginfod-find.sh: Reduce verbosity. Add new cleanup
+ function to use with trap. Add wait_ready function to query
+ metrics instead of sleeping. Calculate rpms and sourcefiles
+ to check.
+
+2019-11-23 Mark Wielaard <mark@klomp.org>
+
+ * run-debuginfod-find.sh: Replace all localhost with 127.0.0.1.
+
+2019-11-07 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod metrics via curl.
+ Fix federated testing, asserted by metrics.
+
+2019-11-06 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod -L mode. Drop
+ plain debuginfo-find help-output-comparison.
+
+2019-11-04 Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh: Test debuginfod-find -v progress mode.
+
+2019-10-28 Aaron Merey <amerey@redhat.com>
+ Frank Ch. Eigler <fche@redhat.com>
+
+ * run-debuginfod-find.sh, debuginfod_build_id_find.c: New test.
+ * testfile-debuginfod-*.rpm.bz2: New data files for test.
+ * Makefile.am: Run it.
+
+2019-11-14 Andreas Schwab <schwab@suse.de>
+
+ * run-large-elf-file.sh: Skip if available memory cannot be
+ determined.
+
+2019-11-14 Andreas Schwab <schwab@suse.de>
+
+ * dwelf_elf_e_machine_string.c (main): Clear errno before calling
+ strtol.
+
2019-09-02 Mark Wielaard <mark@klomp.org>
* run-readelf-s.sh: Add --dyn-syms case.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ad0855de..eab4ae6f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2018 Red Hat, Inc.
+## Copyright (C) 1996-2019 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -190,6 +190,11 @@ check_PROGRAMS += $(asm_TESTS)
TESTS += $(asm_TESTS) run-disasm-bpf.sh
endif
+if DEBUGINFOD
+check_PROGRAMS += debuginfod_build_id_find
+TESTS += run-debuginfod-find.sh
+endif
+
EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
run-show-die-info.sh run-get-files.sh run-get-lines.sh \
run-next-files.sh run-next-lines.sh testfile-only-debug-line.bz2 \
@@ -440,7 +445,25 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
run-dwelf_elf_e_machine_string.sh \
run-elfclassify.sh run-elfclassify-self.sh \
run-disasm-riscv64.sh \
- testfile-riscv64-dis1.o.bz2 testfile-riscv64-dis1.expect.bz2
+ testfile-riscv64-dis1.o.bz2 testfile-riscv64-dis1.expect.bz2 \
+ run-debuginfod-find.sh \
+ debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm \
+ debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm \
+ debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm \
+ debuginfod-rpms/hello2.spec. \
+ debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm \
+ debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm \
+ debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm \
+ debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm \
+ debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm \
+ debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
+
+
if USE_VALGRIND
valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1'
@@ -474,7 +497,7 @@ TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD=$(valgrind_cmd); \
export LC_ALL; export LANG; export VALGRIND_CMD; \
NM=$(NM); export NM;
LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
- $(abs_top_builddir)/libdw:$(abs_top_builddir)/backends:$(abs_top_builddir)/libelf:$(abs_top_builddir)/libasm
+ $(abs_top_builddir)/libdw:$(abs_top_builddir)/backends:$(abs_top_builddir)/libelf:$(abs_top_builddir)/libasm:$(abs_top_builddir)/debuginfod
installcheck-local:
$(MAKE) $(AM_MAKEFLAGS) \
@@ -489,7 +512,7 @@ libasm = -lasm
libebl = -lebl
else !STANDALONE
if BUILD_STATIC
-libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl)
+libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl -lpthread
libelf = ../libelf/libelf.a -lz
libasm = ../libasm/libasm.a
else
@@ -610,6 +633,7 @@ unit_info_LDADD = $(libdw)
next_cfi_LDADD = $(libelf) $(libdw)
elfcopy_LDADD = $(libelf)
addsections_LDADD = $(libelf)
+debuginfod_build_id_find_LDADD = $(libelf) $(libdw)
xlate_notes_LDADD = $(libelf)
elfrdwrnop_LDADD = $(libelf)
dwelf_elf_e_machine_string_LDADD = $(libelf) $(libdw)
diff --git a/tests/coverage.sh b/tests/coverage.sh
index 5cc353c9..01d292cc 100755
--- a/tests/coverage.sh
+++ b/tests/coverage.sh
@@ -8,14 +8,14 @@ fi
cd ..
-for d in lib libasm libdw libdwfl libebl libelf backends src; do
+for d in lib libasm libdw libdwfl libebl libelf backends src debuginfod; do
tmp=$d-data
cd $d
unused=0
unused_files=
for f in *.gcno; do
base="$(basename $f .gcno)"
- fc="$base.c"
+ if [ -f "$base.c" ]; then fc="$base.c"; else fc="$base.cxx"; fi
gcda="$base.gcda"
if [ -f "$gcda" ]; then
gcov -n -a "$fc" |
diff --git a/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..29a60999
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..2757e01a
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..dc6e0f2f
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..f036fa39
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-debugsource-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..e1c09dac
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-two-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..b9a63dfa
--- /dev/null
+++ b/tests/debuginfod-rpms/fedora30/hello2-two-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/hello2.spec. b/tests/debuginfod-rpms/hello2.spec.
new file mode 100644
index 00000000..0690992f
--- /dev/null
+++ b/tests/debuginfod-rpms/hello2.spec.
@@ -0,0 +1,57 @@
+Summary: hello2 -- double hello, world rpm
+Name: hello2
+Version: 1.0
+Release: 2
+Group: Utilities
+License: GPL
+Distribution: RPM ^W Elfutils test suite.
+Vendor: Red Hat Software
+Packager: Red Hat Software <bugs@redhat.com>
+URL: http://www.redhat.com
+BuildRequires: gcc make
+Source0: hello-1.0.tar.gz
+
+%description
+Simple rpm demonstration with an eye to consumption by debuginfod.
+
+%package two
+Summary: hello2two
+License: GPL
+
+%description two
+Dittoish.
+
+%prep
+%setup -q -n hello-1.0
+
+%build
+gcc -g -O1 hello.c -o hello
+gcc -g -O2 -D_FORTIFY_SOURCE=2 hello.c -o hello2
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/local/bin
+cp hello $RPM_BUILD_ROOT/usr/local/bin/
+cp hello2 $RPM_BUILD_ROOT/usr/local/bin/
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+%attr(0751,root,root) /usr/local/bin/hello
+
+%files two
+%defattr(-,root,root)
+%attr(0751,root,root) /usr/local/bin/hello2
+
+%changelog
+* Thu Nov 14 2019 Frank Ch. Eigler <fche@redhat.com>
+- Added source code right here to make spec file self-contained.
+- Dropped misc files not relevant to debuginfod testing.
+
+* Wed May 18 2016 Mark Wielaard <mjw@redhat.com>
+- Add hello2 for dwz testing support.
+
+* Tue Oct 20 1998 Jeff Johnson <jbj@redhat.com>
+- create.
diff --git a/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm
new file mode 100644
index 00000000..cb99fd6e
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..603a9b1a
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm
new file mode 100644
index 00000000..19f4360c
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-debuginfo-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm b/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm
new file mode 100644
index 00000000..58c77a1d
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel6/hello2-two-1.0-2.i686.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm
new file mode 100644
index 00000000..5ca4d423
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.src.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..0e6f6cc8
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..c1136f3a
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-debuginfo-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm b/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
new file mode 100644
index 00000000..5e89afd2
--- /dev/null
+++ b/tests/debuginfod-rpms/rhel7/hello2-two-1.0-2.x86_64.rpm
Binary files differ
diff --git a/tests/debuginfod_build_id_find.c b/tests/debuginfod_build_id_find.c
new file mode 100644
index 00000000..753a20c2
--- /dev/null
+++ b/tests/debuginfod_build_id_find.c
@@ -0,0 +1,62 @@
+/* Test program for fetching debuginfo with debuginfo-server.
+ Copyright (C) 2019 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ elfutils 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 Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdio.h>
+#include ELFUTILS_HEADER(dwfl)
+#include <elf.h>
+#include <dwarf.h>
+#include <argp.h>
+#include <assert.h>
+#include <string.h>
+
+static const char *debuginfo_path = "";
+static const Dwfl_Callbacks cb =
+ {
+ NULL,
+ dwfl_standard_find_debuginfo,
+ NULL,
+ (char **)&debuginfo_path,
+ };
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+ int expect_pass = strcmp(argv[3], "0");
+ Dwarf_Addr bias = 0;
+ Dwfl *dwfl = dwfl_begin(&cb);
+ dwfl_report_begin(dwfl);
+
+ /* Open an executable. */
+ Dwfl_Module *mod = dwfl_report_offline(dwfl, argv[2], argv[2], -1);
+
+ /* The corresponding debuginfo will not be found in debuginfo_path
+ (since it's empty), causing the server to be queried. */
+
+ Dwarf *res = dwfl_module_getdwarf(mod, &bias);
+ if (expect_pass)
+ assert(res);
+ else
+ assert(!res);
+
+ dwfl_end (dwfl);
+
+ return 0;
+}
diff --git a/tests/dwelf_elf_e_machine_string.c b/tests/dwelf_elf_e_machine_string.c
index 1df2b233..afad1058 100644
--- a/tests/dwelf_elf_e_machine_string.c
+++ b/tests/dwelf_elf_e_machine_string.c
@@ -40,6 +40,7 @@ main (int argc, char **argv)
int em;
const char *machine;
+ errno = 0;
if (strncmp ("0x", argv[i], 2) == 0)
val = strtol (&argv[i][2], NULL, 16);
else
diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh
new file mode 100755
index 00000000..0ade03b7
--- /dev/null
+++ b/tests/run-debuginfod-find.sh
@@ -0,0 +1,324 @@
+#!/bin/bash
+#
+# Copyright (C) 2019 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils 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 Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh # includes set -e
+
+DB=${PWD}/.debuginfod_tmp.sqlite
+tempfiles $DB
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
+
+PID1=0
+PID2=0
+
+cleanup()
+{
+ if [ $PID1 -ne 0 ]; then kill $PID1; wait $PID1; fi
+ if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi
+
+ rm -rf F R L ${PWD}/.client_cache*
+ exit_cleanup
+}
+
+# clean up trash if we were aborted early
+trap cleanup 0 1 2 3 5 9 15
+
+# find an unused port number
+while true; do
+ PORT1=`expr '(' $RANDOM % 1000 ')' + 9000`
+ ss -atn | fgrep ":$PORT1" || break
+done
+
+# We want to run debuginfod in the background. We also want to start
+# it with the same check/installcheck-sensitive LD_LIBRARY_PATH stuff
+# that the testrun alias sets. But: we if we just use
+# testrun .../debuginfod
+# it runs in a subshell, with different pid, so not helpful.
+#
+# So we gather the LD_LIBRARY_PATH with this cunning trick:
+ldpath=`testrun sh -c 'echo $LD_LIBRARY_PATH'`
+
+mkdir F R L
+# not tempfiles F R L - they are directories which we clean up manually
+ln -s ${abs_builddir}/dwfllines L/foo # any program not used elsewhere in this test
+
+wait_ready()
+{
+ port=$1;
+ what=$2;
+ value=$3;
+ timeout=20;
+
+ echo "Wait $timeout seconds on $port for metric $what to change to $value"
+ while [ $timeout -gt 0 ]; do
+ mvalue="$(curl -s http://127.0.0.1:$port/metrics \
+ | grep "$what" | awk '{print $NF}')"
+ if [ -z "$mvalue" ]; then mvalue=0; fi
+ echo "metric $what: $mvalue"
+ if [ "$mvalue" -eq "$value" ]; then
+ break;
+ fi
+ sleep 0.5;
+ ((timeout--));
+ done;
+
+ if [ $timeout -eq 0 ]; then
+ echo "metric $what never changed to $value on port $port"
+ exit 1;
+ fi
+}
+
+env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod -F -R -d $DB -p $PORT1 -t0 -g0 R F L &
+PID1=$!
+# Server must become ready
+wait_ready $PORT1 'ready' 1
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/ # or without trailing /
+
+# Be patient when run on a busy machine things might take a bit.
+export DEBUGINFOD_TIMEOUT=10
+
+# We use -t0 and -g0 here to turn off time-based scanning & grooming.
+# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
+
+########################################################################
+
+# Compile a simple program, strip its debuginfo and save the build-id.
+# Also move the debuginfo into another directory so that elfutils
+# cannot find it without debuginfod.
+echo "int main() { return 0; }" > ${PWD}/prog.c
+tempfiles prog.c
+gcc -g -o prog ${PWD}/prog.c
+ ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+ -a prog | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv prog F
+mv prog.debug F
+kill -USR1 $PID1
+# Wait till both files are in the index.
+wait_ready $PORT1 'thread_work_total{file="F"}' 2
+
+########################################################################
+
+# Test whether elfutils, via the debuginfod client library dlopen hooks,
+# is able to fetch debuginfo from the local debuginfod.
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+########################################################################
+
+# Test whether debuginfod-find is able to fetch those files.
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID`
+cmp $filename F/prog.debug
+
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID`
+cmp $filename F/prog
+
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/prog.c`
+cmp $filename ${PWD}/prog.c
+
+########################################################################
+
+# Add artifacts to the search paths and test whether debuginfod finds them while already running.
+
+# Build another, non-stripped binary
+echo "int main() { return 0; }" > ${PWD}/prog2.c
+tempfiles prog2.c
+gcc -g -o prog2 ${PWD}/prog2.c
+BUILDID2=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+ -a prog2 | grep 'Build ID' | cut -d ' ' -f 7`
+
+mv prog2 F
+kill -USR1 $PID1
+# Now there should be 3 files in the index
+wait_ready $PORT1 'thread_work_total{file="F"}' 3
+
+# Rerun same tests for the prog2 binary
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v debuginfo $BUILDID2 2>vlog`
+cmp $filename F/prog2
+cat vlog
+grep -q Progress vlog
+tempfiles vlog
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2`
+cmp $filename F/prog2
+filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c`
+cmp $filename ${PWD}/prog2.c
+
+cp -rp ${abs_srcdir}/debuginfod-rpms R
+kill -USR1 $PID1
+# All rpms need to be in the index
+rpms=$(find R -name \*rpm | wc -l)
+wait_ready $PORT1 'scanned_total{source="rpm"}' $rpms
+
+kill -USR1 $PID1 # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
+# Expect all source files found in the rpms (they are all called hello.c :)
+# We will need to extract all rpms (in their own directory) and could all
+# sources referenced in the .debug files.
+mkdir extracted
+cd extracted
+subdir=0;
+newrpms=$(find ../R -name \*\.rpm)
+for i in $newrpms; do
+ subdir=$[$subdir+1];
+ mkdir $subdir;
+ cd $subdir;
+ ls -lah ../$i
+ rpm2cpio ../$i | cpio -id;
+ cd ..;
+done
+sourcefiles=$(find -name \*\\.debug \
+ | env LD_LIBRARY_PATH=$ldpath xargs \
+ ${abs_top_builddir}/src/readelf --debug-dump=decodedline \
+ | grep mtime: | wc --lines)
+cd ..
+rm -rf extracted
+
+wait_ready $PORT1 'found_sourcerefs_total{source="rpm"}' $sourcefiles
+
+# Run a bank of queries against the debuginfod-rpms test cases
+
+rpm_test() {
+ __BUILDID=$1
+ __SOURCEPATH=$2
+ __SOURCESHA1=$3
+
+ filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
+ buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+ -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
+ test $__BUILDID = $buildid
+
+ filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $__BUILDID`
+ buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+ -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
+ test $__BUILDID = $buildid
+
+ filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $__BUILDID $__SOURCEPATH`
+ hash=`cat $filename | sha1sum | awk '{print $1}'`
+ test $__SOURCESHA1 = $hash
+}
+
+
+# common source file sha1
+SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
+# fedora30
+rpm_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+rpm_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
+# rhel7
+rpm_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
+rpm_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
+# rhel6
+rpm_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
+rpm_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
+
+RPM_BUILDID=d44d42cbd7d915bc938c81333a21e355a6022fb7 # in rhel6/ subdir, for a later test
+
+
+########################################################################
+
+# Drop some of the artifacts, run a groom cycle; confirm that
+# debuginfod has forgotten them, but remembers others
+
+rm -r R/debuginfod-rpms/rhel6/*
+kill -USR2 $PID1 # groom cycle
+# Expect 3 rpms to be deleted by the groom
+wait_ready $PORT1 'groom{statistic="file d/e"}' 3
+
+rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $RPM_BUILDID && false || true
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2
+
+########################################################################
+
+# Federation mode
+
+# find another unused port
+while true; do
+ PORT2=`expr '(' $RANDOM % 1000 ')' + 9000`
+ ss -atn | fgrep ":$PORT2" || break
+done
+
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
+mkdir -p $DEBUGINFOD_CACHE_PATH
+# NB: inherits the DEBUGINFOD_URLS to the first server
+# NB: run in -L symlink-following mode for the L subdir
+env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod -F -d ${DB}_2 -p $PORT2 -L L &
+PID2=$!
+tempfiles ${DB}_2
+wait_ready $PORT2 'ready' 1
+
+# have clients contact the new server
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+# confirm that first server can't resolve symlinked info in L/ but second can
+BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
+ -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
+file L/foo
+file -L L/foo
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
+rm -rf $DEBUGINFOD_CACHE_PATH
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
+export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
+
+
+# test parallel queries in client
+export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
+mkdir -p $DEBUGINFOD_CACHE_PATH
+export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
+
+########################################################################
+
+# Fetch some metrics, if curl program is installed
+if type curl 2>/dev/null; then
+ curl http://127.0.0.1:$PORT1/badapi
+ curl http://127.0.0.1:$PORT1/metrics
+ curl http://127.0.0.1:$PORT2/metrics
+ curl http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*error'
+ curl http://127.0.0.1:$PORT2/metrics | grep -q 'http_responses_total.*result.*upstream'
+fi
+
+########################################################################
+
+# Run the tests again without the servers running. The target file should
+# be found in the cache.
+
+kill -INT $PID1 $PID2
+wait $PID1 $PID2
+PID1=0
+PID2=0
+tempfiles .debuginfod_*
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
+
+########################################################################
+
+# Trigger a cache clean and run the tests again. The clients should be unable to
+# find the target.
+echo 0 > $DEBUGINFOD_CACHE_PATH/cache_clean_interval_s
+echo 0 > $DEBUGINFOD_CACHE_PATH/max_unused_age_s
+
+testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
+
+testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID2 && false || true
+
+exit 0
diff --git a/tests/run-large-elf-file.sh b/tests/run-large-elf-file.sh
index 6146cfed..cbe30615 100755
--- a/tests/run-large-elf-file.sh
+++ b/tests/run-large-elf-file.sh
@@ -42,9 +42,9 @@ if [ "x$VALGRIND_CMD" != "x" ]; then
mem_needed=$[${mem_needed} + 2]
fi
echo "mem_needed: $mem_needed"
-mem_available=$(free -g | grep ^Mem: | awk -F ' +' '{print $7}')
+mem_available=$(free -g 2>/dev/null | grep ^Mem: | awk -F ' +' '{print $7}')
echo "mem_available: $mem_available"
-if test $mem_available -lt $mem_needed; then
+if test -z "$mem_available" || test $mem_available -lt $mem_needed; then
echo "Need at least ${mem_needed}GB free available memory"
exit 77
fi