19992e6a6SMatthew Barden#! /usr/bin/ksh
29992e6a6SMatthew Barden#
39992e6a6SMatthew Barden#
49992e6a6SMatthew Barden# This file and its contents are supplied under the terms of the
59992e6a6SMatthew Barden# Common Development and Distribution License ("CDDL"), version 1.0.
69992e6a6SMatthew Barden# You may only use this file in accordance with the terms of version
79992e6a6SMatthew Barden# 1.0 of the CDDL.
89992e6a6SMatthew Barden#
99992e6a6SMatthew Barden# A full copy of the text of the CDDL should have accompanied this
109992e6a6SMatthew Barden# source.  A copy of the CDDL is also available via the Internet at
119992e6a6SMatthew Barden# http://www.illumos.org/license/CDDL.
129992e6a6SMatthew Barden#
139992e6a6SMatthew Barden
149992e6a6SMatthew Barden#
15e41ba543SMatt Barden# Copyright 2017 Nexenta Systems, Inc. All rights reserved.
164adc6f15SPeter Tribble# Copyright 2020 Peter Tribble.
17f415aa8fSRobert Mustacchi# Copyright 2020 Oxide Computer Company
189992e6a6SMatthew Barden#
199992e6a6SMatthew Barden
20d2d52addSAlexander PyhalovXGREP=${XGREP:=/usr/bin/grep}
21f415aa8fSRobert MustacchiFILEDIR=$MY_TESTS/tests/files/grep
22f415aa8fSRobert MustacchiOUTFILE=/tmp/grep_test.out.$$
23f415aa8fSRobert MustacchiFLAGSFILE=/tmp/grep_flags.$$
249992e6a6SMatthew Barden
25*81dd18d8SRobert Mustacchi#
26*81dd18d8SRobert Mustacchi# Set the tests to a known multi-byte locale to start with.
27*81dd18d8SRobert Mustacchi#
28*81dd18d8SRobert Mustacchiexport LC_ALL=C.UTF-8
29*81dd18d8SRobert Mustacchi
309992e6a6SMatthew Bardenfail() {
319992e6a6SMatthew Barden	echo $1
329992e6a6SMatthew Barden	exit -1
339992e6a6SMatthew Barden}
349992e6a6SMatthew Barden
35f415aa8fSRobert Mustacchitest_fail() {
36f415aa8fSRobert Mustacchi	echo "$*"
37f415aa8fSRobert Mustacchi	((failures++))
38f415aa8fSRobert Mustacchi}
39f415aa8fSRobert Mustacchi
40f415aa8fSRobert Mustacchi#
41f415aa8fSRobert Mustacchi# Run through a set of tests once for each value in $FLAGSFILE. Arguments are:
42f415aa8fSRobert Mustacchi# - expected exit status
43f415aa8fSRobert Mustacchi# - the file pass this is
44f415aa8fSRobert Mustacchi# - the remaining arguments to grep
45f415aa8fSRobert Mustacchi#
46f415aa8fSRobert Mustacchirun_tests() {
47f415aa8fSRobert Mustacchi	i=0
48f415aa8fSRobert Mustacchi	exp=$1
49f415aa8fSRobert Mustacchi	shift
50f415aa8fSRobert Mustacchi	pass=$1
51f415aa8fSRobert Mustacchi	shift
52f415aa8fSRobert Mustacchi
53f415aa8fSRobert Mustacchi	echo "$FLAGS" > $FLAGSFILE
54f415aa8fSRobert Mustacchi	while read flags; do
55f415aa8fSRobert Mustacchi		difffile="gout.$pass.$i"
56f415aa8fSRobert Mustacchi		print -n "test $total: grep $flags: "
57f415aa8fSRobert Mustacchi		((total++))
58f415aa8fSRobert Mustacchi		((i++))
59f415aa8fSRobert Mustacchi		$XGREP $flags "$@" > $OUTFILE
60f415aa8fSRobert Mustacchi		err=$?
61f415aa8fSRobert Mustacchi		if [[ $err -ne $exp ]]; then
62f415aa8fSRobert Mustacchi			test_fail "failed on exit: $err"
63f415aa8fSRobert Mustacchi			continue
64f415aa8fSRobert Mustacchi		fi
65f415aa8fSRobert Mustacchi
66f415aa8fSRobert Mustacchi		if [[ $exp -eq 0 ]]; then
67f415aa8fSRobert Mustacchi			if [[ ! -f "$difffile" ]]; then
68f415aa8fSRobert Mustacchi				test_fail "missing output file $difffile"
69f415aa8fSRobert Mustacchi				continue
70f415aa8fSRobert Mustacchi			fi
71f415aa8fSRobert Mustacchi
72f415aa8fSRobert Mustacchi			if [[ -n "$(diff $OUTFILE $difffile)" ]]; then
73f415aa8fSRobert Mustacchi				print "$(diff $OUTFILE $difffile)"
74f415aa8fSRobert Mustacchi				test_fail "output is different from $difffile"
75f415aa8fSRobert Mustacchi				continue
76f415aa8fSRobert Mustacchi			fi
77f415aa8fSRobert Mustacchi		fi
78f415aa8fSRobert Mustacchi		echo "passed"
79f415aa8fSRobert Mustacchi	done < $FLAGSFILE
80f415aa8fSRobert Mustacchi}
81f415aa8fSRobert Mustacchi
828ccd0217SRobert Mustacchirun_tests_stdin() {
838ccd0217SRobert Mustacchi	i=0
848ccd0217SRobert Mustacchi	exp=$1
858ccd0217SRobert Mustacchi	pass=$2
868ccd0217SRobert Mustacchi	pattern=$3
878ccd0217SRobert Mustacchi	file=$4
888ccd0217SRobert Mustacchi
898ccd0217SRobert Mustacchi	echo "$FLAGS" > $FLAGSFILE
908ccd0217SRobert Mustacchi	while read flags; do
918ccd0217SRobert Mustacchi		difffile="gout.$pass.$i"
928ccd0217SRobert Mustacchi		print -n "test $total: grep (stdin) $flags: "
938ccd0217SRobert Mustacchi		((total++))
948ccd0217SRobert Mustacchi		((i++))
958ccd0217SRobert Mustacchi		$XGREP $flags $pattern < $file > $OUTFILE
968ccd0217SRobert Mustacchi		err=$?
978ccd0217SRobert Mustacchi		if [[ $err -ne $exp ]]; then
988ccd0217SRobert Mustacchi			test_fail "failed on exit: $err"
998ccd0217SRobert Mustacchi			continue
1008ccd0217SRobert Mustacchi		fi
1018ccd0217SRobert Mustacchi
1028ccd0217SRobert Mustacchi		if [[ $exp -eq 0 ]]; then
1038ccd0217SRobert Mustacchi			if [[ ! -f "$difffile" ]]; then
1048ccd0217SRobert Mustacchi				test_fail "missing output file $difffile"
1058ccd0217SRobert Mustacchi				continue
1068ccd0217SRobert Mustacchi			fi
1078ccd0217SRobert Mustacchi
1088ccd0217SRobert Mustacchi			if [[ -n "$(diff $OUTFILE $difffile)" ]]; then
1098ccd0217SRobert Mustacchi				print "$(diff $OUTFILE $difffile)"
1108ccd0217SRobert Mustacchi				test_fail "output is different"
1118ccd0217SRobert Mustacchi				continue
1128ccd0217SRobert Mustacchi			fi
1138ccd0217SRobert Mustacchi		fi
1148ccd0217SRobert Mustacchi		echo "passed"
1158ccd0217SRobert Mustacchi	done < $FLAGSFILE
1168ccd0217SRobert Mustacchi}
117f415aa8fSRobert Mustacchitotal=0
118f415aa8fSRobert Mustacchifailures=0
119f415aa8fSRobert Mustacchi
120f415aa8fSRobert MustacchiFLAGS="
1219992e6a6SMatthew Barden-n
1229992e6a6SMatthew Barden-c
1239992e6a6SMatthew Barden-q
1249992e6a6SMatthew Barden-v
1259992e6a6SMatthew Barden-nv
1269992e6a6SMatthew Barden-vc
1279992e6a6SMatthew Barden-A 5
1289992e6a6SMatthew Barden-nA 5
1299992e6a6SMatthew Barden-cA 5
1309992e6a6SMatthew Barden-qA 5
1319992e6a6SMatthew Barden-vA 5
1329992e6a6SMatthew Barden-nvA 5
1339992e6a6SMatthew Barden-vcA 5
1349992e6a6SMatthew Barden-B 5
1359992e6a6SMatthew Barden-nB 5
1369992e6a6SMatthew Barden-cB 5
1379992e6a6SMatthew Barden-qB 5
1389992e6a6SMatthew Barden-vB 5
1399992e6a6SMatthew Barden-nvB 5
1409992e6a6SMatthew Barden-vcB 5
1419992e6a6SMatthew Barden-C 5
1429992e6a6SMatthew Barden-nC 5
1439992e6a6SMatthew Barden-cC 5
1449992e6a6SMatthew Barden-qC 5
1459992e6a6SMatthew Barden-vC 5
1469992e6a6SMatthew Barden-nvC 5
1479992e6a6SMatthew Barden-vcC 5
1489992e6a6SMatthew Barden-B 5 -A 2
1499992e6a6SMatthew Barden-nB 5 -A 2
1509992e6a6SMatthew Barden-cB 5 -A 2
1519992e6a6SMatthew Barden-qB 5 -A 2
1529992e6a6SMatthew Barden-vB 5 -A 2
1539992e6a6SMatthew Barden-nvB 5 -A 2
1549992e6a6SMatthew Barden-vcB 5 -A 2
1559992e6a6SMatthew Barden-B 5 -A 2 -C 5
1569992e6a6SMatthew Barden-nB 5 -A 2 -C 5
1579992e6a6SMatthew Barden-cB 5 -A 2 -C 5
1589992e6a6SMatthew Barden-qB 5 -A 2 -C 5
1599992e6a6SMatthew Barden-vB 5 -A 2 -C 5
1609992e6a6SMatthew Barden-nvB 5 -A 2 -C 5
1619992e6a6SMatthew Barden-vcB 5 -A 2 -C 5
1629992e6a6SMatthew Barden-5
1639992e6a6SMatthew Barden-n -5
1649992e6a6SMatthew Barden-c -5
1659992e6a6SMatthew Barden-q -5
1669992e6a6SMatthew Barden-v -5
1679992e6a6SMatthew Barden-nv -5
1689992e6a6SMatthew Barden-vc -5
1699992e6a6SMatthew Barden-50000
1709992e6a6SMatthew Barden-n -50000
1719992e6a6SMatthew Barden-c -50000
1729992e6a6SMatthew Barden-q -50000
1739992e6a6SMatthew Barden-v -50000
1749992e6a6SMatthew Barden-nv -50000
1759992e6a6SMatthew Barden-vc -50000
1769992e6a6SMatthew Barden-C 5 -B 4 -A 2
1779992e6a6SMatthew Barden-nC 5 -B 4 -A 2
1789992e6a6SMatthew Barden-cC 5 -B 4 -A 2
1799992e6a6SMatthew Barden-qC 5 -B 4 -A 2
1809992e6a6SMatthew Barden-vC 5 -B 4 -A 2
1819992e6a6SMatthew Barden-nvC 5 -B 4 -A 2
182*81dd18d8SRobert Mustacchi-vcC 5 -B 4 -A 2
183*81dd18d8SRobert Mustacchi-b
184*81dd18d8SRobert Mustacchi-bh
185*81dd18d8SRobert Mustacchi-bn
186*81dd18d8SRobert Mustacchi-bnh
187*81dd18d8SRobert Mustacchi-ib
188*81dd18d8SRobert Mustacchi-ibnH
189*81dd18d8SRobert Mustacchi-b -C 1
190*81dd18d8SRobert Mustacchi-bn -C 1
191*81dd18d8SRobert Mustacchi-o
192*81dd18d8SRobert Mustacchi-no
193*81dd18d8SRobert Mustacchi-cno
194*81dd18d8SRobert Mustacchi-bo
195*81dd18d8SRobert Mustacchi-bno
196*81dd18d8SRobert Mustacchi-cbno
197*81dd18d8SRobert Mustacchi-ho
198*81dd18d8SRobert Mustacchi-xo
199*81dd18d8SRobert Mustacchi-o -C 3"
2009992e6a6SMatthew Barden
201f415aa8fSRobert Mustacchicd $FILEDIR || fail "failed to cd to $FILEDIR"
202*81dd18d8SRobert Mustacchi
203*81dd18d8SRobert Mustacchi#
204*81dd18d8SRobert Mustacchi# Test Pass 1: General flags with a basic pattern, checked against all
205*81dd18d8SRobert Mustacchi# three primary forms of grep: grep, egrep, and fgrep. We do this in two
206*81dd18d8SRobert Mustacchi# different passes. In one we're in a default multi-byte locale and in
207*81dd18d8SRobert Mustacchi# the other we're in a single-byte locale. This ensures that we get
208*81dd18d8SRobert Mustacchi# basic coverage of the use_bmg path in grep.
209*81dd18d8SRobert Mustacchi#
210f415aa8fSRobert Mustacchirun_tests 0 t1 a test0 test1 test2 test3 test4 test5 test6 test7
211*81dd18d8SRobert Mustacchirun_tests 0 t1 -E a test0 test1 test2 test3 test4 test5 test6 test7
212*81dd18d8SRobert Mustacchirun_tests 0 t1 -F a test0 test1 test2 test3 test4 test5 test6 test7
213*81dd18d8SRobert Mustacchiexport LC_ALL=C
214*81dd18d8SRobert Mustacchirun_tests 0 t1 a test0 test1 test2 test3 test4 test5 test6 test7
215*81dd18d8SRobert Mustacchirun_tests 0 t1 -E a test0 test1 test2 test3 test4 test5 test6 test7
216*81dd18d8SRobert Mustacchirun_tests 0 t1 -F a test0 test1 test2 test3 test4 test5 test6 test7
217*81dd18d8SRobert Mustacchiexport LC_ALL=C.UTF-8
218f415aa8fSRobert Mustacchi
219f415aa8fSRobert MustacchiFLAGS="-nE"
220f415aa8fSRobert Mustacchirun_tests 0 t2 ".*" testnl
221f415aa8fSRobert Mustacchi
222f415aa8fSRobert MustacchiFLAGS="-B 1
223e41ba543SMatt Barden-vA 1
224e41ba543SMatt Barden-vB 1"
225f415aa8fSRobert Mustacchirun_tests 0 t3 a testnl
226e41ba543SMatt Barden
227f415aa8fSRobert MustacchiFLAGS="-h
2284adc6f15SPeter Tribble-H"
229f415aa8fSRobert Mustacchirun_tests 0 t4 a test0
2304adc6f15SPeter Tribble
2314adc6f15SPeter Tribble# need a directory with predictable contents
2324adc6f15SPeter Tribblerm -fr /tmp/test0
2334adc6f15SPeter Tribblemkdir /tmp/test0
2344adc6f15SPeter Tribblecp test0 /tmp/test0
2354adc6f15SPeter Tribble
236f415aa8fSRobert MustacchiFLAGS="-r
237f415aa8fSRobert Mustacchi-hr"
238f415aa8fSRobert Mustacchirun_tests 0 t5 a /tmp/test0
239f415aa8fSRobert Mustacchirm -rf /tmp/test0
240f415aa8fSRobert Mustacchi
2412e5ac464SRobert Mustacchi#
2422e5ac464SRobert Mustacchi# Test Group 6: Test -l and -L which are supposed to match the file or
2432e5ac464SRobert Mustacchi# not. We break this into cases that should always pass and those that
2442e5ac464SRobert Mustacchi# should fail. The first group should always pass.
2452e5ac464SRobert Mustacchi#
2462e5ac464SRobert MustacchiFLAGS="-l
2472e5ac464SRobert Mustacchi-L
2482e5ac464SRobert Mustacchi-il
2492e5ac464SRobert Mustacchi-vl
2502e5ac464SRobert Mustacchi-vil
2512e5ac464SRobert Mustacchi-hl
2522e5ac464SRobert Mustacchi-hL
2532e5ac464SRobert Mustacchi-Hl
2542e5ac464SRobert Mustacchi-HL
2552e5ac464SRobert Mustacchi-cl
2562e5ac464SRobert Mustacchi-cL
2572e5ac464SRobert Mustacchi-nl
2582e5ac464SRobert Mustacchi-nL
2592e5ac464SRobert Mustacchi-l -A5 -B5
2602e5ac464SRobert Mustacchi-L -C5
2612e5ac464SRobert Mustacchi-nHvl
2622e5ac464SRobert Mustacchi-l -L -l
2632e5ac464SRobert Mustacchi-L -l
2642e5ac464SRobert Mustacchi-l -L
2652e5ac464SRobert Mustacchi-L -l -L"
2662e5ac464SRobert Mustacchirun_tests 0 t6 foo test.lL.0 test.lL.1
2672e5ac464SRobert Mustacchi
2682e5ac464SRobert Mustacchi#
2692e5ac464SRobert Mustacchi# Test Group 7: -l and -L variants that should cause us to not match or
2702e5ac464SRobert Mustacchi# fail for another reason.
2712e5ac464SRobert Mustacchi#
2722e5ac464SRobert MustacchiFLAGS="-vL
2732e5ac464SRobert Mustacchi-viL
2742e5ac464SRobert Mustacchi-nHvL"
2752e5ac464SRobert Mustacchirun_tests 1 t7 foo test.lL.0 test.lL.1
2762e5ac464SRobert Mustacchi
2778ccd0217SRobert Mustacchi#
2788ccd0217SRobert Mustacchi# Test Group 8, 9: Here we are testing the ability for --label to
2798ccd0217SRobert Mustacchi# properly replace the name of a file from standard in, but not
2808ccd0217SRobert Mustacchi# replacing that of a file that's normally specified. Set 8 verifies the
2818ccd0217SRobert Mustacchi# former while set 9 verifies the latter.
2828ccd0217SRobert Mustacchi#
2838ccd0217SRobert MustacchiFLAGS="-H
2848ccd0217SRobert Mustacchi-H --label=zelda
2858ccd0217SRobert Mustacchi--label=zelda
2868ccd0217SRobert Mustacchi-h --label=zelda
2878ccd0217SRobert Mustacchi-n --label=zelda
2888ccd0217SRobert Mustacchi-H -n --label=zelda"
2898ccd0217SRobert Mustacchirun_tests_stdin 0 t8 a test0
2908ccd0217SRobert Mustacchirun_tests 0 t9 a test0
2918ccd0217SRobert Mustacchi
292*81dd18d8SRobert Mustacchi#
293*81dd18d8SRobert Mustacchi# Test group 10, using multiple regexps.
294*81dd18d8SRobert Mustacchi#
295*81dd18d8SRobert MustacchiFLAGS="-o
296*81dd18d8SRobert Mustacchi-E -o
297*81dd18d8SRobert Mustacchi-o -n
298*81dd18d8SRobert Mustacchi-E -o -n
299*81dd18d8SRobert Mustacchi-o -n -b
300*81dd18d8SRobert Mustacchi-E -o -n -b
301*81dd18d8SRobert Mustacchi-E -o -n -H
302*81dd18d8SRobert Mustacchi-E -o -n -H -b"
303*81dd18d8SRobert Mustacchirun_tests 0 t10 -e '[fF]oo' -e 's[df]+;' test.o.0
304*81dd18d8SRobert Mustacchi
305*81dd18d8SRobert Mustacchi#
306*81dd18d8SRobert Mustacchi# Test group 11, using multibyte files.
307*81dd18d8SRobert Mustacchi#
308*81dd18d8SRobert MustacchiOLDLOC=$LC_ALL
309*81dd18d8SRobert Mustacchiexport LC_ALL=C.UTF-8
310*81dd18d8SRobert MustacchiFLAGS="
311*81dd18d8SRobert Mustacchi-o
312*81dd18d8SRobert Mustacchi-n
313*81dd18d8SRobert Mustacchi-n -o
314*81dd18d8SRobert Mustacchi-H -n -o
315*81dd18d8SRobert Mustacchi-l
316*81dd18d8SRobert Mustacchi-c"
317*81dd18d8SRobert Mustacchirun_tests 0 t11 -e ï -e à test.mb.0
318*81dd18d8SRobert Mustacchiexport LC_ALL=$OLDLOC
319*81dd18d8SRobert Mustacchi
320f415aa8fSRobert Mustacchi#
321f415aa8fSRobert Mustacchi# Clean up temporary files.
322f415aa8fSRobert Mustacchi#
323f415aa8fSRobert Mustacchirm -f $FLAGSFILE $OUTFILE
324f415aa8fSRobert Mustacchi
325f415aa8fSRobert Mustacchiif [[ "$failures" -ne 0 ]]; then
326f415aa8fSRobert Mustacchi	printf "%u tests failed\n" "$failures" 2>&1
327f415aa8fSRobert Mustacchi	exit -1
328f415aa8fSRobert Mustacchifi
329f415aa8fSRobert Mustacchiexit 0
330