test.sh 9.1 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
SUCCESS=1
20
CONTINUE_ON_FAILURE=0
21

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

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

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

	echo "Done."
36 37
}

38
run_test() {
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
	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
54 55

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

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

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

	if [ "$FAILED" -ne 0 ]; then
68 69 70 71
		if [ "$CONTINUE_ON_FAILURE" -ne 1 ]; then
			exit 1
		fi

72 73
		SUCCESS=0
	fi
74
}
75

76 77 78
# Configure the test environment; run them early so that we're certain
# that they're started by the time we need them.

79
echo "##############################################################################"
80
echo "## Configuring test environment"
81 82 83 84 85 86
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"
87 88
	git daemon --listen=localhost --export-all --enable=receive-pack --base-path="${GITDAEMON_DIR}" "${GITDAEMON_DIR}" 2>/dev/null &
	GITDAEMON_PID=$!
89
	disown $GITDAEMON_PID
90 91 92
fi

if [ -z "$SKIP_PROXY_TESTS" ]; then
93
	curl --location --silent --show-error https://github.com/ethomson/poxyproxy/releases/download/v0.7.0/poxyproxy-0.7.0.jar >poxyproxy.jar
94 95 96 97 98 99 100 101

	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 &
102 103
fi

Edward Thomson committed
104
if [ -z "$SKIP_NTLM_TESTS" ]; then
105
	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
106 107 108 109 110 111 112 113

	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

114 115 116 117 118 119
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
120 121 122 123 124
	Port 2222
	ListenAddress 0.0.0.0
	Protocol 2
	HostKey ${SSHD_DIR}/id_rsa
	PidFile ${SSHD_DIR}/pid
125 126
	AuthorizedKeysFile ${HOME}/.ssh/authorized_keys
	LogLevel DEBUG
127 128 129 130
	RSAAuthentication yes
	PasswordAuthentication yes
	PubkeyAuthentication yes
	ChallengeResponseAuthentication no
131
	StrictModes no
132 133
	# Required here as sshd will simply close connection otherwise
	UsePAM no
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
	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
154 155 156 157
fi

# Run the tests that do not require network connectivity.

158 159 160 161 162
if [ -z "$SKIP_OFFLINE_TESTS" ]; then
	echo ""
	echo "##############################################################################"
	echo "## Running (offline) tests"
	echo "##############################################################################"
163

164
	run_test offline
165
fi
166

167
if [ -n "$RUN_INVASIVE_TESTS" ]; then
168 169 170 171 172 173 174 175 176 177 178 179 180
	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

181
if [ -z "$SKIP_ONLINE_TESTS" ]; then
182 183 184
	# Run the 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.
185

186 187 188 189
	echo ""
	echo "##############################################################################"
	echo "## Running (online) tests"
	echo "##############################################################################"
190

191
	export GITTEST_FLAKY_RETRY=5
192
	run_test online
193
	unset GITTEST_FLAKY_RETRY
194 195 196 197 198 199 200 201

	# Run the online tests that immutably change global state separately
	# to avoid polluting the test environment.
	echo ""
	echo "##############################################################################"
	echo "## Running (online_customcert) tests"
	echo "##############################################################################"
	run_test online_customcert
202
fi
203

204 205 206 207
if [ -z "$SKIP_GITDAEMON_TESTS" ]; then
	echo ""
	echo "Running gitdaemon tests"
	echo ""
208

209
	export GITTEST_REMOTE_URL="git://localhost/test.git"
210
	run_test gitdaemon
211 212
	unset GITTEST_REMOTE_URL
fi
213

214 215
if [ -z "$SKIP_PROXY_TESTS" ]; then
	echo ""
216
	echo "Running proxy tests (Basic authentication)"
217 218
	echo ""

219
	export GITTEST_REMOTE_PROXY_HOST="localhost:8080"
220 221
	export GITTEST_REMOTE_PROXY_USER="foo"
	export GITTEST_REMOTE_PROXY_PASS="bar"
222
	run_test proxy
223
	unset GITTEST_REMOTE_PROXY_HOST
224 225
	unset GITTEST_REMOTE_PROXY_USER
	unset GITTEST_REMOTE_PROXY_PASS
226 227 228 229 230 231 232 233

	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"
234
	export GITTEST_FLAKY_RETRY=5
235
	run_test proxy
236
	unset GITTEST_FLAKY_RETRY
237 238 239
	unset GITTEST_REMOTE_PROXY_HOST
	unset GITTEST_REMOTE_PROXY_USER
	unset GITTEST_REMOTE_PROXY_PASS
240
fi
241

Edward Thomson committed
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
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

268 269 270 271 272 273 274 275 276 277 278 279 280 281
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
282
	run_test auth_clone
283 284 285
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_DEFAULT

286 287 288 289 290 291 292
	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
293
	run_test auth_clone
294 295 296 297
	unset GITTEST_REMOTE_URL
	unset GITTEST_REMOTE_DEFAULT
	unset GITTEST_REMOTE_EXPECTCONTINUE

298 299 300
	kdestroy -A
fi

301 302 303 304 305 306 307 308 309 310 311
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}"
312
	run_test ssh
313 314 315 316 317 318 319
	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
320

321 322 323 324 325 326
if [ -z "$SKIP_FUZZERS" ]; then
	echo ""
	echo "##############################################################################"
	echo "## Running fuzzers"
	echo "##############################################################################"

327
	ctest -V -R 'fuzzer'
328 329
fi

330
cleanup
331

332
if [ "$SUCCESS" -ne 1 ]; then
333 334 335 336 337
	echo "Some tests failed."
	exit 1
fi

echo "Success."
338
exit 0