Blame tests/run-debuginfod-find.sh

Packit Service 97d2fb
#!/usr/bin/env bash
Packit Service 97d2fb
#
Packit Service 97d2fb
# Copyright (C) 2019-2020 Red Hat, Inc.
Packit Service 97d2fb
# This file is part of elfutils.
Packit Service 97d2fb
#
Packit Service 97d2fb
# This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
# it under the terms of the GNU General Public License as published by
Packit Service 97d2fb
# the Free Software Foundation; either version 3 of the License, or
Packit Service 97d2fb
# (at your option) any later version.
Packit Service 97d2fb
#
Packit Service 97d2fb
# elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
# WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 97d2fb
# GNU General Public License for more details.
Packit Service 97d2fb
#
Packit Service 97d2fb
# You should have received a copy of the GNU General Public License
Packit Service 97d2fb
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 97d2fb
Packit Service 97d2fb
. $srcdir/test-subr.sh  # includes set -e
Packit Service 97d2fb
Packit Service 97d2fb
type curl 2>/dev/null || (echo "need curl"; exit 77)
Packit Service 97d2fb
type rpm2cpio 2>/dev/null || (echo "need rpm2cpio"; exit 77)
Packit Service 97d2fb
type bzcat 2>/dev/null || (echo "need bzcat"; exit 77)
Packit Service 97d2fb
bsdtar --version | grep -q zstd && zstd=true || zstd=false
Packit Service 97d2fb
echo "zstd=$zstd bsdtar=`bsdtar --version`"
Packit Service 97d2fb
Packit Service 97d2fb
# for test case debugging, uncomment:
Packit Service 97d2fb
#set -x
Packit Service 97d2fb
#VERBOSE=-vvvv
Packit Service 97d2fb
Packit Service 97d2fb
DB=${PWD}/.debuginfod_tmp.sqlite
Packit Service 97d2fb
tempfiles $DB
Packit Service 97d2fb
export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache
Packit Service 97d2fb
Packit Service 97d2fb
PID1=0
Packit Service 97d2fb
PID2=0
Packit Service 97d2fb
PID3=0
Packit Service 97d2fb
Packit Service 97d2fb
cleanup()
Packit Service 97d2fb
{
Packit Service 97d2fb
  if [ $PID1 -ne 0 ]; then kill $PID1; wait $PID1; fi
Packit Service 97d2fb
  if [ $PID2 -ne 0 ]; then kill $PID2; wait $PID2; fi
Packit Service 97d2fb
  if [ $PID3 -ne 0 ]; then kill $PID3; wait $PID3; fi
Packit Service 97d2fb
Packit Service 97d2fb
  rm -rf F R D L Z ${PWD}/foobar ${PWD}/mocktree ${PWD}/.client_cache* ${PWD}/tmp*
Packit Service 97d2fb
  exit_cleanup
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
# clean up trash if we were aborted early
Packit Service 97d2fb
trap cleanup 0 1 2 3 5 9 15
Packit Service 97d2fb
Packit Service 97d2fb
# find an unused port number
Packit Service 97d2fb
while true; do
Packit Service 97d2fb
    PORT1=`expr '(' $RANDOM % 1000 ')' + 9000`
Packit Service 97d2fb
    ss -atn | fgrep ":$PORT1" || break
Packit Service 97d2fb
done    
Packit Service 97d2fb
Packit Service 97d2fb
# We want to run debuginfod in the background.  We also want to start
Packit Service 97d2fb
# it with the same check/installcheck-sensitive LD_LIBRARY_PATH stuff
Packit Service 97d2fb
# that the testrun alias sets.  But: we if we just use
Packit Service 97d2fb
#    testrun .../debuginfod
Packit Service 97d2fb
# it runs in a subshell, with different pid, so not helpful.
Packit Service 97d2fb
#
Packit Service 97d2fb
# So we gather the LD_LIBRARY_PATH with this cunning trick:
Packit Service 97d2fb
ldpath=`testrun sh -c 'echo $LD_LIBRARY_PATH'`
Packit Service 97d2fb
Packit Service 97d2fb
mkdir F R L D Z
Packit Service 97d2fb
# not tempfiles F R L D Z - they are directories which we clean up manually
Packit Service 97d2fb
ln -s ${abs_builddir}/dwfllines L/foo   # any program not used elsewhere in this test
Packit Service 97d2fb
Packit Service 97d2fb
wait_ready()
Packit Service 97d2fb
{
Packit Service 97d2fb
  port=$1;
Packit Service 97d2fb
  what=$2;
Packit Service 97d2fb
  value=$3;
Packit Service 97d2fb
  timeout=20;
Packit Service 97d2fb
Packit Service 97d2fb
  echo "Wait $timeout seconds on $port for metric $what to change to $value"
Packit Service 97d2fb
  while [ $timeout -gt 0 ]; do
Packit Service 97d2fb
    mvalue="$(curl -s http://127.0.0.1:$port/metrics \
Packit Service 97d2fb
              | grep "$what" | awk '{print $NF}')"
Packit Service 97d2fb
    if [ -z "$mvalue" ]; then mvalue=0; fi
Packit Service 97d2fb
      echo "metric $what: $mvalue"
Packit Service 97d2fb
      if [ "$mvalue" -eq "$value" ]; then
Packit Service 97d2fb
        break;
Packit Service 97d2fb
    fi
Packit Service 97d2fb
    sleep 0.5;
Packit Service 97d2fb
    ((timeout--));
Packit Service 97d2fb
  done;
Packit Service 97d2fb
Packit Service 97d2fb
  if [ $timeout -eq 0 ]; then
Packit Service 97d2fb
      echo "metric $what never changed to $value on port $port"
Packit Service 97d2fb
      curl -s http://127.0.0.1:$port/metrics
Packit Service 97d2fb
    exit 1;
Packit Service 97d2fb
  fi
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service cf3f85
# create a 000 empty .rpm file to evoke a metric-visible error
Packit Service cf3f85
touch R/nothing.rpm
Packit Service cf3f85
chmod 000 R/nothing.rpm
Packit Service 97d2fb
Packit Service 97d2fb
env LD_LIBRARY_PATH=$ldpath DEBUGINFOD_URLS= ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -R -d $DB -p $PORT1 -t0 -g0 --fdcache-fds 1 --fdcache-mbs 2 -Z .tar.xz -Z .tar.bz2=bzcat -v R F Z L > vlog4 2>&1 &
Packit Service 97d2fb
PID1=$!
Packit Service 97d2fb
tempfiles vlog4
Packit Service 97d2fb
# Server must become ready
Packit Service 97d2fb
wait_ready $PORT1 'ready' 1
Packit Service 97d2fb
export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1/   # or without trailing /
Packit Service 97d2fb
Packit Service 97d2fb
# Be patient when run on a busy machine things might take a bit.
Packit Service 97d2fb
export DEBUGINFOD_TIMEOUT=10
Packit Service 97d2fb
Packit Service 97d2fb
# We use -t0 and -g0 here to turn off time-based scanning & grooming.
Packit Service 97d2fb
# For testing purposes, we just sic SIGUSR1 / SIGUSR2 at the process.
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Compile a simple program, strip its debuginfo and save the build-id.
Packit Service 97d2fb
# Also move the debuginfo into another directory so that elfutils
Packit Service 97d2fb
# cannot find it without debuginfod.
Packit Service 97d2fb
echo "int main() { return 0; }" > ${PWD}/prog.c
Packit Service 97d2fb
tempfiles prog.c
Packit Service 97d2fb
# Create a subdirectory to confound source path names
Packit Service 97d2fb
mkdir foobar
Packit Service 97d2fb
gcc -Wl,--build-id -g -o prog ${PWD}/foobar///./../prog.c
Packit Service 97d2fb
testrun ${abs_top_builddir}/src/strip -g -f prog.debug ${PWD}/prog
Packit Service 97d2fb
BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
          -a prog | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
Packit Service 97d2fb
mv prog F
Packit Service 97d2fb
mv prog.debug F
Packit Service 97d2fb
kill -USR1 $PID1
Packit Service 97d2fb
# Wait till both files are in the index.
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 2
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Test whether elfutils, via the debuginfod client library dlopen hooks,
Packit Service 97d2fb
# is able to fetch debuginfo from the local debuginfod.
Packit Service 97d2fb
testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Test whether debuginfod-find is able to fetch those files.
Packit Service 97d2fb
rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID`
Packit Service 97d2fb
cmp $filename F/prog.debug
Packit Service 97d2fb
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable F/prog`
Packit Service 97d2fb
cmp $filename F/prog
Packit Service 97d2fb
Packit Service 97d2fb
# raw source filename
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/foobar///./../prog.c`
Packit Service 97d2fb
cmp $filename  ${PWD}/prog.c
Packit Service 97d2fb
Packit Service 97d2fb
# and also the canonicalized one
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID ${PWD}/prog.c`
Packit Service 97d2fb
cmp $filename  ${PWD}/prog.c
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Test whether the cache default locations are correct
Packit Service 97d2fb
Packit Service 97d2fb
mkdir tmphome
Packit Service 97d2fb
Packit Service 97d2fb
# $HOME/.cache should be created.
Packit Service 97d2fb
testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/debuginfo ]; then
Packit Service 97d2fb
  echo "could not find cache in $PWD/tmphome/.cache"
Packit Service 97d2fb
  exit 1
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
# $HOME/.cache should be found.
Packit Service 97d2fb
testrun env HOME=$PWD/tmphome XDG_CACHE_HOME= DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID
Packit Service 97d2fb
if [ ! -f $PWD/tmphome/.cache/debuginfod_client/$BUILDID/executable ]; then
Packit Service 97d2fb
  echo "could not find cache in $PWD/tmphome/.cache"
Packit Service 97d2fb
  exit 1
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
# $XDG_CACHE_HOME should take priority over $HOME.cache.
Packit Service 97d2fb
testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
if [ ! -f $PWD/tmpxdg/debuginfod_client/$BUILDID/debuginfo ]; then
Packit Service 97d2fb
  echo "could not find cache in $PWD/tmpxdg/"
Packit Service 97d2fb
  exit 1
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
# A cache at the old default location ($HOME/.debuginfod_client_cache) should take
Packit Service 97d2fb
# priority over $HOME/.cache, $XDG_CACHE_HOME.
Packit Service 97d2fb
cp -r $DEBUGINFOD_CACHE_PATH tmphome/.debuginfod_client_cache
Packit Service 97d2fb
Packit Service 97d2fb
# Add a file that doesn't exist in $HOME/.cache, $XDG_CACHE_HOME.
Packit Service 97d2fb
mkdir tmphome/.debuginfod_client_cache/deadbeef
Packit Service 97d2fb
echo ELF... > tmphome/.debuginfod_client_cache/deadbeef/debuginfo
Packit Service 97d2fb
filename=`testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH= ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo deadbeef`
Packit Service 97d2fb
cmp $filename tmphome/.debuginfod_client_cache/deadbeef/debuginfo
Packit Service 97d2fb
Packit Service 97d2fb
# $DEBUGINFO_CACHE_PATH should take priority over all else.
Packit Service 97d2fb
testrun env HOME=$PWD/tmphome XDG_CACHE_HOME=$PWD/tmpxdg DEBUGINFOD_CACHE_PATH=$PWD/tmpcache ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
if [ ! -f $PWD/tmpcache/$BUILDID/debuginfo ]; then
Packit Service 97d2fb
  echo "could not find cache in $PWD/tmpcache/"
Packit Service 97d2fb
  exit 1
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Add artifacts to the search paths and test whether debuginfod finds them while already running.
Packit Service 97d2fb
Packit Service 97d2fb
# Build another, non-stripped binary
Packit Service 97d2fb
echo "int main() { return 0; }" > ${PWD}/prog2.c
Packit Service 97d2fb
tempfiles prog2.c
Packit Service 97d2fb
gcc -Wl,--build-id -g -o prog2 ${PWD}/prog2.c
Packit Service 97d2fb
BUILDID2=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
          -a prog2 | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
Packit Service 97d2fb
mv prog2 F
Packit Service 97d2fb
kill -USR1 $PID1
Packit Service 97d2fb
# Now there should be 3 files in the index
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 3
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
Packit Service 97d2fb
# Rerun same tests for the prog2 binary
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v debuginfo $BUILDID2 2>vlog`
Packit Service 97d2fb
cmp $filename F/prog2
Packit Service 97d2fb
cat vlog
Packit Service 97d2fb
grep -q Progress vlog
Packit Service 97d2fb
grep -q Downloaded.from vlog
Packit Service 97d2fb
tempfiles vlog
Packit Service 97d2fb
filename=`testrun env DEBUGINFOD_PROGRESS=1 ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2 2>vlog2`
Packit Service 97d2fb
cmp $filename F/prog2
Packit Service 97d2fb
cat vlog2
Packit Service 97d2fb
grep -q 'Downloading.*http' vlog2
Packit Service 97d2fb
tempfiles vlog2
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $BUILDID2 ${PWD}/prog2.c`
Packit Service 97d2fb
cmp $filename ${PWD}/prog2.c
Packit Service 97d2fb
Packit Service 97d2fb
cp -rvp ${abs_srcdir}/debuginfod-rpms R
Packit Service 97d2fb
if [ "$zstd" = "false" ]; then  # nuke the zstd fedora 31 ones
Packit Service 97d2fb
    rm -vrf R/debuginfod-rpms/fedora31
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
cp -rvp ${abs_srcdir}/debuginfod-tars Z
Packit Service 97d2fb
kill -USR1 $PID1
Packit Service 97d2fb
# All rpms need to be in the index, except the dummy permission-000 one
Packit Service 97d2fb
rpms=$(find R -name \*rpm | grep -v nothing | wc -l)
Packit Service 97d2fb
wait_ready $PORT1 'scanned_files_total{source=".rpm archive"}' $rpms
Packit Service 97d2fb
txz=$(find Z -name \*tar.xz | wc -l)
Packit Service 97d2fb
wait_ready $PORT1 'scanned_files_total{source=".tar.xz archive"}' $txz
Packit Service 97d2fb
tb2=$(find Z -name \*tar.bz2 | wc -l)
Packit Service 97d2fb
wait_ready $PORT1 'scanned_files_total{source=".tar.bz2 archive"}' $tb2
Packit Service 97d2fb
Packit Service 97d2fb
kill -USR1 $PID1  # two hits of SIGUSR1 may be needed to resolve .debug->dwz->srefs
Packit Service 97d2fb
# Expect all source files found in the rpms (they are all called hello.c :)
Packit Service 97d2fb
# We will need to extract all rpms (in their own directory) and could all
Packit Service 97d2fb
# sources referenced in the .debug files.
Packit Service 97d2fb
mkdir extracted
Packit Service 97d2fb
cd extracted
Packit Service 97d2fb
subdir=0;
Packit Service 97d2fb
newrpms=$(find ../R -name \*\.rpm | grep -v nothing)
Packit Service 97d2fb
for i in $newrpms; do
Packit Service 97d2fb
    subdir=$[$subdir+1];
Packit Service 97d2fb
    mkdir $subdir;
Packit Service 97d2fb
    cd $subdir;
Packit Service 97d2fb
    ls -lah ../$i
Packit Service 97d2fb
    rpm2cpio ../$i | cpio -ivd;
Packit Service 97d2fb
    cd ..;
Packit Service 97d2fb
done
Packit Service 97d2fb
sourcefiles=$(find -name \*\\.debug \
Packit Service 97d2fb
	      | env LD_LIBRARY_PATH=$ldpath xargs \
Packit Service 97d2fb
		${abs_top_builddir}/src/readelf --debug-dump=decodedline \
Packit Service 97d2fb
	      | grep mtime: | wc --lines)
Packit Service 97d2fb
cd ..
Packit Service 97d2fb
rm -rf extracted
Packit Service 97d2fb
Packit Service 97d2fb
wait_ready $PORT1 'found_sourcerefs_total{source=".rpm archive"}' $sourcefiles
Packit Service 97d2fb
Packit Service 97d2fb
# Run a bank of queries against the debuginfod-rpms / debuginfod-debs test cases
Packit Service 97d2fb
Packit Service 97d2fb
archive_test() {
Packit Service 97d2fb
    __BUILDID=$1
Packit Service 97d2fb
    __SOURCEPATH=$2
Packit Service 97d2fb
    __SOURCESHA1=$3
Packit Service 97d2fb
    
Packit Service 97d2fb
    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
Packit Service 97d2fb
    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
    test $__BUILDID = $buildid
Packit Service 97d2fb
    # check that timestamps are plausible - older than the near-present (tmpdir mtime)
Packit Service 97d2fb
    test $filename -ot `pwd`
Packit Service 97d2fb
Packit Service 97d2fb
    # run again to assure that fdcache is being enjoyed
Packit Service 97d2fb
    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $__BUILDID`
Packit Service 97d2fb
    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
    test $__BUILDID = $buildid
Packit Service 97d2fb
    test $filename -ot `pwd`
Packit Service 97d2fb
Packit Service 97d2fb
    filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $__BUILDID`
Packit Service 97d2fb
    buildid=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
             -a $filename | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
    test $__BUILDID = $buildid
Packit Service 97d2fb
    test $filename -ot `pwd`
Packit Service 97d2fb
Packit Service 97d2fb
    if test "x$__SOURCEPATH" != "x"; then
Packit Service 97d2fb
        filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source $__BUILDID $__SOURCEPATH`
Packit Service 97d2fb
        hash=`cat $filename | sha1sum | awk '{print $1}'`
Packit Service 97d2fb
        test $__SOURCESHA1 = $hash
Packit Service 97d2fb
        test $filename -ot `pwd`
Packit Service 97d2fb
    fi
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
# common source file sha1
Packit Service 97d2fb
SHA=f4a1a8062be998ae93b8f1cd744a398c6de6dbb1
Packit Service 97d2fb
# fedora31
Packit Service 97d2fb
if [ $zstd = true ]; then
Packit Service 97d2fb
    # fedora31 uses zstd compression on rpms, older rpm2cpio/libarchive can't handle it
Packit Service 97d2fb
    # and we're not using the fancy -Z '.rpm=(rpm2cpio|zstdcat)<' workaround in this testsuite
Packit Service 97d2fb
    archive_test 420e9e3308971f4b817cc5bf83928b41a6909d88 /usr/src/debug/hello3-1.0-2.x86_64/foobar////./../hello.c $SHA
Packit Service 97d2fb
    archive_test 87c08d12c78174f1082b7c888b3238219b0eb265 /usr/src/debug/hello3-1.0-2.x86_64///foobar/./..//hello.c $SHA
Packit Service 97d2fb
fi
Packit Service 97d2fb
# fedora30
Packit Service 97d2fb
archive_test c36708a78618d597dee15d0dc989f093ca5f9120 /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
Packit Service 97d2fb
archive_test 41a236eb667c362a1c4196018cc4581e09722b1b /usr/src/debug/hello2-1.0-2.x86_64/hello.c $SHA
Packit Service 97d2fb
# rhel7
Packit Service 97d2fb
archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
# rhel6
Packit Service 97d2fb
archive_test bbbf92ebee5228310e398609c23c2d7d53f6e2f9 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
archive_test d44d42cbd7d915bc938c81333a21e355a6022fb7 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
# arch
Packit Service 97d2fb
archive_test cee13b2ea505a7f37bd20d271c6bc7e5f8d2dfcb /usr/src/debug/hello.c 7a1334e086b97e5f124003a6cfb3ed792d10cdf4
Packit Service 97d2fb
Packit Service 97d2fb
RPM_BUILDID=d44d42cbd7d915bc938c81333a21e355a6022fb7 # in rhel6/ subdir, for a later test
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Drop some of the artifacts, run a groom cycle; confirm that
Packit Service 97d2fb
# debuginfod has forgotten them, but remembers others
Packit Service 97d2fb
Packit Service 97d2fb
rm -r R/debuginfod-rpms/rhel6/*
Packit Service 97d2fb
kill -USR2 $PID1  # groom cycle
Packit Service 97d2fb
# Expect 3 rpms to be deleted by the groom
Packit Service 97d2fb
# 1 groom cycle already took place at/soon-after startup, so -USR2 makes 2
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="groom"}' 2
Packit Service 97d2fb
wait_ready $PORT1 'groom{statistic="file d/e"}' 3
Packit Service 97d2fb
Packit Service 97d2fb
rm -rf $DEBUGINFOD_CACHE_PATH # clean it from previous tests
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $RPM_BUILDID && false || true
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find executable $BUILDID2
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# PR26810: Now rename some files in the R directory, then rescan, so
Packit Service 97d2fb
# there are two copies of the same buildid in the index, one for the
Packit Service 97d2fb
# no-longer-existing file name, and one under the new name.
Packit Service 97d2fb
Packit Service 97d2fb
# run a groom cycle to force server to drop its fdcache
Packit Service 97d2fb
kill -USR2 $PID1  # groom cycle
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="groom"}' 3
Packit Service 97d2fb
# move it around a couple of times to make it likely to hit a nonexistent entry during iteration
Packit Service 97d2fb
mv R/debuginfod-rpms/rhel7 R/debuginfod-rpms/rhel7renamed
Packit Service 97d2fb
kill -USR1 $PID1  # scan cycle
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 6
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
mv R/debuginfod-rpms/rhel7renamed R/debuginfod-rpms/rhel7renamed2
Packit Service 97d2fb
kill -USR1 $PID1  # scan cycle
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 7
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
mv R/debuginfod-rpms/rhel7renamed2 R/debuginfod-rpms/rhel7renamed3
Packit Service 97d2fb
kill -USR1 $PID1  # scan cycle
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 8
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
Packit Service 97d2fb
# retest rhel7
Packit Service 97d2fb
archive_test bc1febfd03ca05e030f0d205f7659db29f8a4b30 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
archive_test f0aa15b8aba4f3c28cac3c2a73801fefa644a9f2 /usr/src/debug/hello-1.0/hello.c $SHA
Packit Service 97d2fb
Packit Service 97d2fb
egrep '(libc.error.*rhel7)|(bc1febfd03ca)|(f0aa15b8aba)' vlog4
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Federation mode
Packit Service 97d2fb
Packit Service 97d2fb
# find another unused port
Packit Service 97d2fb
while true; do
Packit Service 97d2fb
    PORT2=`expr '(' $RANDOM % 1000 ')' + 9000`
Packit Service 97d2fb
    ss -atn | fgrep ":$PORT2" || break
Packit Service 97d2fb
done
Packit Service 97d2fb
Packit Service 97d2fb
export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache2
Packit Service 97d2fb
mkdir -p $DEBUGINFOD_CACHE_PATH
Packit Service 97d2fb
# NB: inherits the DEBUGINFOD_URLS to the first server
Packit Service 97d2fb
# NB: run in -L symlink-following mode for the L subdir
Packit Service 97d2fb
env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d ${DB}_2 -p $PORT2 -L L D > vlog3 2>&1 &
Packit Service 97d2fb
PID2=$!
Packit Service 97d2fb
tempfiles vlog3
Packit Service 97d2fb
tempfiles ${DB}_2
Packit Service 97d2fb
wait_ready $PORT2 'ready' 1
Packit Service 97d2fb
wait_ready $PORT2 'thread_work_total{role="traverse"}' 1
Packit Service 97d2fb
wait_ready $PORT2 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT2 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
Packit Service 97d2fb
# have clients contact the new server
Packit Service 97d2fb
export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
Packit Service 97d2fb
Packit Service 97d2fb
if type bsdtar 2>/dev/null; then
Packit Service 97d2fb
    # copy in the deb files
Packit Service 97d2fb
    cp -rvp ${abs_srcdir}/debuginfod-debs/*deb D
Packit Service 97d2fb
    kill -USR1 $PID2
Packit Service 97d2fb
    # All debs need to be in the index
Packit Service 97d2fb
    debs=$(find D -name \*.deb | wc -l)
Packit Service 97d2fb
    wait_ready $PORT2 'scanned_files_total{source=".deb archive"}' `expr $debs`
Packit Service 97d2fb
    ddebs=$(find D -name \*.ddeb | wc -l)
Packit Service 97d2fb
    wait_ready $PORT2 'scanned_files_total{source=".ddeb archive"}' `expr $ddebs`
Packit Service 97d2fb
Packit Service 97d2fb
    # ubuntu
Packit Service 97d2fb
    archive_test f17a29b5a25bd4960531d82aa6b07c8abe84fa66 "" ""
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
rm -rf $DEBUGINFOD_CACHE_PATH
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
Packit Service 97d2fb
# send a request to stress XFF and User-Agent federation relay;
Packit Service 97d2fb
# we'll grep for the two patterns in vlog4
Packit Service 97d2fb
curl -s -H 'User-Agent: TESTCURL' -H 'X-Forwarded-For: TESTXFF' $DEBUGINFOD_URLS/buildid/deaddeadbeef00000000/debuginfo -o /dev/null || true
Packit Service 97d2fb
Packit Service 97d2fb
grep UA:TESTCURL vlog4
Packit Service 97d2fb
grep XFF:TESTXFF vlog4
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
# confirm that first server can't resolve symlinked info in L/ but second can
Packit Service 97d2fb
BUILDID=`env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../src/readelf \
Packit Service 97d2fb
         -a L/foo | grep 'Build ID' | cut -d ' ' -f 7`
Packit Service 97d2fb
file L/foo
Packit Service 97d2fb
file -L L/foo
Packit Service 97d2fb
export DEBUGINFOD_URLS=http://127.0.0.1:$PORT1
Packit Service 97d2fb
rm -rf $DEBUGINFOD_CACHE_PATH
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
Packit Service 97d2fb
export DEBUGINFOD_URLS=http://127.0.0.1:$PORT2
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
Packit Service 97d2fb
# test again with scheme free url
Packit Service 97d2fb
export DEBUGINFOD_URLS=127.0.0.1:$PORT1
Packit Service 97d2fb
rm -rf $DEBUGINFOD_CACHE_PATH
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID && false || true
Packit Service 97d2fb
export DEBUGINFOD_URLS=127.0.0.1:$PORT2
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID
Packit Service 97d2fb
Packit Service 97d2fb
# test parallel queries in client
Packit Service 97d2fb
export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3
Packit Service 97d2fb
mkdir -p $DEBUGINFOD_CACHE_PATH
Packit Service 97d2fb
export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE"
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Fetch some metrics
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/badapi
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT2/metrics
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*error'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep -q 'http_responses_total.*result.*fdcache'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT2/metrics | grep -q 'http_responses_total.*result.*upstream'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_count'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_duration_milliseconds_sum'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_count'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'http_responses_transfer_bytes_sum'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'fdcache_'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'error_count'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'traversed_total'
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT1/metrics | grep 'scanned_bytes_total'
Packit Service 97d2fb
Packit Service 97d2fb
# And generate a few errors into the second debuginfod's logs, for analysis just below
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT2/badapi > /dev/null || true
Packit Service 97d2fb
curl -s http://127.0.0.1:$PORT2/buildid/deadbeef/debuginfo > /dev/null || true
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Run the tests again without the servers running. The target file should
Packit Service 97d2fb
# be found in the cache.
Packit Service 97d2fb
Packit Service 97d2fb
kill -INT $PID1 $PID2
Packit Service 97d2fb
wait $PID1 $PID2
Packit Service 97d2fb
PID1=0
Packit Service 97d2fb
PID2=0
Packit Service 97d2fb
tempfiles .debuginfod_*
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1
Packit Service 97d2fb
Packit Service 97d2fb
# check out the debuginfod logs for the new style status lines
Packit Service 97d2fb
# cat vlog3
Packit Service 97d2fb
grep -q 'UA:.*XFF:.*GET /buildid/.* 200 ' vlog3
Packit Service 97d2fb
grep -q 'UA:.*XFF:.*GET /metrics 200 ' vlog3
Packit Service 97d2fb
grep -q 'UA:.*XFF:.*GET /badapi 503 ' vlog3
Packit Service 97d2fb
grep -q 'UA:.*XFF:.*GET /buildid/deadbeef.* 404 ' vlog3
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
Packit Service 97d2fb
# Add some files to the cache that do not fit its naming format.
Packit Service 97d2fb
# They should survive cache cleaning.
Packit Service 97d2fb
mkdir $DEBUGINFOD_CACHE_PATH/malformed
Packit Service 97d2fb
touch $DEBUGINFOD_CACHE_PATH/malformed0
Packit Service 97d2fb
touch $DEBUGINFOD_CACHE_PATH/malformed/malformed1
Packit Service 97d2fb
Packit Service 97d2fb
# Trigger a cache clean and run the tests again. The clients should be unable to
Packit Service 97d2fb
# find the target.
Packit Service 97d2fb
echo 0 > $DEBUGINFOD_CACHE_PATH/cache_clean_interval_s
Packit Service 97d2fb
echo 0 > $DEBUGINFOD_CACHE_PATH/max_unused_age_s
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog 1
Packit Service 97d2fb
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID2 && false || true
Packit Service 97d2fb
Packit Service 97d2fb
if [ ! -f $DEBUGINFOD_CACHE_PATH/malformed0 ] \
Packit Service 97d2fb
    || [ ! -f $DEBUGINFOD_CACHE_PATH/malformed/malformed1 ]; then
Packit Service 97d2fb
  echo "unrelated files did not survive cache cleaning"
Packit Service 97d2fb
  exit 1
Packit Service 97d2fb
fi
Packit Service 97d2fb
Packit Service 97d2fb
# Test debuginfod without a path list; reuse $PORT1
Packit Service 97d2fb
env LD_LIBRARY_PATH=$ldpath ${abs_builddir}/../debuginfod/debuginfod $VERBOSE -F -U -d :memory: -p $PORT1 -L -F &
Packit Service 97d2fb
PID3=$!
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_total{role="traverse"}' 1
Packit Service 97d2fb
wait_ready $PORT1 'thread_work_pending{role="scan"}' 0
Packit Service 97d2fb
wait_ready $PORT1 'thread_busy{role="scan"}' 0
Packit Service 97d2fb
kill -int $PID3
Packit Service 97d2fb
wait $PID3
Packit Service 97d2fb
PID3=0
Packit Service 97d2fb
Packit Service 97d2fb
########################################################################
Packit Service 97d2fb
# Test fetching a file using file:// . No debuginfod server needs to be run for
Packit Service 97d2fb
# this test.
Packit Service 97d2fb
local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/source/my/path
Packit Service 97d2fb
mkdir -p ${local_dir}
Packit Service 97d2fb
echo "int main() { return 0; }" > ${local_dir}/main.c
Packit Service 97d2fb
Packit Service 97d2fb
# first test that is doesn't work, when no DEBUGINFOD_URLS is set
Packit Service 97d2fb
DEBUGINFOD_URLS=""
Packit Service 97d2fb
testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true
Packit Service 97d2fb
Packit Service 97d2fb
# Now test is with proper DEBUGINFOD_URLS
Packit Service 97d2fb
DEBUGINFOD_URLS="file://${PWD}/mocktree/"
Packit Service 97d2fb
filename=`testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c`
Packit Service 97d2fb
cmp $filename ${local_dir}/main.c
Packit Service 97d2fb
Packit Service 97d2fb
exit 0