| 
							
							
							
						 |  |  | @@ -1,8 +1,9 @@ | 
		
	
		
			
				|  |  |  |  | #!/bin/sh | 
		
	
		
			
				|  |  |  |  | # Sharness test framework. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Copyright (c) 2011-2012 Mathias Lafeldt | 
		
	
		
			
				|  |  |  |  | # Copyright (c) 2005-2012 Git project | 
		
	
		
			
				|  |  |  |  | # Copyright (c) 2005-2012 Junio C Hamano | 
		
	
		
			
				|  |  |  |  | # Copyright (c) 2019-2023 Felipe Contreras | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This program is free software: you can redistribute it and/or modify | 
		
	
		
			
				|  |  |  |  | # it under the terms of the GNU General Public License as published by | 
		
	
	
		
			
				
					
					|  |  |  | @@ -17,42 +18,52 @@ | 
		
	
		
			
				|  |  |  |  | # You should have received a copy of the GNU General Public License | 
		
	
		
			
				|  |  |  |  | # along with this program.  If not, see http://www.gnu.org/licenses/ . | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | if test -n "${ZSH_VERSION-}" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	# shellcheck disable=SC2296 | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_SOURCE=${(%):-%x} | 
		
	
		
			
				|  |  |  |  | 	emulate sh -o POSIX_ARGZERO | 
		
	
		
			
				|  |  |  |  | else | 
		
	
		
			
				|  |  |  |  | 	# shellcheck disable=SC3028 | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_SOURCE=${BASH_SOURCE-$0} | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Current version of Sharness. | 
		
	
		
			
				|  |  |  |  | SHARNESS_VERSION="1.1.0" | 
		
	
		
			
				|  |  |  |  | SHARNESS_VERSION="1.2.1" | 
		
	
		
			
				|  |  |  |  | export SHARNESS_VERSION | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: The file extension for tests.  By default, it is set to "t". | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_TEST_EXTENSION:=t}" | 
		
	
		
			
				|  |  |  |  | # Public: The file extension for tests.  By default, it is set to "t". | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_EXTENSION | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_TEST_DIRECTORY:=$(dirname "$0")}" | 
		
	
		
			
				|  |  |  |  | # ensure that SHARNESS_TEST_DIRECTORY is an absolute path so that it | 
		
	
		
			
				|  |  |  |  | # is valid even if the current working directory is changed | 
		
	
		
			
				|  |  |  |  | SHARNESS_TEST_DIRECTORY=$(cd "$SHARNESS_TEST_DIRECTORY" && pwd) || exit 1 | 
		
	
		
			
				|  |  |  |  | # Public: Root directory containing tests. Tests can override this variable, | 
		
	
		
			
				|  |  |  |  | # e.g. for testing Sharness itself. | 
		
	
		
			
				|  |  |  |  | if test -z "$SHARNESS_TEST_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_TEST_DIRECTORY=$(pwd) | 
		
	
		
			
				|  |  |  |  | else | 
		
	
		
			
				|  |  |  |  | 	# ensure that SHARNESS_TEST_DIRECTORY is an absolute path so that it | 
		
	
		
			
				|  |  |  |  | 	# is valid even if the current working directory is changed | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_TEST_DIRECTORY=$(cd "$SHARNESS_TEST_DIRECTORY" && pwd) || exit 1 | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_DIRECTORY | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | if test -z "$SHARNESS_TEST_OUTPUT_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	# Similarly, override this to store the test-results subdir | 
		
	
		
			
				|  |  |  |  | 	# elsewhere | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_TEST_OUTPUT_DIRECTORY=$SHARNESS_TEST_DIRECTORY | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_TEST_SRCDIR:=$(cd "$(dirname "$SHARNESS_SOURCE")" && pwd)}" | 
		
	
		
			
				|  |  |  |  | # Public: Source directory of test code and sharness library. | 
		
	
		
			
				|  |  |  |  | # This directory may be different from the directory in which tests are | 
		
	
		
			
				|  |  |  |  | # being run. | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_SRCDIR | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_TEST_OUTDIR:=$SHARNESS_TEST_DIRECTORY}" | 
		
	
		
			
				|  |  |  |  | # Public: Directory where the output of the tests should be stored (i.e. | 
		
	
		
			
				|  |  |  |  | # trash directories). | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_OUTDIR | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #  Reset TERM to original terminal if found, otherwise save original TERM | 
		
	
		
			
				|  |  |  |  | [ "x" = "x$SHARNESS_ORIG_TERM" ] && | 
		
	
		
			
				|  |  |  |  | [ -z "$SHARNESS_ORIG_TERM" ] && | 
		
	
		
			
				|  |  |  |  | 		SHARNESS_ORIG_TERM="$TERM" || | 
		
	
		
			
				|  |  |  |  | 		TERM="$SHARNESS_ORIG_TERM" | 
		
	
		
			
				|  |  |  |  | # Public: The unsanitized TERM under which sharness is originally run | 
		
	
		
			
				|  |  |  |  | export SHARNESS_ORIG_TERM | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Export SHELL_PATH | 
		
	
		
			
				|  |  |  |  | : "${SHELL_PATH:=$SHELL}" | 
		
	
		
			
				|  |  |  |  | : "${SHELL_PATH:=/bin/sh}" | 
		
	
		
			
				|  |  |  |  | export SHELL_PATH | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # if --tee was passed, write the output not only to the terminal, but | 
		
	
	
		
			
				
					
					|  |  |  | @@ -62,8 +73,8 @@ done,*) | 
		
	
		
			
				|  |  |  |  | 	# do not redirect again | 
		
	
		
			
				|  |  |  |  | 	;; | 
		
	
		
			
				|  |  |  |  | *' --tee '*|*' --verbose-log '*) | 
		
	
		
			
				|  |  |  |  | 	mkdir -p "$SHARNESS_TEST_OUTPUT_DIRECTORY/test-results" | 
		
	
		
			
				|  |  |  |  | 	BASE="$SHARNESS_TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" ".$SHARNESS_TEST_EXTENSION")" | 
		
	
		
			
				|  |  |  |  | 	mkdir -p "$SHARNESS_TEST_OUTDIR/test-results" | 
		
	
		
			
				|  |  |  |  | 	BASE="$SHARNESS_TEST_OUTDIR/test-results/$(basename "$0" ".$SHARNESS_TEST_EXTENSION")" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	# Make this filename available to the sub-process in case it is using | 
		
	
		
			
				|  |  |  |  | 	# --verbose-log. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -128,6 +139,9 @@ while test "$#" -ne 0; do | 
		
	
		
			
				|  |  |  |  | 	--root=*) | 
		
	
		
			
				|  |  |  |  | 		root=$(expr "z$1" : 'z[^=]*=\(.*\)') | 
		
	
		
			
				|  |  |  |  | 		shift ;; | 
		
	
		
			
				|  |  |  |  | 	-x) | 
		
	
		
			
				|  |  |  |  | 		trace=t | 
		
	
		
			
				|  |  |  |  | 		shift ;; | 
		
	
		
			
				|  |  |  |  | 	--verbose-log) | 
		
	
		
			
				|  |  |  |  | 		verbose_log=t | 
		
	
		
			
				|  |  |  |  | 		shift ;; | 
		
	
	
		
			
				
					
					|  |  |  | @@ -177,6 +191,40 @@ else | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | : "${test_untraceable:=}" | 
		
	
		
			
				|  |  |  |  | # Public: When set to a non-empty value, the current test will not be | 
		
	
		
			
				|  |  |  |  | # traced, unless it's run with a Bash version supporting | 
		
	
		
			
				|  |  |  |  | # BASH_XTRACEFD, i.e. v4.1 or later. | 
		
	
		
			
				|  |  |  |  | export test_untraceable | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | if test -n "$trace" && test -n "$test_untraceable" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	# '-x' tracing requested, but this test script can't be reliably | 
		
	
		
			
				|  |  |  |  | 	# traced, unless it is run with a Bash version supporting | 
		
	
		
			
				|  |  |  |  | 	# BASH_XTRACEFD (introduced in Bash v4.1). | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	# Perform this version check _after_ the test script was | 
		
	
		
			
				|  |  |  |  | 	# potentially re-executed with $TEST_SHELL_PATH for '--tee' or | 
		
	
		
			
				|  |  |  |  | 	# '--verbose-log', so the right shell is checked and the | 
		
	
		
			
				|  |  |  |  | 	# warning is issued only once. | 
		
	
		
			
				|  |  |  |  | 	if test -n "$BASH_VERSION" && eval ' | 
		
	
		
			
				|  |  |  |  | 	     test ${BASH_VERSINFO[0]} -gt 4 || { | 
		
	
		
			
				|  |  |  |  | 	       test ${BASH_VERSINFO[0]} -eq 4 && | 
		
	
		
			
				|  |  |  |  | 	       test ${BASH_VERSINFO[1]} -ge 1 | 
		
	
		
			
				|  |  |  |  | 	     } | 
		
	
		
			
				|  |  |  |  | 	   ' | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		: Executed by a Bash version supporting BASH_XTRACEFD.  Good. | 
		
	
		
			
				|  |  |  |  | 	else | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "warning: ignoring -x; '$0' is untraceable without BASH_XTRACEFD" | 
		
	
		
			
				|  |  |  |  | 		trace= | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | if test -n "$trace" && test -z "$verbose_log" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	verbose=t | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | TERM=dumb | 
		
	
		
			
				|  |  |  |  | export TERM | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					
					|  |  |  | @@ -209,11 +257,22 @@ else | 
		
	
		
			
				|  |  |  |  | 	exec 4>/dev/null 3>/dev/null | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_failure=0 | 
		
	
		
			
				|  |  |  |  | test_count=0 | 
		
	
		
			
				|  |  |  |  | test_fixed=0 | 
		
	
		
			
				|  |  |  |  | test_broken=0 | 
		
	
		
			
				|  |  |  |  | test_success=0 | 
		
	
		
			
				|  |  |  |  | # Send any "-x" output directly to stderr to avoid polluting tests | 
		
	
		
			
				|  |  |  |  | # which capture stderr. We can do this unconditionally since it | 
		
	
		
			
				|  |  |  |  | # has no effect if tracing isn't turned on. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Note that this sets up the trace fd as soon as we assign the variable, so it | 
		
	
		
			
				|  |  |  |  | # must come after the creation of descriptor 4 above. Likewise, we must never | 
		
	
		
			
				|  |  |  |  | # unset this, as it has the side effect of closing descriptor 4, which we | 
		
	
		
			
				|  |  |  |  | # use to show verbose tests to the user. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Note also that we don't need or want to export it. The tracing is local to | 
		
	
		
			
				|  |  |  |  | # this shell, and we would not want to influence any shells we exec. | 
		
	
		
			
				|  |  |  |  | BASH_XTRACEFD=4 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: The current test number, starting at 0. | 
		
	
		
			
				|  |  |  |  | SHARNESS_TEST_NB=0 | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_NB | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | die() { | 
		
	
		
			
				|  |  |  |  | 	code=$? | 
		
	
	
		
			
				
					
					|  |  |  | @@ -228,105 +287,30 @@ die() { | 
		
	
		
			
				|  |  |  |  | EXIT_OK= | 
		
	
		
			
				|  |  |  |  | trap 'die' EXIT | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Define that a test prerequisite is available. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # The prerequisite can later be checked explicitly using test_have_prereq or | 
		
	
		
			
				|  |  |  |  | # implicitly by specifying the prerequisite name in calls to test_expect_success | 
		
	
		
			
				|  |  |  |  | # or test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - Name of prerequisite (a simple word, in all capital letters by convention) | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   # Set PYTHON prerequisite if interpreter is available. | 
		
	
		
			
				|  |  |  |  | #   command -v python >/dev/null && test_set_prereq PYTHON | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   # Set prerequisite depending on some variable. | 
		
	
		
			
				|  |  |  |  | #   test -z "$NO_GETTEXT" && test_set_prereq GETTEXT | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns nothing. | 
		
	
		
			
				|  |  |  |  | test_set_prereq() { | 
		
	
		
			
				|  |  |  |  | 	satisfied_prereq="$satisfied_prereq$1 " | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | satisfied_prereq=" " | 
		
	
		
			
				|  |  |  |  | test_prereq= | 
		
	
		
			
				|  |  |  |  | missing_prereq= | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Check if one or more test prerequisites are defined. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # The prerequisites must have previously been set with test_set_prereq. | 
		
	
		
			
				|  |  |  |  | # The most common use of this is to skip all the tests if some essential | 
		
	
		
			
				|  |  |  |  | # prerequisite is missing. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - Comma-separated list of test prerequisites. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   # Skip all remaining tests if prerequisite is not set. | 
		
	
		
			
				|  |  |  |  | #   if ! test_have_prereq PERL; then | 
		
	
		
			
				|  |  |  |  | #       skip_all='skipping perl interface tests, perl not available' | 
		
	
		
			
				|  |  |  |  | #       test_done | 
		
	
		
			
				|  |  |  |  | #   fi | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 0 if all prerequisites are defined or 1 otherwise. | 
		
	
		
			
				|  |  |  |  | test_have_prereq() { | 
		
	
		
			
				|  |  |  |  | 	# prerequisites can be concatenated with ',' | 
		
	
		
			
				|  |  |  |  | 	save_IFS=$IFS | 
		
	
		
			
				|  |  |  |  | 	IFS=, | 
		
	
		
			
				|  |  |  |  | 	set -- $@ | 
		
	
		
			
				|  |  |  |  | 	IFS=$save_IFS | 
		
	
		
			
				|  |  |  |  | test_failure=0 | 
		
	
		
			
				|  |  |  |  | test_fixed=0 | 
		
	
		
			
				|  |  |  |  | test_broken=0 | 
		
	
		
			
				|  |  |  |  | test_success=0 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	total_prereq=0 | 
		
	
		
			
				|  |  |  |  | 	ok_prereq=0 | 
		
	
		
			
				|  |  |  |  | 	missing_prereq= | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	for prerequisite; do | 
		
	
		
			
				|  |  |  |  | 		case "$prerequisite" in | 
		
	
		
			
				|  |  |  |  | 		!*) | 
		
	
		
			
				|  |  |  |  | 			negative_prereq=t | 
		
	
		
			
				|  |  |  |  | 			prerequisite=${prerequisite#!} | 
		
	
		
			
				|  |  |  |  | 			;; | 
		
	
		
			
				|  |  |  |  | 		*) | 
		
	
		
			
				|  |  |  |  | 			negative_prereq= | 
		
	
		
			
				|  |  |  |  | 		esac | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		total_prereq=$((total_prereq + 1)) | 
		
	
		
			
				|  |  |  |  | 		case "$satisfied_prereq" in | 
		
	
		
			
				|  |  |  |  | 		*" $prerequisite "*) | 
		
	
		
			
				|  |  |  |  | 			satisfied_this_prereq=t | 
		
	
		
			
				|  |  |  |  | 			;; | 
		
	
		
			
				|  |  |  |  | 		*) | 
		
	
		
			
				|  |  |  |  | 			satisfied_this_prereq= | 
		
	
		
			
				|  |  |  |  | 		esac | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		case "$satisfied_this_prereq,$negative_prereq" in | 
		
	
		
			
				|  |  |  |  | 		t,|,t) | 
		
	
		
			
				|  |  |  |  | 			ok_prereq=$((ok_prereq + 1)) | 
		
	
		
			
				|  |  |  |  | 			;; | 
		
	
		
			
				|  |  |  |  | 		*) | 
		
	
		
			
				|  |  |  |  | 			# Keep a list of missing prerequisites; restore | 
		
	
		
			
				|  |  |  |  | 			# the negative marker if necessary. | 
		
	
		
			
				|  |  |  |  | 			prerequisite=${negative_prereq:+!}$prerequisite | 
		
	
		
			
				|  |  |  |  | 			if test -z "$missing_prereq"; then | 
		
	
		
			
				|  |  |  |  | 				missing_prereq=$prerequisite | 
		
	
		
			
				|  |  |  |  | 			else | 
		
	
		
			
				|  |  |  |  | 				missing_prereq="$prerequisite,$missing_prereq" | 
		
	
		
			
				|  |  |  |  | 			fi | 
		
	
		
			
				|  |  |  |  | 		esac | 
		
	
		
			
				|  |  |  |  | 	done | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	test $total_prereq = $ok_prereq | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | if test -e "$SHARNESS_TEST_SRCDIR/lib-sharness/functions.sh" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	. "$SHARNESS_TEST_SRCDIR/lib-sharness/functions.sh" | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # You are not expected to call test_ok_ and test_failure_ directly, use | 
		
	
		
			
				|  |  |  |  | # the text_expect_* functions instead. | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_ok_() { | 
		
	
		
			
				|  |  |  |  | 	test_success=$((test_success + 1)) | 
		
	
		
			
				|  |  |  |  | 	say_color "" "ok $test_count - $*" | 
		
	
		
			
				|  |  |  |  | 	say_color "" "ok $SHARNESS_TEST_NB - $*" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_failure_() { | 
		
	
		
			
				|  |  |  |  | 	test_failure=$((test_failure + 1)) | 
		
	
		
			
				|  |  |  |  | 	say_color error "not ok $test_count - $1" | 
		
	
		
			
				|  |  |  |  | 	say_color error "not ok $SHARNESS_TEST_NB - $1" | 
		
	
		
			
				|  |  |  |  | 	shift | 
		
	
		
			
				|  |  |  |  | 	echo "$@" | sed -e 's/^/#	/' | 
		
	
		
			
				|  |  |  |  | 	test "$immediate" = "" || { EXIT_OK=t; exit 1; } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -334,53 +318,76 @@ test_failure_() { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_known_broken_ok_() { | 
		
	
		
			
				|  |  |  |  | 	test_fixed=$((test_fixed + 1)) | 
		
	
		
			
				|  |  |  |  | 	say_color error "ok $test_count - $* # TODO known breakage vanished" | 
		
	
		
			
				|  |  |  |  | 	say_color error "ok $SHARNESS_TEST_NB - $* # TODO known breakage vanished" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_known_broken_failure_() { | 
		
	
		
			
				|  |  |  |  | 	test_broken=$((test_broken + 1)) | 
		
	
		
			
				|  |  |  |  | 	say_color warn "not ok $test_count - $* # TODO known breakage" | 
		
	
		
			
				|  |  |  |  | 	say_color warn "not ok $SHARNESS_TEST_NB - $* # TODO known breakage" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Execute commands in debug mode. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Takes a single argument and evaluates it only when the test script is started | 
		
	
		
			
				|  |  |  |  | # with --debug. This is primarily meant for use during the development of test | 
		
	
		
			
				|  |  |  |  | # scripts. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - Commands to be executed. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_debug "cat some_log_file" | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns the exit code of the last command executed in debug mode or 0 | 
		
	
		
			
				|  |  |  |  | #   otherwise. | 
		
	
		
			
				|  |  |  |  | test_debug() { | 
		
	
		
			
				|  |  |  |  | 	test "$debug" = "" || eval "$1" | 
		
	
		
			
				|  |  |  |  | want_trace () { | 
		
	
		
			
				|  |  |  |  | 	test "$trace" = t && { | 
		
	
		
			
				|  |  |  |  | 		test "$verbose" = t || test "$verbose_log" = t | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Stop execution and start a shell. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is useful for debugging tests and only makes sense together with "-v". | 
		
	
		
			
				|  |  |  |  | # Be sure to remove all invocations of this command before submitting. | 
		
	
		
			
				|  |  |  |  | test_pause() { | 
		
	
		
			
				|  |  |  |  | 	if test "$verbose" = t; then | 
		
	
		
			
				|  |  |  |  | 		"$SHELL_PATH" <&6 >&3 2>&4 | 
		
	
		
			
				|  |  |  |  | 	else | 
		
	
		
			
				|  |  |  |  | 		error >&5 "test_pause requires --verbose" | 
		
	
		
			
				|  |  |  |  | # This is a separate function because some tests use | 
		
	
		
			
				|  |  |  |  | # "return" to end a test_expect_success block early | 
		
	
		
			
				|  |  |  |  | # (and we want to make sure we run any cleanup like | 
		
	
		
			
				|  |  |  |  | # "set +x"). | 
		
	
		
			
				|  |  |  |  | test_eval_inner_ () { | 
		
	
		
			
				|  |  |  |  | 	# Do not add anything extra (including LF) after '$*' | 
		
	
		
			
				|  |  |  |  | 	eval " | 
		
	
		
			
				|  |  |  |  | 		want_trace && set -x | 
		
	
		
			
				|  |  |  |  | 		$*" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_eval_x_ () { | 
		
	
		
			
				|  |  |  |  | 	# If "-x" tracing is in effect, then we want to avoid polluting stderr | 
		
	
		
			
				|  |  |  |  | 	# with non-test commands. But once in "set -x" mode, we cannot prevent | 
		
	
		
			
				|  |  |  |  | 	# the shell from printing the "set +x" to turn it off (nor the saving | 
		
	
		
			
				|  |  |  |  | 	# of $? before that). But we can make sure that the output goes to | 
		
	
		
			
				|  |  |  |  | 	# /dev/null. | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	# There are a few subtleties here: | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	#   - we have to redirect descriptor 4 in addition to 2, to cover | 
		
	
		
			
				|  |  |  |  | 	#     BASH_XTRACEFD | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	#   - the actual eval has to come before the redirection block (since | 
		
	
		
			
				|  |  |  |  | 	#     it needs to see descriptor 4 to set up its stderr) | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	#   - likewise, any error message we print must be outside the block to | 
		
	
		
			
				|  |  |  |  | 	#     access descriptor 4 | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 	#   - checking $? has to come immediately after the eval, but it must | 
		
	
		
			
				|  |  |  |  | 	#     be _inside_ the block to avoid polluting the "set -x" output | 
		
	
		
			
				|  |  |  |  | 	# | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	test_eval_inner_ "$@" </dev/null >&3 2>&4 | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		test_eval_ret_=$? | 
		
	
		
			
				|  |  |  |  | 		if want_trace | 
		
	
		
			
				|  |  |  |  | 		then | 
		
	
		
			
				|  |  |  |  | 			set +x | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 	} 2>/dev/null 4>&2 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	if test "$test_eval_ret_" != 0 && want_trace | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		say_color error >&4 "error: last command exited with \$?=$test_eval_ret_" | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	return $test_eval_ret_ | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_eval_() { | 
		
	
		
			
				|  |  |  |  | 	# This is a separate function because some tests use | 
		
	
		
			
				|  |  |  |  | 	# "return" to end a test_expect_success block early. | 
		
	
		
			
				|  |  |  |  | 	case ",$test_prereq," in | 
		
	
		
			
				|  |  |  |  | 	*,INTERACTIVE,*) | 
		
	
		
			
				|  |  |  |  | 		eval "$*" | 
		
	
		
			
				|  |  |  |  | 		;; | 
		
	
		
			
				|  |  |  |  | 	*) | 
		
	
		
			
				|  |  |  |  | 		eval </dev/null >&3 2>&4 "$*" | 
		
	
		
			
				|  |  |  |  | 		test_eval_x_ "$@" | 
		
	
		
			
				|  |  |  |  | 		;; | 
		
	
		
			
				|  |  |  |  | 	esac | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					
					|  |  |  | @@ -392,13 +399,22 @@ test_run_() { | 
		
	
		
			
				|  |  |  |  | 	eval_ret=$? | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	if test "$chain_lint" = "t"; then | 
		
	
		
			
				|  |  |  |  | 		# turn off tracing for this test-eval, as it simply creates | 
		
	
		
			
				|  |  |  |  | 		# confusing noise in the "-x" output | 
		
	
		
			
				|  |  |  |  | 		trace_tmp=$trace | 
		
	
		
			
				|  |  |  |  | 		trace= | 
		
	
		
			
				|  |  |  |  | 		# 117 is magic because it is unlikely to match the exit | 
		
	
		
			
				|  |  |  |  | 		# code of other programs | 
		
	
		
			
				|  |  |  |  | 		test_eval_ "(exit 117) && $1" | 
		
	
		
			
				|  |  |  |  | 		if test "$?" != 117; then | 
		
	
		
			
				|  |  |  |  | 			error "bug in the test script: broken &&-chain: $1" | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 		trace=$trace_tmp | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"; then | 
		
	
		
			
				|  |  |  |  | 	if test -z "$immediate" || test $eval_ret = 0 || | 
		
	
		
			
				|  |  |  |  | 	   test -n "$expecting_failure" && test "$test_cleanup" != ":" | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		test_eval_ "$test_cleanup" | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then | 
		
	
	
		
			
				
					
					|  |  |  | @@ -408,10 +424,11 @@ test_run_() { | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_skip_() { | 
		
	
		
			
				|  |  |  |  | 	test_count=$((test_count + 1)) | 
		
	
		
			
				|  |  |  |  | 	SHARNESS_TEST_NB=$((SHARNESS_TEST_NB + 1)) | 
		
	
		
			
				|  |  |  |  | 	to_skip= | 
		
	
		
			
				|  |  |  |  | 	for skp in $SKIP_TESTS; do | 
		
	
		
			
				|  |  |  |  | 		case $this_test.$test_count in | 
		
	
		
			
				|  |  |  |  | 		# shellcheck disable=SC2254 | 
		
	
		
			
				|  |  |  |  | 		case $this_test.$SHARNESS_TEST_NB in | 
		
	
		
			
				|  |  |  |  | 		$skp) | 
		
	
		
			
				|  |  |  |  | 			to_skip=t | 
		
	
		
			
				|  |  |  |  | 			break | 
		
	
	
		
			
				
					
					|  |  |  | @@ -428,7 +445,7 @@ test_skip_() { | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		say_color skip >&3 "skipping test: $*" | 
		
	
		
			
				|  |  |  |  | 		say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})" | 
		
	
		
			
				|  |  |  |  | 		say_color skip "ok $SHARNESS_TEST_NB # skip $1 (missing $missing_prereq${of_prereq})" | 
		
	
		
			
				|  |  |  |  | 		: true | 
		
	
		
			
				|  |  |  |  | 		;; | 
		
	
		
			
				|  |  |  |  | 	*) | 
		
	
	
		
			
				
					
					|  |  |  | @@ -437,6 +454,13 @@ test_skip_() { | 
		
	
		
			
				|  |  |  |  | 	esac | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | remove_trash_() { | 
		
	
		
			
				|  |  |  |  | 	test -d "$remove_trash" && ( | 
		
	
		
			
				|  |  |  |  | 		cd "$(dirname "$remove_trash")" && | 
		
	
		
			
				|  |  |  |  | 			rm -rf "$(basename "$remove_trash")" | 
		
	
		
			
				|  |  |  |  | 	) | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Run test commands and expect them to succeed. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # When the test passed, an "ok" message is printed and the number of successful | 
		
	
	
		
			
				
					
					|  |  |  | @@ -563,246 +587,6 @@ test_expect_unstable() { | 
		
	
		
			
				|  |  |  |  | 	echo >&3 "" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Run command and ensure that it fails in a controlled way. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Use it instead of "! <command>". For example, when <command> dies due to a | 
		
	
		
			
				|  |  |  |  | # segfault, test_must_fail diagnoses it as an error, while "! <command>" would | 
		
	
		
			
				|  |  |  |  | # mistakenly be treated as just another expected failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is one of the prefix functions to be used inside test_expect_success or | 
		
	
		
			
				|  |  |  |  | # test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1.. - Command to be executed. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'complain and die' ' | 
		
	
		
			
				|  |  |  |  | #       do something && | 
		
	
		
			
				|  |  |  |  | #       do something else && | 
		
	
		
			
				|  |  |  |  | #       test_must_fail git checkout ../outerspace | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 1 if the command succeeded (exit code 0). | 
		
	
		
			
				|  |  |  |  | # Returns 1 if the command died by signal (exit codes 130-192) | 
		
	
		
			
				|  |  |  |  | # Returns 1 if the command could not be found (exit code 127). | 
		
	
		
			
				|  |  |  |  | # Returns 0 otherwise. | 
		
	
		
			
				|  |  |  |  | test_must_fail() { | 
		
	
		
			
				|  |  |  |  | 	"$@" | 
		
	
		
			
				|  |  |  |  | 	exit_code=$? | 
		
	
		
			
				|  |  |  |  | 	if test $exit_code = 0; then | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "test_must_fail: command succeeded: $*" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	elif test $exit_code -gt 129 -a $exit_code -le 192; then | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "test_must_fail: died by signal: $*" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	elif test $exit_code = 127; then | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "test_must_fail: command not found: $*" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	return 0 | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Run command and ensure that it succeeds or fails in a controlled way. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Similar to test_must_fail, but tolerates success too. Use it instead of | 
		
	
		
			
				|  |  |  |  | # "<command> || :" to catch failures caused by a segfault, for instance. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is one of the prefix functions to be used inside test_expect_success or | 
		
	
		
			
				|  |  |  |  | # test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1.. - Command to be executed. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'some command works without configuration' ' | 
		
	
		
			
				|  |  |  |  | #       test_might_fail git config --unset all.configuration && | 
		
	
		
			
				|  |  |  |  | #       do something | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 1 if the command died by signal (exit codes 130-192) | 
		
	
		
			
				|  |  |  |  | # Returns 1 if the command could not be found (exit code 127). | 
		
	
		
			
				|  |  |  |  | # Returns 0 otherwise. | 
		
	
		
			
				|  |  |  |  | test_might_fail() { | 
		
	
		
			
				|  |  |  |  | 	"$@" | 
		
	
		
			
				|  |  |  |  | 	exit_code=$? | 
		
	
		
			
				|  |  |  |  | 	if test $exit_code -gt 129 -a $exit_code -le 192; then | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "test_might_fail: died by signal: $*" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	elif test $exit_code = 127; then | 
		
	
		
			
				|  |  |  |  | 		echo >&2 "test_might_fail: command not found: $*" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	return 0 | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Run command and ensure it exits with a given exit code. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is one of the prefix functions to be used inside test_expect_success or | 
		
	
		
			
				|  |  |  |  | # test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1   - Expected exit code. | 
		
	
		
			
				|  |  |  |  | # $2.. - Command to be executed. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'Merge with d/f conflicts' ' | 
		
	
		
			
				|  |  |  |  | #       test_expect_code 1 git merge "merge msg" B master | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 0 if the expected exit code is returned or 1 otherwise. | 
		
	
		
			
				|  |  |  |  | test_expect_code() { | 
		
	
		
			
				|  |  |  |  | 	want_code=$1 | 
		
	
		
			
				|  |  |  |  | 	shift | 
		
	
		
			
				|  |  |  |  | 	"$@" | 
		
	
		
			
				|  |  |  |  | 	exit_code=$? | 
		
	
		
			
				|  |  |  |  | 	if test "$exit_code" = "$want_code"; then | 
		
	
		
			
				|  |  |  |  | 		return 0 | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	echo >&2 "test_expect_code: command exited with $exit_code, we wanted $want_code $*" | 
		
	
		
			
				|  |  |  |  | 	return 1 | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Compare two files to see if expected output matches actual output. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # The TEST_CMP variable defines the command used for the comparison; it | 
		
	
		
			
				|  |  |  |  | # defaults to "diff -u". Only when the test script was started with --verbose, | 
		
	
		
			
				|  |  |  |  | # will the command's output, the diff, be printed to the standard output. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is one of the prefix functions to be used inside test_expect_success or | 
		
	
		
			
				|  |  |  |  | # test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - Path to file with expected output. | 
		
	
		
			
				|  |  |  |  | # $2 - Path to file with actual output. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'foo works' ' | 
		
	
		
			
				|  |  |  |  | #       echo expected >expected && | 
		
	
		
			
				|  |  |  |  | #       foo >actual && | 
		
	
		
			
				|  |  |  |  | #       test_cmp expected actual | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns the exit code of the command set by TEST_CMP. | 
		
	
		
			
				|  |  |  |  | test_cmp() { | 
		
	
		
			
				|  |  |  |  | 	${TEST_CMP:-diff -u} "$@" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: portably print a sequence of numbers. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # seq is not in POSIX and GNU seq might not be available everywhere, | 
		
	
		
			
				|  |  |  |  | # so it is nice to have a seq implementation, even a very simple one. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - Starting number. | 
		
	
		
			
				|  |  |  |  | # $2 - Ending number. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'foo works 10 times' ' | 
		
	
		
			
				|  |  |  |  | #       for i in $(test_seq 1 10) | 
		
	
		
			
				|  |  |  |  | #       do | 
		
	
		
			
				|  |  |  |  | #           foo || return | 
		
	
		
			
				|  |  |  |  | #       done | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 0 if all the specified numbers can be displayed. | 
		
	
		
			
				|  |  |  |  | test_seq() { | 
		
	
		
			
				|  |  |  |  | 	i="$1" | 
		
	
		
			
				|  |  |  |  | 	j="$2" | 
		
	
		
			
				|  |  |  |  | 	while test "$i" -le "$j" | 
		
	
		
			
				|  |  |  |  | 	do | 
		
	
		
			
				|  |  |  |  | 		echo "$i" || return | 
		
	
		
			
				|  |  |  |  | 		i=$(("$i" + 1)) | 
		
	
		
			
				|  |  |  |  | 	done | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Check if the file expected to be empty is indeed empty, and barfs | 
		
	
		
			
				|  |  |  |  | # otherwise. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1 - File to check for emptiness. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 0 if file is empty, 1 otherwise. | 
		
	
		
			
				|  |  |  |  | test_must_be_empty() { | 
		
	
		
			
				|  |  |  |  | 	if test -s "$1" | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		echo "'$1' is not empty, it contains:" | 
		
	
		
			
				|  |  |  |  | 		cat "$1" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # debugging-friendly alternatives to "test [-f|-d|-e]" | 
		
	
		
			
				|  |  |  |  | # The commands test the existence or non-existence of $1. $2 can be | 
		
	
		
			
				|  |  |  |  | # given to provide a more precise diagnosis. | 
		
	
		
			
				|  |  |  |  | test_path_is_file () { | 
		
	
		
			
				|  |  |  |  | 	if ! test -f "$1" | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		echo "File $1 doesn't exist. $2" | 
		
	
		
			
				|  |  |  |  | 		false | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | test_path_is_dir () { | 
		
	
		
			
				|  |  |  |  | 	if ! test -d "$1" | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		echo "Directory $1 doesn't exist. $2" | 
		
	
		
			
				|  |  |  |  | 		false | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Check if the directory exists and is empty as expected, barf otherwise. | 
		
	
		
			
				|  |  |  |  | test_dir_is_empty () { | 
		
	
		
			
				|  |  |  |  | 	test_path_is_dir "$1" && | 
		
	
		
			
				|  |  |  |  | 	if test -n "$(find "$1" -mindepth 1 -maxdepth 1)" | 
		
	
		
			
				|  |  |  |  | 	then | 
		
	
		
			
				|  |  |  |  | 		echo "Directory '$1' is not empty, it contains:" | 
		
	
		
			
				|  |  |  |  | 		ls -la "$1" | 
		
	
		
			
				|  |  |  |  | 		return 1 | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Schedule cleanup commands to be run unconditionally at the end of a | 
		
	
		
			
				|  |  |  |  | # test. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # If some cleanup command fails, the test will not pass. With --immediate, no | 
		
	
		
			
				|  |  |  |  | # cleanup is done to help diagnose what went wrong. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This is one of the prefix functions to be used inside test_expect_success or | 
		
	
		
			
				|  |  |  |  | # test_expect_failure. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # $1.. - Commands to prepend to the list of cleanup commands. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   test_expect_success 'test core.capslock' ' | 
		
	
		
			
				|  |  |  |  | #       git config core.capslock true && | 
		
	
		
			
				|  |  |  |  | #       test_when_finished "git config --unset core.capslock" && | 
		
	
		
			
				|  |  |  |  | #       do_something | 
		
	
		
			
				|  |  |  |  | #   ' | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns the exit code of the last cleanup command executed. | 
		
	
		
			
				|  |  |  |  | test_when_finished() { | 
		
	
		
			
				|  |  |  |  | 	test_cleanup="{ $* | 
		
	
		
			
				|  |  |  |  | 		} && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Schedule cleanup commands to be run unconditionally when all tests | 
		
	
		
			
				|  |  |  |  | # have run. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # This can be used to clean up things like test databases. It is not needed to | 
		
	
		
			
				|  |  |  |  | # clean up temporary files, as test_done already does that. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Examples: | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #   cleanup mysql -e "DROP DATABASE mytest" | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns the exit code of the last cleanup command executed. | 
		
	
		
			
				|  |  |  |  | final_cleanup= | 
		
	
		
			
				|  |  |  |  | cleanup() { | 
		
	
		
			
				|  |  |  |  | 	final_cleanup="{ $* | 
		
	
		
			
				|  |  |  |  | 		} && (exit \"\$eval_ret\"); eval_ret=\$?; $final_cleanup" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Summarize test results and exit with an appropriate error code. | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Must be called at the end of each test script. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -823,16 +607,17 @@ cleanup() { | 
		
	
		
			
				|  |  |  |  | #   fi | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | # Returns 0 if all tests passed or 1 if there was a failure. | 
		
	
		
			
				|  |  |  |  | # shellcheck disable=SC2154,SC2034 | 
		
	
		
			
				|  |  |  |  | test_done() { | 
		
	
		
			
				|  |  |  |  | 	EXIT_OK=t | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	if test -z "$HARNESS_ACTIVE"; then | 
		
	
		
			
				|  |  |  |  | 		test_results_dir="$SHARNESS_TEST_OUTPUT_DIRECTORY/test-results" | 
		
	
		
			
				|  |  |  |  | 		test_results_dir="$SHARNESS_TEST_OUTDIR/test-results" | 
		
	
		
			
				|  |  |  |  | 		mkdir -p "$test_results_dir" | 
		
	
		
			
				|  |  |  |  | 		test_results_path="$test_results_dir/$this_test.$$.counts" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		cat >>"$test_results_path" <<-EOF | 
		
	
		
			
				|  |  |  |  | 		total $test_count | 
		
	
		
			
				|  |  |  |  | 		total $SHARNESS_TEST_NB | 
		
	
		
			
				|  |  |  |  | 		success $test_success | 
		
	
		
			
				|  |  |  |  | 		fixed $test_fixed | 
		
	
		
			
				|  |  |  |  | 		broken $test_broken | 
		
	
	
		
			
				
					
					|  |  |  | @@ -848,54 +633,43 @@ test_done() { | 
		
	
		
			
				|  |  |  |  | 		say_color warn "# still have $test_broken known breakage(s)" | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	if test "$test_broken" != 0 || test "$test_fixed" != 0; then | 
		
	
		
			
				|  |  |  |  | 		test_remaining=$((test_count - test_broken - test_fixed)) | 
		
	
		
			
				|  |  |  |  | 		test_remaining=$((SHARNESS_TEST_NB - test_broken - test_fixed)) | 
		
	
		
			
				|  |  |  |  | 		msg="remaining $test_remaining test(s)" | 
		
	
		
			
				|  |  |  |  | 	else | 
		
	
		
			
				|  |  |  |  | 		test_remaining=$test_count | 
		
	
		
			
				|  |  |  |  | 		msg="$test_count test(s)" | 
		
	
		
			
				|  |  |  |  | 		test_remaining=$SHARNESS_TEST_NB | 
		
	
		
			
				|  |  |  |  | 		msg="$SHARNESS_TEST_NB test(s)" | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	case "$test_failure" in | 
		
	
		
			
				|  |  |  |  | 	0) | 
		
	
		
			
				|  |  |  |  | 		# Maybe print SKIP message | 
		
	
		
			
				|  |  |  |  | 		if test -n "$skip_all" && test $test_count -gt 0; then | 
		
	
		
			
				|  |  |  |  | 			error "Can't use skip_all after running some tests" | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 		[ -z "$skip_all" ] || skip_all=" # SKIP $skip_all" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		if test $test_remaining -gt 0; then | 
		
	
		
			
				|  |  |  |  | 		check_skip_all_ | 
		
	
		
			
				|  |  |  |  | 		if test "$test_remaining" -gt 0; then | 
		
	
		
			
				|  |  |  |  | 			say_color pass "# passed all $msg" | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 		say "1..$test_count$skip_all" | 
		
	
		
			
				|  |  |  |  | 		say "1..$SHARNESS_TEST_NB$skip_all" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		test_eval_ "$final_cleanup" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		test -d "$remove_trash" && | 
		
	
		
			
				|  |  |  |  | 		cd "$(dirname "$remove_trash")" && | 
		
	
		
			
				|  |  |  |  | 		rm -rf "$(basename "$remove_trash")" | 
		
	
		
			
				|  |  |  |  | 		remove_trash_ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		exit 0 ;; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	*) | 
		
	
		
			
				|  |  |  |  | 		say_color error "# failed $test_failure among $msg" | 
		
	
		
			
				|  |  |  |  | 		say "1..$test_count" | 
		
	
		
			
				|  |  |  |  | 		say "1..$SHARNESS_TEST_NB" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 		exit 1 ;; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 	esac | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Source directory of test code and sharness library. | 
		
	
		
			
				|  |  |  |  | # This directory may be different from the directory in which tests are | 
		
	
		
			
				|  |  |  |  | # being run. | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_TEST_SRCDIR:=$(cd "$(dirname "$0")" && pwd)}" | 
		
	
		
			
				|  |  |  |  | export SHARNESS_TEST_SRCDIR | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_BUILD_DIRECTORY:="$SHARNESS_TEST_DIRECTORY/.."}" | 
		
	
		
			
				|  |  |  |  | # Public: Build directory that will be added to PATH. By default, it is set to | 
		
	
		
			
				|  |  |  |  | # the parent directory of SHARNESS_TEST_DIRECTORY. | 
		
	
		
			
				|  |  |  |  | : "${SHARNESS_BUILD_DIRECTORY:="$SHARNESS_TEST_DIRECTORY/.."}" | 
		
	
		
			
				|  |  |  |  | export SHARNESS_BUILD_DIRECTORY | 
		
	
		
			
				|  |  |  |  | PATH="$SHARNESS_BUILD_DIRECTORY:$PATH" | 
		
	
		
			
				|  |  |  |  | export PATH SHARNESS_BUILD_DIRECTORY | 
		
	
		
			
				|  |  |  |  | export PATH | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # Public: Path to test script currently executed. | 
		
	
		
			
				|  |  |  |  | SHARNESS_TEST_FILE="$0" | 
		
	
	
		
			
				
					
					|  |  |  | @@ -906,7 +680,7 @@ SHARNESS_TRASH_DIRECTORY="trash directory.$(basename "$SHARNESS_TEST_FILE" ".$SH | 
		
	
		
			
				|  |  |  |  | test -n "$root" && SHARNESS_TRASH_DIRECTORY="$root/$SHARNESS_TRASH_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | case "$SHARNESS_TRASH_DIRECTORY" in | 
		
	
		
			
				|  |  |  |  | /*) ;; # absolute path is good | 
		
	
		
			
				|  |  |  |  |  *) SHARNESS_TRASH_DIRECTORY="$SHARNESS_TEST_OUTPUT_DIRECTORY/$SHARNESS_TRASH_DIRECTORY" ;; | 
		
	
		
			
				|  |  |  |  |  *) SHARNESS_TRASH_DIRECTORY="$SHARNESS_TEST_OUTDIR/$SHARNESS_TRASH_DIRECTORY" ;; | 
		
	
		
			
				|  |  |  |  | esac | 
		
	
		
			
				|  |  |  |  | test "$debug" = "t" || remove_trash="$SHARNESS_TRASH_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | rm -rf "$SHARNESS_TRASH_DIRECTORY" || { | 
		
	
	
		
			
				
					
					|  |  |  | @@ -917,11 +691,11 @@ rm -rf "$SHARNESS_TRASH_DIRECTORY" || { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | #  Load any extensions in $srcdir/sharness.d/*.sh | 
		
	
		
			
				|  |  |  |  | #  Load any extensions in $testdir/sharness.d/*.sh | 
		
	
		
			
				|  |  |  |  | # | 
		
	
		
			
				|  |  |  |  | if test -d "${SHARNESS_TEST_SRCDIR}/sharness.d" | 
		
	
		
			
				|  |  |  |  | if test -d "${SHARNESS_TEST_DIRECTORY}/sharness.d" | 
		
	
		
			
				|  |  |  |  | then | 
		
	
		
			
				|  |  |  |  | 	for file in "${SHARNESS_TEST_SRCDIR}"/sharness.d/*.sh | 
		
	
		
			
				|  |  |  |  | 	for file in "${SHARNESS_TEST_DIRECTORY}"/sharness.d/*.sh | 
		
	
		
			
				|  |  |  |  | 	do | 
		
	
		
			
				|  |  |  |  | 		# Ensure glob was not an empty match: | 
		
	
		
			
				|  |  |  |  | 		test -e "${file}" || break | 
		
	
	
		
			
				
					
					|  |  |  | @@ -930,6 +704,7 @@ then | 
		
	
		
			
				|  |  |  |  | 		then | 
		
	
		
			
				|  |  |  |  | 			echo >&5 "sharness: loading extensions from ${file}" | 
		
	
		
			
				|  |  |  |  | 		fi | 
		
	
		
			
				|  |  |  |  | 		# shellcheck disable=SC1090 | 
		
	
		
			
				|  |  |  |  | 		. "${file}" | 
		
	
		
			
				|  |  |  |  | 		if test $? != 0 | 
		
	
		
			
				|  |  |  |  | 		then | 
		
	
	
		
			
				
					
					|  |  |  | @@ -946,14 +721,28 @@ export SHARNESS_TRASH_DIRECTORY | 
		
	
		
			
				|  |  |  |  | HOME="$SHARNESS_TRASH_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | export HOME | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | # shellcheck disable=SC3028 | 
		
	
		
			
				|  |  |  |  | if [ "$OSTYPE" = msys ]; then | 
		
	
		
			
				|  |  |  |  | 	USERPROFILE="$SHARNESS_TRASH_DIRECTORY" | 
		
	
		
			
				|  |  |  |  | 	export USERPROFILE | 
		
	
		
			
				|  |  |  |  | fi | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | mkdir -p "$SHARNESS_TRASH_DIRECTORY" || exit 1 | 
		
	
		
			
				|  |  |  |  | # Use -P to resolve symlinks in our working directory so that the cwd | 
		
	
		
			
				|  |  |  |  | # in subprocesses like git equals our $PWD (for pathname comparisons). | 
		
	
		
			
				|  |  |  |  | cd -P "$SHARNESS_TRASH_DIRECTORY" || exit 1 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | check_skip_all_() { | 
		
	
		
			
				|  |  |  |  | 	if test -n "$skip_all" && test $SHARNESS_TEST_NB -gt 0; then | 
		
	
		
			
				|  |  |  |  | 		error "Can't use skip_all after running some tests" | 
		
	
		
			
				|  |  |  |  | 	fi | 
		
	
		
			
				|  |  |  |  | 	[ -z "$skip_all" ] || skip_all=" # SKIP $skip_all" | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | this_test=${SHARNESS_TEST_FILE##*/} | 
		
	
		
			
				|  |  |  |  | this_test=${this_test%.$SHARNESS_TEST_EXTENSION} | 
		
	
		
			
				|  |  |  |  | this_test=${this_test%".$SHARNESS_TEST_EXTENSION"} | 
		
	
		
			
				|  |  |  |  | for skp in $SKIP_TESTS; do | 
		
	
		
			
				|  |  |  |  | 	# shellcheck disable=SC2254 | 
		
	
		
			
				|  |  |  |  | 	case "$this_test" in | 
		
	
		
			
				|  |  |  |  | 	$skp) | 
		
	
		
			
				|  |  |  |  | 		say_color info >&3 "skipping test $this_test altogether" |