1
#!/bin/sh
2
3
test_description="Test the svn importer's input handling routines.
4
+
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.
9
+
10
+While at it, check that input of newlines and null bytes are handled
11
+correctly.
12
"
13
. ./test-lib.sh
14
7
-test_expect_success 'read greeting' '
15
+test -n "$GIT_REMOTE_SVN_TEST_BIG_FILES" && test_set_prereq EXPENSIVE
16
+
17
+generate_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
+
33
+long_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
+ 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
+}
64
+
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
+'
72
+
73
+test_expect_success 'hello world' '
74
echo HELLO >expect &&
75
test-line-buffer <<-\EOF >actual &&
76
read 6
79
test_cmp expect actual
80
'
81
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
+'
96
+
97
test_expect_success '0-length read, send along greeting' '
98
echo HELLO >expect &&
99
test-line-buffer <<-\EOF >actual &&
104
test_cmp expect actual
105
'
106
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
124
+'
125
+
126
+test_expect_success PIPE 'long read (around 8192 bytes)' '
127
+ long_read_test 8192
128
+'
129
+
130
+test_expect_success PIPE,EXPENSIVE 'longer read (around 65536 bytes)' '
131
+ long_read_test 65536
132
+'
133
+
134
test_expect_success 'buffer_read_string copes with null byte' '
135
>expect &&
136
q_to_nul <<-\EOF | test-line-buffer >actual &&