Merge branch 'pw/p4'
[git/mjg.git] / t / t0081-line-buffer.sh
blob550fad0823a8d27cf1d49b1c55154ea7ce69de02
1 #!/bin/sh
3 test_description="Test the svn importer's input handling routines.
5 These tests exercise the line_buffer library, but their real purpose
6 is to check the assumptions that library makes of the platform's input
7 routines. Processes engaged in bi-directional communication would
8 hang if fread or fgets is too greedy.
10 While at it, check that input of newlines and null bytes are handled
11 correctly.
13 . ./test-lib.sh
15 test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
17 generate_tens_of_lines () {
18 tens=$1 &&
19 line=$2 &&
21 i=0 &&
22 while test $i -lt "$tens"
24 for j in a b c d e f g h i j
26 echo "$line"
27 done &&
28 : $((i = $i + 1)) ||
29 return
30 done
33 long_read_test () {
34 : each line is 10 bytes, including newline &&
35 line=abcdefghi &&
36 echo "$line" >expect &&
38 if ! test_declared_prereq PIPE
39 then
40 echo >&4 "long_read_test: need to declare PIPE prerequisite"
41 return 127
42 fi &&
43 tens_of_lines=$(($1 / 100 + 1)) &&
44 lines=$(($tens_of_lines * 10)) &&
45 readsize=$((($lines - 1) * 10 + 3)) &&
46 copysize=7 &&
47 rm -f input &&
48 mkfifo input &&
51 generate_tens_of_lines $tens_of_lines "$line" &&
52 sleep 100
53 } >input &
54 } &&
55 test-line-buffer input <<-EOF >output &&
56 read $readsize
57 copy $copysize
58 EOF
59 kill $! &&
60 test_line_count = $lines output &&
61 tail -n 1 <output >actual &&
62 test_cmp expect actual
65 test_expect_success 'setup: have pipes?' '
66 rm -f frob &&
67 if mkfifo frob
68 then
69 test_set_prereq PIPE
73 test_expect_success 'hello world' '
74 echo HELLO >expect &&
75 test-line-buffer <<-\EOF >actual &&
76 read 6
77 HELLO
78 EOF
79 test_cmp expect actual
82 test_expect_success PIPE '0-length read, no input available' '
83 >expect &&
84 rm -f input &&
85 mkfifo input &&
87 sleep 100 >input &
88 } &&
89 test-line-buffer input <<-\EOF >actual &&
90 read 0
91 copy 0
92 EOF
93 kill $! &&
94 test_cmp expect actual
97 test_expect_success '0-length read, send along greeting' '
98 echo HELLO >expect &&
99 test-line-buffer <<-\EOF >actual &&
100 read 0
101 copy 6
102 HELLO
104 test_cmp expect actual
107 test_expect_success PIPE '1-byte read, no input available' '
108 printf "%s" ab >expect &&
109 rm -f input &&
110 mkfifo input &&
113 printf "%s" a &&
114 printf "%s" b &&
115 sleep 100
116 } >input &
117 } &&
118 test-line-buffer input <<-\EOF >actual &&
119 read 1
120 copy 1
122 kill $! &&
123 test_cmp expect actual
126 test_expect_success PIPE 'long read (around 8192 bytes)' '
127 long_read_test 8192
130 test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' '
131 long_read_test 65536
134 test_expect_success 'read from file descriptor' '
135 rm -f input &&
136 echo hello >expect &&
137 echo hello >input &&
138 echo copy 6 |
139 test-line-buffer "&4" 4<input >actual &&
140 test_cmp expect actual
143 test_expect_success 'buffer_read_string copes with null byte' '
144 >expect &&
145 q_to_nul <<-\EOF | test-line-buffer >actual &&
146 read 2
149 test_cmp expect actual
152 test_expect_success 'skip, copy null byte' '
153 echo Q | q_to_nul >expect &&
154 q_to_nul <<-\EOF | test-line-buffer >actual &&
155 skip 2
157 copy 2
160 test_cmp expect actual
163 test_expect_success 'read null byte' '
164 echo ">QhelloQ" | q_to_nul >expect &&
165 q_to_nul <<-\EOF | test-line-buffer >actual &&
166 binary 8
167 QhelloQ
169 test_cmp expect actual
172 test_expect_success 'long reads are truncated' '
173 echo foo >expect &&
174 test-line-buffer <<-\EOF >actual &&
175 read 5
178 test_cmp expect actual
181 test_expect_success 'long copies are truncated' '
182 printf "%s\n" "" foo >expect &&
183 test-line-buffer <<-\EOF >actual &&
184 read 1
186 copy 5
189 test_cmp expect actual
192 test_expect_success 'long binary reads are truncated' '
193 echo ">foo" >expect &&
194 test-line-buffer <<-\EOF >actual &&
195 binary 5
198 test_cmp expect actual
201 test_done