Blame ci/test.sh

Packit ae9e2a
#!/usr/bin/env bash
Packit ae9e2a
Packit ae9e2a
set -e
Packit ae9e2a
Packit ae9e2a
if [ -n "$SKIP_TESTS" ]; then
Packit ae9e2a
	exit 0
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
SOURCE_DIR=${SOURCE_DIR:-$( cd "$( dirname "${BASH_SOURCE[0]}" )" && dirname $( pwd ) )}
Packit ae9e2a
BUILD_DIR=$(pwd)
Packit ae9e2a
TMPDIR=${TMPDIR:-/tmp}
Packit ae9e2a
USER=${USER:-$(whoami)}
Packit ae9e2a
Packit ae9e2a
SUCCESS=1
Packit ae9e2a
Packit ae9e2a
VALGRIND="valgrind --leak-check=full --show-reachable=yes --error-exitcode=125 --num-callers=50 --suppressions=\"$SOURCE_DIR/libgit2_clar.supp\""
Packit ae9e2a
LEAKS="MallocStackLogging=1 MallocScribble=1 leaks -quiet -atExit -- nohup"
Packit ae9e2a
Packit ae9e2a
cleanup() {
Packit ae9e2a
	echo "Cleaning up..."
Packit ae9e2a
Packit ae9e2a
	if [ ! -z "$GITDAEMON_DIR" -a -f "${GITDAEMON_DIR}/pid" ]; then
Packit ae9e2a
		echo "Stopping git daemon..."
Packit ae9e2a
		kill $(cat "${GITDAEMON_DIR}/pid")
Packit ae9e2a
	fi
Packit ae9e2a
Packit ae9e2a
	if [ ! -z "$SSHD_DIR" -a -f "${SSHD_DIR}/pid" ]; then
Packit ae9e2a
		echo "Stopping SSH..."
Packit ae9e2a
		kill $(cat "${SSHD_DIR}/pid")
Packit ae9e2a
	fi
Packit ae9e2a
Packit ae9e2a
	echo "Done."
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
failure() {
Packit ae9e2a
	echo "Test exited with code: $1"
Packit ae9e2a
	SUCCESS=0
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
# Ask ctest what it would run if we were to invoke it directly.  This lets
Packit ae9e2a
# us manage the test configuration in a single place (tests/CMakeLists.txt)
Packit ae9e2a
# instead of running clar here as well.  But it allows us to wrap our test
Packit ae9e2a
# harness with a leak checker like valgrind.  Append the option to write
Packit ae9e2a
# JUnit-style XML files.
Packit ae9e2a
run_test() {
Packit ae9e2a
	TEST_CMD=$(ctest -N -V -R "^${1}$" | sed -n 's/^[0-9]*: Test command: //p')
Packit ae9e2a
	TEST_CMD="${TEST_CMD} -r${BUILD_DIR}/results_${1}.xml"
Packit ae9e2a
Packit ae9e2a
	if [ "$LEAK_CHECK" = "valgrind" ]; then
Packit ae9e2a
		RUNNER="$VALGRIND $TEST_CMD"
Packit ae9e2a
	elif [ "$LEAK_CHECK" = "leaks" ]; then
Packit ae9e2a
		RUNNER="$LEAKS $TEST_CMD"
Packit ae9e2a
	else
Packit ae9e2a
		RUNNER="$TEST_CMD"
Packit ae9e2a
	fi
Packit ae9e2a
Packit ae9e2a
	eval $RUNNER || failure
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
# Configure the test environment; run them early so that we're certain
Packit ae9e2a
# that they're started by the time we need them.
Packit ae9e2a
Packit ae9e2a
echo "##############################################################################"
Packit ae9e2a
echo "## Configuring test environment"
Packit ae9e2a
echo "##############################################################################"
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_GITDAEMON_TESTS" ]; then
Packit ae9e2a
	echo "Starting git daemon..."
Packit ae9e2a
	GITDAEMON_DIR=`mktemp -d ${TMPDIR}/gitdaemon.XXXXXXXX`
Packit ae9e2a
	git init --bare "${GITDAEMON_DIR}/test.git"
Packit ae9e2a
	git daemon --listen=localhost --export-all --enable=receive-pack --pid-file="${GITDAEMON_DIR}/pid" --base-path="${GITDAEMON_DIR}" "${GITDAEMON_DIR}" 2>/dev/null &
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_PROXY_TESTS" ]; then
Packit ae9e2a
	echo "Starting HTTP proxy..."
Packit ae9e2a
	curl -L https://github.com/ethomson/poxyproxy/releases/download/v0.1.0/poxyproxy-0.1.0.jar >poxyproxy.jar
Packit ae9e2a
	java -jar poxyproxy.jar -d --port 8080 --credentials foo:bar >/dev/null 2>&1 &
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_SSH_TESTS" ]; then
Packit ae9e2a
	echo "Starting ssh daemon..."
Packit ae9e2a
	HOME=`mktemp -d ${TMPDIR}/home.XXXXXXXX`
Packit ae9e2a
	SSHD_DIR=`mktemp -d ${TMPDIR}/sshd.XXXXXXXX`
Packit ae9e2a
	git init --bare "${SSHD_DIR}/test.git"
Packit ae9e2a
	cat >"${SSHD_DIR}/sshd_config" <<-EOF
Packit ae9e2a
	Port 2222
Packit ae9e2a
	ListenAddress 0.0.0.0
Packit ae9e2a
	Protocol 2
Packit ae9e2a
	HostKey ${SSHD_DIR}/id_rsa
Packit ae9e2a
	PidFile ${SSHD_DIR}/pid
Packit ae9e2a
	AuthorizedKeysFile ${HOME}/.ssh/authorized_keys
Packit ae9e2a
	LogLevel DEBUG
Packit ae9e2a
	RSAAuthentication yes
Packit ae9e2a
	PasswordAuthentication yes
Packit ae9e2a
	PubkeyAuthentication yes
Packit ae9e2a
	ChallengeResponseAuthentication no
Packit ae9e2a
	StrictModes no
Packit ae9e2a
	# Required here as sshd will simply close connection otherwise
Packit ae9e2a
	UsePAM no
Packit ae9e2a
	EOF
Packit ae9e2a
	ssh-keygen -t rsa -f "${SSHD_DIR}/id_rsa" -N "" -q
Packit ae9e2a
	/usr/sbin/sshd -f "${SSHD_DIR}/sshd_config" -E "${SSHD_DIR}/log"
Packit ae9e2a
Packit ae9e2a
	# Set up keys
Packit ae9e2a
	mkdir "${HOME}/.ssh"
Packit ae9e2a
	ssh-keygen -t rsa -f "${HOME}/.ssh/id_rsa" -N "" -q
Packit ae9e2a
	cat "${HOME}/.ssh/id_rsa.pub" >>"${HOME}/.ssh/authorized_keys"
Packit ae9e2a
	while read algorithm key comment; do
Packit ae9e2a
		echo "[localhost]:2222 $algorithm $key" >>"${HOME}/.ssh/known_hosts"
Packit ae9e2a
	done <"${SSHD_DIR}/id_rsa.pub"
Packit ae9e2a
Packit ae9e2a
	# Get the fingerprint for localhost and remove the colons so we can
Packit ae9e2a
	# parse it as a hex number. Older versions have a different output
Packit ae9e2a
	# format.
Packit ae9e2a
	if [[ $(ssh -V 2>&1) == OpenSSH_6* ]]; then
Packit ae9e2a
		SSH_FINGERPRINT=$(ssh-keygen -F '[localhost]:2222' -f "${HOME}/.ssh/known_hosts" -l | tail -n 1 | cut -d ' ' -f 2 | tr -d ':')
Packit ae9e2a
	else
Packit ae9e2a
		SSH_FINGERPRINT=$(ssh-keygen -E md5 -F '[localhost]:2222' -f "${HOME}/.ssh/known_hosts" -l | tail -n 1 | cut -d ' ' -f 3 | cut -d : -f2- | tr -d :)
Packit ae9e2a
	fi
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
# Run the tests that do not require network connectivity.
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_OFFLINE_TESTS" ]; then
Packit ae9e2a
	echo ""
Packit ae9e2a
	echo "##############################################################################"
Packit ae9e2a
	echo "## Running (offline) tests"
Packit ae9e2a
	echo "##############################################################################"
Packit ae9e2a
Packit ae9e2a
	run_test offline
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_ONLINE_TESTS" ]; then
Packit ae9e2a
	# Run the various online tests.  The "online" test suite only includes the
Packit ae9e2a
	# default online tests that do not require additional configuration.  The
Packit ae9e2a
	# "proxy" and "ssh" test suites require further setup.
Packit ae9e2a
Packit ae9e2a
	echo ""
Packit ae9e2a
	echo "##############################################################################"
Packit ae9e2a
	echo "## Running (online) tests"
Packit ae9e2a
	echo "##############################################################################"
Packit ae9e2a
Packit ae9e2a
	run_test online
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_GITDAEMON_TESTS" ]; then
Packit ae9e2a
	echo ""
Packit ae9e2a
	echo "Running gitdaemon tests"
Packit ae9e2a
	echo ""
Packit ae9e2a
Packit ae9e2a
	export GITTEST_REMOTE_URL="git://localhost/test.git"
Packit ae9e2a
	run_test gitdaemon
Packit ae9e2a
	unset GITTEST_REMOTE_URL
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_PROXY_TESTS" ]; then
Packit ae9e2a
	echo ""
Packit ae9e2a
	echo "Running proxy tests"
Packit ae9e2a
	echo ""
Packit ae9e2a
Packit ae9e2a
	export GITTEST_REMOTE_PROXY_URL="localhost:8080"
Packit ae9e2a
	export GITTEST_REMOTE_PROXY_USER="foo"
Packit ae9e2a
	export GITTEST_REMOTE_PROXY_PASS="bar"
Packit ae9e2a
	run_test proxy
Packit ae9e2a
	unset GITTEST_REMOTE_PROXY_URL
Packit ae9e2a
	unset GITTEST_REMOTE_PROXY_USER
Packit ae9e2a
	unset GITTEST_REMOTE_PROXY_PASS
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
if [ -z "$SKIP_SSH_TESTS" ]; then
Packit ae9e2a
	echo ""
Packit ae9e2a
	echo "Running ssh tests"
Packit ae9e2a
	echo ""
Packit ae9e2a
Packit ae9e2a
	export GITTEST_REMOTE_URL="ssh://localhost:2222/$SSHD_DIR/test.git"
Packit ae9e2a
	export GITTEST_REMOTE_USER=$USER
Packit ae9e2a
	export GITTEST_REMOTE_SSH_KEY="${HOME}/.ssh/id_rsa"
Packit ae9e2a
	export GITTEST_REMOTE_SSH_PUBKEY="${HOME}/.ssh/id_rsa.pub"
Packit ae9e2a
	export GITTEST_REMOTE_SSH_PASSPHRASE=""
Packit ae9e2a
	export GITTEST_REMOTE_SSH_FINGERPRINT="${SSH_FINGERPRINT}"
Packit ae9e2a
	run_test ssh
Packit ae9e2a
	unset GITTEST_REMOTE_URL
Packit ae9e2a
	unset GITTEST_REMOTE_USER
Packit ae9e2a
	unset GITTEST_REMOTE_SSH_KEY
Packit ae9e2a
	unset GITTEST_REMOTE_SSH_PUBKEY
Packit ae9e2a
	unset GITTEST_REMOTE_SSH_PASSPHRASE
Packit ae9e2a
	unset GITTEST_REMOTE_SSH_FINGERPRINT
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
cleanup
Packit ae9e2a
Packit ae9e2a
if [ "$SUCCESS" -ne "1" ]; then
Packit ae9e2a
	echo "Some tests failed."
Packit ae9e2a
	exit 1
Packit ae9e2a
fi
Packit ae9e2a
Packit ae9e2a
echo "Success."
Packit ae9e2a
exit 0