chiark / gitweb /
test suite: protocol-compat: Even more solid checks
[dgit.git] / tests / lib
index 39763c6169430058237f1b3d5752b072866798f6..0cd696b4a98681efe691f71199fc23a161a350fc 100644 (file)
--- a/tests/lib
+++ b/tests/lib
@@ -65,7 +65,8 @@ incoming              = $tmp/incoming
 run_dinstall           = 0
 END
 
-: ${tagpfx:=test-dummy}
+: ${t_archive_method:=aq}
+: ${tagpfx:=archive/test-dummy}
 : ${suitespecs:=sid:unstable}
 
 t-git-next-date () {
@@ -113,7 +114,7 @@ t-grep-mpat () {
 t-expect-push-fail () {
        local mpat="$1"; shift
 
-       local triedpush=`git rev-parse HEAD`
+       local triedpush; triedpush=`git rev-parse HEAD`
 
        t-reporefs pre-push
        t-expect-fail "$mpat"  "$@"
@@ -188,14 +189,29 @@ t-git-merge-base () {
 }
 
 t-has-ancestor () {
-       local now=`git rev-parse HEAD`
-       local ancestor=`git rev-parse $1^{}`
-       local mbase=`t-git-merge-base $ancestor $now`
+       # t-has-ancestor ANCESTOR
+       # (CHILD is implicit, HEAD)
+       local now;      now=`git rev-parse HEAD`
+       local ancestor; ancestor=`git rev-parse $1^{}`
+       local mbase;    mbase=`t-git-merge-base $ancestor $now`
        if [ x$mbase != x$ancestor ]; then
                fail "not ff $ancestor..$now, $mbase != $ancestor"
        fi
 }
 
+t-has-parent-or-is () {
+       # t-has-parent-or-is CHILD PARENT
+       local child=$1
+       local parent=$2
+       local parents
+       parents=$(git show --pretty=format:' %P %H ' "$child")
+       parent=$(git rev-parse "$parent~0")
+       case "$parents" in
+       *" $parent "*)  ;;
+       *)      fail "child $child lacks parent $parent" ;;
+       esac
+}
+
 t-prep-newpackage () {
        t-select-package $1
        v=$2
@@ -212,6 +228,9 @@ t-prep-newpackage () {
 
 t-archive-none () {
        t-select-package $1
+       t-archive-none-$t_archive_method
+}
+t-archive-none-aq () {
        mkdir -p $tmp/aq/dsc_in_suite $tmp/mirror/pool/main
 
        : >$tmp/aq/suites
@@ -223,10 +242,10 @@ t-archive-none () {
                local sname=${suitespec#*:}
 
                >$tmp/aq/package.$suite.$p
-               t-archive-updated $suite $p
+               t-aq-archive-updated $suite $p
 
                >$tmp/aq/package.new.$p
-               t-archive-updated new $p
+               t-aq-archive-updated new $p
 
                ln -sf $suite $tmp/aq/dsc_in_suite/$sname
 
@@ -253,7 +272,7 @@ END
 END
 }
 
-t-archive-updated () {
+t-aq-archive-updated () {
        local suite=$1
        local p=$2
        local suitedir=$tmp/aq/dsc_in_suite/$suite
@@ -278,16 +297,23 @@ t-archive-updated () {
 
 t-archive-process-incoming () {
        local suite=$1
-       mv $tmp/incoming/${p}_${v}[._]* $tmp/mirror/pool/main/
+       mv $tmp/incoming/${p}_* $tmp/mirror/pool/main/
        t-archive-query "$suite"
 }
 
 t-archive-query () {
        local suite=${1-sid}
        local dscf=main/${p}_${v}.dsc
-       local sha=`sha256sum <$tmp/mirror/pool/$dscf`
+       t-archive-query-$t_archive_method "$suite" "$p" "$v" "$dscf"
+}
+t-archive-query-aq () {
+       local suite=$1
+       local p=$2
+       local v=$3
+       local dscf=$4
+       local sha; sha=`sha256sum <$tmp/mirror/pool/$dscf`
        echo "${v} ${sha%  -} $dscf" >>$tmp/aq/package.$suite.${p}
-       t-archive-updated $suite $p
+       t-aq-archive-updated $suite $p
 }
 
 t-archive () {
@@ -296,7 +322,7 @@ t-archive () {
        local dscf=${p}_$2.dsc
        rm -f $tmp/mirror/pool/main/${p}_*
        ln $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/
-       t-archive-query
+       t-archive-query $suite
        rm -rf $tmp/extract
        mkdir $tmp/extract
        (set -e; cd $tmp/extract; dpkg-source -x ../mirror/pool/main/$dscf)
@@ -324,6 +350,52 @@ t-git-dir-check () {
        esac
 }
 
+t-expect-fsck-fail () {
+       echo >>$tmp/fsck.expected-errors "$1"
+}
+
+t-git-fsck () {
+       set +e
+       LC_MESSAGES=C git fsck --no-dangling --strict 2>&1 \
+               | tee dgit-test-fsck.errs
+       ps="${PIPESTATUS[*]}"
+       set -e
+
+       local pats
+       if [ -f $tmp/fsck.expected-errors ]; then
+               pats=(-w -f $tmp/fsck.expected-errors)
+       else
+               test "$ps" = "0 0"
+       fi
+       pats+=(-e 'notice: HEAD points to an unborn branch')
+       pats+=(-e 'notice: No default references')
+
+       set +e
+       grep -v "${pats[@]}" dgit-test-fsck.errs
+       rc=$?
+       set -e
+       case $rc in
+       1) ;; # no unexpected errors
+       0) fail "unexpected messages from git-fsck" ;;
+       *) fail "grep of git-fsck failed" ;;
+       esac
+}
+
+t-fscks () {
+       (
+       shopt -s nullglob
+       for d in $tmp/*/.git $tmp/git/*.git; do
+               cd "$d"
+               t-git-fsck
+       done
+       )
+}
+
+t-ok () {
+       t-fscks
+       echo ok.
+}
+
 t-rm-dput-dropping () {
        rm -f $tmp/${p}_${v}_*.upload
 }
@@ -334,7 +406,9 @@ t-dgit () {
        : '
 {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'
        $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \
-               -dtest-dummy $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \
+ ${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \
+               ${distro--dtest-dummy} ${distro+${distro:+-d}${distro}} \
+               $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \
                -k39B13D8A $t_dgit_xopts "$@"
        : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
 '
@@ -457,35 +531,37 @@ t-git-get-ref () {
 
 t-ref-same-exact () {
        local name="$1"
-       local val=`t-git-get-ref-exact $name`
+       local val; val=`t-git-get-ref-exact $name`
        t-ref-same-val "$name" $val
 }
 
 t-ref-same () {
        local name="$1"
-       local val=`t-git-get-ref $name`
+       local val; val=`t-git-get-ref $name`
        t-ref-same-val "$name" $val
 }
 
 t-ref-head () {
-       local val=`git rev-parse HEAD`
+       local val; val=`git rev-parse HEAD`
        t-ref-same-val HEAD $val
 }
 
 t-ref-same-val () {
        local name="$1"
        local val=$2
-       case "$t_ref_val" in
-       '')             ;;
+       case "${t_ref_val-unset}" in
+       unset)          ;;
        "$val")         ;;
-       *)              fail "ref varies: $name:\
- ${val:-nothing} != ${t_ref_val:-nothing}" ;;
+       *)              fail "ref varies: ($name)\
+ ${val:-nothing} != ${t_ref_val:-nothing} (${t_ref_names[*]})" ;;
        esac
        t_ref_val="$val"
+       t_ref_names+=("$name")
 }
 
 t-refs-same-start () {
-       t_ref_val=''
+       unset t_ref_val
+       t_ref_names=()
 }
 
 t-refs-same () {
@@ -516,11 +592,11 @@ t-format-ref () {
 t-sametree-parent () {
        local ref=$1
        local parent
-       local ctree=$(t-format-ref '%T' "$ref")
+       local ctree; ctree=$(t-format-ref '%T' "$ref")
        while :; do
                local psame=''
                for parent in $(t-format-ref '%P' "$ref"); do
-                       local ptree=$(t-format-ref '%T' "$parent")
+                       local ptree; ptree=$(t-format-ref '%T' "$parent")
                        if [ "x$ptree" = "x$ctree" ]; then
                                psame+=" $parent"
                        fi
@@ -532,11 +608,11 @@ t-sametree-parent () {
 }
 
 t-check-pushed-master () {
-       local master=`t-git-get-ref refs/heads/master`
+       local master; master=`t-git-get-ref refs/heads/master`
        if [ x$master = x$t_ref_val ]; then return; fi
        if [ x$master = x ]; then fail "failed to push master"; fi
        # didn't update master, it must be not FF
-       local mbase=`t-git-merge-base $master $t_ref_val`
+       local mbase; mbase=`t-git-merge-base $master $t_ref_val`
        if [ x$mbase = x$master ]; then fail "failed to ff master"; fi
 }
 
@@ -573,6 +649,7 @@ t-splitbrain-pushed-good--unpack () {
        mkdir t-unpack
        cd t-unpack
        ln -s $tmp/mirror/pool/main/*.orig*.tar* .
+       ln -s $tmp/incoming/*.orig*.tar* . ||:
        ln -s $incoming_dsc .
        ln -s ${incoming_dsc/.dsc/.debian.tar}* .
        dpkg-source "$@" -x *.dsc
@@ -602,6 +679,13 @@ t-splitbrain-pushed-good-start () {
        git merge-base --is-ancestor $dep14tag $dgittag
 
        t-refs-same-start
+       t-ref-same refs/heads/split.p
+       case "$(t-git-get-ref refs/heads/split.b)" in
+       "$t_ref_val") ;;
+       "$(git rev-parse refs/heads/split.p^0)") ;;
+       "$(git rev-parse refs/heads/split.p^1)") ;;
+       *) fail 'bad b/p' ;;
+       esac
        t-pushed-good-core
 
        t-incoming-dsc
@@ -707,12 +791,41 @@ t-stunt-envvar () {
        '
 }
 
+t-tstunt--save-real () {
+       local f="$1"
+       case "$f" in
+       */*) return ;;
+       esac
+
+       local rc
+       local real
+       set +e
+       real=$(type -p "$f")
+       rc=$?
+       set -e
+
+       case $rc in
+       1)      return ;;
+       0)      ;;
+       *)      fail "did not find $f on PATH $PATH" ;;
+       esac
+
+       local varname=${f//[^_0-9a-zA-Z]/_}
+       varname=DGIT_TEST_REAL_${varname^^}
+
+       eval "
+               : \${$varname:=\$real}
+               export $varname
+       "
+}
+
 t-tstunt () {
        local tstunt=$tmp/tstunt
        t-stunt-envvar PATH $tstunt
        t-stunt-envvar PERLLIB $tstunt
        local f
        for f in "$@"; do
+               t-tstunt--save-real $f
                f="./$f"
                local d="$tstunt/${f%/*}"
                mkdir -p $d
@@ -724,6 +837,14 @@ t-tstunt-parsechangelog () {
        t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm
 }
 
+t-tstunt-lintian () {
+       t-tstunt lintian
+}
+
+t-tstunt-debuild () {
+       t-tstunt debuild
+}
+
 t-incoming-dsc () {
        local dsc=${p}_${v}.dsc
        incoming_dsc=$tmp/incoming/$dsc
@@ -731,8 +852,12 @@ t-incoming-dsc () {
 
 t-ref-dsc-dgit () {
        t-incoming-dsc
-       local val=`t-822-field $incoming_dsc Dgit`
-       perl -e '$_=shift @ARGV; die "Dgit $_ ?" unless m/^\w+\b/;' "$val"
+       local val; val=`t-822-field $incoming_dsc Dgit`
+       val=$( perl -e '
+               $_=shift @ARGV;
+               die "Dgit $_ ?" unless m/^\w+\b/;
+               print $&,"\n" or die $!;
+       ' "$val")
        t-ref-same-val $incoming_dsc "$val"
 }
 
@@ -807,10 +932,19 @@ t-gbp-example-prep () {
                remotes/dgit/dgit/sid
 }
 
+t-make-badcommit () {
+       badcommit=$(
+               git cat-file commit HEAD | \
+               perl -pe 's/^committer /commiter /' | \
+               git hash-object -w -t commit --stdin
+       )
+       t-expect-fsck-fail $badcommit
+}
+
 t-commit () {
        local msg=$1
        v=${2:-${majorv:-1}.$revision}
-       dch -v$v --distribution ${3:-unstable} "$1"
+       dch --force-distribution -v$v --distribution ${3:-unstable} "$1"
        git add debian/changelog
        debcommit
        revision=$(( ${revision-0} + 1 ))
@@ -825,7 +959,7 @@ t-drs () {
  t-git-config dgit-distro.test-dummy.git-url "ext::$troot/drs-git-ext %S "
  t-git-config dgit-distro.test-dummy.git-check true
  t-git-config dgit-distro.test-dummy.git-create true
- t-git-config dgit-distro.test-dummy.dgit-tag-format old,new
+ t-git-config dgit-distro.test-dummy.dgit-tag-format new,old,maint
        cp $troot/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/.
        cp $troot/suites $tmp/.
        cp $troot/suites $tmp/suites-master
@@ -852,6 +986,7 @@ t-newtag () {
  t-git-config dgit-distro.test-dummy.dgit-tag-format new,maint
 }
 t-oldtag () {
+ export tagpfx=test-dummy
  t-git-config dgit-distro.test-dummy.dgit-tag-format old
 }