Update test framework for use with notmuch

This removes Git specific things from the test-lib.sh and adds helper
functions for notmuch taken from Carl's notmuch-test script. README is
also slightly modified to reflect the current state.

Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
This commit is contained in:
Michal Sojka 2010-06-10 08:48:01 +02:00 committed by Carl Worth
parent 0083854b12
commit 223987bace
4 changed files with 256 additions and 466 deletions

View file

@ -6,6 +6,7 @@
-include ../config.mak -include ../config.mak
#GIT_TEST_OPTS=--verbose --debug #GIT_TEST_OPTS=--verbose --debug
SHELL=/bin/bash
SHELL_PATH ?= $(SHELL) SHELL_PATH ?= $(SHELL)
TAR ?= $(TAR) TAR ?= $(TAR)
RM ?= rm -f RM ?= rm -f

View file

@ -165,10 +165,10 @@ Writing Tests
------------- -------------
The test script is written as a shell script. It should start The test script is written as a shell script. It should start
with the standard "#!/bin/sh" with copyright notices, and an with the standard "#!/bin/bash" with copyright notices, and an
assignment to variable 'test_description', like this: assignment to variable 'test_description', like this:
#!/bin/sh #!/bin/bash
# #
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
@ -192,9 +192,11 @@ This test harness library does the following things:
- If the script is invoked with command line argument --help - If the script is invoked with command line argument --help
(or -h), it shows the test_description and exits. (or -h), it shows the test_description and exits.
- Creates an empty test directory with an empty .git/objects - Creates a test directory with default notmuch-config and empty mail
database and chdir(2) into it. This directory is 't/trash directory' store. This directory is 't/trash directory.<test-basename>' (note
if you must know, but I do not think you care. the space) if you must know, but I do not think you care. The path
to notmuch-config is exported in NOTMUCH_CONFIG environment
variable and mail store path is stored in MAIL_DIR variable.
- Defines standard test helper functions for your scripts to - Defines standard test helper functions for your scripts to
use. These functions are designed to make all scripts behave use. These functions are designed to make all scripts behave

View file

@ -3,48 +3,39 @@
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
test_description='Test the very basics part #1. test_description='Tests the test framework itself.'
The rest of the test suite does not check the basic operation of git
plumbing commands to work very carefully. Their job is to concentrate
on tricky features that caused bugs in the past to detect regression.
This test runs very basic features, like registering things in cache,
writing tree, etc.
Note that this test *deliberately* hard-codes many expected object
IDs. When object ID computation changes, like in the previous case of
swapping compression and hashing order, the person who is making the
modification *should* take notice and update the test vectors here.
'
################################################################ ################################################################
# It appears that people try to run tests without building... # It appears that people try to run tests without building...
../git >/dev/null if ! test -x ../notmuch
if test $? != 1
then then
echo >&2 'You do not seem to have built git yet.' echo >&2 'You do not seem to have built notmuch yet.'
exit 1 exit 1
fi fi
. ./test-lib.sh . ./test-lib.sh
################################################################ ################################################################
# git init has been done in an empty repository. # Test mail store prepared in test-lib.sh
# make sure it is empty.
find .git/objects -type f -print >should-be-empty
test_expect_success \ test_expect_success \
'.git/objects should be empty after git init in an empty repo.' \ 'test that mail store was created' \
'test -d "${MAIL_DIR}"'
find "${MAIL_DIR}" -type f -print >should-be-empty
test_expect_success \
'mail store should be empty' \
'cmp -s /dev/null should-be-empty' 'cmp -s /dev/null should-be-empty'
# also it should have 2 subdirectories; no fan-out anymore, pack, and info.
# 3 is counting "objects" itself
find .git/objects -type d -print >full-of-directories
test_expect_success \ test_expect_success \
'.git/objects should have 3 subdirectories.' \ 'NOTMUCH_CONFIG is set and points to an existing file' \
'test $(wc -l < full-of-directories) = 3' 'test -f "${NOTMUCH_CONFIG}"'
test_expect_success \
'PATH is set to this repository' \
'test "`echo $PATH|cut -f1 -d:`" = "`dirname ${TEST_DIRECTORY}`"'
################################################################ ################################################################
# Test harness # Test harness
@ -94,296 +85,4 @@ test_expect_code 2 'failure to clean up causes the test to fail' '
test_when_finished "(exit 2)" test_when_finished "(exit 2)"
' '
################################################################
# Basics of the basics
# updating a new file without --add should fail.
test_expect_success 'git update-index without --add should fail adding.' '
test_must_fail git update-index should-be-empty
'
# and with --add it should succeed, even if it is empty (it used to fail).
test_expect_success \
'git update-index with --add should succeed.' \
'git update-index --add should-be-empty'
test_expect_success \
'writing tree out with git write-tree' \
'tree=$(git write-tree)'
# we know the shape and contents of the tree and know the object ID for it.
test_expect_success \
'validate object ID of a known tree.' \
'test "$tree" = 7bb943559a305bdd6bdee2cef6e5df2413c3d30a'
# Removing paths.
rm -f should-be-empty full-of-directories
test_expect_success 'git update-index without --remove should fail removing.' '
test_must_fail git update-index should-be-empty
'
test_expect_success \
'git update-index with --remove should be able to remove.' \
'git update-index --remove should-be-empty'
# Empty tree can be written with recent write-tree.
test_expect_success \
'git write-tree should be able to write an empty tree.' \
'tree=$(git write-tree)'
test_expect_success \
'validate object ID of a known tree.' \
'test "$tree" = 4b825dc642cb6eb9a060e54bf8d69288fbee4904'
# Various types of objects
# Some filesystems do not support symblic links; on such systems
# some expected values are different
mkdir path2 path3 path3/subp3
paths='path0 path2/file2 path3/file3 path3/subp3/file3'
for p in $paths
do
echo "hello $p" >$p
done
if test_have_prereq SYMLINKS
then
for p in $paths
do
ln -s "hello $p" ${p}sym
done
expectfilter=cat
expectedtree=087704a96baf1c2d1c869a8b084481e121c88b5b
expectedptree1=21ae8269cacbe57ae09138dcc3a2887f904d02b3
expectedptree2=3c5e5399f3a333eddecce7a9b9465b63f65f51e2
else
expectfilter='grep -v sym'
expectedtree=8e18edf7d7edcf4371a3ac6ae5f07c2641db7c46
expectedptree1=cfb8591b2f65de8b8cc1020cd7d9e67e7793b325
expectedptree2=ce580448f0148b985a513b693fdf7d802cacb44f
fi
test_expect_success \
'adding various types of objects with git update-index --add.' \
'find path* ! -type d -print | xargs git update-index --add'
# Show them and see that matches what we expect.
test_expect_success \
'showing stage with git ls-files --stage' \
'git ls-files --stage >current'
$expectfilter >expected <<\EOF
100644 f87290f8eb2cbbea7857214459a0739927eab154 0 path0
120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0 path0sym
100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0 path2/file2
120000 d8ce161addc5173867a3c3c730924388daedbc38 0 path2/file2sym
100644 0aa34cae68d0878578ad119c86ca2b5ed5b28376 0 path3/file3
120000 8599103969b43aff7e430efea79ca4636466794f 0 path3/file3sym
100644 00fb5908cb97c2564a9783c0c64087333b3b464f 0 path3/subp3/file3
120000 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c 0 path3/subp3/file3sym
EOF
test_expect_success \
'validate git ls-files output for a known tree.' \
'test_cmp expected current'
test_expect_success \
'writing tree out with git write-tree.' \
'tree=$(git write-tree)'
test_expect_success \
'validate object ID for a known tree.' \
'test "$tree" = "$expectedtree"'
test_expect_success \
'showing tree with git ls-tree' \
'git ls-tree $tree >current'
cat >expected <<\EOF
100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe path2
040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3 path3
EOF
test_expect_success SYMLINKS \
'git ls-tree output for a known tree.' \
'test_cmp expected current'
# This changed in ls-tree pathspec change -- recursive does
# not show tree nodes anymore.
test_expect_success \
'showing tree with git ls-tree -r' \
'git ls-tree -r $tree >current'
$expectfilter >expected <<\EOF
100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 path2/file2
120000 blob d8ce161addc5173867a3c3c730924388daedbc38 path2/file2sym
100644 blob 0aa34cae68d0878578ad119c86ca2b5ed5b28376 path3/file3
120000 blob 8599103969b43aff7e430efea79ca4636466794f path3/file3sym
100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f path3/subp3/file3
120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c path3/subp3/file3sym
EOF
test_expect_success \
'git ls-tree -r output for a known tree.' \
'test_cmp expected current'
# But with -r -t we can have both.
test_expect_success \
'showing tree with git ls-tree -r -t' \
'git ls-tree -r -t $tree >current'
cat >expected <<\EOF
100644 blob f87290f8eb2cbbea7857214459a0739927eab154 path0
120000 blob 15a98433ae33114b085f3eb3bb03b832b3180a01 path0sym
040000 tree 58a09c23e2ca152193f2786e06986b7b6712bdbe path2
100644 blob 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 path2/file2
120000 blob d8ce161addc5173867a3c3c730924388daedbc38 path2/file2sym
040000 tree 21ae8269cacbe57ae09138dcc3a2887f904d02b3 path3
100644 blob 0aa34cae68d0878578ad119c86ca2b5ed5b28376 path3/file3
120000 blob 8599103969b43aff7e430efea79ca4636466794f path3/file3sym
040000 tree 3c5e5399f3a333eddecce7a9b9465b63f65f51e2 path3/subp3
100644 blob 00fb5908cb97c2564a9783c0c64087333b3b464f path3/subp3/file3
120000 blob 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c path3/subp3/file3sym
EOF
test_expect_success SYMLINKS \
'git ls-tree -r output for a known tree.' \
'test_cmp expected current'
test_expect_success \
'writing partial tree out with git write-tree --prefix.' \
'ptree=$(git write-tree --prefix=path3)'
test_expect_success \
'validate object ID for a known tree.' \
'test "$ptree" = "$expectedptree1"'
test_expect_success \
'writing partial tree out with git write-tree --prefix.' \
'ptree=$(git write-tree --prefix=path3/subp3)'
test_expect_success \
'validate object ID for a known tree.' \
'test "$ptree" = "$expectedptree2"'
cat >badobjects <<EOF
100644 blob 1000000000000000000000000000000000000000 dir/file1
100644 blob 2000000000000000000000000000000000000000 dir/file2
100644 blob 3000000000000000000000000000000000000000 dir/file3
100644 blob 4000000000000000000000000000000000000000 dir/file4
100644 blob 5000000000000000000000000000000000000000 dir/file5
EOF
rm .git/index
test_expect_success \
'put invalid objects into the index.' \
'git update-index --index-info < badobjects'
test_expect_success 'writing this tree without --missing-ok.' '
test_must_fail git write-tree
'
test_expect_success \
'writing this tree with --missing-ok.' \
'git write-tree --missing-ok'
################################################################
rm .git/index
test_expect_success \
'git read-tree followed by write-tree should be idempotent.' \
'git read-tree $tree &&
test -f .git/index &&
newtree=$(git write-tree) &&
test "$newtree" = "$tree"'
$expectfilter >expected <<\EOF
:100644 100644 f87290f8eb2cbbea7857214459a0739927eab154 0000000000000000000000000000000000000000 M path0
:120000 120000 15a98433ae33114b085f3eb3bb03b832b3180a01 0000000000000000000000000000000000000000 M path0sym
:100644 100644 3feff949ed00a62d9f7af97c15cd8a30595e7ac7 0000000000000000000000000000000000000000 M path2/file2
:120000 120000 d8ce161addc5173867a3c3c730924388daedbc38 0000000000000000000000000000000000000000 M path2/file2sym
:100644 100644 0aa34cae68d0878578ad119c86ca2b5ed5b28376 0000000000000000000000000000000000000000 M path3/file3
:120000 120000 8599103969b43aff7e430efea79ca4636466794f 0000000000000000000000000000000000000000 M path3/file3sym
:100644 100644 00fb5908cb97c2564a9783c0c64087333b3b464f 0000000000000000000000000000000000000000 M path3/subp3/file3
:120000 120000 6649a1ebe9e9f1c553b66f5a6e74136a07ccc57c 0000000000000000000000000000000000000000 M path3/subp3/file3sym
EOF
test_expect_success \
'validate git diff-files output for a know cache/work tree state.' \
'git diff-files >current && diff >/dev/null -b current expected'
test_expect_success \
'git update-index --refresh should succeed.' \
'git update-index --refresh'
test_expect_success \
'no diff after checkout and git update-index --refresh.' \
'git diff-files >current && cmp -s current /dev/null'
################################################################
P=$expectedtree
test_expect_success \
'git commit-tree records the correct tree in a commit.' \
'commit0=$(echo NO | git commit-tree $P) &&
tree=$(git show --pretty=raw $commit0 |
sed -n -e "s/^tree //p" -e "/^author /q") &&
test "z$tree" = "z$P"'
test_expect_success \
'git commit-tree records the correct parent in a commit.' \
'commit1=$(echo NO | git commit-tree $P -p $commit0) &&
parent=$(git show --pretty=raw $commit1 |
sed -n -e "s/^parent //p" -e "/^author /q") &&
test "z$commit0" = "z$parent"'
test_expect_success \
'git commit-tree omits duplicated parent in a commit.' \
'commit2=$(echo NO | git commit-tree $P -p $commit0 -p $commit0) &&
parent=$(git show --pretty=raw $commit2 |
sed -n -e "s/^parent //p" -e "/^author /q" |
sort -u) &&
test "z$commit0" = "z$parent" &&
numparent=$(git show --pretty=raw $commit2 |
sed -n -e "s/^parent //p" -e "/^author /q" |
wc -l) &&
test $numparent = 1'
test_expect_success 'update-index D/F conflict' '
mv path0 tmp &&
mv path2 path0 &&
mv tmp path2 &&
git update-index --add --replace path2 path0/file2 &&
numpath0=$(git ls-files path0 | wc -l) &&
test $numpath0 = 1
'
test_expect_success SYMLINKS 'absolute path works as expected' '
mkdir first &&
ln -s ../.git first/.git &&
mkdir second &&
ln -s ../first second/other &&
mkdir third &&
dir="$(cd .git; pwd -P)" &&
dir2=third/../second/other/.git &&
test "$dir" = "$(test-path-utils make_absolute_path $dir2)" &&
file="$dir"/index &&
test "$file" = "$(test-path-utils make_absolute_path $dir2/index)" &&
basename=blub &&
test "$dir/$basename" = "$(cd .git && test-path-utils make_absolute_path "$basename")" &&
ln -s ../first/file .git/syml &&
sym="$(cd first; pwd -P)"/file &&
test "$sym" = "$(test-path-utils make_absolute_path "$dir2/syml")"
'
test_expect_success 'very long name in the index handled sanely' '
a=a && # 1
a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 16
a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 256
a=$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a && # 4096
a=${a}q &&
>path4 &&
git update-index --add path4 &&
(
git ls-files -s path4 |
sed -e "s/ .*/ /" |
tr -d "\012"
echo "$a"
) | git update-index --index-info &&
len=$(git ls-files "a*" | wc -c) &&
test $len = 4098
'
test_done test_done

View file

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
# #
# Copyright (c) 2005 Junio C Hamano # Copyright (c) 2005 Junio C Hamano
# #
@ -41,40 +41,6 @@ PAGER=cat
TZ=UTC TZ=UTC
TERM=dumb TERM=dumb
export LANG LC_ALL PAGER TERM TZ export LANG LC_ALL PAGER TERM TZ
EDITOR=:
unset VISUAL
unset GIT_EDITOR
unset AUTHOR_DATE
unset AUTHOR_EMAIL
unset AUTHOR_NAME
unset COMMIT_AUTHOR_EMAIL
unset COMMIT_AUTHOR_NAME
unset EMAIL
unset GIT_ALTERNATE_OBJECT_DIRECTORIES
unset GIT_AUTHOR_DATE
GIT_AUTHOR_EMAIL=author@example.com
GIT_AUTHOR_NAME='A U Thor'
unset GIT_COMMITTER_DATE
GIT_COMMITTER_EMAIL=committer@example.com
GIT_COMMITTER_NAME='C O Mitter'
unset GIT_DIFF_OPTS
unset GIT_DIR
unset GIT_WORK_TREE
unset GIT_EXTERNAL_DIFF
unset GIT_INDEX_FILE
unset GIT_OBJECT_DIRECTORY
unset GIT_CEILING_DIRECTORIES
unset SHA1_FILE_DIRECTORIES
unset SHA1_FILE_DIRECTORY
unset GIT_NOTES_REF
unset GIT_NOTES_DISPLAY_REF
unset GIT_NOTES_REWRITE_REF
unset GIT_NOTES_REWRITE_MODE
GIT_MERGE_VERBOSITY=5
export GIT_MERGE_VERBOSITY
export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
export EDITOR
GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u} GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u}
# Protect ourselves from common misconfiguration to export # Protect ourselves from common misconfiguration to export
@ -98,6 +64,9 @@ esac
_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' _x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" _x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
_x04='[0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x32="$_x04$_x04$_x04$_x04$_x04$_x04$_x04$_x04"
# Each test should start with something like this, after copyright notices: # Each test should start with something like this, after copyright notices:
# #
# test_description='Description of this test... # test_description='Description of this test...
@ -221,22 +190,6 @@ die () {
GIT_EXIT_OK= GIT_EXIT_OK=
trap 'die' EXIT trap 'die' EXIT
# The semantics of the editor variables are that of invoking
# sh -c "$EDITOR \"$@\"" files ...
#
# If our trash directory contains shell metacharacters, they will be
# interpreted if we just set $EDITOR directly, so do a little dance with
# environment variables to work around this.
#
# In particular, quoting isn't enough, as the path may contain the same quote
# that we're using.
test_set_editor () {
FAKE_EDITOR="$1"
export FAKE_EDITOR
EDITOR='"$FAKE_EDITOR"'
export EDITOR
}
test_decode_color () { test_decode_color () {
sed -e 's/.\[1m/<WHITE>/g' \ sed -e 's/.\[1m/<WHITE>/g' \
-e 's/.\[31m/<RED>/g' \ -e 's/.\[31m/<RED>/g' \
@ -264,52 +217,205 @@ remove_cr () {
tr '\015' Q | sed -e 's/Q$//' tr '\015' Q | sed -e 's/Q$//'
} }
test_tick () { # Notmuch helper functions
if test -z "${test_tick+set}" increment_mtime_amount=0
then increment_mtime ()
test_tick=1112911993 {
else dir=$1
test_tick=$(($test_tick + 60))
fi increment_mtime_amount=$((increment_mtime_amount + 1))
GIT_COMMITTER_DATE="$test_tick -0700" touch -d "+${increment_mtime_amount} seconds" $dir
GIT_AUTHOR_DATE="$test_tick -0700"
export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
} }
# Call test_commit with the arguments "<message> [<file> [<contents>]]" # Generate a new message in the mail directory, with a unique message
# ID and subject. The message is not added to the index.
# #
# This will commit a file with the given contents and the given commit # After this function returns, the filename of the generated message
# message. It will also add a tag with <message> as name. # is available as $gen_msg_filename and the message ID is available as
# $gen_msg_id .
# #
# Both <file> and <contents> default to <message>. # This function supports named parameters with the bash syntax for
# assigning a value to an associative array ([name]=value). The
# supported parameters are:
#
# [dir]=directory/of/choice
#
# Generate the message in directory 'directory/of/choice' within
# the mail store. The directory will be created if necessary.
#
# [body]=text
#
# Text to use as the body of the email message
#
# '[from]="Some User <user@example.com>"'
# '[to]="Some User <user@example.com>"'
# '[subject]="Subject of email message"'
# '[date]="RFC 822 Date"'
#
# Values for email headers. If not provided, default values will
# be generated instead.
#
# '[cc]="Some User <user@example.com>"'
# [reply-to]=some-address
# [in-reply-to]=<message-id>
# [references]=<message-id>
# [content-type]=content-type-specification
# '[header]=full header line, including keyword'
#
# Additional values for email headers. If these are not provided
# then the relevant headers will simply not appear in the
# message.
#
# '[id]=message-id'
#
# Controls the message-id of the created message.
gen_msg_cnt=0
gen_msg_filename=""
gen_msg_id=""
generate_message ()
{
# This is our (bash-specific) magic for doing named parameters
local -A template="($@)"
local additional_headers
test_commit () { gen_msg_cnt=$((gen_msg_cnt + 1))
file=${2:-"$1.t"} gen_msg_name=msg-$(printf "%03d" $gen_msg_cnt)
echo "${3-$1}" > "$file" &&
git add "$file" && if [ -z "${template[id]}" ]; then
test_tick && gen_msg_id="${gen_msg_name}@notmuch-test-suite"
git commit -m "$1" && else
git tag "$1" gen_msg_id="${template[id]}"
fi
if [ -z "${template[dir]}" ]; then
gen_msg_filename="${MAIL_DIR}/$gen_msg_name"
else
gen_msg_filename="${MAIL_DIR}/${template[dir]}/$gen_msg_name"
mkdir -p $(dirname $gen_msg_filename)
fi
if [ -z "${template[body]}" ]; then
template[body]="This is just a test message (#${gen_msg_cnt})"
fi
if [ -z "${template[from]}" ]; then
template[from]="Notmuch Test Suite <test_suite@notmuchmail.org>"
fi
if [ -z "${template[to]}" ]; then
template[to]="Notmuch Test Suite <test_suite@notmuchmail.org>"
fi
if [ -z "${template[subject]}" ]; then
template[subject]="Test message #${gen_msg_cnt}"
fi
if [ -z "${template[date]}" ]; then
template[date]="Tue, 05 Jan 2001 15:43:57 -0800"
fi
additional_headers=""
if [ ! -z "${template[header]}" ]; then
additional_headers="${template[header]}
${additional_headers}"
fi
if [ ! -z "${template[reply-to]}" ]; then
additional_headers="Reply-To: ${template[reply-to]}
${additional_headers}"
fi
if [ ! -z "${template[in-reply-to]}" ]; then
additional_headers="In-Reply-To: ${template[in-reply-to]}
${additional_headers}"
fi
if [ ! -z "${template[cc]}" ]; then
additional_headers="Cc: ${template[cc]}
${additional_headers}"
fi
if [ ! -z "${template[references]}" ]; then
additional_headers="References: ${template[references]}
${additional_headers}"
fi
if [ ! -z "${template[content-type]}" ]; then
additional_headers="Content-Type: ${template[content-type]}
${additional_headers}"
fi
cat <<EOF >$gen_msg_filename
From: ${template[from]}
To: ${template[to]}
Message-Id: <${gen_msg_id}>
Subject: ${template[subject]}
Date: ${template[date]}
${additional_headers}
${template[body]}
EOF
# Ensure that the mtime of the containing directory is updated
increment_mtime $(dirname ${gen_msg_filename})
} }
# Call test_merge with the arguments "<message> <commit>", where <commit> # Generate a new message and add it to the index.
# can be a tag pointing to the commit-to-merge. #
# All of the arguments and return values supported by generate_message
# are also supported here, so see that function for details.
add_message ()
{
generate_message "$@"
test_merge () { $NOTMUCH new > /dev/null
test_tick &&
git merge -m "$1" "$2" &&
git tag "$1"
} }
# This function helps systems where core.filemode=false is set. tests=0
# Use it instead of plain 'chmod +x' to set or unset the executable bit test_failures=0
# of a file in the working directory and add it to the index.
test_chmod () { pass_if_equal ()
chmod "$@" && {
git update-index --add "--chmod=$@" output=$1
expected=$2
tests=$((tests + 1))
if [ "$output" = "$expected" ]; then
echo " PASS"
else
echo " FAIL"
testname=test-$(printf "%03d" $tests)
echo "$expected" > $testname.expected
echo "$output" > $testname.output
diff -u $testname.expected $testname.output || true
test_failures=$((test_failures + 1))
fi
} }
TEST_DIR=$(pwd)/test.$$
MAIL_DIR=${TEST_DIR}/mail
export NOTMUCH_CONFIG=${TEST_DIR}/notmuch-config
NOTMUCH=$(find_notmuch_binary $(pwd))
NOTMUCH_NEW ()
{
$NOTMUCH new | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file'
}
notmuch_search_sanitize ()
{
sed -r -e 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/'
}
NOTMUCH_SHOW_FILENAME_SQUELCH='s,filename:.*/mail,filename:/XXX/mail,'
notmuch_show_sanitize ()
{
sed -e "$NOTMUCH_SHOW_FILENAME_SQUELCH"
}
# End of notmuch helper functions
# Use test_set_prereq to tell that a particular prerequisite is available. # Use test_set_prereq to tell that a particular prerequisite is available.
# The prerequisite can later be checked for in two ways: # The prerequisite can later be checked for in two ways:
# #
@ -572,21 +678,6 @@ test_when_finished () {
} && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup" } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
} }
# Most tests can use the created repository, but some may need to create more.
# Usage: test_create_repo <directory>
test_create_repo () {
test "$#" = 1 ||
error "bug in the test script: not 1 parameter to test-create-repo"
owd=`pwd`
repo="$1"
mkdir -p "$repo"
cd "$repo" || error "Cannot setup test environment"
"$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 ||
error "cannot run git init -- have you built things yet?"
mv .git/hooks .git/hooks-disabled
cd "$owd"
}
test_done () { test_done () {
GIT_EXIT_OK=t GIT_EXIT_OK=t
test_results_dir="$TEST_DIRECTORY/test-results" test_results_dir="$TEST_DIRECTORY/test-results"
@ -628,9 +719,27 @@ test_done () {
esac esac
} }
find_notmuch_path ()
{
dir="$1"
while [ -n "$dir" ]; do
bin="$dir/notmuch"
if [ -x "$bin" ]; then
echo "$dir"
return
fi
dir="$(dirname "$dir")"
if [ "$dir" = "/" ]; then
break
fi
done
}
# Test the binaries we have just built. The tests are kept in # Test the binaries we have just built. The tests are kept in
# t/ subdirectory and are run in 'trash directory' subdirectory. # test/ subdirectory and are run in 'trash directory' subdirectory.
TEST_DIRECTORY=$(pwd) TEST_DIRECTORY=$(pwd)
# FIXME: Only the normal case bellow is updated to notmuch
if test -n "$valgrind" if test -n "$valgrind"
then then
make_symlink () { make_symlink () {
@ -699,48 +808,11 @@ elif test -n "$GIT_TEST_INSTALLED" ; then
error "Cannot run git from $GIT_TEST_INSTALLED." error "Cannot run git from $GIT_TEST_INSTALLED."
PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH
GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
else # normal case, use ../bin-wrappers only unless $with_dashes: else # normal case
git_bin_dir="$TEST_DIRECTORY/../bin-wrappers" notmuch_path=`find_notmuch_path "$TEST_DIRECTORY"`
if ! test -x "$git_bin_dir/git" ; then test -n "$notmuch_path" && PATH="$notmuch_path:$PATH"
if test -z "$with_dashes" ; then
say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
fi
with_dashes=t
fi
PATH="$git_bin_dir:$PATH"
GIT_EXEC_PATH=$TEST_DIRECTORY/..
if test -n "$with_dashes" ; then
PATH="$TEST_DIRECTORY/..:$PATH"
fi
fi
GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
unset GIT_CONFIG
GIT_CONFIG_NOSYSTEM=1
GIT_CONFIG_NOGLOBAL=1
export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL
. ../GIT-BUILD-OPTIONS
GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
export GITPERLLIB
test -d ../templates/blt || {
error "You haven't built things yet, have you?"
}
if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
then
GITPYTHONLIB="$(pwd)/../git_remote_helpers/build/lib"
export GITPYTHONLIB
test -d ../git_remote_helpers/build || {
error "You haven't built git_remote_helpers yet, have you?"
}
fi
if ! test -x ../test-chmtime; then
echo >&2 'You need to build test-chmtime:'
echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
exit 1
fi fi
export PATH
# Test repository # Test repository
test="trash directory.$(basename "$0" .sh)" test="trash directory.$(basename "$0" .sh)"
@ -756,10 +828,26 @@ rm -fr "$test" || {
exit 1 exit 1
} }
test_create_repo "$test" MAIL_DIR="${TRASH_DIRECTORY}/mail"
export NOTMUCH_CONFIG="${TRASH_DIRECTORY}/notmuch-config"
mkdir -p "${test}"
mkdir "$MAIL_DIR"
cat <<EOF >"${NOTMUCH_CONFIG}"
[database]
path=${MAIL_DIR}
[user]
name=Notmuch Test Suite
primary_email=test_suite@notmuchmail.org
other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
EOF
# Use -P to resolve symlinks in our working directory so that the cwd # Use -P to resolve symlinks in our working directory so that the cwd
# in subprocesses like git equals our $PWD (for pathname comparisons). # in subprocesses like git equals our $PWD (for pathname comparisons).
cd -P "$test" || exit 1 cd -P "$test" || error "Cannot setup test environment"
this_test=${0##*/} this_test=${0##*/}
this_test=${this_test%%-*} this_test=${this_test%%-*}