1#!/bin/sh
2
3test_description="Test the svn importer's input handling routines.
4
5These tests exercise the line_buffer library, but their real purpose
6is to check the assumptions that library makes of the platform's input
7routines. Processes engaged in bi-directional communication would
8hang if fread or fgets is too greedy.
9
10While at it, check that input of newlines and null bytes are handled
11correctly.
12"
13. ./test-lib.sh
14
15test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
16
17generate_tens_of_lines () {
18 tens=$1 &&
19 line=$2 &&
20
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}
32
33long_read_test () {
34 : each line is 10 bytes, including newline &&
35 line=abcdefghi &&
36 echo "$line" >expect &&
37
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 binary $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}
64
65test_expect_success 'setup: have pipes?' '
66 rm -f frob &&
67 if mkfifo frob
68 then
69 test_set_prereq PIPE
70 fi
71'
72
73test_expect_success 'hello world' '
74 echo ">HELLO" >expect &&
75 test-line-buffer <<-\EOF >actual &&
76 binary 6
77 HELLO
78 EOF
79 test_cmp expect actual
80'
81
82test_expect_success PIPE '0-length read, no input available' '
83 printf ">" >expect &&
84 rm -f input &&
85 mkfifo input &&
86 {
87 sleep 100 >input &
88 } &&
89 test-line-buffer input <<-\EOF >actual &&
90 binary 0
91 copy 0
92 EOF
93 kill $! &&
94 test_cmp expect actual
95'
96
97test_expect_success '0-length read, send along greeting' '
98 echo ">HELLO" >expect &&
99 test-line-buffer <<-\EOF >actual &&
100 binary 0
101 copy 6
102 HELLO
103 EOF
104 test_cmp expect actual
105'
106
107test_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 binary 1
120 copy 1
121 EOF
122 kill $! &&
123 test_cmp expect actual
124'
125
126test_expect_success PIPE 'long read (around 8192 bytes)' '
127 long_read_test 8192
128'
129
130test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' '
131 long_read_test 65536
132'
133
134test_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
141'
142
143test_expect_success 'skip, copy null byte' '
144 echo Q | q_to_nul >expect &&
145 q_to_nul <<-\EOF | test-line-buffer >actual &&
146 skip 2
147 Q
148 copy 2
149 Q
150 EOF
151 test_cmp expect actual
152'
153
154test_expect_success 'read null byte' '
155 echo ">QhelloQ" | q_to_nul >expect &&
156 q_to_nul <<-\EOF | test-line-buffer >actual &&
157 binary 8
158 QhelloQ
159 EOF
160 test_cmp expect actual
161'
162
163test_expect_success 'long reads are truncated' '
164 echo ">foo" >expect &&
165 test-line-buffer <<-\EOF >actual &&
166 binary 5
167 foo
168 EOF
169 test_cmp expect actual
170'
171
172test_expect_success 'long copies are truncated' '
173 printf "%s\n" ">" foo >expect &&
174 test-line-buffer <<-\EOF >actual &&
175 binary 1
176
177 copy 5
178 foo
179 EOF
180 test_cmp expect actual
181'
182
183test_expect_success 'long binary reads are truncated' '
184 echo ">foo" >expect &&
185 test-line-buffer <<-\EOF >actual &&
186 binary 5
187 foo
188 EOF
189 test_cmp expect actual
190'
191
192test_done