test.sh 8.67 KB
Newer Older
1
#!/usr/bin/env bash
2 3 4 5

set -e

if [ -n "$SKIP_TESTS" ]; then
6
	exit 0
7 8
fi

Edward Thomson committed
9 10 11 12 13
# Windows doesn't run the NTLM tests properly (yet)
if [[ "$(uname -s)" == MINGW* ]]; then
        SKIP_NTLM_TESTS=1
fi

14 15 16 17 18
SOURCE_DIR=${SOURCE_DIR:-$( cd "$( dirname "${BASH_SOURCE[0]}" )" && dirname $( pwd ) )}
BUILD_DIR=$(pwd)
TMPDIR=${TMPDIR:-/tmp}
USER=${USER:-$(whoami)}

19 20
SUCCESS=1

21 22 23
cleanup() {
	echo "Cleaning up..."

24
	if [ ! -z "$GITDAEMON_PID" ]; then
25
		echo "Stopping git daemon..."
26
		kill $GITDAEMON_PID
27 28 29
	fi

	if [ ! -z "$SSHD_DIR" -a -f "${SSHD_DIR}/pid" ]; then
30
		echo "Stopping SSH..."
31 32
		kill $(cat "${SSHD_DIR}/pid")
	fi
33 34

	echo "Done."
35 36
}

37
run_test() {
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
	if [[ "$GITTEST_FLAKY_RETRY" > 0 ]]; then
		ATTEMPTS_REMAIN=$GITTEST_FLAKY_RETRY
	else
		ATTEMPTS_REMAIN=1
	fi

	FAILED=0
	while [[ "$ATTEMPTS_REMAIN" > 0 ]]; do
		if [ "$FAILED" -eq 1 ]; then
			echo ""
			echo "Re-running flaky ${1} tests..."
			echo ""
		fi

		RETURN_CODE=0
53 54

		CLAR_SUMMARY="${BUILD_DIR}/results_${1}.xml" ctest -V -R "^${1}$" || RETURN_CODE=$? && true
55 56

		if [ "$RETURN_CODE" -eq 0 ]; then
57
			FAILED=0
58 59 60 61 62 63 64 65 66 67 68
			break
		fi

		echo "Test exited with code: $RETURN_CODE"
		ATTEMPTS_REMAIN="$(($ATTEMPTS_REMAIN-1))"
		FAILED=1
	done

	if [ "$FAILED" -ne 0 ]; then
		SUCCESS=0
	fi
69
}
70

71 72 73
# Configure the test environment; run them early so that we're certain
# that they're started by the time we need them.

74
echo "##############################################################################"
75
echo "## Configuring test environment"
76 77 78 79 80 81
echo "##############################################################################"

if [ -z "$SKIP_GITDAEMON_TESTS" ]; then
	echo "Starting git daemon..."
	GITDAEMON_DIR=`mktemp -d ${TMPDIR}/gitdaemon.XXXXXXXX`
	git init --bare "${GITDAEMON_DIR}/test.git"
82 83
	git daemon --listen=localhost --export-all --enable=receive-pack --base-path="${GITDAEMON_DIR}" "${GITDAEMON_DIR}" 2>/dev/null &
	GITDAEMON_PID=$!
84
	disown $GITDAEMON_PID
85 86 87
fi

if [ -z "$SKIP_PROXY_TESTS" ]; then
88
	curl --location --silent --show-error https://github.com/ethomson/poxyproxy/releases/download/v0.7.0/poxyproxy-0.7.0.jar >poxyproxy.jar
89 90 91 92 93 94 95 96

	echo ""
	echo "Starting HTTP proxy (Basic)..."
	java -jar poxyproxy.jar --address 127.0.0.1 --port 8080 --credentials foo:bar --auth-type basic --quiet &

	echo ""
	echo "Starting HTTP proxy (NTLM)..."
	java -jar poxyproxy.jar --address 127.0.0.1 --port 8090 --credentials foo:bar --auth-type ntlm --quiet &
97 98
fi

Edward Thomson committed
99
if [ -z "$SKIP_NTLM_TESTS" ]; then
100
	curl --location --silent --show-error https://github.com/ethomson/poxygit/releases/download/v0.4.0/poxygit-0.4.0.jar >poxygit.jar
Edward Thomson committed
101 102 103 104 105 106 107 108

	echo ""
	echo "Starting HTTP server..."
	NTLM_DIR=`mktemp -d ${TMPDIR}/ntlm.XXXXXXXX`
	git init --bare "${NTLM_DIR}/test.git"
	java -jar poxygit.jar --address 127.0.0.1 --port 9000 --credentials foo:baz --quiet "${NTLM_DIR}" &
fi

109 110 111 112 113 114
if [ -z "$SKIP_SSH_TESTS" ]; then
	echo "Starting ssh daemon..."
	HOME=`mktemp -d ${TMPDIR}/home.XXXXXXXX`
	SSHD_DIR=`mktemp -d ${TMPDIR}/sshd.XXXXXXXX`
	git init --bare "${SSHD_DIR}/test.git"
	cat >"${SSHD_DIR}/sshd_config" <<-EOF
115 116 117 118 119
	Port 2222
	ListenAddress 0.0.0.0
	Protocol 2
	HostKey ${SSHD_DIR}/id_rsa
	PidFile ${SSHD_DIR}/pid
120 121
	AuthorizedKeysFile ${HOME}/.ssh/authorized_keys
	LogLevel DEBUG
122 123 124 125
	RSAAuthentication yes
	PasswordAuthentication yes
	PubkeyAuthentication yes
	ChallengeResponseAuthentication no
126
	StrictModes no
127 128
	# Required here as sshd will simply close connection otherwise
	UsePAM no
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
	EOF
	ssh-keygen -t rsa -f "${SSHD_DIR}/id_rsa" -N "" -q
	/usr/sbin/sshd -f "${SSHD_DIR}/sshd_config" -E "${SSHD_DIR}/log"

	# Set up keys
	mkdir "${HOME}/.ssh"
	ssh-keygen -t rsa -f "${HOME}/.ssh/id_rsa" -N "" -q
	cat "${HOME}/.ssh/id_rsa.pub" >>"${HOME}/.ssh/authorized_keys"
	while read algorithm key comment; do
		echo "[localhost]:2222 $algorithm $key" >>"${HOME}/.ssh/known_hosts"
	done <"${SSHD_DIR}/id_rsa.pub"

	# Get the fingerprint for localhost and remove the colons so we can
	# parse it as a hex number. Older versions have a different output
	# format.
	if [[ $(ssh -V 2>&1) == OpenSSH_6* ]]; then
		SSH_FINGERPRINT=$(ssh-keygen -F '[localhost]:2222' -f "${HOME}/.ssh/known_hosts" -l | tail -n 1 | cut -d ' ' -f 2 | tr -d ':')
	else
		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 :)
	fi
149 150 151 152
fi

# Run the tests that do not require network connectivity.

153 154 155 156 157
if [ -z "$SKIP_OFFLINE_TESTS" ]; then
	echo ""
	echo "##############################################################################"
	echo "## Running (offline) tests"
	echo "##############################################################################"
158

159
	run_test offline
160
fi
161

162
if [ -n "$RUN_INVASIVE_TESTS" ]; then
163 164 165 166 167 168 169 170 171 172 173 174 175
	echo ""
	echo "Running invasive tests"
	echo ""

	export GITTEST_INVASIVE_FS_SIZE=1
	export GITTEST_INVASIVE_MEMORY=1
	export GITTEST_INVASIVE_SPEED=1
	run_test invasive
	unset GITTEST_INVASIVE_FS_SIZE
	unset GITTEST_INVASIVE_MEMORY
	unset GITTEST_INVASIVE_SPEED
fi

176 177 178 179
if [ -z "$SKIP_ONLINE_TESTS" ]; then
	# Run the various online tests.  The "online" test suite only includes the
	# default online tests that do not require additional configuration.  The
	# "proxy" and "ssh" test suites require further setup.
180

181 182 183 184
	echo ""
	echo "##############################################################################"
	echo "## Running (online) tests"
	echo "##############################################################################"
185

186
	export GITTEST_FLAKY_RETRY=5
187
	run_test online
188
	unset GITTEST_FLAKY_RETRY
189
fi
190

191 192 193 194
if [ -z "$SKIP_GITDAEMON_TESTS" ]; then
	echo ""
	echo "Running gitdaemon tests"
	echo ""
195

196
	export GITTEST_REMOTE_URL="git://localhost/test.git"
197
	run_test gitdaemon
198 199
	unset GITTEST_REMOTE_URL
fi
200

201 202
if [ -z "$SKIP_PROXY_TESTS" ]; then
	echo ""
203
	echo "Running proxy tests (Basic authentication)"
204 205
	echo ""

206
	export GITTEST_REMOTE_PROXY_HOST="localhost:8080"
207 208
	export GITTEST_REMOTE_PROXY_USER="foo"
	export GITTEST_REMOTE_PROXY_PASS="bar"
209
	run_test proxy
210
	unset GITTEST_REMOTE_PROXY_HOST
211 212
	unset GITTEST_REMOTE_PROXY_USER
	unset GITTEST_REMOTE_PROXY_PASS
213 214 215 216 217 218 219 220

	echo ""
	echo "Running proxy tests (NTLM authentication)"
	echo ""

	export GITTEST_REMOTE_PROXY_HOST="localhost:8090"
	export GITTEST_REMOTE_PROXY_USER="foo"
	export GITTEST_REMOTE_PROXY_PASS="bar"
221
	export GITTEST_FLAKY_RETRY=5
222
	run_test proxy
223
	unset GITTEST_FLAKY_RETRY
224 225 226
	unset GITTEST_REMOTE_PROXY_HOST
	unset GITTEST_REMOTE_PROXY_USER
	unset GITTEST_REMOTE_PROXY_PASS
227
fi
228

Edward Thomson committed
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
if [ -z "$SKIP_NTLM_TESTS" ]; then
	echo ""
	echo "Running NTLM tests (IIS emulation)"
	echo ""

	export GITTEST_REMOTE_URL="http://localhost:9000/ntlm/test.git"
	export GITTEST_REMOTE_USER="foo"
	export GITTEST_REMOTE_PASS="baz"
	run_test auth_clone_and_push
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_USER
	unset GITTEST_REMOTE_PASS

	echo ""
	echo "Running NTLM tests (Apache emulation)"
	echo ""

	export GITTEST_REMOTE_URL="http://localhost:9000/broken-ntlm/test.git"
	export GITTEST_REMOTE_USER="foo"
	export GITTEST_REMOTE_PASS="baz"
	run_test auth_clone_and_push
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_USER
	unset GITTEST_REMOTE_PASS
fi

255 256 257 258 259 260 261 262 263 264 265 266 267 268
if [ -z "$SKIP_NEGOTIATE_TESTS" -a -n "$GITTEST_NEGOTIATE_PASSWORD" ]; then
	echo ""
	echo "Running SPNEGO tests"
	echo ""

	if [ "$(uname -s)" = "Darwin" ]; then
		KINIT_FLAGS="--password-file=STDIN"
	fi

	echo $GITTEST_NEGOTIATE_PASSWORD | kinit $KINIT_FLAGS test@LIBGIT2.ORG
	klist -5f

	export GITTEST_REMOTE_URL="https://test.libgit2.org/kerberos/empty.git"
	export GITTEST_REMOTE_DEFAULT="true"
Edward Thomson committed
269
	run_test auth_clone
270 271 272
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_DEFAULT

273 274 275 276 277 278 279
	echo ""
	echo "Running SPNEGO tests (expect/continue)"
	echo ""

	export GITTEST_REMOTE_URL="https://test.libgit2.org/kerberos/empty.git"
	export GITTEST_REMOTE_DEFAULT="true"
	export GITTEST_REMOTE_EXPECTCONTINUE="true"
Edward Thomson committed
280
	run_test auth_clone
281 282 283 284
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_DEFAULT
	unset GITTEST_REMOTE_EXPECTCONTINUE

285 286 287
	kdestroy -A
fi

288 289 290 291 292 293 294 295 296 297 298
if [ -z "$SKIP_SSH_TESTS" ]; then
	echo ""
	echo "Running ssh tests"
	echo ""

	export GITTEST_REMOTE_URL="ssh://localhost:2222/$SSHD_DIR/test.git"
	export GITTEST_REMOTE_USER=$USER
	export GITTEST_REMOTE_SSH_KEY="${HOME}/.ssh/id_rsa"
	export GITTEST_REMOTE_SSH_PUBKEY="${HOME}/.ssh/id_rsa.pub"
	export GITTEST_REMOTE_SSH_PASSPHRASE=""
	export GITTEST_REMOTE_SSH_FINGERPRINT="${SSH_FINGERPRINT}"
299
	run_test ssh
300 301 302 303 304 305 306
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_USER
	unset GITTEST_REMOTE_SSH_KEY
	unset GITTEST_REMOTE_SSH_PUBKEY
	unset GITTEST_REMOTE_SSH_PASSPHRASE
	unset GITTEST_REMOTE_SSH_FINGERPRINT
fi
307

308 309 310 311 312 313
if [ -z "$SKIP_FUZZERS" ]; then
	echo ""
	echo "##############################################################################"
	echo "## Running fuzzers"
	echo "##############################################################################"

314
	ctest -V -R 'fuzzer'
315 316
fi

317
cleanup
318

319
if [ "$SUCCESS" -ne 1 ]; then
320 321 322 323 324
	echo "Some tests failed."
	exit 1
fi

echo "Success."
325
exit 0