blob: 2101bfeb063df2eaf46b458114d32ed57cc48c5d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright 2020 Oxide Computer Company
#
HEAD=${HEAD:=/usr/bin/head}
TMPFILE=/tmp/head_test.out.$$
TMPINPUT=/tmp/head_test.in.$$
test_fail() {
echo "$*"
((failures++))
}
test_one() {
typeset desc="$1"
shift
typeset input="$1"
shift
typeset output="$1"
shift
printf "Running %s: " "$desc"
if [[ "$input" == "-" ]]; then
$HEAD $* > $TMPFILE
else
printf "$input" | $HEAD $* > $TMPFILE
fi
if [[ $? -ne 0 ]]; then
test_fail "head exited non-zero"
return
fi
if [[ ! -f "$output" ]]; then
test_fail "missing expeced output file $output"
return
fi
if ! diff $output $TMPFILE >/dev/null 2>/dev/null; then
test_fail "output mismatch"
return
fi
printf "passed\n"
}
if ! cd $(dirname $0); then
printf "failed to reach test directory!\n" 1>&2
exit 1
fi
test_one "simple stdin 1" "a\n\n\nb\n" stdin.1.out
test_one "simple stdin 2 -n 1" "a\n\n\nb\n" stdin.2.out "-n 1"
test_one "simple stdin 3 -n 3" "a\n\n\nb\n" stdin.3.out "-n 3"
test_one "simple stdin 4 -n 10000" "a\n\n\nb\n" stdin.1.out "-n 10000"
test_one "simple stdin 5 -c 1" "a\n\n\nb\n" stdin.5.out "-c 1"
test_one "simple stdin 6 -c 230" "a\n\n\nb\n" stdin.1.out "-c 230"
test_one "simple stdin 7 -n 3 -q" "a\n\n\nb\n" stdin.3.out "-n 3" "-q"
test_one "simple stdin 8 -" "a\n\n\nb\n" stdin.2.out "-1"
test_one "simple stdin 9 -23" "a\n\n\nb\n" stdin.1.out "-23"
test_one "simple stdin 10 -q" "a\n\n\nb\n" stdin.1.out "-q"
#
# Note, different implementations have different behaviours when -v is specified
# and there is only standard input. This verifies our current choice.
#
test_one "simple stdin 11 -v" "a\n\n\nb\n" stdin.11.out "-v"
test_one "stdin nul 1" "hello\0regression\n" stdin-nul.1.out
test_one "stdin nul 2 -c 1" "hello\0regression\n" stdin-nul.2.out "-c 1"
test_one "stdin nul 3" "this\0\nwas\0an\0\n\nunfortunate\0buf\0\n" \
stdin-nul.3.out
test_one "5221 regression" "Old\nBill Joy\nBug\n\nLasts Forever\n" 5221.out \
5221.in /dev/stdin
test_one "/dev/stdin repeated" "Hello\n" stdin.multi.out /dev/stdin /dev/stdin
test_one "no newline -n 3" "Why do you need newlines?" stdin.nonewline.out \
"-n 3"
test_one "simple file 1" - rings.1.out rings.in
test_one "simple file 2 -c 30" - rings.2.out "-c 30" rings.in
test_one "simple file 3 -n 7" - rings.3.out "-n 7" rings.in
test_one "simple file 4 -50" - rings.in "-50" rings.in
test_one "simple file 5 -v" - rings.5.out "-v" rings.in
test_one "multi file 1 -n 5 -q" - multi.1.out "-n 5" "-q" rings.in \
rings.in rings.in
test_one "multi file 2 -n 5 -q -v" - multi.1.out "-n 5" "-q" "-v" "-q" \
rings.in rings.in rings.in
test_one "multi file 3 -n 5 -q -v -q" - multi.1.out "-n 5" "-q" "-v" "-q" \
rings.in rings.in rings.in
test_one "multi file 4 -c 100" - multi.4.out "-c 100" rings.in rings.in
#
# Construct a file larger than 8k in size without a new line to verify that we
# will do multiple reads beyond the first.
#
rm -f $TMPINPUT
for ((i = 0; i < 10000; i++)); do
printf "Lorem ipsum" >> $TMPINPUT
done
test_one "large input" - $TMPINPUT $TMPINPUT
rm $TMPFILE $TMPINPUT
if [[ "$failures" -ne 0 ]]; then
printf "%u tests failed\n" "$failures" 2>&1
exit 1
fi
printf "All tests passed successfully\n"
exit 0
|