From: Jonathan Nieder <jrnieder@gmail.com>
To: Johannes Sixt <j.sixt@viscovery.net>
Cc: Jeff King <peff@peff.net>, Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, David Barr <david.barr@cordelta.com>
Subject: [PATCH/RFC svn-fe] tests: introduce helper to fill a pipe in the background
Date: Wed, 30 Mar 2011 03:16:43 -0500 [thread overview]
Message-ID: <20110330081643.GD2793@elie> (raw)
In-Reply-To: <4D92D3A8.3090301@viscovery.net>
The fill_input function generates a fifo and runs a command to write
to it and wait. The intended use is to check that specialized
programs can find the end of their input without reading too much or
relying on EOF or SIGPIPE. For example:
fill_input "echo hi" &&
head -1 input
will succeed, while
fill_input "echo hi" &&
head -2 input
will hang.
It works by running the indicated commands followed by
"exec sleep 100" in a background process; the process ID is later
passed to "kill" to avoid leaving behind random processes.
Several tests already did something like that but this adds some
improvements:
1. Wrap the "kill" in a test_when_finished, since we want
to clean up the process whether the test succeeds or not.
2. Mark the kill as OK to fail. These tests are not about
whether the input generating function dies due to SIGPIPE
or the system is slow enough for the timer to expire early
but about what happens on the downstream end.
3. Mark the relevant tests with the EXECKEEPSPID prerequisite.
Based-on-patch-by: Jeff King <peff@peff.net>
Improved-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Johannes Sixt wrote:
> Note that tests that depend on ( exec ... ) & kill $! must be marked with
> the EXECKEEPSPID prerequisite.
Hmm, that's a shame, since the point of writing t0081 was to make sure
some assumptions the line-buffer lib makes are valid on Windows. So I
suspect a better thing to do would be to remove t0081 --- the
line-buffer lib is simple, everyday use exercises it pretty well
already, and I can't imagine this script catching a bug.
t/t0081-line-buffer.sh | 61 ++++++++++++++++++++++--------------------------
1 files changed, 28 insertions(+), 33 deletions(-)
diff --git a/t/t0081-line-buffer.sh b/t/t0081-line-buffer.sh
index 5067d1e..fb09ff1 100755
--- a/t/t0081-line-buffer.sh
+++ b/t/t0081-line-buffer.sh
@@ -14,6 +14,25 @@ correctly.
test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
+fill_input () {
+ if
+ ! test_declared_prereq PIPE ||
+ ! test_declared_prereq EXECKEEPSPID
+ then
+ echo >&4 "fill_input requires PIPE,EXECKEEPSPID prerequisites"
+ return 127
+ fi &&
+ rm -f input &&
+ mkfifo input &&
+ {
+ (
+ eval "$*" &&
+ exec sleep 100
+ ) >input &
+ } &&
+ test_when_finished "kill $!"
+}
+
generate_tens_of_lines () {
tens=$1 &&
line=$2 &&
@@ -35,28 +54,15 @@ long_read_test () {
line=abcdefghi &&
echo "$line" >expect &&
- if ! test_declared_prereq PIPE
- then
- echo >&4 "long_read_test: need to declare PIPE prerequisite"
- return 127
- fi &&
tens_of_lines=$(($1 / 100 + 1)) &&
lines=$(($tens_of_lines * 10)) &&
readsize=$((($lines - 1) * 10 + 3)) &&
copysize=7 &&
- rm -f input &&
- mkfifo input &&
- {
- (
- generate_tens_of_lines $tens_of_lines "$line" &&
- exec sleep 100
- ) >input &
- } &&
+ fill_input "generate_tens_of_lines $tens_of_lines $line" &&
test-line-buffer input <<-EOF >output &&
binary $readsize
copy $copysize
EOF
- kill $! &&
test_line_count = $lines output &&
tail -n 1 <output >actual &&
test_cmp expect actual
@@ -79,18 +85,13 @@ test_expect_success 'hello world' '
test_cmp expect actual
'
-test_expect_success PIPE '0-length read, no input available' '
+test_expect_success PIPE,EXECKEEPSPID '0-length read, no input available' '
printf ">" >expect &&
- rm -f input &&
- mkfifo input &&
- {
- sleep 100 >input &
- } &&
+ fill_input : &&
test-line-buffer input <<-\EOF >actual &&
binary 0
copy 0
EOF
- kill $! &&
test_cmp expect actual
'
@@ -104,26 +105,20 @@ test_expect_success '0-length read, send along greeting' '
test_cmp expect actual
'
-test_expect_success PIPE '1-byte read, no input available' '
+test_expect_success PIPE,EXECKEEPSPID '1-byte read, no input available' '
printf ">%s" ab >expect &&
- rm -f input &&
- mkfifo input &&
- {
- (
- printf "%s" a &&
- printf "%s" b &&
- exec sleep 100
- ) >input &
- } &&
+ fill_input "
+ printf a &&
+ printf b
+ " &&
test-line-buffer input <<-\EOF >actual &&
binary 1
copy 1
EOF
- kill $! &&
test_cmp expect actual
'
-test_expect_success PIPE 'long read (around 8192 bytes)' '
+test_expect_success PIPE,EXECKEEPSPID 'long read (around 8192 bytes)' '
long_read_test 8192
'
--
1.7.4.2
next prev parent reply other threads:[~2011-03-30 8:16 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-29 17:31 [PATCH] Portability: returning void Michael Witten
2011-03-29 20:02 ` Jonathan Nieder
2011-03-29 22:16 ` Jeff King
2011-03-29 22:36 ` Jeff King
2011-03-29 23:49 ` Jonathan Nieder
2011-03-30 0:16 ` Jeff King
2011-03-30 0:29 ` Jonathan Nieder
2011-03-30 3:30 ` Jeff King
2011-03-30 3:57 ` Jonathan Nieder
2011-03-30 4:13 ` Jeff King
2011-03-30 6:54 ` Johannes Sixt
2011-03-30 8:16 ` Jonathan Nieder [this message]
2011-03-30 8:41 ` Jonathan Nieder
2011-03-30 12:40 ` Jeff King
2011-03-30 18:54 ` Jonathan Nieder
2011-03-30 4:41 ` [PULL svn-fe] " Jonathan Nieder
2011-03-30 19:31 ` Junio C Hamano
2011-03-30 0:42 ` [PATCH] " Jonathan Nieder
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=20110330081643.GD2793@elie \
--to=jrnieder@gmail.com \
--cc=david.barr@cordelta.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j.sixt@viscovery.net \
--cc=peff@peff.net \
/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).