On Thu, Apr 11, 2013 at 01:05:12PM +0100, Adam Spiers wrote: > +test_expect_success 'setup: have stdbuf?' ' > + if which stdbuf >/dev/null 2>&1 > + then > + test_set_prereq STDBUF > + fi > +' > + > +test_expect_success STDBUF 'streaming support for --stdin' ' > + ( > + echo one > + sleep 2 > + echo two > + ) | stdbuf -oL git check-ignore -v -n --stdin >out & > + pid=$! && > + sleep 1 && > + grep "^\.gitignore:1:one one" out && > + test $( wc -l <out ) = 1 && > + sleep 2 && > + grep "^:: two" out && > + test $( wc -l <out ) = 2 && > + ( wait $pid || kill $pid || : ) 2>/dev/null > +'
I always get a little nervous with sleeps in the test suite, as they are indicative that we are trying to avoid some race condition, which means that the test can fail when the system is under load, or when a tool like valgrind is used which drastically alters the timing (e.g., if check-ignore takes longer than 1 second to produce its answer, we may fail here). Is there a simpler way to test this? Like: # Set up a long-running "check-ignore" connected by pipes. mkfifo in out && (git check-ignore ... <in >out &) && # We cannot just "echo >in" because check-ignore # would get EOF after echo exited; instead we open # the descriptor in our shell, and then echo to the # fd. We make sure to close it at the end, so that # the subprocess does get EOF and dies properly. exec 9>in && test_when_finished "exec 9>&-" && # Now we can do interactive tests echo >&9 one && read response <out && test "$response" = ... && echo >&9 two && read response <out && test "$response" = ... Hmm. Maybe simpler wasn't the right word. :) But it avoids any sleeps or race conditions. -Peff -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html