Code

Merge branch 'maint'
[git.git] / t / t0081-line-buffer.sh
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.
12 "
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"
23         do
24                 for j in a b c d e f g h i j
25                 do
26                         echo "$line"
27                 done &&
28                 : $((i = $i + 1)) ||
29                 return
30         done
31 }
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 &&
49         {
50                 {
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
63 }
65 test_expect_success 'setup: have pipes?' '
66       rm -f frob &&
67       if mkfifo frob
68       then
69                 test_set_prereq PIPE
70       fi
71 '
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
80 '
82 test_expect_success PIPE '0-length read, no input available' '
83         >expect &&
84         rm -f input &&
85         mkfifo input &&
86         {
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
95 '
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
103         EOF
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 &&
111         {
112                 {
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
121         EOF
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
147         Q
148         EOF
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
156         Q
157         copy 2
158         Q
159         EOF
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
168         EOF
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
176         foo
177         EOF
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
187         foo
188         EOF
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
196         foo
197         EOF
198         test_cmp expect actual
201 test_done