#!/bin/sh
test_description="Test the svn importer's input handling routines.
+
+These tests exercise the line_buffer library, but their real purpose
+is to check the assumptions that library makes of the platform's input
+routines. Processes engaged in bi-directional communication would
+hang if fread or fgets is too greedy.
+
+While at it, check that input of newlines and null bytes are handled
+correctly.
"
. ./test-lib.sh
-test_expect_success 'read greeting' '
- echo HELLO >expect &&
+test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
+
+generate_tens_of_lines () {
+ tens=$1 &&
+ line=$2 &&
+
+ i=0 &&
+ while test $i -lt "$tens"
+ do
+ for j in a b c d e f g h i j
+ do
+ echo "$line"
+ done &&
+ : $((i = $i + 1)) ||
+ return
+ done
+}
+
+long_read_test () {
+ : each line is 10 bytes, including newline &&
+ 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 &
+ } &&
+ 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
+}
+
+test_expect_success 'setup: have pipes?' '
+ rm -f frob &&
+ if mkfifo frob
+ then
+ test_set_prereq PIPE
+ fi
+'
+
+test_expect_success 'hello world' '
+ echo ">HELLO" >expect &&
test-line-buffer <<-\EOF >actual &&
- read 5
+ binary 6
HELLO
EOF
test_cmp expect actual
'
+test_expect_success PIPE '0-length read, no input available' '
+ printf ">" >expect &&
+ rm -f input &&
+ mkfifo input &&
+ {
+ sleep 100 >input &
+ } &&
+ test-line-buffer input <<-\EOF >actual &&
+ binary 0
+ copy 0
+ EOF
+ kill $! &&
+ test_cmp expect actual
+'
+
test_expect_success '0-length read, send along greeting' '
- printf "%s\n" "" HELLO >expect &&
+ echo ">HELLO" >expect &&
test-line-buffer <<-\EOF >actual &&
- read 0
-
- copy 5
+ binary 0
+ copy 6
HELLO
EOF
test_cmp expect actual
'
-test_expect_success 'buffer_read_string copes with trailing null byte' '
- echo >expect &&
+test_expect_success PIPE '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 &
+ } &&
+ 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)' '
+ long_read_test 8192
+'
+
+test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' '
+ long_read_test 65536
+'
+
+test_expect_success 'read from file descriptor' '
+ rm -f input &&
+ echo hello >expect &&
+ echo hello >input &&
+ echo copy 6 |
+ test-line-buffer "&4" 4<input >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'skip, copy null byte' '
+ echo Q | q_to_nul >expect &&
q_to_nul <<-\EOF | test-line-buffer >actual &&
- read 1
+ skip 2
+ Q
+ copy 2
Q
EOF
test_cmp expect actual
'
-test_expect_success '0-length read, copy null byte' '
- printf "%s\n" "" Q | q_to_nul >expect &&
+test_expect_success 'read null byte' '
+ echo ">QhelloQ" | q_to_nul >expect &&
q_to_nul <<-\EOF | test-line-buffer >actual &&
- read 0
-
- copy 1
- Q
+ binary 8
+ QhelloQ
EOF
test_cmp expect actual
'
test_expect_success 'long reads are truncated' '
- printf "%s\n" foo "" >expect &&
+ echo ">foo" >expect &&
test-line-buffer <<-\EOF >actual &&
- read 5
+ binary 5
foo
EOF
test_cmp expect actual
'
test_expect_success 'long copies are truncated' '
- printf "%s\n" "" foo >expect &&
+ printf "%s\n" ">" foo >expect &&
test-line-buffer <<-\EOF >actual &&
- read 0
+ binary 1
copy 5
foo
test_cmp expect actual
'
+test_expect_success 'long binary reads are truncated' '
+ echo ">foo" >expect &&
+ test-line-buffer <<-\EOF >actual &&
+ binary 5
+ foo
+ EOF
+ test_cmp expect actual
+'
+
test_done