| #!/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 -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" && |
| 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 && |
| 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' ' |
| echo ">HELLO" >expect && |
| test-line-buffer <<-\EOF >actual && |
| binary 0 |
| copy 6 |
| HELLO |
| EOF |
| test_cmp expect actual |
| ' |
| |
| 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 && |
| 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 && |
| skip 2 |
| Q |
| copy 2 |
| Q |
| EOF |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'read null byte' ' |
| echo ">QhelloQ" | q_to_nul >expect && |
| q_to_nul <<-\EOF | test-line-buffer >actual && |
| binary 8 |
| QhelloQ |
| EOF |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'long reads are truncated' ' |
| echo ">foo" >expect && |
| test-line-buffer <<-\EOF >actual && |
| binary 5 |
| foo |
| EOF |
| test_cmp expect actual |
| ' |
| |
| test_expect_success 'long copies are truncated' ' |
| printf "%s\n" ">" foo >expect && |
| test-line-buffer <<-\EOF >actual && |
| binary 1 |
| |
| copy 5 |
| foo |
| EOF |
| 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 |