Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Arch Linux
aurweb
Commits
882c011e
Commit
882c011e
authored
Nov 23, 2019
by
Lukas Fleischer
Browse files
Upgrade Sharness to 1.1.0
Signed-off-by:
Lukas Fleischer
<
lfleischer@archlinux.org
>
parent
771ced32
Changes
1
Hide whitespace changes
Inline
Side-by-side
test/sharness.sh
View file @
882c011e
#
!/bin/sh
#
Sharness test framework.
#
# Copyright (c) 2011-2012 Mathias Lafeldt
# Copyright (c) 2005-2012 Git project
...
...
@@ -22,10 +22,22 @@ SHARNESS_VERSION="1.0.0"
export
SHARNESS_VERSION
# Public: The file extension for tests. By default, it is set to "t".
:
${
SHARNESS_TEST_EXTENSION
:
=t
}
:
"
${
SHARNESS_TEST_EXTENSION
:
=t
}
"
export
SHARNESS_TEST_EXTENSION
# Reset TERM to original terminal if found, otherwise save orignal TERM
# 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
# Reset TERM to original terminal if found, otherwise save original TERM
[
"x"
=
"x
$SHARNESS_ORIG_TERM
"
]
&&
SHARNESS_ORIG_TERM
=
"
$TERM
"
||
TERM
=
"
$SHARNESS_ORIG_TERM
"
...
...
@@ -33,23 +45,45 @@ export SHARNESS_TEST_EXTENSION
export
SHARNESS_ORIG_TERM
# Export SHELL_PATH
:
${
SHELL_PATH
:
=
$SHELL
}
:
"
${
SHELL_PATH
:
=
$SHELL
}
"
export
SHELL_PATH
# if --tee was passed, write the output not only to the terminal, but
# additionally to the file test-results/$BASENAME.out, too.
case
"
$SHARNESS_TEST_TEE_STARTED
,
$*
"
in
done
,
*
)
# do not redirect again
;;
*
' --tee '
*
|
*
' --verbose-log '
*
)
mkdir
-p
"
$SHARNESS_TEST_DIRECTORY
/test-results"
BASE
=
"
$SHARNESS_TEST_DIRECTORY
/test-results/
$(
basename
"
$0
"
".
$SHARNESS_TEST_EXTENSION
"
)
"
# Make this filename available to the sub-process in case it is using
# --verbose-log.
SHARNESS_TEST_TEE_OUTPUT_FILE
=
"
$BASE
.out"
export
SHARNESS_TEST_TEE_OUTPUT_FILE
# Truncate before calling "tee -a" to get rid of the results
# from any previous runs.
:
>
"
$SHARNESS_TEST_TEE_OUTPUT_FILE
"
(
SHARNESS_TEST_TEE_STARTED
=
"done"
${
SHELL_PATH
}
"
$0
"
"
$@
"
2>&1
;
echo
$?
>
"
$BASE
.exit"
)
|
tee
-a
"
$SHARNESS_TEST_TEE_OUTPUT_FILE
"
test
"
$(
cat
"
$BASE
.exit"
)
"
=
0
exit
;;
esac
# For repeatability, reset the environment to a known state.
# TERM is sanitized below, after saving color control sequences.
LANG
=
C
LC_ALL
=
C
PAGER
=
cat
PAGER
=
"
cat
"
TZ
=
UTC
EDITOR
=
:
export
LANG LC_ALL PAGER TZ EDITOR
unset
VISUAL CDPATH GREP_OPTIONS
# Line feed
LF
=
'
'
[
"x
$TERM
"
!=
"xdumb"
]
&&
(
[
-t
1
]
&&
tput bold
>
/dev/null 2>&1
&&
...
...
@@ -82,9 +116,14 @@ while test "$#" -ne 0; do
chain_lint
=
;
shift
;;
--no-color
)
color
=
;
shift
;;
--tee
)
shift
;;
# was handled already
--root
=
*
)
root
=
$(
expr
"z
$1
"
:
'z[^=]*=\(.*\)'
)
shift
;;
--verbose-log
)
verbose_log
=
t
shift
;;
*
)
echo
"error: unknown test option '
$1
'"
>
&2
;
exit
1
;;
esac
...
...
@@ -109,18 +148,25 @@ if test -n "$color"; then
say_color_pass
=
$(
tput setaf 2
)
# green
say_color_info
=
$(
tput setaf 6
)
# cyan
say_color_reset
=
$(
tput sgr0
)
say_color_
=
""
# no formatting for normal text
say_color_
raw
=
""
# no formatting for normal text
say_color
()
{
test
-z
"
$1
"
&&
test
-n
"
$quiet
"
&&
return
eval
"say_color_color=
\$
say_color_
$1
"
case
"
$1
"
in
error
)
say_color_color
=
$say_color_error
;;
skip
)
say_color_color
=
$say_color_skip
;;
warn
)
say_color_color
=
$say_color_warn
;;
pass
)
say_color_color
=
$say_color_pass
;;
info
)
say_color_color
=
$say_color_info
;;
*
)
say_color_color
=
$say_color_raw
;;
esac
shift
printf
"
%s
\
\
n
"
"
$say_color_color
$*
$say_color_reset
"
printf
'%s%s
%s\n
'
"
$say_color_color
"
"
$*
"
"
$say_color_reset
"
}
else
say_color
()
{
test
-z
"
$1
"
&&
test
-n
"
$quiet
"
&&
return
shift
printf
"
%s
\n
"
"
$*
"
printf
'
%s\n
'
"
$*
"
}
fi
...
...
@@ -137,7 +183,7 @@ say() {
say_color info
"
$*
"
}
test
-n
"
$test_description
"
||
error
"Test script did not set test_description."
test
-n
"
$
{
test_description
:-}
"
||
error
"Test script did not set test_description."
if
test
"
$help
"
=
"t"
;
then
echo
"
$test_description
"
...
...
@@ -146,7 +192,11 @@ fi
exec
5>&1
exec
6<&0
if
test
"
$verbose
"
=
"t"
;
then
if
test
"
$verbose_log
"
=
"t"
then
exec
3>>
"
$SHARNESS_TEST_TEE_OUTPUT_FILE
"
4>&3
elif
test
"
$verbose
"
=
"t"
then
exec
4>&2 3>&1
else
exec
4>/dev/null 3>/dev/null
...
...
@@ -177,7 +227,7 @@ trap 'die' EXIT
# implicitly by specifying the prerequisite name in calls to test_expect_success
# or test_expect_failure.
#
# $1 - Name of prerequiste (a simple word, in all capital letters by convention)
# $1 - Name of prerequis
i
te (a simple word, in all capital letters by convention)
#
# Examples
#
...
...
@@ -214,7 +264,7 @@ test_have_prereq() {
# prerequisites can be concatenated with ','
save_IFS
=
$IFS
IFS
=
,
set
--
$
*
set
--
$
@
IFS
=
$save_IFS
total_prereq
=
0
...
...
@@ -231,7 +281,7 @@ test_have_prereq() {
negative_prereq
=
esac
total_prereq
=
$((
$
total_prereq
+
1
))
total_prereq
=
$((
total_prereq
+
1
))
case
"
$satisfied_prereq
"
in
*
"
$prerequisite
"
*
)
satisfied_this_prereq
=
t
...
...
@@ -242,7 +292,7 @@ test_have_prereq() {
case
"
$satisfied_this_prereq
,
$negative_prereq
"
in
t,|,t
)
ok_prereq
=
$((
$
ok_prereq
+
1
))
ok_prereq
=
$((
ok_prereq
+
1
))
;;
*
)
# Keep a list of missing prerequisites; restore
...
...
@@ -263,12 +313,12 @@ test_have_prereq() {
# the text_expect_* functions instead.
test_ok_
()
{
test_success
=
$((
$
test_success
+
1
))
say_color
""
"ok
$test_count
-
$
@
"
test_success
=
$((
test_success
+
1
))
say_color
""
"ok
$test_count
-
$
*
"
}
test_failure_
()
{
test_failure
=
$((
$
test_failure
+
1
))
test_failure
=
$((
test_failure
+
1
))
say_color error
"not ok
$test_count
-
$1
"
shift
echo
"
$@
"
|
sed
-e
's/^/# /'
...
...
@@ -276,13 +326,13 @@ test_failure_() {
}
test_known_broken_ok_
()
{
test_fixed
=
$((
$
test_fixed
+
1
))
say_color error
"ok
$test_count
-
$
@
# TODO known breakage vanished"
test_fixed
=
$((
test_fixed
+
1
))
say_color error
"ok
$test_count
-
$
*
# TODO known breakage vanished"
}
test_known_broken_failure_
()
{
test_broken
=
$((
$
test_broken
+
1
))
say_color warn
"not ok
$test_count
-
$
@
# TODO known breakage"
test_broken
=
$((
test_broken
+
1
))
say_color warn
"not ok
$test_count
-
$
*
# TODO known breakage"
}
# Public: Execute commands in debug mode.
...
...
@@ -351,7 +401,7 @@ test_run_() {
}
test_skip_
()
{
test_count
=
$((
$
test_count
+
1
))
test_count
=
$((
test_count
+
1
))
to_skip
=
for
skp
in
$SKIP_TESTS
;
do
case
$this_test
.
$test_count
in
...
...
@@ -370,7 +420,7 @@ test_skip_() {
of_prereq
=
" of
$test_prereq
"
fi
say_color skip
>
&3
"skipping test:
$
@
"
say_color skip
>
&3
"skipping test:
$
*
"
say_color skip
"ok
$test_count
# skip
$1
(missing
$missing_prereq
${
of_prereq
}
)"
:
true
;;
...
...
@@ -468,6 +518,44 @@ test_expect_failure() {
echo
>
&3
""
}
# Public: Run test commands and expect anything from them. Used when a
# test is not stable or not finished for some reason.
#
# When the test passed, an "ok" message is printed, but the number of
# fixed tests is not incremented.
#
# When it failed, a "not ok ... # TODO known breakage" message is
# printed, and the number of tests still broken is incremented.
#
# Failures from these tests won't cause --immediate to stop.
#
# Usually takes two arguments:
# $1 - Test description
# $2 - Commands to be executed.
#
# With three arguments, the first will be taken to be a prerequisite:
# $1 - Comma-separated list of test prerequisites. The test will be skipped if
# not all of the given prerequisites are set. To negate a prerequisite,
# put a "!" in front of it.
# $2 - Test description
# $3 - Commands to be executed.
#
# Returns nothing.
test_expect_unstable
()
{
test
"$#"
=
3
&&
{
test_prereq
=
$1
;
shift
;
}
||
test_prereq
=
test
"$#"
=
2
||
error
"bug in the test script: not 2 or 3 parameters to test_expect_unstable"
export
test_prereq
if
!
test_skip_
"
$@
"
;
then
say
>
&3
"checking unstable test:
$2
"
if
test_run_
"
$2
"
unstable
;
then
test_ok_
"
$1
"
else
test_known_broken_failure_
"
$1
"
fi
fi
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
...
...
@@ -560,7 +648,7 @@ test_expect_code() {
shift
"
$@
"
exit_code
=
$?
if
test
$exit_code
=
$want_code
;
then
if
test
"
$exit_code
"
=
"
$want_code
"
;
then
return
0
fi
...
...
@@ -570,7 +658,7 @@ test_expect_code() {
# Public: Compare two files to see if expected output matches actual output.
#
# The TEST_CMP variable defines the command used for the comparis
i
on; it
# 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.
#
...
...
@@ -617,14 +705,14 @@ test_seq() {
while
test
"
$i
"
-le
"
$j
"
do
echo
"
$i
"
||
return
i
=
$(
expr
"
$i
"
+ 1
)
i
=
$(
(
"
$i
"
+
1
)
)
done
}
# Public: Check if the file expected to be empty is indeed empty, and barfs
# otherwise.
#
# $1 - File to check for empt
y
ness.
# $1 - File to check for empt
i
ness.
#
# Returns 0 if file is empty, 1 otherwise.
test_must_be_empty
()
{
...
...
@@ -636,6 +724,36 @@ test_must_be_empty() {
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.
#
...
...
@@ -723,7 +841,7 @@ 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
=
$((
test_count
-
test_broken
-
test_fixed
))
msg
=
"remaining
$test_remaining
test(s)"
else
test_remaining
=
$test_count
...
...
@@ -760,20 +878,15 @@ test_done() {
esac
}
# Public: Root directory containing tests. Tests can override this variable,
# e.g. for testing Sharness itself.
:
${
SHARNESS_TEST_DIRECTORY
:
=
$(
pwd
)
}
export
SHARNESS_TEST_DIRECTORY
# 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
)
}
:
"
${
SHARNESS_TEST_SRCDIR
:
=
$(
cd
"
$(
dirname
"
$0
"
)
"
&&
pwd
)
}
"
export
SHARNESS_TEST_SRCDIR
# 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
/.."
}
:
"
${
SHARNESS_BUILD_DIRECTORY
:
=
"
$SHARNESS_TEST_DIRECTORY
/.."
}
"
PATH
=
"
$SHARNESS_BUILD_DIRECTORY
:
$PATH
"
export
PATH SHARNESS_BUILD_DIRECTORY
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment