xref: /illumos-gate/usr/src/test/util-tests/tests/grep_xpg4/grep_test.ksh (revision 45ede40b2394db7967e59f19288fae9b62efd4aa)
1#! /usr/bin/ksh
2#
3#
4# This file and its contents are supplied under the terms of the
5# Common Development and Distribution License ("CDDL"), version 1.0.
6# You may only use this file in accordance with the terms of version
7# 1.0 of the CDDL.
8#
9# A full copy of the text of the CDDL should have accompanied this
10# source.  A copy of the CDDL is also available via the Internet at
11# http://www.illumos.org/license/CDDL.
12#
13
14#
15# Copyright 2017 Nexenta Systems, Inc. All rights reserved.
16# Copyright 2020 Peter Tribble.
17# Copyright 2020 Oxide Computer Company
18#
19
20XGREP=${XGREP:=/usr/bin/grep}
21FILEDIR=$MY_TESTS/tests/files/grep
22OUTFILE=/tmp/grep_test.out.$$
23FLAGSFILE=/tmp/grep_flags.$$
24
25#
26# Set the tests to a known multi-byte locale to start with.
27#
28export LC_ALL=C.UTF-8
29
30fail() {
31	echo $1
32	exit -1
33}
34
35test_fail() {
36	echo "$*"
37	((failures++))
38}
39
40#
41# Run through a set of tests once for each value in $FLAGSFILE. Arguments are:
42# - expected exit status
43# - the file pass this is
44# - the remaining arguments to grep
45#
46run_tests() {
47	i=0
48	exp=$1
49	shift
50	pass=$1
51	shift
52
53	echo "$FLAGS" > $FLAGSFILE
54	while read flags; do
55		difffile="gout.$pass.$i"
56		print -n "test $total: grep $flags: "
57		((total++))
58		((i++))
59		$XGREP $flags "$@" > $OUTFILE
60		err=$?
61		if [[ $err -ne $exp ]]; then
62			test_fail "failed on exit: $err"
63			continue
64		fi
65
66		if [[ $exp -eq 0 ]]; then
67			if [[ ! -f "$difffile" ]]; then
68				test_fail "missing output file $difffile"
69				continue
70			fi
71
72			if [[ -n "$(diff $OUTFILE $difffile)" ]]; then
73				print "$(diff $OUTFILE $difffile)"
74				test_fail "output is different from $difffile"
75				continue
76			fi
77		fi
78		echo "passed"
79	done < $FLAGSFILE
80}
81
82run_tests_stdin() {
83	i=0
84	exp=$1
85	pass=$2
86	pattern=$3
87	file=$4
88
89	echo "$FLAGS" > $FLAGSFILE
90	while read flags; do
91		difffile="gout.$pass.$i"
92		print -n "test $total: grep (stdin) $flags: "
93		((total++))
94		((i++))
95		$XGREP $flags $pattern < $file > $OUTFILE
96		err=$?
97		if [[ $err -ne $exp ]]; then
98			test_fail "failed on exit: $err"
99			continue
100		fi
101
102		if [[ $exp -eq 0 ]]; then
103			if [[ ! -f "$difffile" ]]; then
104				test_fail "missing output file $difffile"
105				continue
106			fi
107
108			if [[ -n "$(diff $OUTFILE $difffile)" ]]; then
109				print "$(diff $OUTFILE $difffile)"
110				test_fail "output is different"
111				continue
112			fi
113		fi
114		echo "passed"
115	done < $FLAGSFILE
116}
117total=0
118failures=0
119
120FLAGS="
121-n
122-c
123-q
124-v
125-nv
126-vc
127-A 5
128-nA 5
129-cA 5
130-qA 5
131-vA 5
132-nvA 5
133-vcA 5
134-B 5
135-nB 5
136-cB 5
137-qB 5
138-vB 5
139-nvB 5
140-vcB 5
141-C 5
142-nC 5
143-cC 5
144-qC 5
145-vC 5
146-nvC 5
147-vcC 5
148-B 5 -A 2
149-nB 5 -A 2
150-cB 5 -A 2
151-qB 5 -A 2
152-vB 5 -A 2
153-nvB 5 -A 2
154-vcB 5 -A 2
155-B 5 -A 2 -C 5
156-nB 5 -A 2 -C 5
157-cB 5 -A 2 -C 5
158-qB 5 -A 2 -C 5
159-vB 5 -A 2 -C 5
160-nvB 5 -A 2 -C 5
161-vcB 5 -A 2 -C 5
162-5
163-n -5
164-c -5
165-q -5
166-v -5
167-nv -5
168-vc -5
169-50000
170-n -50000
171-c -50000
172-q -50000
173-v -50000
174-nv -50000
175-vc -50000
176-C 5 -B 4 -A 2
177-nC 5 -B 4 -A 2
178-cC 5 -B 4 -A 2
179-qC 5 -B 4 -A 2
180-vC 5 -B 4 -A 2
181-nvC 5 -B 4 -A 2
182-vcC 5 -B 4 -A 2
183-b
184-bh
185-bn
186-bnh
187-ib
188-ibnH
189-b -C 1
190-bn -C 1
191-o
192-no
193-cno
194-bo
195-bno
196-cbno
197-ho
198-xo
199-o -C 3"
200
201cd $FILEDIR || fail "failed to cd to $FILEDIR"
202
203#
204# Test Pass 1: General flags with a basic pattern, checked against all
205# three primary forms of grep: grep, egrep, and fgrep. We do this in two
206# different passes. In one we're in a default multi-byte locale and in
207# the other we're in a single-byte locale. This ensures that we get
208# basic coverage of the use_bmg path in grep.
209#
210run_tests 0 t1 a test0 test1 test2 test3 test4 test5 test6 test7
211run_tests 0 t1 -E a test0 test1 test2 test3 test4 test5 test6 test7
212run_tests 0 t1 -F a test0 test1 test2 test3 test4 test5 test6 test7
213export LC_ALL=C
214run_tests 0 t1 a test0 test1 test2 test3 test4 test5 test6 test7
215run_tests 0 t1 -E a test0 test1 test2 test3 test4 test5 test6 test7
216run_tests 0 t1 -F a test0 test1 test2 test3 test4 test5 test6 test7
217export LC_ALL=C.UTF-8
218
219FLAGS="-nE"
220run_tests 0 t2 ".*" testnl
221
222FLAGS="-B 1
223-vA 1
224-vB 1"
225run_tests 0 t3 a testnl
226
227FLAGS="-h
228-H"
229run_tests 0 t4 a test0
230
231# need a directory with predictable contents
232rm -fr /tmp/test0
233mkdir /tmp/test0
234cp test0 /tmp/test0
235
236FLAGS="-r
237-hr"
238run_tests 0 t5 a /tmp/test0
239rm -rf /tmp/test0
240
241#
242# Test Group 6: Test -l and -L which are supposed to match the file or
243# not. We break this into cases that should always pass and those that
244# should fail. The first group should always pass.
245#
246FLAGS="-l
247-L
248-il
249-vl
250-vil
251-hl
252-hL
253-Hl
254-HL
255-cl
256-cL
257-nl
258-nL
259-l -A5 -B5
260-L -C5
261-nHvl
262-l -L -l
263-L -l
264-l -L
265-L -l -L"
266run_tests 0 t6 foo test.lL.0 test.lL.1
267
268#
269# Test Group 7: -l and -L variants that should cause us to not match or
270# fail for another reason.
271#
272FLAGS="-vL
273-viL
274-nHvL"
275run_tests 1 t7 foo test.lL.0 test.lL.1
276
277#
278# Test Group 8, 9: Here we are testing the ability for --label to
279# properly replace the name of a file from standard in, but not
280# replacing that of a file that's normally specified. Set 8 verifies the
281# former while set 9 verifies the latter.
282#
283FLAGS="-H
284-H --label=zelda
285--label=zelda
286-h --label=zelda
287-n --label=zelda
288-H -n --label=zelda"
289run_tests_stdin 0 t8 a test0
290run_tests 0 t9 a test0
291
292#
293# Test group 10, using multiple regexps.
294#
295FLAGS="-o
296-E -o
297-o -n
298-E -o -n
299-o -n -b
300-E -o -n -b
301-E -o -n -H
302-E -o -n -H -b"
303run_tests 0 t10 -e '[fF]oo' -e 's[df]+;' test.o.0
304
305#
306# Test group 11, using multibyte files.
307#
308OLDLOC=$LC_ALL
309export LC_ALL=C.UTF-8
310FLAGS="
311-o
312-n
313-n -o
314-H -n -o
315-l
316-c"
317run_tests 0 t11 -e ï -e à test.mb.0
318export LC_ALL=$OLDLOC
319
320#
321# Clean up temporary files.
322#
323rm -f $FLAGSFILE $OUTFILE
324
325if [[ "$failures" -ne 0 ]]; then
326	printf "%u tests failed\n" "$failures" 2>&1
327	exit -1
328fi
329exit 0
330