git/t/interop/interop-lib.sh
Jeff King 3d8936153d t: add an interoperability test harness
The current test suite is good at letting you test a
particular version of Git. But it's not very good at letting
you test _two_ versions and seeing how they interact (e.g.,
one cloning from the other).

This commit adds a test harness that will build two
arbitrary versions of git and make it easy to call them from
inside your tests. See the README and the example script for
details.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-10 14:30:25 -08:00

93 lines
1.8 KiB
Bash

# Interoperability testing framework. Each script should source
# this after setting default $VERSION_A and $VERSION_B variables.
. ../../GIT-BUILD-OPTIONS
INTEROP_ROOT=$(pwd)
BUILD_ROOT=$INTEROP_ROOT/build
build_version () {
if test -z "$1"
then
echo >&2 "error: test script did not set default versions"
return 1
fi
if test "$1" = "."
then
git rev-parse --show-toplevel
return 0
fi
sha1=$(git rev-parse "$1^{tree}") || return 1
dir=$BUILD_ROOT/$sha1
if test -e "$dir/.built"
then
echo "$dir"
return 0
fi
echo >&2 "==> Building $1..."
mkdir -p "$dir" || return 1
(cd "$(git rev-parse --show-cdup)" && git archive --format=tar "$sha1") |
(cd "$dir" && tar x) ||
return 1
for config in config.mak config.mak.autogen config.status
do
if test -e "$INTEROP_ROOT/../../$config"
then
cp "$INTEROP_ROOT/../../$config" "$dir/" || return 1
fi
done
(
cd "$dir" &&
make $GIT_INTEROP_MAKE_OPTS >&2 &&
touch .built
) || return 1
echo "$dir"
}
# Old versions of git don't have bin-wrappers, so let's give a rough emulation.
wrap_git () {
write_script "$1" <<-EOF
GIT_EXEC_PATH="$2"
export GIT_EXEC_PATH
PATH="$2:\$PATH"
export GIT_EXEC_PATH
exec git "\$@"
EOF
}
generate_wrappers () {
mkdir -p .bin &&
wrap_git .bin/git.a "$DIR_A" &&
wrap_git .bin/git.b "$DIR_B" &&
write_script .bin/git <<-\EOF &&
echo >&2 fatal: test tried to run generic git
exit 1
EOF
PATH=$(pwd)/.bin:$PATH
}
VERSION_A=${GIT_TEST_VERSION_A:-$VERSION_A}
VERSION_B=${GIT_TEST_VERSION_B:-$VERSION_B}
if ! DIR_A=$(build_version "$VERSION_A") ||
! DIR_B=$(build_version "$VERSION_B")
then
echo >&2 "fatal: unable to build git versions"
exit 1
fi
TEST_DIRECTORY=$INTEROP_ROOT/..
TEST_OUTPUT_DIRECTORY=$INTEROP_ROOT
TEST_NO_CREATE_REPO=t
. "$TEST_DIRECTORY"/test-lib.sh
generate_wrappers || die "unable to set up interop test environment"