Below is the file 'testsuite.at' from this revision. You can also download the file.
# -*- Autoconf -*-
#
# the monotone integration testsuite is written in bourne shell,
# strung together with the autotest framework (part of autoconf).
#
# it's a bit icky but it's better than the hand-written thing we were
# using before, and it's *certainly* more user friendly than dejagnu,
# and we need *some* tests which run "as the user would run them".
# bourne shell scripts are pretty close to that.
#
AT_INIT([integration tests])
AT_TESTED([monotone])
# some command abbreviations to make life easier
# Set PREEXECUTE in your environment to run monotone under, e.g., valgrind.
m4_define([MONOTONE], [$PREEXECUTE $_MT_EXEC --rcfile=$_ROOT_DIR/test_hooks.lua --nostd --norc --db=$_ROOT_DIR/test.db --keydir=$_ROOT_DIR/keys --key=tester@test.net --root=$_ROOT_DIR])
m4_define([RAW_MONOTONE], [$PREEXECUTE monotone --norc])
m4_define([MINHOOKS_MONOTONE], [$PREEXECUTE $_MT_EXEC --db=$_ROOT_DIR/test.db --keydir=$_ROOT_DIR/keys --rcfile=$_ROOT_DIR/min_hooks.lua --key=tester@test.net --root=$_ROOT_DIR])
m4_define([SHA1], [monotone --norc identify $1])
m4_define([BASE_REVISION], [cat MT/revision])
m4_define([WORKING_REVISION], [monotone --norc automate get_revision | monotone --norc identify])
m4_define([CANONICALISE], [
if test "$OSTYPE" = "msys"; then
dos2unix -q -o $1
fi
])
# the MONOTONE_SETUP macro deploys the standard lua hooks and loads the
# standard testing key, which we use for further tests.
m4_define([MONOTONE_SETUP], [
# Absolutify monotone path.
_MT_EXEC=`which monotone`
# Save the PWD so MONOTONE macro can refer back to it
_ROOT_DIR=`pwd -P`
# Pick a random port, so running multiple testsuites concurrently on the
# same machine has a hope of working. Port range will usually be
# 20050..53347.
_PORT=`echo $RANDOM | awk 'BEGIN {a=1;srand()} END {printf "%.0f\n", ((rand() * 529 + 20050 + $a) % 64512 + 1024)}'`
AT_DATA(test_keys, [@<:@keypair tester@test.net@:>@
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6Pz+IvvOCDDqzN9WFO/zOjL7s9dVCS+zn
s/L9jQ2kHfNWXFof4GcgmMu4DfU4sUrRz39QxDlUrxEOvmIc9z3DNuIcbFZx7UZg9DWfdmDm
vbW79bZlVMeIudAIUwa6euX163AK5hacmqJfuB5U7awQM9o3rn8JYULleAoz5QTtawIDAQAB#
MIICyTBDBgkqhkiG9w0BBQ0wNjAeBgkqhkiG9w0BBQwwEQQIvYSV8ucj9m4CAggAAgEYMBQG
CCqGSIb3DQMHBAg/BZPM2O3QfASCAoBBGkVz4E/Pr1CsIioC92eCz4qWLclhc53HgHSCEo9I
XdNCTpCs/oxOXhQ0WQCPFhYEaxU8STgZm0Yhq8WEF1QfxOPOU8nDiwMT0L7/ARruu5bTCxnW
B3kkn+XiO5GldVJhULFlrl91t83yMsTSw+vyCyxZkqewBLR7mqHQUe2suVquMyutxxr2vZgV
QMfRxk65fSvySUHeNaj1dmakYcpP+35iejyUTAtAGuBsv2C68bwif4wkpLpedghNCtmccSdQ
t9QDF3yy6Q42tAW/OK6/t836/qn39f+47Kp4LMJUMmxNrtV7IntIkgBGgnGsqP9Br2B4GYXc
sWK0YApA3+Sf3kfH/wQ6Hib8nN4YxUTxxnS9WNHvRFrXCmfbGd5vAzi4lKCm/W+2Nlpd4DDQ
3JZjjCR73PMfKtHJCGULkNkK/9kRyhLYql2u/ZUJoEcdZxzEpYgExW8Wu1CrCVtWd+ueXs1h
or6Fdua7Gg4cjMgVg6EUSxdMBFQCX8heD8JeG6jMFNR9hTxe8o/PK8Ys63JyLMLRUv3Ud+f8
8T0TtCZV5+rgLfvb6k89uDJJK228WuJB6rp8S+qqq30RFPmkzW8JNulRilY+wrIfcowA6+TA
T5WKzFOIbkZd/R34tNLJMjTJlUq6SQKaOlQnqOEFbyY/GXgzYgnmc3tl8pigXEJvNzU5GiuB
ib35QQbzh87KlfLtWELK+8ZoyhZAZAMr97IavUbuFubOyEoEozUliARyRZ1ZudM4Ii+J6TRX
cmLryIBlz3OXgUUBSwJPwtWuR4tZ8nIt7cVJr7pxLblGfeFuu01HWN55hv4C78/aNSipVYCF
OFt8n7wQHxbbJvoTIdd/
@<:@end@:>@
])
AT_DATA(min_hooks.lua, [
function get_passphrase(keyid)
return keyid
end
function non_blocking_rng_ok()
return true
end
function persist_phrase_ok()
return true
end
])
AT_DATA(test_hooks.lua, [
-- this is the "testing" set of lua hooks for monotone
-- it's intended to support self-tests, not for use in
-- production. just defines some of the std hooks.
function get_passphrase(keyid)
return keyid
end
function non_blocking_rng_ok()
return true
end
-- Everything alice signs is trusted, nothing mallory signs is
-- trusted. For certs signed by other people, everything is
-- trusted except for one particular cert...
-- For use of t_trusted.at.
function get_revision_cert_trust(signers, id, name, val)
for k, v in pairs(signers) do
if v == "alice@trusted.com" then return true end
if v == "mallory@evil.com" then return false end
end
if (id == "0000000000000000000000000000000000000000"
and name == "bad-cert" and val == "bad-val")
then return false end
return true
end
function get_manifest_cert_trust(signers, id, name, val)
return true
end
function get_file_cert_trust(signers, id, name, val)
return true
end
function accept_testresult_change(old_results, new_results)
for test,res in pairs(old_results)
do
if res == true and new_results@<:@test@:>@ ~= true
then
return false
end
end
return true
end
function persist_phrase_ok()
return true
end
function get_author(branchname)
return "tester@test.net"
end
function ignore_file(name)
if (string.find(name, "test_hooks.lua")) then return true end
if (string.find(name, "keys")) then return true end
if (string.find(name, "test.db")) then return true end
return false
end
function merge2(left_path, right_path, merged_path, left, right)
io.write("running merge2 hook\n")
return left
end
if (attr_functions == nil) then
attr_functions = {}
end
attr_functions[["test:test_attr"]] =
function(filename, value)
io.write(string.format("test:test_attr:%s:%s\n", filename, value))
end
])
AT_CHECK(MONOTONE db init, [], [ignore], [ignore])
AT_CHECK(MONOTONE read <test_keys, [], [ignore], [ignore])
AT_CHECK(MONOTONE setup --branch=testbranch ., [], [ignore], [ignore])
AT_CHECK(rm test_keys)
])
# run as CHECK_SAME_STDOUT(command1, command2)
m4_define([CHECK_SAME_STDOUT], [
AT_CHECK($1, [], [stdout], [ignore])
AT_CHECK(mv stdout expout)
AT_CHECK($2, [], [expout], [ignore])
])
# run as CHECK_SAME_CANONICALISED_STDOUT(command1, command2)
m4_define([CHECK_SAME_CANONICALISED_STDOUT], [
AT_CHECK($1, [], [stdout], [ignore])
AT_CHECK(mv stdout output1)
AT_CHECK(CANONICALISE(output1))
AT_CHECK($2, [], [stdout], [ignore])
AT_CHECK(mv stdout output2)
AT_CHECK(CANONICALISE(output2))
AT_CHECK(cmp output1 output2)
])
# run as CHECK_DIFFERENT_STDOUT(command1, command2)
m4_define([CHECK_DIFFERENT_STDOUT], [
AT_CHECK($1, [], [stdout], [ignore])
AT_CHECK(mv stdout firstout)
AT_CHECK($2, [], [stdout], [ignore])
AT_CHECK(mv stdout secondout)
AT_CHECK(cmp firstout secondout, [1], [ignore], [ignore])
])
# run as CHECK_SAME_DB_CONTENTS(db1, db2)
m4_define([CHECK_SAME_DB_CONTENTS], [
CHECK_SAME_STDOUT(MONOTONE --db=$1 ls keys, MONOTONE --db=$2 ls keys)
REVS=`MONOTONE --db=$1 complete revision ""`
for R in $REVS; do
CHECK_SAME_STDOUT(MONOTONE --db=$1 automate certs $R, MONOTONE --db=$2 automate certs $R)
CHECK_SAME_STDOUT(MONOTONE --db=$1 automate get_revision $R, MONOTONE --db=$2 automate get_revision $R)
CHECK_SAME_STDOUT(MONOTONE --db=$1 automate get_manifest_of $R, MONOTONE --db=$2 automate get_manifest_of $R)
done
CHECK_SAME_STDOUT(MONOTONE --db=$1 complete file "", MONOTONE --db=$2 complete file "")
FILES=`MONOTONE --db=$1 complete file ""`
for F in $FILES; do
CHECK_SAME_STDOUT(MONOTONE --db=$1 automate get_file $F, MONOTONE --db=$2 automate get_file $F)
done
])
# run as PROBE_NODE(filename, rsha, fsha)
m4_define([PROBE_NODE], [
AT_CHECK(rm -rf MT.old)
AT_CHECK(mv MT MT.old)
AT_CHECK(rm $1)
AT_CHECK(MONOTONE checkout --revision=$2 ., [], [ignore])
AT_CHECK(mv MT.old/options MT)
PROBE_R_SHA=`BASE_REVISION`
PROBE_F_SHA=`SHA1($1)`
AT_CHECK(test $PROBE_R_SHA = $2)
AT_CHECK(test $PROBE_F_SHA = $3)
])
# run as REVERT_TO(rsha[,branch])
m4_define([REVERT_TO], [
AT_CHECK(rm -rf MT.old)
AT_CHECK(mv MT MT.old)
m4_case([$2],
[], [AT_CHECK(MONOTONE checkout --revision=$1 ., [], [ignore])],
[AT_CHECK(MONOTONE --branch=$2 checkout --revision=$1 ., [], [ignore])])
PROBE_R_SHA=`BASE_REVISION`
AT_CHECK(test $PROBE_R_SHA = $1)
])
# run as ADD_FILE(filename, data)
m4_define([ADD_FILE], [
AT_DATA($1, $2)
AT_CHECK(MONOTONE add $1, [], [ignore], [ignore])
])
# run as SET_FILE(filename, data)
m4_define([SET_FILE], [
AT_DATA($1, $2)
])
# run as COMMIT(branch)
m4_define([COMMIT], [
AT_CHECK(MONOTONE --branch=$1 commit --message blah-blah, [], [ignore],
[ignore])
])
m4_define([NOT_ON_WIN32], [
if test "$OSTYPE" = "msys"; then
exit 77
fi
])
# Some tests want to include data files.
# Usage: NEED_UNB64 will cancel the test (reporting success) if we
# can't decode base64'ed text.
# After calling NEED_UNB64, you can use UNB64(infile, outfile) to
# decode base64'ed text.
m4_define([NEED_UNB64], [
if test -n "`command -v mimencode`" 2>/dev/null; then
UNB64_COMMAND="mimencode -u"
elif test -n "`command -v recode`" 2>/dev/null; then
UNB64_COMMAND="recode /Base64"
elif perl -MMIME::Base64 -e 1 2>/dev/null; then
UNB64_COMMAND="perl -MMIME::Base64 -ne 'print decode_base64(\$_)'"
elif python -c 'import sys;sys.exit(not hasattr("", "decode"))' 2>/dev/null; then
UNB64_COMMAND="python -c 'import sys;sys.stdout.write(sys.stdin.read().decode("'"'"base64"'"'"))'"
else
# This is lame! We should XFAIL the test so the user knows that
# they're not, you know, actually testing the software. But
# Autotest runs XFAIL conditions in a completely different shell, so
# we can't without duplicating the whole test here.
exit 77
fi
# Poor man's logging:
AT_CHECK(echo $UNB64_COMMAND, [], [ignore], [ignore])
])
m4_define([UNB64], [AT_CHECK(
if test "$OSTYPE" = "msys"; then
mimencode -u -o $2 $1
else
eval $UNB64_COMMAND <$1 >$2
fi
)])
# Usage: NEED_UNGZ will cancel the test (reporting success) if we
# can't decode gzipped text.
# After calling NEED_UNGZ, you can use UNGZ(infile, outfile) to
# decode gzipped text.
m4_define([NEED_UNGZ], [
if test -n "`command -v gunzip`" 2>/dev/null; then
# This is lame! We should XFAIL the test so the user knows that
# they're not, you know, actually testing the software. But
# Autotest runs XFAIL conditions in a completely different shell, so
# we can't without duplicating the whole test here.
UNGZ_COMMAND="gunzip -c"
fi
# Poor man's logging:
AT_CHECK(echo $UNGZ_COMMAND, [], [ignore], [ignore])
])
m4_define([UNGZ], [AT_CHECK(
if test "$OSTYPE" = "msys"; then
if test "$1" != "$2.gz"; then
mv $1 $2.gz
fi
gunzip $2.gz
else
eval $UNGZ_COMMAND <$1 >$2
fi
)])
# Usage: NEED_UNGZB64 will XFAIL the test if we can't decode base64'ed
# gzipped text.
# After calling NEED_UNGZB64, you can use UNGZB64(infile, outfile) to
# decode base64'ed gzipped text.
m4_define([NEED_UNGZB64], [
NEED_UNB64
NEED_UNGZ
])
m4_define([UNGZB64], [
UNB64($1, $2.gz)
UNGZ($2.gz, $2)
])
# netsync helpers
# NETSYNC_SETUP sets up 2 databases; RUN_NETSYNC netsyncs between
# them, MONOTONE2 operates on the second one.
m4_define([NETSYNC_SETUP], [
AT_CHECK(cp test.db test2.db)
AT_CHECK(cp -r keys/ keys2)
AT_CHECK(cp test.db test3.db)
AT_CHECK(cp -r keys/ keys3)
AT_DATA(netsync.lua, [
function get_netsync_read_permitted(pattern, identity)
return true
end
function get_netsync_write_permitted(identity)
return true
end
])
foo () {
NETSYNC_KILLHARD
}
trap foo EXIT
])
m4_define([MONOTONE2], MONOTONE --db=test2.db --keydir=keys2)
m4_define([MONOTONE3], MONOTONE --db=test3.db --keydir=keys3)
m4_define([NETSYNC_KILL], [
# kill last seen pid if there is no pid file (needed for cases where
# NETSYNC_KILL{,HARD} is used more than once on a single process.
if test -e monotone_at.pid; then
mt_pid=`cat monotone_at.pid`
fi
if test "$OSTYPE" = "msys"; then
# we can't use MingW's kill because it can't target Win32 pids.
pskill=`which pskill`
if test $pskill && test -x $pskill; then
$pskill $mt_pid 2>/dev/null
else
ps | awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[[pp]]=="monotone")system("kill " $a);}'
fi
else
kill -TERM $mt_pid 2>/dev/null
fi
rm -f monotone_at.pid 2>/dev/null
])
m4_define([NETSYNC_KILLHARD], [
# kill last seen pid if there is no pid file (needed for cases where
# NETSYNC_KILL{,HARD} is used more than once on a single process.
if test -e monotone_at.pid; then
mt_pid=`cat monotone_at.pid`
fi
if test "$OSTYPE" = "msys"; then
# we can't use MingW's kill because it can't target Win32 pids.
pskill=`which pskill`
if test $pskill && test -x $pskill; then
$pskill $mt_pid 2>/dev/null
else
ps | awk -- '{p=$NF;a=1;if(p=="COMMAND")next;pp=split(p,ps,"/");if(ps[[pp]]=="monotone")system("kill -KILL " $a);}'
fi
else
kill -KILL $mt_pid 2>/dev/null
fi
rm -f monotone_at.pid 2>/dev/null
])
m4_define([NETSYNC_ADDRESS], [localhost:$_PORT])
# run as NETSYNC_SERVE_N_START(2|3, pattern)
# note that NETSYNC_SERVE_START is _not_ a special case of this macro.
m4_define([NETSYNC_SERVE_N_START], [
NETSYNC_KILLHARD
MONOTONE --db=test$1.db --keydir=keys$1 --rcfile=netsync.lua --pid-file=monotone_at.pid --dump=MT/server_dump --bind=NETSYNC_ADDRESS serve m4_if($2, [], "{}*", $2) &
sleep 4
])
# run as NETSYNC_SERVE_START(pattern)
m4_define([NETSYNC_SERVE_START], [
NETSYNC_KILLHARD
MONOTONE --rcfile=netsync.lua --pid-file=monotone_at.pid --dump=MT/server_dump --bind=NETSYNC_ADDRESS serve m4_if($1, [], "{}*", $1) &
sleep 4
])
# run as STDHOOKS_NETSYNC_SERVE_N_START(2|3, pattern)
# note that NETSYNC_SERVE_START is _not_ a special case of this macro.
m4_define([MINHOOKS_NETSYNC_SERVE_N_START], [
NETSYNC_KILLHARD
MINHOOKS_MONOTONE --db=test$1.db --keydir=keys$1 --pid-file=monotone_at.pid --dump=MT/server_dump --bind=NETSYNC_ADDRESS serve m4_if($2, [], "{}*", $2) &
sleep 4
])
# run as MINHOOKS_NETSYNC_SERVE_START(pattern)
m4_define([MINHOOKS_NETSYNC_SERVE_START], [
NETSYNC_KILLHARD
MINHOOKS_MONOTONE --pid-file=monotone_at.pid --dump=MT/server_dump --bind=NETSYNC_ADDRESS serve m4_if($1, [], "{}*", $1) &
sleep 4
])
# run as NETSYNC_SERVE_STOP
m4_define([NETSYNC_SERVE_STOP], [
NETSYNC_KILL
sleep 1
NETSYNC_KILLHARD
])
# run as NETSYNC_CLIENT_N_RUN(2|3, push|pull|sync, pattern[, expected result])
# first argument chooses whether to use the 2nd or 3rd database
m4_define([NETSYNC_CLIENT_N_RUN], [
AT_CHECK(MONOTONE --db=test$1.db --keydir=keys$1 --rcfile=netsync.lua $2 NETSYNC_ADDRESS $3, [$4], [ignore], [ignore])
])
# run as NETSYNC_CLIENT_RUN(push|pull|sync, pattern[, expected result])
m4_define([NETSYNC_CLIENT_RUN], [
NETSYNC_CLIENT_N_RUN(2, $1, $2, $3)
])
# run as RUN_NETSYNC(push|pull|sync, pattern)
# It is the second database that is always the client; take this into
# account when choosing push|pull|sync.
m4_define([RUN_NETSYNC], [
NETSYNC_SERVE_START($2)
NETSYNC_CLIENT_RUN($1, $2, 0)
NETSYNC_SERVE_STOP
])
# run as QGREP(arguments) the same way you'd run 'grep -q arguments'
# same for QEGREP and egrep -q
m4_define([QGREP], [grep $1 >/dev/null])
m4_define([QEGREP], [egrep $1 >/dev/null])
# run as TAIL(lines)
m4_define([TAIL], [(tail -n $1 2>/dev/null || tail -$1)])
# run as LARGISH_FILE_CREATE(filename, size) to create a <size> MB file of
# uncompressible data
m4_define([LARGISH_FILE_CREATE], [
awk -- 'BEGIN{srand(4691);for(a=0;a<1024*1024;a+=20)printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256,rand()*256);}' > largish.tmp
i=$2
while test $i -gt 0; do
cat largish.tmp >> $1
i=$((i - 1))
done
rm -f largish.tmp
])
# include all the sub-tests we're going to use
m4_include(tests/t_null.at)
m4_include(tests/t_scan.at)
m4_include(tests/t_import.at)
m4_include(tests/t_genkey.at)
m4_include(tests/t_unidiff.at)
m4_include(tests/t_persist_phrase.at)
m4_include(tests/t_versions.at)
m4_include(tests/t_fork.at)
m4_include(tests/t_update.at)
m4_include(tests/t_merge.at)
m4_include(tests/t_merge_add.at)
m4_include(tests/t_related_merge2_data.at)
m4_include(tests/t_merge2_add.at)
m4_include(tests/t_merge2_data.at)
m4_include(tests/t_unidiff2.at)
m4_include(tests/t_cwork.at)
m4_include(tests/t_revert.at)
m4_include(tests/t_add.at)
m4_include(tests/t_drop.at)
m4_include(tests/t_drop_missing.at)
m4_include(tests/t_cross.at)
m4_include(tests/t_rename.at)
m4_include(tests/t_renamed.at)
m4_include(tests/t_erename.at)
m4_include(tests/t_cvsimport.at)
m4_include(tests/t_i18n_file.at)
m4_include(tests/t_fmerge.at)
m4_include(tests/t_netsync.at)
m4_include(tests/t_netsync_single.at)
m4_include(tests/t_netsync_pubkey.at)
m4_include(tests/t_netsync_repeated.at)
m4_include(tests/t_netsync_unrelated.at)
m4_include(tests/t_disapprove.at)
m4_include(tests/t_testresult.at)
m4_include(tests/t_singlecvs.at)
m4_include(tests/t_ls_missing.at)
m4_include(tests/t_attributes.at)
m4_include(tests/t_single_char_filenames.at)
m4_include(tests/t_restrictions.at)
m4_include(tests/t_subdirs.at)
m4_include(tests/t_movepatch.at)
m4_include(tests/t_movedel.at)
m4_include(tests/t_remerge.at)
m4_include(tests/t_update_missing.at)
m4_include(tests/t_chkeypass.at)
m4_include(tests/t_diff_added_file.at)
m4_include(tests/t_update_to_revision.at)
m4_include(tests/t_heads.at)
m4_include(tests/t_heads_discontinuous_branch.at)
m4_include(tests/t_merge_1.at)
m4_include(tests/t_merge_2.at)
m4_include(tests/t_tags.at)
m4_include(tests/t_add_dot.at)
m4_include(tests/t_cleanup_empty_dir.at)
m4_include(tests/t_merge_add_del.at)
m4_include(tests/t_add_edge.at)
m4_include(tests/t_patch_drop_add.at)
m4_include(tests/t_add_drop_add.at)
m4_include(tests/t_merge2_add_drop_add.at)
m4_include(tests/t_add_patch_drop_add.at)
m4_include(tests/t_patch_vs_drop_add.at)
m4_include(tests/t_explicit_merge.at)
m4_include(tests/t_ambig_update.at)
m4_include(tests/t_checkout_dir.at)
m4_include(tests/t_checkout_options.at)
m4_include(tests/t_trusted.at)
m4_include(tests/t_attr.at)
m4_include(tests/t_rcfile_required.at)
m4_include(tests/t_persistent_server_revision.at)
m4_include(tests/t_persistent_server_keys.at)
m4_include(tests/t_fmerge_normalize.at)
m4_include(tests/t_delete_dir.at)
m4_include(tests/t_migrate_schema.at)
m4_include(tests/t_dump_load.at)
m4_include(tests/t_no_change_deltas.at)
m4_include(tests/t_drop_rename_patch.at)
m4_include(tests/t_cmdline_options.at)
m4_include(tests/t_log_nonexistent.at)
m4_include(tests/t_crlf.at)
m4_include(tests/t_netsync_diffbranch.at)
m4_include(tests/t_netsync_nocerts.at)
m4_include(tests/t_check_same_db_contents.at)
m4_include(tests/t_merge_ancestor.at)
m4_include(tests/t_propagate_desc.at)
m4_include(tests/t_propagate_anc.at)
m4_include(tests/t_status_missing.at)
m4_include(tests/t_persistent_server_keys_2.at)
m4_include(tests/t_update_1.at)
m4_include(tests/t_vcheck.at)
m4_include(tests/t_db_with_dots.at)
m4_include(tests/t_subdir_add.at)
m4_include(tests/t_subdir_drop.at)
m4_include(tests/t_subdir_revert.at)
m4_include(tests/t_subdir_rename.at)
m4_include(tests/t_subdir_attr.at)
m4_include(tests/t_lca_1.at)
m4_include(tests/t_update_2.at)
m4_include(tests/t_rename_dir_cross_level.at)
m4_include(tests/t_rename_added_in_rename.at)
m4_include(tests/t_rename_conflict.at)
m4_include(tests/t_rename_dir_patch.at)
m4_include(tests/t_delete_dir_patch.at)
m4_include(tests/t_revert_dirs.at)
m4_include(tests/t_revert_rename.at)
m4_include(tests/t_revert_unchanged.at)
m4_include(tests/t_cdiff.at)
m4_include(tests/t_no_rename_overwrite.at)
m4_include(tests/t_checkout_noop_on_fail.at)
m4_include(tests/t_monotone_agent.at)
m4_include(tests/t_approval_semantics.at)
m4_include(tests/t_i18n_changelog.at)
m4_include(tests/t_restrictions_warn_on_unknown.at)
m4_include(tests/t_need_mt_revision.at)
m4_include(tests/t_update_null_revision.at)
m4_include(tests/t_branch_checkout.at)
m4_include(tests/t_load_into_existing.at)
m4_include(tests/t_automate_version.at)
m4_include(tests/t_automate_heads.at)
m4_include(tests/t_merge_normalization_edge_case.at)
m4_include(tests/t_undo_update.at)
m4_include(tests/t_change_empty_file.at)
m4_include(tests/t_largish_file.at)
m4_include(tests/t_add_intermediate_MT_path.at)
m4_include(tests/t_merge_3.at)
m4_include(tests/t_merge_4.at)
m4_include(tests/t_db_missing.at)
m4_include(tests/t_database_check.at)
m4_include(tests/t_add_owndb.at)
m4_include(tests/t_can_execute.at)
m4_include(tests/t_diff_binary.at)
m4_include(tests/t_command_completion.at)
m4_include(tests/t_merge_rename_file_and_rename_dir.at)
m4_include(tests/t_diff_restrict.at)
m4_include(tests/t_cat_file_by_name.at)
m4_include(tests/t_epoch.at)
m4_include(tests/t_epoch_server.at)
m4_include(tests/t_epoch_unidirectional.at)
m4_include(tests/t_vars.at)
m4_include(tests/t_netsync_defaults.at)
m4_include(tests/t_netsync_set_defaults.at)
m4_include(tests/t_netsync_absorbs.at)
m4_include(tests/t_netsync_checks_server_key.at)
m4_include(tests/t_merge_5.at)
m4_include(tests/t_empty_id_completion.at)
m4_include(tests/t_empty_path.at)
m4_include(tests/t_empty_env.at)
m4_include(tests/t_short_opts.at)
m4_include(tests/t_netsync_sigpipe.at)
m4_include(tests/t_setup_creates_log.at)
m4_include(tests/t_checkout_creates_log.at)
m4_include(tests/t_commit_log_1.at)
m4_include(tests/t_commit_log_2.at)
m4_include(tests/t_commit_validate.at)
m4_include(tests/t_dropkey_1.at)
m4_include(tests/t_dropkey_2.at)
m4_include(tests/t_rename_attr.at)
m4_include(tests/t_automate_ancestors.at)
m4_include(tests/t_automate_descendents.at)
m4_include(tests/t_automate_erase_ancestors.at)
m4_include(tests/t_automate_toposort.at)
m4_include(tests/t_diff_first_rev.at)
m4_include(tests/t_automate_ancestry_difference.at)
m4_include(tests/t_automate_leaves.at)
m4_include(tests/t_log_last_next.at)
m4_include(tests/t_commit_log_3.at)
m4_include(tests/t_at_sign.at)
m4_include(tests/t_db_execute.at)
m4_include(tests/t_sql_unpack.at)
m4_include(tests/t_final_space.at)
m4_include(tests/t_inodeprints.at)
m4_include(tests/t_inodeprints_update.at)
m4_include(tests/t_ls_known.at)
m4_include(tests/t_cvsimport_samelog.at)
m4_include(tests/t_sticky_branch.at)
m4_include(tests/t_checkout_id_sets_branch.at)
m4_include(tests/t_netsync_largish_file.at)
m4_include(tests/t_update_off_branch.at)
m4_include(tests/t_setup_checkout_modify_new_dir.at)
m4_include(tests/t_rename_dir_add_dir_with_old_name.at)
m4_include(tests/t_rcs_import.at)
m4_include(tests/t_cvsimport2.at)
m4_include(tests/t_lf_crlf.at)
m4_include(tests/t_add_vs_commit.at)
m4_include(tests/t_update_nonexistent.at)
m4_include(tests/t_override_author_date.at)
m4_include(tests/t_add_stomp_file.at)
m4_include(tests/t_database_check_minor.at)
m4_include(tests/t_db_kill_rev_locally.at)
m4_include(tests/t_drop_attr.at)
m4_include(tests/t_attr_drop.at)
m4_include(tests/t_log_depth_single.at)
m4_include(tests/t_attr_init.at)
m4_include(tests/t_add_executable.at)
m4_include(tests/t_inodeprints_hook.at)
m4_include(tests/t_bad_packets.at)
m4_include(tests/t_multiple_heads_msg.at)
m4_include(tests/t_diff_currev.at)
m4_include(tests/t_normalized_filenames.at)
m4_include(tests/t_automate_inventory.at)
m4_include(tests/t_rename_file_to_dir.at)
m4_include(tests/t_replace_file_with_dir.at)
m4_include(tests/t_replace_dir_with_file.at)
m4_include(tests/t_parents_children.at)
m4_include(tests/t_automate_graph.at)
m4_include(tests/t_i18n_file_data.at)
m4_include(tests/t_cvsimport_manifest_cycle.at)
m4_include(tests/t_select_cert.at)
m4_include(tests/t_automate_select.at)
m4_include(tests/t_refresh_inodeprints.at)
m4_include(tests/t_merge_6.at)
m4_include(tests/t_annotate.at)
m4_include(tests/t_annotate_add_collision.at)
m4_include(tests/t_annotate_branch_collision.at)
m4_include(tests/t_netsync_error.at)
m4_include(tests/t_options.at)
m4_include(tests/t_annotate_copy_all.at)
m4_include(tests/t_cvsimport_deleted_invar.at)
m4_include(tests/t_rcfile_stdin.at)
m4_include(tests/t_monotone_up.at)
m4_include(tests/t_drop_vs_patch_rename.at)
m4_include(tests/t_unreadable_MT.at)
m4_include(tests/t_cvsimport3.at)
m4_include(tests/t_commit_message_file.at)
m4_include(tests/t_automate_attributes.at)
m4_include(tests/t_unidiff3.at)
m4_include(tests/t_netsync_permissions.at)
m4_include(tests/t_update_with_blocked_rename.at)
m4_include(tests/t_drop_vs_dropadd.at)
m4_include(tests/t_annotate_lineage_dependent.at)
m4_include(tests/t_annotate_split_line.at)
m4_include(tests/t_automate_certs.at)
m4_include(tests/t_selector_later_earlier.at)
m4_include(tests/t_automate_stdio.at)
m4_include(tests/t_cvsimport_drepper.at)
m4_include(tests/t_update_with_pending_drop.at)
m4_include(tests/t_update_with_pending_add.at)
m4_include(tests/t_update_with_pending_rename.at)
m4_include(tests/t_restricted_commit_with_inodeprints.at)
m4_include(tests/t_merge_manual.at)
m4_include(tests/t_revert_restrict.at)
m4_include(tests/t_status.at)
m4_include(tests/t_cvsimport_drepper2.at)
m4_include(tests/t_rcfile_dir.at)
m4_include(tests/t_lua_includedir.at)
m4_include(tests/t_existsonpath.at)
m4_include(tests/t_db_kill_branch_certs_locally.at)
m4_include(tests/t_netsync_globs.at)
m4_include(tests/t_set_default.at)
m4_include(tests/t_netsync_read_permissions.at)
m4_include(tests/t_netsync_exclude.at)
m4_include(tests/t_netsync_exclude_default.at)
m4_include(tests/t_ambiguous_tags.at)
m4_include(tests/t_kill_tag_locally.at)
m4_include(tests/t_restricted_diff_unchanged.at)
m4_include(tests/t_selector_globbing.at)
m4_include(tests/t_diff_external.at)
m4_include(tests/t_migrate_broken_schema.at)
m4_include(tests/t_ls_branches.at)
m4_include(tests/t_database_check_normalized.at)
m4_include(tests/t_annotate_no_rev.at)
m4_include(tests/t_merge_add_rename_add.at)
m4_include(tests/t_update_branch.at)
m4_include(tests/t_commit_cancelled.at)
m4_include(tests/t_merge_lca.at)
m4_include(tests/t_commit_log_writeback.at)
m4_include(tests/t_log_brief.at)
m4_include(tests/t_explicit_merge_with_anc.at)
m4_include(tests/t_drop_execute.at)
m4_include(tests/t_rename_execute.at)
m4_include(tests/t_read_from_file.at)
m4_include(tests/t_setup_existing_path.at)
m4_include(tests/t_mt_ignore.at)
m4_include(tests/t_automate_get_file.at)
m4_include(tests/t_automate_get_manifest_of.at)
m4_include(tests/t_automate_get_revision.at)
m4_include(tests/t_unreadable_db.at)
m4_include(tests/t_restriction_with_exclude.at)
m4_include(tests/t_restriction_with_exclude_iprint.at)
m4_include(tests/t_rename_diff_names.at)
m4_include(tests/t_key_management_without_db.at)
m4_include(tests/t_automate_keys.at)
m4_include(tests/t_diff_outside_workspace.at)
m4_include(tests/t_log_outside_workspace.at)
m4_include(tests/t_add_inside_MT.at)
m4_include(tests/t_annotate_renames.at)
m4_include(tests/t_config_confdir.at)
m4_include(tests/t_database_sig_cleanup.at)
m4_include(tests/t_update_switch_branch.at)
m4_include(tests/t_migrate_rosterify.at)
m4_include(tests/t_rosterify_attrs.at)
m4_include(tests/t_rosterify_rename.at)
m4_include(tests/t_mixed_case_pwd.at)
m4_include(tests/t_read_privkey.at)
m4_include(tests/t_restricted_commands_consistent.at)
m4_include(tests/t_rosterify_drop_attrs.at)
m4_include(tests/t_rosterify_one_rev.at)
m4_include(tests/t_selectors_b_h.at)
m4_include(tests/t_revert_ignored.at)
m4_include(tests/t_no_persist_phrase.at)
m4_include(tests/t_check_db_format.at)
m4_include(tests/t_rename_destdir.at)
m4_include(tests/t_ls_changed.at)