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