notmuch/performance-test/perf-test-lib.sh
David Bremner 1e4e8e3bf5 test: unbreak performance tests
In 8e7fb88237 Jani replaced the use of $(pwd -P) to find the
TEST_DIRECTORY in order to better support out of tree
builds. Unfortunately the performance-tests need a different value for
the variable and were thus broken.

This commit splits out the setting of this variable for the two sets
of tests.  Performance tests still don't work out of tree, because
the handling of the downloaded corpus needs to be updated.
2017-12-04 21:04:38 -04:00

219 lines
4.6 KiB
Bash

. $(dirname "$0")/version.sh || exit 1
corpus_size=large
while test "$#" -ne 0
do
case "$1" in
-d|--debug)
debug=t;
shift
;;
-s|--small)
corpus_size=small;
shift
;;
-m|--medium)
corpus_size=medium;
shift
;;
-l|--large)
corpus_size=large;
shift
;;
*)
echo "error: unknown performance test option '$1'" >&2; exit 1 ;;
esac
done
# Ensure NOTMUCH_SRCDIR and NOTMUCH_BUILDDIR are set.
. $(dirname "$0")/../test/export-dirs.sh || exit 1
# Where to run the tests
TEST_DIRECTORY=$NOTMUCH_BUILDDIR/performance-test
. "$NOTMUCH_SRCDIR/test/test-lib-common.sh" || exit 1
set -e
# It appears that people try to run tests without building...
if [[ ! -x "$NOTMUCH_BUILDDIR/notmuch" ]]; then
echo >&2 'You do not seem to have built notmuch yet.'
exit 1
fi
DB_CACHE_DIR=${TEST_DIRECTORY}/notmuch.cache.$corpus_size
add_email_corpus ()
{
rm -rf ${MAIL_DIR}
CORPUS_DIR=${TEST_DIRECTORY}/corpus
mkdir -p "${CORPUS_DIR}"
MAIL_CORPUS="${CORPUS_DIR}/mail.${corpus_size}"
TAG_CORPUS="${CORPUS_DIR}/tags"
if command -v pixz > /dev/null; then
XZ=pixz
else
XZ=xz
fi
if [ ! -d "${CORPUS_DIR}/manifest" ]; then
printf "Unpacking manifests\n"
tar --extract --use-compress-program ${XZ} --strip-components=1 \
--directory ${TEST_DIRECTORY}/corpus \
--wildcards --file ../download/notmuch-email-corpus-${PERFTEST_VERSION}.tar.xz \
'notmuch-email-corpus/manifest/*'
fi
file_list=$(mktemp file_listXXXXXX)
declare -a extract_dirs
if [ ! -d "$TAG_CORPUS" ] ; then
extract_dirs=("${extract_dirs[@]}" notmuch-email-corpus/tags)
fi
if [ ! -d "$MAIL_CORPUS" ] ; then
if [[ "$corpus_size" != "large" ]]; then
sed s,^,notmuch-email-corpus/, < \
${TEST_DIRECTORY}/corpus/manifest/MANIFEST.${corpus_size} >> $file_list
else
extract_dirs=("${extract_dirs[@]}" notmuch-email-corpus/mail)
fi
fi
if [[ -s $file_list || -n "${extract_dirs[*]}" ]]; then
printf "Unpacking corpus\n"
tar --checkpoint=.5000 --extract --strip-components=1 \
--directory ${TEST_DIRECTORY}/corpus \
--use-compress-program ${XZ} \
--file ../download/notmuch-email-corpus-${PERFTEST_VERSION}.tar.xz \
--anchored --recursion \
--files-from $file_list "${extract_dirs[@]}"
printf "\n"
if [[ ! -d ${MAIL_CORPUS} ]]; then
printf "creating link farm\n"
if [[ "$corpus_size" = large ]]; then
cp -rl ${TEST_DIRECTORY}/corpus/mail ${MAIL_CORPUS}
else
while read -r file; do
tdir=${MAIL_CORPUS}/$(dirname $file)
mkdir -p $tdir
ln ${TEST_DIRECTORY}/corpus/$file $tdir
done <${TEST_DIRECTORY}/corpus/manifest/MANIFEST.${corpus_size}
fi
fi
fi
rm $file_list
cp -lr $TAG_CORPUS $TMP_DIRECTORY/corpus.tags
cp -lr $MAIL_CORPUS $MAIL_DIR
}
notmuch_new_with_cache ()
{
if [ -d $DB_CACHE_DIR ]; then
cp -r $DB_CACHE_DIR ${MAIL_DIR}/.notmuch
else
"$1" 'Initial notmuch new' "notmuch new"
cache_database
fi
}
time_start ()
{
add_email_corpus
print_header
notmuch_new_with_cache time_run
}
memory_start ()
{
add_email_corpus
local timestamp=$(date +%Y%m%dT%H%M%S)
log_dir="${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${timestamp}"
mkdir -p ${log_dir}
notmuch_new_with_cache memory_run
}
memory_run ()
{
test_count=$(($test_count+1))
log_file=$log_dir/$test_count.log
talloc_log=$log_dir/$test_count.talloc
printf "[ %d ]\t%s\n" $test_count "$1"
NOTMUCH_TALLOC_REPORT="$talloc_log" eval "valgrind --leak-check=full --log-file='$log_file' $2"
awk '/LEAK SUMMARY/,/suppressed/ { sub(/^==[0-9]*==/," "); print }' "$log_file"
echo
sed -n -e 's/.*[(]total *\([^)]*\)[)]/talloced at exit: \1/p' $talloc_log
echo
}
memory_done ()
{
time_done
}
cache_database ()
{
if [ -d $MAIL_DIR/.notmuch ]; then
cp -r $MAIL_DIR/.notmuch $DB_CACHE_DIR
else
echo "Warning: No database found to cache"
fi
}
uncache_database ()
{
rm -rf $DB_CACHE_DIR
}
print_header ()
{
printf "\t\t\tWall(s)\tUsr(s)\tSys(s)\tRes(K)\tIn/Out(512B)\n"
}
time_run ()
{
printf " %-22s" "$1"
test_count=$(($test_count+1))
if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
if ! eval >&3 "/usr/bin/time -f '%e\t%U\t%S\t%M\t%I/%O' $2" ; then
test_failure=$(($test_failure + 1))
return 1
fi
return 0
}
time_done ()
{
if [ "$test_failure" = "0" ]; then
rm -rf "$remove_tmp"
exit 0
else
exit 1
fi
}
cd -P "$test" || error "Cannot set up test environment"
test_failure=0
test_count=0
printf "\n%-55s [%s %s]\n" \
"$(basename "$0"): Testing ${test_description:-notmuch performance}" \
"${PERFTEST_VERSION}" "${corpus_size}"