Blame ci/test.sh

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