From: Thomas Gummerer <t.gummerer@gmail.com>
To: gitster@pobox.com
Cc: trast@inf.ethz.ch, git@vger.kernel.org, t.gummerer@gmail.com
Subject: [PATCH v2 1/3] test-lib: introduce "modern" style tests
Date: Mon, 23 Sep 2013 23:08:44 +0200 [thread overview]
Message-ID: <1379970526-27997-2-git-send-email-t.gummerer@gmail.com> (raw)
In-Reply-To: <1379970526-27997-1-git-send-email-t.gummerer@gmail.com>
From: Junio C Hamano <gitster@pobox.com>
Add a new, extensible style for tests that allows the addition of new
parameters other than the prerequitites
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
t/README | 24 +++++++++++++++--
t/perf/README | 12 ++++++++-
t/perf/perf-lib.sh | 17 +++++-------
t/t0008-ignores.sh | 34 +++++++++++------------
t/test-lib-functions.sh | 72 ++++++++++++++++++++++++++++++++++++++-----------
5 files changed, 114 insertions(+), 45 deletions(-)
diff --git a/t/README b/t/README
index 2167125..bf41c29 100644
--- a/t/README
+++ b/t/README
@@ -390,6 +390,12 @@ below), e.g.:
"$PERL_PATH" -e "hlagh() if unf_unf()"
'
+or in the "modern" form, specifying the prerequisite as a parameter, e.g.:
+
+ test_expect_success --prereq PERL 'I need Perl' '
+ "$PERL_PATH" -e "hlagh() if unf_unf()"
+ '
+
The advantage of skipping tests like this is that platforms that don't
have the PERL and other optional dependencies get an indication of how
many tests they're missing.
@@ -422,6 +428,7 @@ There are a handful helper functions defined in the test harness
library for your script to use.
- test_expect_success [<prereq>] <message> <script>
+ - test_expect_success [--prereq <prereq>] [--] <message> <script>
Usually takes two strings as parameters, and evaluates the
<script>. If it yields success, test is considered
@@ -434,19 +441,31 @@ library for your script to use.
'tree=$(git-write-tree)'
If you supply three parameters the first will be taken to be a
- prerequisite; see the test_set_prereq and test_have_prereq
+ prerequisite; if you ues the "modern" test style, you can specify
+ the prerequisites with --prereq; see the test_set_prereq and test_have_prereq
documentation below:
test_expect_success TTY 'git --paginate rev-list uses a pager' \
' ... '
+ test_expect_success --prereq TTY 'git --paginate rev-list uses a pager' \
+ ' ... '
+
You can also supply a comma-separated list of prerequisites, in the
rare case where your test depends on more than one:
test_expect_success PERL,PYTHON 'yo dawg' \
' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" '
+ test_expect_success --prereq PERL,PYTHON 'yo dawg' \
+ ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" '
+
+ The modern version also allows to distinguish the message from the
+ description and test script with --, in case the message starts
+ with --.
+
- test_expect_failure [<prereq>] <message> <script>
+ - test_expect_failure [--prereq <prereq>] [--] <message> <script>
This is NOT the opposite of test_expect_success, but is used
to mark a test that demonstrates a known breakage. Unlike
@@ -456,7 +475,8 @@ library for your script to use.
tests won't cause -i (immediate) to stop.
Like test_expect_success this function can optionally use a three
- argument invocation with a prerequisite as the first argument.
+ argument invocation with a prerequisite as the first argument, or
+ the modern invocation with the prerequisite as an extra parameter.
- test_debug <script>
diff --git a/t/perf/README b/t/perf/README
index 8848c14..21abbaf 100644
--- a/t/perf/README
+++ b/t/perf/README
@@ -118,11 +118,21 @@ At least one of the first two is required!
You can use test_expect_success as usual. For actual performance
tests, use
- test_perf 'descriptive string' '
+ test_perf [<prereq>] 'descriptive string' '
+ command1 &&
+ command2
+ '
+
+ test_perf [--prereq <prereq>] [--] 'descriptive string' '
command1 &&
command2
'
+prereq is an optional parameter to test_perf, and the performance
+tests are only executed if the prerequisite is fulfilled. The modern
+version also allows to distinguish the message from the description
+and test script with --, in case the message starts with --.
+
test_perf spawns a subshell, for lack of better options. This means
that
diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh
index f4eecaa..6477d38 100644
--- a/t/perf/perf-lib.sh
+++ b/t/perf/perf-lib.sh
@@ -151,23 +151,20 @@ exit $ret' >&3 2>&4
test_perf () {
test_start_
- test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
- test "$#" = 2 ||
- error "bug in the test script: not 2 or 3 parameters to test-expect-success"
- export test_prereq
+ test_expect_parse test_perf "$@"
if ! test_skip "$@"
then
base=$(basename "$0" .sh)
echo "$test_count" >>"$perf_results_dir"/$base.subtests
- echo "$1" >"$perf_results_dir"/$base.$test_count.descr
+ echo "$test_label" >"$perf_results_dir"/$base.$test_count.descr
if test -z "$verbose"; then
- printf "%s" "perf $test_count - $1:"
+ printf "%s" "perf $test_count - $test_label:"
else
- echo "perf $test_count - $1:"
+ echo "perf $test_count - $test_label:"
fi
for i in $(test_seq 1 $GIT_PERF_REPEAT_COUNT); do
- say >&3 "running: $2"
- if test_run_perf_ "$2"
+ say >&3 "running: $test_body"
+ if test_run_perf_ "$test_body"
then
if test -z "$verbose"; then
printf " %s" "$i"
@@ -183,7 +180,7 @@ test_perf () {
if test -z "$verbose"; then
echo " ok"
else
- test_ok_ "$1"
+ test_ok_ "$test_label"
fi
base="$perf_results_dir"/"$perf_results_prefix$(basename "$0" .sh)"."$test_count"
"$TEST_DIRECTORY"/perf/min_time.perl test_time.* >"$base".times
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index 181513a..efe8dfd 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -234,7 +234,7 @@ test_expect_success_multi 'empty command line' '' '
stderr_contains "fatal: no path specified"
'
-test_expect_success_multi '--stdin with empty STDIN' '' '
+test_expect_success_multi -- '--stdin with empty STDIN' '' '
test_check_ignore "--stdin" 1 </dev/null &&
test_stderr ""
'
@@ -245,7 +245,7 @@ test_expect_success '-q with multiple args' '
stderr_contains "fatal: --quiet is only valid with a single pathname"
'
-test_expect_success '--quiet with multiple args' '
+test_expect_success -- '--quiet with multiple args' '
expect "" &&
test_check_ignore "--quiet one two" 128 &&
stderr_contains "fatal: --quiet is only valid with a single pathname"
@@ -255,7 +255,7 @@ for verbose_opt in '-v' '--verbose'
do
for quiet_opt in '-q' '--quiet'
do
- test_expect_success "$quiet_opt $verbose_opt" "
+ test_expect_success -- "$quiet_opt $verbose_opt" "
expect '' &&
test_check_ignore '$quiet_opt $verbose_opt foo' 128 &&
stderr_contains 'fatal: cannot have both --quiet and --verbose'
@@ -263,7 +263,7 @@ do
done
done
-test_expect_success '--quiet with multiple args' '
+test_expect_success -- '--quiet with multiple args' '
expect "" &&
test_check_ignore "--quiet one two" 128 &&
stderr_contains "fatal: --quiet is only valid with a single pathname"
@@ -274,12 +274,12 @@ test_expect_success_multi 'erroneous use of --' '' '
stderr_contains "fatal: no path specified"
'
-test_expect_success_multi '--stdin with superfluous arg' '' '
+test_expect_success_multi -- '--stdin with superfluous arg' '' '
test_check_ignore "--stdin foo" 128 &&
stderr_contains "fatal: cannot specify pathnames with --stdin"
'
-test_expect_success_multi '--stdin -z with superfluous arg' '' '
+test_expect_success_multi -- '--stdin -z with superfluous arg' '' '
test_check_ignore "--stdin -z foo" 128 &&
stderr_contains "fatal: cannot specify pathnames with --stdin"
'
@@ -613,34 +613,34 @@ sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \
sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \
tr ":\t\n" "\0" >expected-verbose0
-test_expect_success '--stdin' '
+test_expect_success -- '--stdin' '
expect_from_stdin <expected-default &&
test_check_ignore "--stdin" <stdin
'
-test_expect_success '--stdin -q' '
+test_expect_success -- '--stdin -q' '
expect "" &&
test_check_ignore "-q --stdin" <stdin
'
-test_expect_success '--stdin -v' '
+test_expect_success -- '--stdin -v' '
expect_from_stdin <expected-verbose &&
test_check_ignore "-v --stdin" <stdin
'
for opts in '--stdin -z' '-z --stdin'
do
- test_expect_success "$opts" "
+ test_expect_success -- "$opts" "
expect_from_stdin <expected-default0 &&
test_check_ignore '$opts' <stdin0
"
- test_expect_success "$opts -q" "
+ test_expect_success -- "$opts -q" "
expect "" &&
test_check_ignore '-q $opts' <stdin0
"
- test_expect_success "$opts -v" "
+ test_expect_success -- "$opts -v" "
expect_from_stdin <expected-verbose0 &&
test_check_ignore '-v $opts' <stdin0
"
@@ -699,7 +699,7 @@ sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \
sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \
tr ":\t\n" "\0" >expected-verbose0
-test_expect_success '--stdin from subdirectory' '
+test_expect_success -- '--stdin from subdirectory' '
expect_from_stdin <expected-default &&
(
cd a &&
@@ -707,7 +707,7 @@ test_expect_success '--stdin from subdirectory' '
)
'
-test_expect_success '--stdin from subdirectory with -v' '
+test_expect_success -- '--stdin from subdirectory with -v' '
expect_from_stdin <expected-verbose &&
(
cd a &&
@@ -715,7 +715,7 @@ test_expect_success '--stdin from subdirectory with -v' '
)
'
-test_expect_success '--stdin from subdirectory with -v -n' '
+test_expect_success -- '--stdin from subdirectory with -v -n' '
expect_from_stdin <expected-all &&
(
cd a &&
@@ -725,7 +725,7 @@ test_expect_success '--stdin from subdirectory with -v -n' '
for opts in '--stdin -z' '-z --stdin'
do
- test_expect_success "$opts from subdirectory" '
+ test_expect_success -- "$opts from subdirectory" '
expect_from_stdin <expected-default0 &&
(
cd a &&
@@ -733,7 +733,7 @@ do
)
'
- test_expect_success "$opts from subdirectory with -v" '
+ test_expect_success -- "$opts from subdirectory with -v" '
expect_from_stdin <expected-verbose0 &&
(
cd a &&
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 19cdf0b..473b21d 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -347,20 +347,65 @@ test_declared_prereq () {
return 1
}
+test_expect_parse () {
+ whoami=$1
+ shift
+ test_expect_new_style=
+ while case $# in 0) false ;; esac
+ do
+ case "$1" in
+ --prereq)
+ test $# -gt 1 ||
+ error "bug in the test script: --prereq needs a parameter"
+ test_prereq=$2
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ --*)
+ error "bug in the test script: unknown option '$1'"
+ ;;
+ *)
+ break
+ ;;
+ esac
+ test_expect_new_style=yes
+ shift
+ done
+
+ # Traditional "test_expect_what [PREREQ] BODY"
+ if test -z "$test_expect_new_style"
+ then
+ test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
+ fi
+
+ if test $# != 2
+ then
+ if test -z "$test_expect_new_style"
+ then
+ error "bug in the test script: not 2 or 3 parameters to $whoami"
+ else
+ error "bug in the test script: not 2 parameters to $whoami"
+ fi
+ fi
+ test_label=$1 test_body=$2
+
+ export test_prereq
+}
+
test_expect_failure () {
test_start_
- test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
- test "$#" = 2 ||
- error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
- export test_prereq
+ test_expect_parse test_expect_failure "$@"
if ! test_skip "$@"
then
- say >&3 "checking known breakage: $2"
- if test_run_ "$2" expecting_failure
+ say >&3 "checking known breakage: $test_body"
+ if test_run_ "$test_body" expecting_failure
then
- test_known_broken_ok_ "$1"
+ test_known_broken_ok_ "$test_label"
else
- test_known_broken_failure_ "$1"
+ test_known_broken_failure_ "$test_label"
fi
fi
test_finish_
@@ -368,16 +413,13 @@ test_expect_failure () {
test_expect_success () {
test_start_
- test "$#" = 3 && { test_prereq=$1; shift; } || test_prereq=
- test "$#" = 2 ||
- error "bug in the test script: not 2 or 3 parameters to test-expect-success"
- export test_prereq
+ test_expect_parse test_expect_success "$@"
if ! test_skip "$@"
then
- say >&3 "expecting success: $2"
- if test_run_ "$2"
+ say >&3 "expecting success: $test_body"
+ if test_run_ "$test_body"
then
- test_ok_ "$1"
+ test_ok_ "$test_label"
else
test_failure_ "$@"
fi
--
1.8.3.4.1241.g1ce9896
next prev parent reply other threads:[~2013-09-23 21:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-17 12:10 [PATCH 1/2] perf-lib: split starting the test from the execution Thomas Gummerer
2013-09-17 12:10 ` [PATCH 2/2] perf-lib: add test_perf_cleanup target Thomas Gummerer
2013-09-17 17:43 ` Junio C Hamano
2013-09-19 11:42 ` Thomas Gummerer
2013-09-19 17:19 ` Junio C Hamano
2013-09-19 19:52 ` Junio C Hamano
2013-09-19 20:11 ` Junio C Hamano
2013-09-20 22:14 ` Thomas Gummerer
2013-09-23 21:08 ` [PATCH v2 0/3] Add cleanup action to perf-lib Thomas Gummerer
2013-09-23 21:08 ` Thomas Gummerer [this message]
2013-09-23 21:08 ` [PATCH v2 2/3] perf-lib: add cleanup option Thomas Gummerer
2013-09-23 21:08 ` [PATCH v2 3/3] p0003-index.sh: add perf test for the index formats Thomas Gummerer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1379970526-27997-2-git-send-email-t.gummerer@gmail.com \
--to=t.gummerer@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=trast@inf.ethz.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).